Skip to content

Instantly share code, notes, and snippets.

@net800
Created April 28, 2023 05:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save net800/9b358052d11b2353a357f1dd611b4950 to your computer and use it in GitHub Desktop.
Save net800/9b358052d11b2353a357f1dd611b4950 to your computer and use it in GitHub Desktop.
9ZX_Sanka
(function(wa){function K(a,b,c){c.a=a;c.f=b;return c}function h(a){return K(2,a,function(b){return function(c){return a(b,c)}})}function n(a){return K(3,a,function(b){return function(c){return function(d){return a(b,c,d)}}})}function u(a){return K(4,a,function(b){return function(c){return function(d){return function(e){return a(b,c,d,e)}}}})}function T(a){return K(5,a,function(b){return function(c){return function(d){return function(e){return function(f){return a(b,c,d,e,f)}}}}})}function ca(a){return K(6,
a,function(b){return function(c){return function(d){return function(e){return function(f){return function(l){return a(b,c,d,e,f,l)}}}}}})}function Xa(a){return K(7,a,function(b){return function(c){return function(d){return function(e){return function(f){return function(l){return function(g){return a(b,c,d,e,f,l,g)}}}}}}})}function Ya(a){return K(8,a,function(b){return function(c){return function(d){return function(e){return function(f){return function(l){return function(g){return function(h){return a(b,
c,d,e,f,l,g,h)}}}}}}}})}function Za(a){return K(9,a,function(b){return function(c){return function(d){return function(e){return function(f){return function(l){return function(g){return function(h){return function(Ob){return a(b,c,d,e,f,l,g,h,Ob)}}}}}}}}})}function g(a,b,c){return 2===a.a?a.f(b,c):a(b)(c)}function p(a,b,c,d){return 3===a.a?a.f(b,c,d):a(b)(c)(d)}function D(a,b,c,d,e){return 4===a.a?a.f(b,c,d,e):a(b)(c)(d)(e)}function L(a,b,c,d,e,f){return 5===a.a?a.f(b,c,d,e,f):a(b)(c)(d)(e)(f)}function xa(a,
b,c,d,e,f,l){return 6===a.a?a.f(b,c,d,e,f,l):a(b)(c)(d)(e)(f)(l)}function $a(a,b){var c,d=[];for(a=ya(a,b,0,d);a&&(c=d.pop());a=ya(c.a,c.b,0,d));return a}function ya(a,b,c,d){if(100<c)return d.push(t(a,b)),!0;if(a===b)return!0;if("object"!==typeof a||null===a||null===b)return"function"===typeof a&&M(5),!1;0>a.$&&(a=ab(a),b=ab(b));for(var e in a)if(!ya(a[e],b[e],c+1,d))return!1;return!0}function v(a,b,c){if("object"!==typeof a)return a===b?0:a<b?-1:1;if("undefined"===typeof a.$)return(c=v(a.a,b.a))?
c:(c=v(a.b,b.b))?c:v(a.c,b.c);for(;a.b&&b.b&&!(c=v(a.a,b.a));a=a.b,b=b.b);return c||(a.b?1:b.b?-1:0)}function t(a,b){return{a:a,b:b}}function X(a,b){var c={},d;for(d in a)c[d]=a[d];for(d in b)c[d]=b[d];return c}function C(a,b){return{$:1,a:a,b:b}}function k(a){for(var b=m,c=a.length;c--;)b=C(a[c],b);return b}function za(a){for(var b=[];a.b;a=a.b)b.push(a.a);return b}function M(a){throw Error("https://github.com/elm/core/blob/1.0.0/hints/"+a+".md");}function N(a,b){return{$:9,f:a,g:b}}function x(a,
b){switch(a.$){case 2:return a.b(b);case 5:return null===b?{$:0,a:a.c}:H("null",b);case 3:return da(b)?bb(a.b,b,k):H("a LIST",b);case 4:return da(b)?bb(a.b,b,Pb):H("an ARRAY",b);case 6:var c=a.d;if("object"!==typeof b||null===b||!(c in b))return H("an OBJECT with a field named `"+c+"`",b);var d=x(a.b,b[c]);return d.$?{$:1,a:g(cb,c,d.a)}:d;case 7:c=a.e;if(!da(b))return H("an ARRAY",b);if(c>=b.length)return H("a LONGER array. Need index "+c+" but only see "+b.length+" entries",b);d=x(a.b,b[c]);return d.$?
{$:1,a:g(db,c,d.a)}:d;case 8:if("object"!==typeof b||null===b||da(b))return H("an OBJECT",b);c=m;for(var e in b)if(b.hasOwnProperty(e)){d=x(a.b,b[e]);if(d.$)return{$:1,a:g(cb,e,d.a)};c=C(t(e,d.a),c)}return{$:0,a:O(c)};case 9:c=a.f;a=a.g;for(e=0;e<a.length;e++){d=x(a[e],b);if(d.$)return d;c=c(d.a)}return{$:0,a:c};case 10:return d=x(a.b,b),d.$?d:x(a.h(d.a),b);case 11:c=m;for(a=a.g;a.b;a=a.b){d=x(a.a,b);if(!d.$)return d;c=C(d.a,c)}return{$:1,a:{$:2,a:O(c)}};case 1:return{$:1,a:g(Aa,a.a,b)};case 0:return{$:0,
a:a.a}}}function bb(a,b,c){for(var d=b.length,e=Array(d),f=0;f<d;f++){var l=x(a,b[f]);if(l.$)return{$:1,a:g(db,f,l.a)};e[f]=l.a}return{$:0,a:c(e)}}function da(a){return Array.isArray(a)||"undefined"!==typeof FileList&&a instanceof FileList}function Pb(a){return g(Qb,a.length,function(b){return a[b]})}function H(a,b){return{$:1,a:g(Aa,"Expecting "+a,b)}}function U(a,b){if(a===b)return!0;if(a.$!==b.$)return!1;switch(a.$){case 0:case 1:return a.a===b.a;case 2:return a.b===b.b;case 5:return a.c===b.c;
case 3:case 4:case 8:return U(a.b,b.b);case 6:return a.d===b.d&&U(a.b,b.b);case 7:return a.e===b.e&&U(a.b,b.b);case 9:return a.f===b.f&&eb(a.g,b.g);case 10:return a.h===b.h&&U(a.b,b.b);case 11:return eb(a.g,b.g)}}function eb(a,b){var c=a.length;if(c!==b.length)return!1;for(var d=0;d<c;d++)if(!U(a[d],b[d]))return!1;return!0}function z(a){return{$:0,a:a}}function A(a){return{$:2,b:a,c:null}}function Ba(a){a={$:0,e:Rb++,f:a,g:null,h:[]};ea(a);return a}function fb(a){return A(function(b){b(z(Ba(a)))})}
function ea(a){gb.push(a);if(!Ca){for(Ca=!0;a=gb.shift();)Sb(a);Ca=!1}}function Sb(a){for(;a.f;){var b=a.f.$;if(0===b||1===b){for(;a.g&&a.g.$!==b;)a.g=a.g.i;if(!a.g)break;a.f=a.g.b(a.f.a);a.g=a.g.i}else if(2===b){a.f.c=a.f.b(function(b){a.f=b;ea(a)});break}else if(5===b){if(0===a.h.length)break;a.f=a.f.b(a.h.shift())}else a.g={$:3===b?0:1,b:a.f.b,i:a.g},a.f=a.f.d}}function Tb(a){return A(function(b){var c=setTimeout(function(){b(z(0))},a);return function(){clearTimeout(c)}})}function Da(a,b,c,d,e,
f){function l(a,b){h=g(d,a,E);y(E=h.a,b);hb(k,h.b,e(E))}var h=g(ib,a,b?b.flags:void 0);!h.$||M(2);var k={};h=c(h.a);var E=h.a,y=f(l,E);a=Ub(k,l);hb(k,h.b,e(E));return a?{ports:a}:{}}function Ub(a,b){var c;for(c in r){var d=r[c];if(d.a){var e=e||{};e[c]=d.a(c,b)}a[c]=Vb(d,b)}return e}function Vb(a,b){function c(a){return g(Ea,c,{$:5,b:function(b){var c=b.a;return 0===b.$?p(f,d,c,a):l&&h?D(e,d,c.i,c.j,a):p(e,d,l?c.i:c.j,a)}})}var d={g:b,h:void 0},e=a.c,f=a.d,l=a.e,h=a.f;return d.h=Ba(g(Ea,c,a.b))}function Fa(a){return function(b){return{$:1,
k:a,l:b}}}function hb(a,b,c){var d={};fa(!0,b,d,null);fa(!1,c,d,null);for(var e in a)b=a[e],b.h.push({$:"fx",a:d[e]||{i:m,j:m}}),ea(b)}function fa(a,b,c,d){switch(b.$){case 1:var e=b.k;d=Wb(a,e,d,b.l);b=(b=c[e])||{i:m,j:m};a?b.i=C(d,b.i):b.j=C(d,b.j);c[e]=b;break;case 2:for(e=b.m;e.b;e=e.b)fa(a,e.a,c,d);break;case 3:fa(a,b.o,c,{p:b.n,q:d})}}function Wb(a,b,c,d){return g(a?r[b].e:r[b].f,function(a){for(var b=c;b;b=b.q)a=b.p(a);return a},d)}function Xb(a){var b=[],c=r[a].r,d=Tb(0);r[a].b=d;r[a].c=n(function(a,
f,l){for(;f.b;f=f.b){a=b;l=c(f.a);for(var e=0;e<a.length;e++)a[e](l)}return d});return{subscribe:function(a){b.push(a)},unsubscribe:function(a){b=b.slice();a=b.indexOf(a);0<=a&&b.splice(a,1)}}}function Yb(a,b){var c=m,d=r[a].r,e=z(null);r[a].b=e;r[a].c=n(function(a,b,d){c=b;return e});return{send:function(e){e=g(ib,d,e);!e.$||M(4,a,e.a);e=e.a;for(var f=c;f.b;f=f.b)b(f.a(e))}}}function jb(a,b){for(var c in b)c in a?"init"==c?M(6):jb(a[c],b[c]):a[c]=b[c]}function P(a,b){return{$:5,l:a,m:b,k:void 0}}
function kb(a){for(var b={};a.b;a=a.b){var c=a.a,d=c.$,e=c.n;c=c.o;if("a2"===d)"className"===e?(d=b[e],b[e]=d?d+" "+c:c):b[e]=c;else{var f=b[d]||(b[d]={});"a3"===d&&"class"===e?(d=f[e],f[e]=d?d+" "+c:c):f[e]=c}}return b}function Q(a,b){var c=a.$;if(5===c)return Q(a.k||(a.k=a.m()),b);if(0===c)return S.createTextNode(a.a);if(4===c){var d=a.k;for(c=a.j;4===d.$;)"object"!==typeof c?c=[c,d.j]:c.push(d.j),d=d.k;b={j:c,p:b};d=Q(d,b);d.elm_event_node_ref=b;return d}if(3===c)return d=a.h(a.g),Ga(d,b,a.d),
d;d=a.f?S.createElementNS(a.f,a.c):S.createElement(a.c);ha&&"a"==a.c&&d.addEventListener("click",ha(d));Ga(d,b,a.d);a=a.e;for(var e=0;e<a.length;e++){var f=Q(1===c?a[e]:a[e].b,b);d.appendChild(f)}return d}function Ga(a,b,c){for(var d in c){var e=c[d];if("a1"===d){var f=void 0,l=a.style;for(f in e)l[f]=e[f]}else if("a0"===d){f=void 0;l=a;var g=b,h=l.elmFs||(l.elmFs={});for(f in e){var E=e[f],k=h[f];if(E){if(k){if(k.q.$===E.$){k.q=E;continue}l.removeEventListener(f,k)}k=Zb(g,E);l.addEventListener(f,
k,Ha&&{passive:2>Ia(E)});h[f]=k}else l.removeEventListener(f,k),h[f]=void 0}}else if("a3"===d)for(f in f=void 0,l=a,e)g=e[f],"undefined"!==typeof g?l.setAttribute(f,g):l.removeAttribute(f);else if("a4"===d)for(f in f=void 0,l=a,e)h=e[f],g=h.f,h=h.o,"undefined"!==typeof h?l.setAttributeNS(g,f,h):l.removeAttributeNS(g,f);else("value"!==d&&"checked"!==d||a[d]!==e)&&(a[d]=e)}}function Zb(a,b){function c(b){var d=c.q,f=x(d.a,b);if(!f.$){var l=Ia(d),g=f.a;f=l?3>l?g.a:g.o:g;d=1==l?g.b:3==l&&g.R;for(b=(d&&
b.stopPropagation(),(2==l?g.b:3==l&&g.O)&&b.preventDefault(),a);l=b.j;){if("function"==typeof l)f=l(f);else for(g=l.length;g--;)f=l[g](f);b=b.p}b(f,d)}}c.q=b;return c}function lb(a,b){var c=[];F(a,b,c,0);return c}function B(a,b,c,d){b={$:b,r:c,s:d,t:void 0,u:void 0};a.push(b);return b}function F(a,b,c,d){if(a!==b){var e=a.$,f=b.$;if(e!==f)if(1===e&&2===f){e=b.e;f=e.length;for(var l=Array(f),g=0;g<f;g++)l[g]=e[g].b;b={$:1,c:b.c,d:b.d,e:l,f:b.f,b:b.b};f=1}else{B(c,0,d,b);return}switch(f){case 5:e=a.l;
f=b.l;l=e.length;for(g=l===f.length;g&&l--;)g=e[l]===f[l];if(g){b.k=a.k;break}b.k=b.m();e=[];F(a.k,b.k,e,0);0<e.length&&B(c,1,d,e);break;case 4:l=a.j;e=b.j;g=!1;for(a=a.k;4===a.$;)g=!0,"object"!==typeof l?l=[l,a.j]:l.push(a.j),a=a.k;for(f=b.k;4===f.$;)g=!0,"object"!==typeof e?e=[e,f.j]:e.push(f.j),f=f.k;if(g&&l.length!==e.length){B(c,0,d,b);break}if(g){a:{for(b=0;b<l.length;b++)if(l[b]!==e[b]){b=!1;break a}b=!0}b=!b}else b=l!==e;b&&B(c,2,d,e);F(a,f,c,d+1);break;case 0:a.a!==b.a&&B(c,3,d,b.a);break;
case 1:mb(a,b,c,d,$b);break;case 2:mb(a,b,c,d,ac);break;case 3:a.h!==b.h?B(c,0,d,b):((e=Ja(a.d,b.d))&&B(c,4,d,e),(a=b.i(a.g,b.g))&&B(c,5,d,a))}}}function mb(a,b,c,d,e){if(a.c!==b.c||a.f!==b.f)B(c,0,d,b);else{var f=Ja(a.d,b.d);f&&B(c,4,d,f);e(a,b,c,d)}}function Ja(a,b,c){var d;for(d in a)if("a1"===d||"a0"===d||"a3"===d||"a4"===d){var e=Ja(a[d],b[d]||{},d);if(e){var f=f||{};f[d]=e}}else if(d in b){e=a[d];var l=b[d];e===l&&"value"!==d&&"checked"!==d||"a0"===c&&e.$==l.$&&U(e.a,l.a)||(f=f||{},f[d]=l)}else f=
f||{},f[d]=c?"a1"===c?"":"a0"===c||"a3"===c?void 0:{f:a[d].f,o:void 0}:"string"===typeof a[d]?"":null;for(var g in b)g in a||(f=f||{},f[g]=b[g]);return f}function $b(a,b,c,d){a=a.e;b=b.e;var e=a.length,f=b.length;e>f?B(c,6,d,{v:f,i:e-f}):e<f&&B(c,7,d,{v:e,e:b});e=e<f?e:f;for(f=0;f<e;f++){var l=a[f];F(l,b[f],c,++d);d+=l.b||0}}function ac(a,b,c,d){var e=[],f={},l=[];a=a.e;b=b.e;for(var g=a.length,h=b.length,k=0,y=0,q=d;k<g&&y<h;){var m=a[k],n=b[y],p=m.a,t=n.a,r=m.b;m=n.b;var w=n=void 0;if(p===t)q++,
F(r,m,e,q),q+=r.b||0,k++,y++;else{var v=a[k+1],x=b[y+1];if(v){var z=v.a,u=v.b;w=t===z}if(x){var D=x.a,C=x.b;n=p===D}if(n&&w)q++,F(r,C,e,q),Y(f,e,p,m,y,l),q+=r.b||0,q++,Z(f,e,p,u,q),q+=u.b||0,k+=2,y+=2;else if(n)q++,Y(f,e,t,m,y,l),F(r,C,e,q),q+=r.b||0,k+=1,y+=2;else if(w)q++,Z(f,e,p,r,q),q+=r.b||0,q++,F(u,m,e,q),q+=u.b||0,k+=2,y+=1;else if(v&&z===D)q++,Z(f,e,p,r,q),Y(f,e,t,m,y,l),q+=r.b||0,q++,F(u,C,e,q),q+=u.b||0,k+=2,y+=2;else break}}for(;k<g;)q++,m=a[k],r=m.b,Z(f,e,m.a,r,q),q+=r.b||0,k++;for(;y<
h;){var A=A||[];n=b[y];Y(f,e,n.a,n.b,void 0,A);y++}(0<e.length||0<l.length||A)&&B(c,8,d,{w:e,x:l,y:A})}function Y(a,b,c,d,e,f){var g=a[c];g?1===g.c?(f.push({r:e,A:g}),g.c=2,a=[],F(g.z,d,a,g.r),g.r=e,g.s.s={w:a,A:g}):Y(a,b,c+nb,d,e,f):(g={c:0,z:d,r:e,s:void 0},f.push({r:e,A:g}),a[c]=g)}function Z(a,b,c,d,e){var f=a[c];f?0===f.c?(f.c=2,a=[],F(d,f.z,a,e),B(b,9,e,{w:a,A:f})):Z(a,b,c+nb,d,e):(b=B(b,9,e,void 0),a[c]={c:1,z:d,r:e,s:b})}function V(a,b,c,d,e,f,g){for(var l=c[d],h=l.r;h===e;){var k=l.$;if(1===
k)k=b.k,V(a,k,l.s,0,0,k.b,g);else if(8===k)l.t=a,l.u=g,k=l.s.w,0<k.length&&V(a,b,k,0,e,f,g);else if(9===k){if(l.t=a,l.u=g,k=l.s)k.A.s=a,k=k.w,0<k.length&&V(a,b,k,0,e,f,g)}else l.t=a,l.u=g;d++;if(!(l=c[d])||(h=l.r)>f)return d}k=b.$;if(4===k){for(g=b.k;4===g.$;)g=g.k;return V(a,g,c,d,e+1,f,a.elm_event_node_ref)}b=b.e;a=a.childNodes;for(var m=0;m<b.length;m++){e++;var q=1===k?b[m]:b[m].b,n=e+(q.b||0);if(e<=h&&h<=n&&(d=V(a[m],q,c,d,e,n,g),!(l=c[d])||(h=l.r)>f))break;e=n}return d}function ob(a,b,c,d){if(0===
c.length)return a;V(a,b,c,0,0,b.b,d);return ia(a,c)}function ia(a,b){for(var c=0;c<b.length;c++){var d=b[c],e=d.t;d=bc(e,d);e===a&&(a=d)}return a}function bc(a,b){switch(b.$){case 0:var c=a.parentNode;b=Q(b.s,b.u);b.elm_event_node_ref||(b.elm_event_node_ref=a.elm_event_node_ref);c&&b!==a&&c.replaceChild(b,a);return b;case 4:return Ga(a,b.u,b.s),a;case 3:return a.replaceData(0,a.length,b.s),a;case 1:return ia(a,b.s);case 2:return a.elm_event_node_ref?a.elm_event_node_ref.j=b.s:a.elm_event_node_ref=
{j:b.s,p:b.u},a;case 6:c=b.s;for(var d=0;d<c.i;d++)a.removeChild(a.childNodes[c.v]);return a;case 7:c=b.s;var e=c.e;d=c.v;for(c=a.childNodes[d];d<e.length;d++)a.insertBefore(Q(e[d],b.u),c);return a;case 9:c=b.s;if(!c)return a.parentNode.removeChild(a),a;b=c.A;"undefined"!==typeof b.r&&a.parentNode.removeChild(a);b.s=ia(a,c.w);return a;case 8:c=b.s;if(d=c.y){e=S.createDocumentFragment();for(var f=0;f<d.length;f++){var g=d[f].A;g=2===g.c?g.s:Q(g.z,b.u);e.appendChild(g)}d=e}else d=void 0;a=ia(a,c.w);
c=c.x;for(e=0;e<c.length;e++)f=c[e],g=f.A,g=2===g.c?g.s:Q(g.z,b.u),a.insertBefore(g,a.childNodes[f.r]);d&&a.appendChild(d);return a;case 5:return b.s(a);default:M(10)}}function Ka(a){if(3===a.nodeType)return{$:0,a:a.textContent};if(1!==a.nodeType)return{$:0,a:""};for(var b=m,c=a.attributes,d=c.length;d--;){var e=c[d];b=C(g(cc,e.name,e.value),b)}c=a.tagName.toLowerCase();e=m;a=a.childNodes;for(d=a.length;d--;)e=C(Ka(a[d]),e);return p(R,c,b,e)}function pb(a,b){function c(){d=1===d?0:(ja(c),b(a),1)}
b(a);var d=0;return function(e,f){a=e;f?(b(a),2===d&&(d=1)):(0===d&&ja(c),d=2)}}function qb(a,b){return A(function(c){ja(function(){var d=document.getElementById(a);c(d?z(b(d)):{$:1,a:a})})})}function dc(a){return A(function(b){ja(function(){b(z(a()))})})}h($a);h(function(a,b){return!$a(a,b)});h(function(a,b){return 0>v(a,b)});h(function(a,b){return 1>v(a,b)});h(function(a,b){return 0<v(a,b)});h(function(a,b){return 0<=v(a,b)});h(function(a,b){a=v(a,b);return 0>a?rb:a?ec:sb});h(function(a,b){if("string"===
typeof a)return a+b;if(!a.b)return b;var c=C(a.a,b);a=a.b;for(var d=c;a.b;a=a.b)d=d.b=C(a.a,b);return c});var m={$:0},G=h(C),fc=n(function(a,b,c){for(var d=[];b.b&&c.b;b=b.b,c=c.b)d.push(g(a,b.a,c.a));return k(d)});u(function(a,b,c,d){for(var e=[];b.b&&c.b&&d.b;b=b.b,c=c.b,d=d.b)e.push(p(a,b.a,c.a,d.a));return k(e)});T(function(a,b,c,d,e){for(var f=[];b.b&&c.b&&d.b&&e.b;b=b.b,c=c.b,d=d.b,e=e.b)f.push(D(a,b.a,c.a,d.a,e.a));return k(f)});ca(function(a,b,c,d,e,f){for(var g=[];b.b&&c.b&&d.b&&e.b&&f.b;b=
b.b,c=c.b,d=d.b,e=e.b,f=f.b)g.push(L(a,b.a,c.a,d.a,e.a,f.a));return k(g)});h(function(a,b){return k(za(b).sort(function(b,d){return v(a(b),a(d))}))});h(function(a,b){return k(za(b).sort(function(b,d){b=g(a,b,d);return b===sb?0:b===rb?-1:1}))});var tb=n(function(a,b,c){for(var d=Array(a),e=0;e<a;e++)d[e]=c(b+e);return d}),ub=h(function(a,b){for(var c=Array(a),d=0;d<a&&b.b;d++)c[d]=b.a,b=b.b;c.length=d;return t(c,b)});h(function(a,b){return b[a]});n(function(a,b,c){for(var d=c.length,e=Array(d),f=0;f<
d;f++)e[f]=c[f];e[a]=b;return e});h(function(a,b){for(var c=b.length,d=Array(c+1),e=0;e<c;e++)d[e]=b[e];d[c]=a;return d});n(function(a,b,c){for(var d=c.length,e=0;e<d;e++)b=g(a,c[e],b);return b});var ka=n(function(a,b,c){for(var d=c.length-1;0<=d;d--)b=g(a,c[d],b);return b});h(function(a,b){for(var c=b.length,d=Array(c),e=0;e<c;e++)d[e]=a(b[e]);return d});n(function(a,b,c){for(var d=c.length,e=Array(d),f=0;f<d;f++)e[f]=g(a,b+f,c[f]);return e});n(function(a,b,c){return c.slice(a,b)});n(function(a,
b,c){var d=b.length;a-=d;a>c.length&&(a=c.length);for(var e=Array(d+a),f=0;f<d;f++)e[f]=b[f];for(f=0;f<a;f++)e[f+d]=c[f];return e});h(function(a,b){return b});h(function(a,b){console.log(a+": <internals>");return b});h(function(a,b){return a+b});h(function(a,b){return a-b});h(function(a,b){return a*b});h(function(a,b){return a/b});h(function(a,b){return a/b|0});h(Math.pow);h(function(a,b){return b%a});h(function(a,b){b%=a;return 0===a?M(11):0<b&&0>a||0>b&&0<a?b+a:b});h(Math.atan2);var vb=Math.ceil,
gc=Math.floor,wb=Math.log;h(function(a,b){return a&&b});h(function(a,b){return a||b});h(function(a,b){return a!==b});h(function(a,b){return a+b});h(function(a,b){return a+b});h(function(a,b){for(var c=b.length,d=Array(c),e=0;e<c;){var f=b.charCodeAt(e);55296<=f&&56319>=f?(d[e]=a(b[e]+b[e+1]),e+=2):(d[e]=a(b[e]),e++)}return d.join("")});h(function(a,b){for(var c=[],d=b.length,e=0;e<d;){var f=b[e],g=b.charCodeAt(e);e++;55296<=g&&56319>=g&&(f+=b[e],e++);a(f)&&c.push(f)}return c.join("")});n(function(a,
b,c){for(var d=c.length,e=0;e<d;){var f=c[e],h=c.charCodeAt(e);e++;55296<=h&&56319>=h&&(f+=c[e],e++);b=g(a,f,b)}return b});n(function(a,b,c){for(var d=c.length;d--;){var e=c[d],f=c.charCodeAt(d);56320<=f&&57343>=f&&(d--,e=c[d]+e);b=g(a,e,b)}return b});var hc=h(function(a,b){return b.split(a)}),ic=h(function(a,b){return b.join(a)}),xb=n(function(a,b,c){return c.slice(a,b)});h(function(a,b){for(var c=b.length;c--;){var d=b[c],e=b.charCodeAt(c);56320<=e&&57343>=e&&(c--,d=b[c]+d);if(a(d))return!0}return!1});
var jc=h(function(a,b){for(var c=b.length;c--;){var d=b[c],e=b.charCodeAt(c);56320<=e&&57343>=e&&(c--,d=b[c]+d);if(!a(d))return!1}return!0}),kc=h(function(a,b){return-1<b.indexOf(a)});h(function(a,b){return 0===b.indexOf(a)});h(function(a,b){return b.length>=a.length&&b.lastIndexOf(a)===b.length-a.length});var la=h(function(a,b){var c=a.length;if(1>c)return m;for(var d=0,e=[];-1<(d=b.indexOf(a,d));)e.push(d),d+=c;return k(e)}),lc=h(function(a,b){return{$:6,d:a,b:b}});h(function(a,b){return{$:7,e:a,
b:b}});h(function(a,b){return{$:10,b:b,h:a}});var mc=h(function(a,b){return N(a,[b])}),nc=n(function(a,b,c){return N(a,[b,c])});u(function(a,b,c,d){return N(a,[b,c,d])});T(function(a,b,c,d,e){return N(a,[b,c,d,e])});ca(function(a,b,c,d,e,f){return N(a,[b,c,d,e,f])});Xa(function(a,b,c,d,e,f,g){return N(a,[b,c,d,e,f,g])});Ya(function(a,b,c,d,e,f,g,h){return N(a,[b,c,d,e,f,g,h])});Za(function(a,b,c,d,e,f,g,h,k){return N(a,[b,c,d,e,f,g,h,k])});h(function(a,b){try{var c=JSON.parse(b);return x(a,c)}catch(d){return{$:1,
a:g(Aa,"This is not valid JSON! "+d.message,b)}}});var ib=h(function(a,b){return x(a,b)}),oc=h(function(a,b){return JSON.stringify(b,null,a)+""}),pc=n(function(a,b,c){c[a]=b;return c}),Ea=h(function(a,b){return{$:3,b:a,d:b}});h(function(a,b){return{$:4,b:a,d:b}});var Rb=0,qc=h(function(a,b){return A(function(c){a.h.push(b);ea(a);c(z(0))})}),Ca=!1,gb=[];u(function(a,b,c,d){return Da(b,d,a.aw,a.aE,a.aC,function(){return function(){}})});var r={},rc=h(function(a,b){return A(function(c){a.g(b);c(z(0))})});
h(function(a,b){return g(qc,a.h,{$:0,a:b})});h(function(a,b){return{$:3,n:a,o:b}});var sc=h(function(a,b){return b}),tc=h(function(a,b){return function(c){return a(b(c))}}),ha,S="undefined"!==typeof document?document:{};u(function(a,b,c,d){b=d.node;b.parentNode.replaceChild(Q(a,function(){}),b);return{}});var R=h(function(a,b){return h(function(c,d){for(var e=[],f=0;d.b;d=d.b){var g=d.a;f+=g.b||0;e.push(g)}f+=e.length;return{$:1,c:b,d:kb(c),e:e,f:a,b:f}})})(void 0);h(function(a,b){return h(function(c,
d){for(var e=[],f=0;d.b;d=d.b){var g=d.a;f+=g.b.b||0;e.push(g)}f+=e.length;return{$:2,c:b,d:kb(c),e:e,f:a,b:f}})})(void 0);h(function(a,b){return{$:4,j:a,k:b,b:1+(b.b||0)}});h(function(a,b){return P([a,b],function(){return a(b)})});n(function(a,b,c){return P([a,b,c],function(){return g(a,b,c)})});u(function(a,b,c,d){return P([a,b,c,d],function(){return p(a,b,c,d)})});T(function(a,b,c,d,e){return P([a,b,c,d,e],function(){return D(a,b,c,d,e)})});ca(function(a,b,c,d,e,f){return P([a,b,c,d,e,f],function(){return L(a,
b,c,d,e,f)})});Xa(function(a,b,c,d,e,f,g){return P([a,b,c,d,e,f,g],function(){return xa(a,b,c,d,e,f,g)})});Ya(function(a,b,c,d,e,f,g,h){return P([a,b,c,d,e,f,g,h],function(){return 7===a.a?a.f(b,c,d,e,f,g,h):a(b)(c)(d)(e)(f)(g)(h)})});Za(function(a,b,c,d,e,f,g,h,k){return P([a,b,c,d,e,f,g,h,k],function(){return 8===a.a?a.f(b,c,d,e,f,g,h,k):a(b)(c)(d)(e)(f)(g)(h)(k)})});var La=h(function(a,b){return{$:"a0",n:a,o:b}});h(function(a,b){return{$:"a1",n:a,o:b}});var yb=h(function(a,b){return{$:"a2",n:a,
o:b}}),cc=h(function(a,b){return{$:"a3",n:a,o:b}});n(function(a,b,c){return{$:"a4",n:b,o:{f:a,o:c}}});h(function(a,b){if("a0"===b.$){var c=b.n;b=b.o;var d=Ia(b);a={$:b.$,a:d?p(uc,3>d?vc:wc,{$:0,a:a},b.a):g(ma,a,b.a)};c=g(La,c,a)}else c=b;return c});var vc=h(function(a,b){return t(a(b.a),b.b)}),wc=h(function(a,b){return{o:a(b.o),R:b.R,O:b.O}}),Ha;try{window.addEventListener("t",null,Object.defineProperty({},"passive",{get:function(){Ha=!0}}))}catch(a){}var nb="_elmW6BL",xc=u(function(a,b,c,d){return Da(b,
d,a.aw,a.aE,a.aC,function(b,c){var e=a.aF,f=d.node,g=Ka(f);return pb(c,function(a){a=e(a);var c=lb(g,a);f=ob(f,g,c,b);g=a})})});u(function(a,b,c,d){return Da(b,d,a.aw,a.aE,a.aC,function(b,c){var d=a.P&&a.P(b),e=a.aF,f=S.title,g=S.body,h=Ka(g);return pb(c,function(a){ha=d;a=e(a);var c=R("body")(m)(a.aq),l=lb(h,c);g=ob(g,h,l,b);h=c;ha=0;f!==a.aD&&(S.title=f=a.aD)})})});var ja="undefined"!==typeof requestAnimationFrame?requestAnimationFrame:function(a){return setTimeout(a,1E3/60)};h(function(a,b){return g(Ma,
Na,A(function(){b&&history.go(b);a()}))});h(function(a,b){return g(Ma,Na,A(function(){history.pushState({},"",b);a()}))});h(function(a,b){return g(Ma,Na,A(function(){history.replaceState({},"",b);a()}))});var yc={addEventListener:function(){},removeEventListener:function(){}},zc="undefined"!==typeof window?window:yc;n(function(a,b,c){return fb(A(function(d){function e(a){Ba(c(a))}a.addEventListener(b,e,Ha&&{passive:!0});return function(){a.removeEventListener(b,e)}}))});h(function(a,b){a=x(a,b);return a.$?
w:{$:0,a:a.a}});h(function(a,b){return qb(b,function(b){b[a]();return 0})});h(function(a,b){return dc(function(){zc.scroll(a,b);return 0})});n(function(a,b,c){return qb(a,function(a){a.scrollLeft=b;a.scrollTop=c;return 0})});var sb=1,ec=2,rb=0,zb=n(function(a,b,c){for(;;){if(-2===c.$)return b;var d=c.d,e=a;b=p(a,c.b,c.c,p(zb,a,b,c.e));a=e;c=d}}),ab=function(a){return p(zb,n(function(a,c,d){return g(G,t(a,c),d)}),m,a)};n(function(a,b,c){var d=c.c;c=c.d;var e=h(function(b,c){return b.$?p(ka,a,c,b.a):
p(ka,e,c,b.a)});return p(ka,e,p(ka,a,b,c),d)});var Aa=h(function(a,b){return{$:3,a:a,b:b}}),cb=h(function(a,b){return{$:0,a:a,b:b}}),db=h(function(a,b){return{$:1,a:a,b:b}}),w={$:1},W=h(function(a,b){return g(ic,a,za(b))}),Ab=h(function(a,b){return k(g(hc,a,b))}),na=n(function(a,b,c){for(;;)if(c.b){var d=c.b,e=a;b=g(a,c.a,b);a=e;c=d}else return b}),Oa=function(a){return p(na,h(function(a,c){return c+1}),0,a)},Ac=n(function(a,b,c){for(;;)if(1>v(a,b)){var d=b-1;c=g(G,b,c);b=d}else return c}),Bc=h(function(a,
b){return p(Ac,a,b,m)}),Cc=h(function(a,b){return p(fc,a,g(Bc,0,Oa(b)-1),b)}),Pa=function(a){var b=a.charCodeAt(0);return 55296<=b&&56319>=b?1024*(b-55296)+a.charCodeAt(1)-56320+65536:b},Bb=function(a){a=Pa(a);return 97<=a&&122>=a},Cb=function(a){a=Pa(a);return 90>=a&&65<=a},Dc=function(a){var b;(b=Bb(a))||(b=Cb(a))||(a=Pa(a),b=57>=a&&48<=a);return b},O=function(a){return p(na,G,m,a)},Fc=h(function(a,b){return"\n\n("+(a+1+") "+g(W,"\n ",g(Ab,"\n",g(Ec,b,m))))}),Ec=h(function(a,b){a:for(;;)switch(a.$){case 0:var c=
a.a;a=a.b;var d;var e=c;e=(d=e.charCodeAt(0))?{$:0,a:55296<=d&&56319>=d?t(e[0]+e[1],e.slice(2)):t(e[0],e.slice(1))}:w;1===e.$?e=!1:(d=e.a,e=d.b,d=d.a,e=(d=Bb(d)||Cb(d))&&g(jc,Dc,e));b=g(G,e?"."+c:"['"+(c+"']"),b);continue a;case 1:c=a.a;a=a.b;c="["+(c+"]");b=g(G,c,b);continue a;case 2:if(c=a.a,c.b){if(c.b.b)return b=b.b?"The Json.Decode.oneOf at json"+g(W,"",O(b)):"Json.Decode.oneOf",b+=" failed in the following "+(Oa(c)+" ways:"),g(W,"\n\n",g(G,b,g(Cc,Fc,c)));a=c.a;continue a}else return b=b.b?" at json"+
g(W,"",O(b)):"!","Ran into a Json.Decode.oneOf with no possibilities"+b;default:return c=a.a,a=a.b,b=b.b?"Problem with the value at json"+(g(W,"",O(b))+":\n\n "):"Problem with the given value:\n\n",b+(g(W,"\n ",g(Ab,"\n",g(oc,4,a)))+("\n\n"+c))}}),Qa=u(function(a,b,c,d){return{$:0,a:a,b:b,c:c,d:d}}),Ra=[],Db=h(function(a,b){return wb(b)/wb(a)}),Sa=vb(g(Db,2,32)),Gc=D(Qa,0,Sa,Ra,Ra);h(function(a,b){return a(b)});h(function(a,b){return b(a)});var Hc=h(function(a,b){return 0<v(a,b)?a:b}),Ic=h(function(a,
b){for(;;){var c=g(ub,32,a);a=c.b;b=g(G,{$:0,a:c.a},b);if(!a.b)return O(b)}}),Jc=h(function(a,b){for(;;){b=vb(b/32);if(1===b)return g(ub,32,a).a;a=g(Ic,a,m)}}),Kc=h(function(a,b){if(b.a){var c=32*b.a,d=gc(g(Db,32,c-1));a=a?O(b.e):b.e;a=g(Jc,a,b.a);return D(Qa,b.c.length+c,g(Hc,5,d*Sa),a,b.c)}return D(Qa,b.c.length,Sa,Ra,b.c)}),Lc=T(function(a,b,c,d,e){for(;;){if(0>b)return g(Kc,!1,{e:d,a:c/32|0,c:e});var f={$:1,a:p(tb,32,b,a)};b-=32;d=g(G,f,d)}}),Qb=h(function(a,b){if(0>=a)return Gc;var c=a%32,d=
p(tb,c,a-c,b);return L(Lc,b,a-c-32,a,m,d)}),ma=mc,uc=nc,Ia=function(a){switch(a.$){case 0:return 0;case 1:return 1;case 2:return 2;default:return 3}},Eb=ca(function(a,b,c,d,e,f){return{X:f,Y:b,ab:d,ad:c,ag:a,ah:e}}),oa=h(function(a,b){return 1>a?b:p(xb,a,b.length,b)}),pa=h(function(a,b){return 1>a?"":p(xb,0,a,b)}),Fb=T(function(a,b,c,d,e){if(""===e||g(kc,"@",e))return w;var f=g(la,":",e);if(f.b){if(f.b.b)return w;f=f.a;a:{var h=g(oa,f+1,e);for(var k=0,m=h.charCodeAt(0),n=43==m||45==m?1:0,p=n;p<h.length;++p){var q=
h.charCodeAt(p);if(48>q||57<q){h=w;break a}k=10*k+q-48}h=p==n?w:{$:0,a:45==m?-k:k}}return 1===h.$?w:{$:0,a:xa(Eb,a,g(pa,f,e),h,b,c,d)}}return{$:0,a:xa(Eb,a,e,w,b,c,d)}}),Gb=u(function(a,b,c,d){if(""===d)return w;var e=g(la,"/",d);return e.b?(e=e.a,L(Fb,a,g(oa,e,d),b,c,g(pa,e,d))):L(Fb,a,"/",b,c,d)}),Hb=n(function(a,b,c){if(""===c)return w;var d=g(la,"?",c);return d.b?(d=d.a,D(Gb,a,{$:0,a:g(oa,d+1,c)},b,g(pa,d,c))):D(Gb,a,w,b,c)});h(function(a,b){if(""===b)return w;var c=g(la,"#",b);return c.b?(c=
c.a,p(Hb,a,{$:0,a:g(oa,c+1,b)},g(pa,c,b))):p(Hb,a,w,b)});var Na=function(a){for(;;);},Mc=z(0),Ib=u(function(a,b,c,d){if(d.b){var e=d.a,f=d.b;if(f.b){d=f.a;var h=f.b;if(h.b){f=h.a;var k=h.b;return k.b?(h=k.a,k=k.b,b=500<c?p(na,a,b,O(k)):D(Ib,a,b,c+1,k),g(a,e,g(a,d,g(a,f,g(a,h,b))))):g(a,e,g(a,d,g(a,f,b)))}return g(a,e,g(a,d,b))}return g(a,e,b)}return b}),Ta=n(function(a,b,c){return D(Ib,a,b,0,c)}),Nc=h(function(a,b){return p(Ta,h(function(b,d){return g(G,a(b),d)}),m,b)}),qa=Ea,Ua=h(function(a,b){return g(qa,
function(b){return z(a(b))},b)}),Oc=n(function(a,b,c){return g(qa,function(b){return g(qa,function(c){return z(g(a,b,c))},c)},b)}),Pc=function(a){return p(Ta,Oc(G),z(m),a)},Qc=h(function(a,b){return fb(g(qa,rc(a),b))}),Rc=n(function(a,b,c){return g(Ua,function(a){return 0},Pc(g(Nc,Qc(a),b)))}),Sc=n(function(a,b,c){return z(0)}),Tc=h(function(a,b){return g(Ua,a,b)});r.Task={b:Mc,c:Rc,d:Sc,e:Tc,f:void 0};var Uc=Fa("Task"),Ma=h(function(a,b){return Uc(g(Ua,a,b))}),Va=T(function(a,b,c,d,e){return{d:c,
f:d,n:a,N:b,g:e}}),Wa={$:2,m:m},Vc=function(a){return{$:1,a:a}},Jb={$:2,b:function(a){return"string"===typeof a?{$:0,a:a}:a instanceof String?{$:0,a:a+""}:H("a STRING",a)}},Wc=function(a,b){r[a]&&M(3,a);r[a]={f:tc,r:b,a:Yb};return Fa(a)}("converted_text",Jb),Xc=function(a){return p(na,h(function(a,c){return p(pc,a.a,a.b,c)}),{},a)},aa=function(a,b){r[a]&&M(3,a);r[a]={e:sc,r:b,a:Xb};return Fa(a)}("convert",function(a){return Xc(k([t("a2u",a.d),t("englishNumbers",a.f),t("input",a.x),t("removeExtraSpaces",
a.g)]))}),Yc=h(function(a,b){switch(a.$){case 0:return a=a.a,t(L(Va,a,"",b.d,b.f,b.g),aa({d:b.d,f:b.f,x:a,g:b.g}));case 1:return t(X(b,{N:a.a}),Wa);case 2:return a=a.a,t(X(b,{f:a}),aa({d:b.d,f:a,x:b.n,g:b.g}));case 3:return a=a.a,t(X(b,{g:a}),aa({d:b.d,f:b.f,x:b.n,g:a}));case 4:return a=a.a,t(X(b,{d:a}),aa({d:a,f:b.f,x:b.n,g:b.g}));case 5:return a=a.a,t(X(b,{d:!a}),aa({d:!a,f:b.f,x:b.n,g:b.g}));default:return t(L(Va,"","",!0,!1,!1),Wa)}}),Zc=function(a){return{$:4,a:a}},$c=function(a){return{$:0,
a:a}},ad={$:6},bd=function(a){return{$:2,a:a}},cd=function(a){return{$:3,a:a}},dd=function(a){return{$:5,a:a}},ed=R("button"),Kb=h(function(a,b){return g(yb,a,b)}),ra=Kb("checked"),ba=h(function(a,b){return g(yb,a,b)}),I=ba("className"),J=R("div"),fd=ba("id"),sa=R("input"),ta=R("label"),Lb=h(function(a,b){return g(La,a,{$:0,a:b})}),Mb=h(function(a,b){return p(Ta,lc,b,a)}),gd=g(Mb,k(["target","checked"]),{$:2,b:function(a){return"boolean"===typeof a?{$:0,a:a}:H("a BOOL",a)}}),ua=function(a){return g(Lb,
"change",g(ma,a,gd))},hd=function(a){return t(a,!0)},id=h(function(a,b){return g(La,a,{$:1,a:b})}),jd=g(Mb,k(["target","value"]),Jb),kd=Kb("readOnly"),ld=R("span"),Nb=R("textarea"),md=ba("title"),va=ba("type"),nd=ba("value");(function(a){wa.Elm?jb(wa.Elm,a):wa.Elm=a})({Converter:{init:xc({aw:function(a){return t(L(Va,"","",!0,!1,!1),Wa)},aC:function(a){return Wc(Vc)},aE:Yc,aF:function(a){var b=""===a.n?0:Oa(k(a.n.trim().split(/\s+/g)));return g(J,k([fd("app")]),k([g(J,k([I("container")]),k([g(J,k([I("controls")]),
k([g(J,k([I("english-numbers")]),k([g(ta,m,k([g(sa,k([va("checkbox"),ra(a.f),ua(bd)]),m),{$:0,a:"\u0c86\u0c82\u0c97\u0ccd\u0cb2 \u0cb8\u0c82\u0c96\u0ccd\u0caf\u0cc6\u0c97\u0cb3\u0cc1"}])),g(ta,m,k([g(sa,k([va("checkbox"),ra(a.g),ua(cd)]),m),{$:0,a:"\u0cb9\u0cc6\u0c9a\u0ccd\u0c9a\u0cbf\u0ca8 Space \u0ca4\u0cc6\u0c97\u0cc6\u0caf\u0cbf\u0cb0\u0cbf"}]))])),g(J,k([I("convert-type")]),k([g(ta,m,k([g(sa,k([va("radio"),ra(a.d),ua(Zc)]),m),{$:0,a:"ASCII to Unicode"}])),g(ta,m,k([g(sa,k([va("radio"),ra(!a.d),
ua(dd)]),m),{$:0,a:"Unicode to ASCII"}]))])),g(ed,k([g(Lb,"click",{$:0,a:ad})]),k([{$:0,a:"Reset"}]))])),g(J,k([I("clear")]),m),g(J,k([I("left")]),k([g(ld,k([I("num-words"),md(b+" \u0caa\u0ca6(\u0c97\u0cb3\u0cc1)")]),k([{$:0,a:b+""}])),{$:0,a:(a.d?"\u0cac\u0cb0\u0cb9/\u0ca8\u0cc1\u0ca1\u0cbf\u0caf\u0cbf\u0c82\u0ca6 \u0caf\u0cc1\u0ca8\u0cbf\u0c95\u0ccb\u0ca1\u0ccd \u0c97\u0cc6":"\u0caf\u0cc1\u0ca8\u0cbf\u0c95\u0ccb\u0ca1\u0ccd \u0ca8\u0cbf\u0c82\u0ca6 \u0cac\u0cb0\u0cb9/\u0ca8\u0cc1\u0ca1\u0cbf\u0c97\u0cc6")+
" \u0cac\u0ca6\u0cb2\u0cbe\u0caf\u0cbf\u0cb8\u0cb2\u0cc1 \u0c87\u0cb2\u0ccd\u0cb2\u0cbf \u0cac\u0cb0\u0cc6\u0caf\u0cbf\u0cb0\u0cbf..."},g(Nb,k([g(id,"input",g(ma,hd,g(ma,$c,jd))),nd(a.n)]),m)])),g(J,k([I("right")]),k([{$:0,a:(a.d?"\u0cac\u0cb0\u0cb9/\u0ca8\u0cc1\u0ca1\u0cbf\u0caf\u0cbf\u0c82\u0ca6 \u0caf\u0cc1\u0ca8\u0cbf\u0c95\u0ccb\u0ca1\u0ccd \u0c97\u0cc6":"\u0caf\u0cc1\u0ca8\u0cbf\u0c95\u0ccb\u0ca1\u0ccd \u0ca8\u0cbf\u0c82\u0ca6 \u0cac\u0cb0\u0cb9/\u0ca8\u0cc1\u0ca1\u0cbf\u0c97\u0cc6")+" \u0cac\u0ca6\u0cb2\u0cbe\u0cb5\u0ca3\u0cc6\u0c97\u0cca\u0c82\u0ca1 \u0caa\u0ca0\u0ccd\u0caf.."},
g(Nb,k([kd(!0)]),k([{$:0,a:a.N}]))])),g(J,k([I("clear")]),m)]))]))}})({$:0,a:0})(0)}})})(this);
/*!
normalize.css v^3.0 | MIT License | git.io/normalize
Copyright (c) Nicolas Gallagher and Jonathan Neal
*/
/*! normalize.css v3.0.2 | MIT License | git.io/normalize */html {
font-family:sans-serif;
-ms-text-size-adjust:100%;
-webkit-text-size-adjust:100%
}
body{
margin:0;
padding:0;
}
.clear{
clear: both;
height: 1px;
width: 100%;
}
body{
background-color: #333;
font-size: 14px;
line-height: 1.5;
}
.top-bar{
width: 98%;
margin: auto;
}
#app{
background-color: #eee;
padding-top: 10px;
}
.container{
width: 98%;
margin: auto;
}
.left{
width: 50%;
float: left;
}
.right{
width: 50%;
float: left;
text-align: right;
}
.left textarea, .right textarea{
width: 94%;
min-height: 900px;
border: 1px solid #bbb;
padding: 2%;
}
.controls{
margin-bottom: 10px;
padding: 10px;
}
.convert-type, .english-numbers{
display: inline-block;
margin-right: 30px;
}
.english-numbers label{
margin-right: 20px;
}
.convert-type input, .english-numbers input{
margin-right: 5px;
}
.convert-type label{
margin-right: 20px;
}
.project-summary-bar{
background-color: #ffdead;
}
.project-summary{
width: 98%;
margin: auto;
padding-top: 20px;
padding-bottom: 20px;
}
.num-words {
display: inline-block;
float: right;
margin-right: 2%;
background-color: #333;
padding: 5px 5px;
color: #fff;
margin-top: -10px;
}
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link href="static/fav3860.png?v=1" rel="icon" type="image/x-icon" />
<meta property="og:site_name" content="Kannada ASCII/Unicode Converter - Aravinda VK"/>
<link rel="apple-touch-icon" href="static/fav3860.png?v=1" />
<title>ಸಂಕ - ಆಸ್ಕಿ ಮತ್ತು ಯುನಿಕೋಡಿಗೆ ಕನ್ನಡದ ಸಂಕ (Kannada ASCII/Unicode Converter)</title>
<meta property="og:title" content="Kannada ASCII/Unicode Converter"/>
<meta property="twitter:title" content="Kannada ASCII/Unicode Converter"/>
<meta name="description" content="Tool for Kannada to convert from Nudi/Baraha to Unicode or back to Nudi/Baraha from Unicode"/>
<meta property="og:description" content="Tool for Kannada to convert from Nudi/Baraha to Unicode or back to Nudi/Baraha from Unicode"/>
<meta property="twitter:description" content="Tool for Kannada to convert from Nudi/Baraha to Unicode or back to Nudi/Baraha from Unicode"/>
<meta property="og:url" content="http://aravindavk.in/knconverter" />
<meta property="twitter:url" content="http://aravindavk.in/knconverter" />
<link rel="stylesheet" href="static/app5e1f.css?v=2" />
<script type="text/javascript" src="static/kn5e1f.js?v=2"></script>
<script type="text/javascript" src="static/app.min5e1f.js?v=2"></script>
</head>
<body>
<div class="top-bar">
<img src="static/logo.png"/>
</div>
<div class="project-summary-bar">
<div class="project-summary">
<p>ನುಡಿ ಅಥವಾ ಬರಹ ಉಪಯೋಗಿಸಿ ಬರೆದ ಪಠ್ಯವನ್ನು ಯುನಿಕೋಡ್ ಗೆ ಬದಲಾಯಿಸಬೇಕಿದ್ದರೆ ಅಥವಾ ಯುನಿಕೋಡ್ ನಿಂದ ಬರಹ/ನುಡಿ ಗೆ ಬದಲಾಯಿಸಬೇಕಿದ್ದರೆ ಎಡಗಡೆ ಇರುವ ಜಾಗದಲ್ಲಿ ಬರೆಯಿರಿ.
</div>
</div>
<div id="elmapp"></div>
<script type="text/javascript">
var app = Elm.Converter.init({
node: document.getElementById('elmapp')
});
app.ports.convert.subscribe(function(args) {
if (args.a2u){
var out = kn.ascii_to_unicode(args.input, args.englishNumbers, args.removeExtraSpaces);
} else {
var out = kn.unicode_to_ascii(args.input, args.englishNumbers, args.removeExtraSpaces);
}
app.ports.converted_text.send(out);
});
</script>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','../../www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-86926039-1', 'auto');
ga('send', 'pageview');
</script>
</body>
<!-- Mirrored from aravindavk.in/sanka/ -->
</html>
Kn.prototype._replace_a2u_anuswara_visarga = function(txt) { return txt.replace('A', 'ಂ').replace('B', 'ಃ');}
Kn.prototype._replace_from_map = function(txt){
return txt.replace(/μï/g, "ಷ್").replace(/μË/g, "ಷೌ").replace(/μÉÊ/g, "ಷೈ").replace(/μÉÆÃ/g, "ಷೋ").replace(/μÉÆ/g, "ಷೊ").replace(/μÉÃ/g, "ಷೇ").replace(/μÉ/g, "ಷೆ").replace(/μÁ/g, "ಷಾ").replace(/μÀÈ/g, "ಷೃ").replace(/μÀÆ/g, "ಷೂ").replace(/μÀÄ/g, "ಷು").replace(/μÀ/g, "ಷ").replace(/¿õï/g, "ೞ್‌").replace(/¿õË/g, "ೞೌ").replace(/¿õÉÊ/g, "ೞೈ").replace(/¿õÉÆÃ/g, "ೞೋ").replace(/¿õÉÆ/g, "ೞೊ").replace(/¿õÉÃ/g, "ೞೇ").replace(/¿õÉ/g, "ೞೆ").replace(/¿õÁ/g, "ೞಾ").replace(/¿õÀ/g, "ೞ").replace(/¿È/g, "ೞೃ").replace(/¿Æ/g, "ೞೂ").replace(/¿Ä/g, "ೞು").replace(/¿Â/g, "ೞಿ").replace(/¾õï/g, "ಱ್‌").replace(/¾õË/g, "ಱೌ").replace(/¾õÉÊ/g, "ಱೈ").replace(/¾õÉÆÃ/g, "ಱೋ").replace(/¾õÉÆ/g, "ಱೊ").replace(/¾õÉÃ/g, "ಱೇ").replace(/¾õÉ/g, "ಱೆ").replace(/¾õÁ/g, "ಱಾ").replace(/¾õÀ/g, "ಱ").replace(/¾È/g, "ಱೃ").replace(/¾Æ/g, "ಱೂ").replace(/¾Ä/g, "ಱು").replace(/¾Â/g, "ಱಿ").replace(/½Ã/g, "ಳೀ").replace(/½/g, "ಳಿ").replace(/¼ï/g, "ಳ್").replace(/¼Ë/g, "ಳೌ").replace(/¼ÉÊ/g, "ಳೈ").replace(/¼ÉÆÃ/g, "ಳೋ").replace(/¼ÉÆ/g, "ಳೊ").replace(/¼ÉÃ/g, "ಳೇ").replace(/¼É/g, "ಳೆ").replace(/¼Á/g, "ಳಾ").replace(/¼ÀÈ/g, "ಳೃ").replace(/¼ÀÆ/g, "ಳೂ").replace(/¼ÀÄ/g, "ಳು").replace(/¼À/g, "ಳ").replace(/»Ã/g, "ಹೀ").replace(/»/g, "ಹಿ").replace(/ºï/g, "ಹ್").replace(/ºË/g, "ಹೌ").replace(/ºÉÊ/g, "ಹೈ").replace(/ºÉÆÃ/g, "ಹೋ").replace(/ºÉÆ/g, "ಹೊ").replace(/ºÉÃ/g, "ಹೇ").replace(/ºÉ/g, "ಹೆ").replace(/ºÁ/g, "ಹಾ").replace(/ºÀÈ/g, "ಹೃ").replace(/ºÀÆ/g, "ಹೂ").replace(/ºÀÄ/g, "ಹು").replace(/ºÀ/g, "ಹ").replace(/¹Ã/g, "ಸೀ").replace(/¹/g, "ಸಿ").replace(/¸ï/g, "ಸ್").replace(/¸Ë/g, "ಸೌ").replace(/¸ÉÊ/g, "ಸೈ").replace(/¸ÉÆÃ/g, "ಸೋ").replace(/¸ÉÆ/g, "ಸೊ").replace(/¸ÉÃ/g, "ಸೇ").replace(/¸É/g, "ಸೆ").replace(/¸Á/g, "ಸಾ").replace(/¸ÀÈ/g, "ಸೃ").replace(/¸ÀÆ/g, "ಸೂ").replace(/¸ÀÄ/g, "ಸು").replace(/¸À/g, "ಸ").replace(/¶Ã/g, "ಷೀ").replace(/¶/g, "ಷಿ").replace(/µï/g, "ಷ್").replace(/µË/g, "ಷೌ").replace(/µÉÊ/g, "ಷೈ").replace(/µÉÆÃ/g, "ಷೋ").replace(/µÉÆ/g, "ಷೊ").replace(/µÉÃ/g, "ಷೇ").replace(/µÉ/g, "ಷೆ").replace(/µÁ/g, "ಷಾ").replace(/µÀÈ/g, "ಷೃ").replace(/µÀÆ/g, "ಷೂ").replace(/µÀÄ/g, "ಷು").replace(/µÀ/g, "ಷ").replace(/²Ã/g, "ಶೀ").replace(/²/g, "ಶಿ").replace(/±ï/g, "ಶ್").replace(/±Ë/g, "ಶೌ").replace(/±ÉÊ/g, "ಶೈ").replace(/±ÉÆÃ/g, "ಶೋ").replace(/±ÉÆ/g, "ಶೊ").replace(/±ÉÃ/g, "ಶೇ").replace(/±É/g, "ಶೆ").replace(/±Á/g, "ಶಾ").replace(/±ÀÈ/g, "ಶೃ").replace(/±ÀÆ/g, "ಶೂ").replace(/±ÀÄ/g, "ಶು").replace(/±À/g, "ಶ").replace(/°Ã/g, "ಲೀ").replace(/°/g, "ಲಿ").replace(/¯ï/g, "ಲ್").replace(/¯Ë/g, "ಲೌ").replace(/¯ÉÊ/g, "ಲೈ").replace(/¯ÉÆÃ/g, "ಲೋ").replace(/¯ÉÆ/g, "ಲೊ").replace(/¯ÉÃ/g, "ಲೇ").replace(/¯É/g, "ಲೆ").replace(/¯Á/g, "ಲಾ").replace(/®È/g, "ಲೃ").replace(/®Æ/g, "ಲೂ").replace(/®Ä/g, "ಲು").replace(/®/g, "ಲ").replace(/¬ÄÃ/g, "ಯೀ").replace(/¬Ä/g, "ಯಿ").replace(/«ÄÃ/g, "ಮೀ").replace(/«Ä/g, "ಮಿ").replace(/«Ã/g, "ವೀ").replace(/«/g, "ವಿ").replace(/ªï/g, "ವ್").replace(/ªË/g, "ವೌ").replace(/ªÉÊ/g, "ವೈ").replace(/ªÉÇÃ/g, "ವೋ").replace(/ªÉÇ/g, "ವೊ").replace(/ªÉÆÃ/g, "ಮೋ").replace(/ªÉÆ/g, "ಮೊ").replace(/ªÉÄÊ/g, "ಮೈ").replace(/ªÉÄÃ/g, "ಮೇ").replace(/ªÉÄ/g, "ಮೆ").replace(/ªÉÃ/g, "ವೇ").replace(/ªÉ/g, "ವೆ").replace(/ªÁ/g, "ವಾ").replace(/ªÀÈ/g, "ವೃ").replace(/ªÀÇ/g, "ವೂ").replace(/ªÀÅ/g, "ವು").replace(/ªÀÄÈ/g, "ಮೃ").replace(/ªÀÄÆ/g, "ಮೂ").replace(/ªÀÄÄ/g, "ಮು").replace(/ªÀÄ/g, "ಮ").replace(/ªÀiï/g, "ಮ್").replace(/ªÀiË/g, "ಮೌ").replace(/ªÀiÁ/g, "ಮಾ").replace(/ªÀ/g, "ವ").replace(/©üÃ/g, "ಭೀ").replace(/©ü/g, "ಭಿ").replace(/©Ã/g, "ಬೀ").replace(/©/g, "ಬಿ").replace(/¨ï/g, "ಬ್").replace(/¨Ë/g, "ಬೌ").replace(/¨ÉÊ/g, "ಬೈ").replace(/¨ÉÆÃ/g, "ಬೋ").replace(/¨ÉÆ/g, "ಬೊ").replace(/¨ÉÃ/g, "ಬೇ").replace(/¨É/g, "ಬೆ").replace(/¨Á/g, "ಬಾ").replace(/¨sï/g, "ಭ್").replace(/¨sË/g, "ಭೌ").replace(/¨sÉÊ/g, "ಭೈ").replace(/¨sÉÆÃ/g, "ಭೋ").replace(/¨sÉÆ/g, "ಭೊ").replace(/¨sÉÃ/g, "ಭೇ").replace(/¨sÉ/g, "ಭೆ").replace(/¨sÁ/g, "ಭಾ").replace(/¨sÀÈ/g, "ಭೃ").replace(/¨sÀÆ/g, "ಭೂ").replace(/¨sÀÄ/g, "ಭು").replace(/¨sÀ/g, "ಭ").replace(/§È/g, "ಬೃ").replace(/§Æ/g, "ಬೂ").replace(/§Ä/g, "ಬು").replace(/§/g, "ಬ").replace(/¦üÃ/g, "ಫೀ").replace(/¦ü/g, "ಫಿ").replace(/¦Ã/g, "ಪೀ").replace(/¦/g, "ಪಿ").replace(/¥ï/g, "ಪ್").replace(/¥Ë/g, "ಪೌ").replace(/¥ÉÊ/g, "ಪೈ").replace(/¥ÉÇÃ/g, "ಪೋ").replace(/¥ÉÇ/g, "ಪೊ").replace(/¥ÉÆÃ/g, "ಪೋ").replace(/¥ÉÆ/g, "ಪೊ").replace(/¥ÉÃ/g, "ಪೇ").replace(/¥É/g, "ಪೆ").replace(/¥Á/g, "ಪಾ").replace(/¥ÀÈ/g, "ಪೃ").replace(/¥ÀÇ/g, "ಪೂ").replace(/¥ÀÆ/g, "ಪೂ").replace(/¥ÀÅ/g, "ಪು").replace(/¥ÀÄ/g, "ಪು").replace(/¥À/g, "ಪ").replace(/¥sï/g, "ಫ್").replace(/¥sË/g, "ಫೌ").replace(/¥sÉÊ/g, "ಫೈ").replace(/¥sÉÇÃ/g, "ಫೋ").replace(/¥sÉÇ/g, "ಫೊ").replace(/¥sÉÆÃ/g, "ಫೋ").replace(/¥sÉÆ/g, "ಫೊ").replace(/¥sÉÃ/g, "ಫೇ").replace(/¥sÉ/g, "ಫೆ").replace(/¥sÁ/g, "ಫಾ").replace(/¥sÀÈ/g, "ಫೃ").replace(/¥sÀÇ/g, "ಫೂ").replace(/¥sÀÆ/g, "ಫೂ").replace(/¥sÀÅ/g, "ಫು").replace(/¥sÀÄ/g, "ಫು").replace(/¥sÀ/g, "ಫ").replace(/¤Ã/g, "ನೀ").replace(/¤/g, "ನಿ").replace(/£ï/g, "ನ್").replace(/£Ë/g, "ನೌ").replace(/£ÉÊ/g, "ನೈ").replace(/£ÉÆÃ/g, "ನೋ").replace(/£ÉÆ/g, "ನೊ").replace(/£ÉÃ/g, "ನೇ").replace(/£É/g, "ನೆ").replace(/£Á/g, "ನಾ").replace(/£ÀÈ/g, "ನೃ").replace(/£ÀÆ/g, "ನೂ").replace(/£ÀÄ/g, "ನು").replace(/£À/g, "ನ").replace(/¢üÃ/g, "ಧೀ").replace(/¢ü/g, "ಧಿ").replace(/¢Ã/g, "ದೀ").replace(/¢/g, "ದಿ").replace(/zï/g, "ದ್").replace(/zË/g, "ದೌ").replace(/zÉÊ/g, "ದೈ").replace(/zÉÆÃ/g, "ದೋ").replace(/zÉÆ/g, "ದೊ").replace(/zÉÃ/g, "ದೇ").replace(/zÉ/g, "ದೆ").replace(/zÁ/g, "ದಾ").replace(/zÀÈ/g, "ದೃ").replace(/zÀÆ/g, "ದೂ").replace(/zÀÄ/g, "ದು").replace(/zÀ/g, "ದ").replace(/zsï/g, "ಧ್").replace(/zsË/g, "ಧೌ").replace(/zsÉÊ/g, "ಧೈ").replace(/zsÉÆÃ/g, "ಧೋ").replace(/zsÉÆ/g, "ಧೊ").replace(/zsÉÃ/g, "ಧೇ").replace(/zsÉ/g, "ಧೆ").replace(/zsÁ/g, "ಧಾ").replace(/zsÀÈ/g, "ಧೃ").replace(/zsÀÆ/g, "ಧೂ").replace(/zsÀÄ/g, "ಧು").replace(/zsÀ/g, "ಧ").replace(/yÃ/g, "ಥೀ").replace(/y/g, "ಥಿ").replace(/xï/g, "ಥ್").replace(/xË/g, "ಥೌ").replace(/xÉÊ/g, "ಥೈ").replace(/xÉÆÃ/g, "ಥೋ").replace(/xÉÆ/g, "ಥೊ").replace(/xÉÃ/g, "ಥೇ").replace(/xÉ/g, "ಥೆ").replace(/xÁ/g, "ಥಾ").replace(/xÀÈ/g, "ಥೃ").replace(/xÀÆ/g, "ಥೂ").replace(/xÀÄ/g, "ಥು").replace(/xÀ/g, "ಥ").replace(/wÃ/g, "ತೀ").replace(/w/g, "ತಿ").replace(/vï/g, "ತ್").replace(/vË/g, "ತೌ").replace(/vÉÊ/g, "ತೈ").replace(/vÉÆÃ/g, "ತೋ").replace(/vÉÆ/g, "ತೊ").replace(/vÉÃ/g, "ತೇ").replace(/vÉ/g, "ತೆ").replace(/vÁ/g, "ತಾ").replace(/vÀÈ/g, "ತೃ").replace(/vÀÆ/g, "ತೂ").replace(/vÀÄ/g, "ತು").replace(/vÀ/g, "ತ").replace(/uï/g, "ಣ್").replace(/uË/g, "ಣೌ").replace(/uÉÊ/g, "ಣೈ").replace(/uÉÆÃ/g, "ಣೋ").replace(/uÉÆ/g, "ಣೊ").replace(/uÉÃ/g, "ಣೇ").replace(/uÉ/g, "ಣೆ").replace(/uÁ/g, "ಣಾ").replace(/tÈ/g, "ಣೃ").replace(/tÆ/g, "ಣೂ").replace(/tÄ/g, "ಣು").replace(/tÂÃ/g, "ಣೀ").replace(/tÂ/g, "ಣಿ").replace(/t/g, "ಣ").replace(/rüÃ/g, "ಢೀ").replace(/rü/g, "ಢಿ").replace(/rÃ/g, "ಡೀ").replace(/r/g, "ಡಿ").replace(/qï/g, "ಡ್").replace(/qË/g, "ಡೌ").replace(/qÉÊ/g, "ಡೈ").replace(/qÉÆÃ/g, "ಡೋ").replace(/qÉÆ/g, "ಡೊ").replace(/qÉÃ/g, "ಡೇ").replace(/qÉ/g, "ಡೆ").replace(/qÁ/g, "ಡಾ").replace(/qÀÈ/g, "ಡೃ").replace(/qÀÆ/g, "ಡೂ").replace(/qÀÄ/g, "ಡು").replace(/qÀ/g, "ಡ").replace(/qsï/g, "ಢ್").replace(/qsË/g, "ಢೌ").replace(/qsÉÊ/g, "ಢೈ").replace(/qsÉÆÃ/g, "ಢೋ").replace(/qsÉÆ/g, "ಢೊ").replace(/qsÉÃ/g, "ಢೇ").replace(/qsÉ/g, "ಢೆ").replace(/qsÁ/g, "ಢಾ").replace(/qsÀÈ/g, "ಢೃ").replace(/qsÀÆ/g, "ಢೂ").replace(/qsÀÄ/g, "ಢು").replace(/qsÀ/g, "ಢ").replace(/pÃ/g, "ಠೀ").replace(/p/g, "ಠಿ").replace(/oï/g, "ಠ್").replace(/oË/g, "ಠೌ").replace(/oÉÊ/g, "ಠೈ").replace(/oÉÆÃ/g, "ಠೋ").replace(/oÉÆ/g, "ಠೊ").replace(/oÉÃ/g, "ಠೇ").replace(/oÉ/g, "ಠೆ").replace(/oÁ/g, "ಠಾ").replace(/oÀÈ/g, "ಠೃ").replace(/oÀÆ/g, "ಠೂ").replace(/oÀÄ/g, "ಠು").replace(/oÀ/g, "ಠ").replace(/nÃ/g, "ಟೀ").replace(/n/g, "ಟಿ").replace(/mï/g, "ಟ್").replace(/mË/g, "ಟೌ").replace(/mÉÊ/g, "ಟೈ").replace(/mÉÆÃ/g, "ಟೋ").replace(/mÉÆ/g, "ಟೊ").replace(/mÉÃ/g, "ಟೇ").replace(/mÉ/g, "ಟೆ").replace(/mÁ/g, "ಟಾ").replace(/lÈ/g, "ಟೃ").replace(/lÆ/g, "ಟೂ").replace(/lÄ/g, "ಟು").replace(/l/g, "ಟ").replace(/kï/g, "ಞ್").replace(/k/g, "ಞ").replace(/jÃ/g, "ರೀ").replace(/jhÄÃ/g, "ಝೀ").replace(/jhÄ/g, "ಝಿ").replace(/j/g, "ರಿ").replace(/gï/g, "ರ್").replace(/gË/g, "ರೌ").replace(/gÉÊ/g, "ರೈ").replace(/gÉÆÃ/g, "ರೋ").replace(/gÉÆ/g, "ರೊ").replace(/gÉÃ/g, "ರೇ").replace(/gÉhÆÃ/g, "ಝೋ").replace(/gÉhÆ/g, "ಝೊ").replace(/gÉhÄÊ/g, "ಝೈ").replace(/gÉhÄÃ/g, "ಝೇ").replace(/gÉhÄ/g, "ಝೆ").replace(/gÉ/g, "ರೆ").replace(/gÁ/g, "ರಾ").replace(/gÀÈ/g, "ರೃ").replace(/gÀÆ/g, "ರೂ").replace(/gÀÄ/g, "ರು").replace(/gÀhÄÈ/g, "ಝೃ").replace(/gÀhÄÆ/g, "ಝೂ").replace(/gÀhÄÄ/g, "ಝು").replace(/gÀhÄ/g, "ಝ").replace(/gÀhiï/g, "ಝ್").replace(/gÀhiË/g, "ಝೌ").replace(/gÀhiÁ/g, "ಝಾ").replace(/gÀ/g, "ರ").replace(/fÃ/g, "ಜೀ").replace(/f/g, "ಜಿ").replace(/eï/g, "ಜ್").replace(/eË/g, "ಜೌ").replace(/eÉÊ/g, "ಜೈ").replace(/eÉÆÃ/g, "ಜೋ").replace(/eÉÆ/g, "ಜೊ").replace(/eÉÃ/g, "ಜೇ").replace(/eÉ/g, "ಜೆ").replace(/eÁ/g, "ಜಾ").replace(/dÈ/g, "ಜೃ").replace(/dÆ/g, "ಜೂ").replace(/dÄ/g, "ಜು").replace(/d/g, "ಜ").replace(/cÃ/g, "ಛೀ").replace(/c/g, "ಛಿ").replace(/bï/g, "ಛ್").replace(/bË/g, "ಛೌ").replace(/bÉÊ/g, "ಛೈ").replace(/bÉÆÃ/g, "ಛೋ").replace(/bÉÆ/g, "ಛೊ").replace(/bÉÃ/g, "ಛೇ").replace(/bÉ/g, "ಛೆ").replace(/bÁ/g, "ಛಾ").replace(/bÀÈ/g, "ಛೃ").replace(/bÀÆ/g, "ಛೂ").replace(/bÀÄ/g, "ಛು").replace(/bÀ/g, "ಛ").replace(/aÃ/g, "ಚೀ").replace(/a/g, "ಚಿ").replace(/Zï/g, "ಚ್").replace(/ZË/g, "ಚೌ").replace(/ZÉÊ/g, "ಚೈ").replace(/ZÉÆÃ/g, "ಚೋ").replace(/ZÉÆ/g, "ಚೊ").replace(/ZÉÃ/g, "ಚೇ").replace(/ZÉ/g, "ಚೆ").replace(/ZÁ/g, "ಚಾ").replace(/ZÀÈ/g, "ಚೃ").replace(/ZÀÆ/g, "ಚೂ").replace(/ZÀÄ/g, "ಚು").replace(/ZÀ/g, "ಚ").replace(/Yï/g, "ಙ್").replace(/Y/g, "ಙ").replace(/XÃ/g, "ಘೀ").replace(/X/g, "ಘಿ").replace(/Wï/g, "ಘ್").replace(/WË/g, "ಘೌ").replace(/WÉÊ/g, "ಘೈ").replace(/WÉÆÃ/g, "ಘೋ").replace(/WÉÆ/g, "ಘೊ").replace(/WÉÃ/g, "ಘೇ").replace(/WÉ/g, "ಘೆ").replace(/WÁ/g, "ಘಾ").replace(/WÀÈ/g, "ಘೃ").replace(/WÀÆ/g, "ಘೂ").replace(/WÀÄ/g, "ಘು").replace(/WÀ/g, "ಘ").replace(/VÃ/g, "ಗೀ").replace(/V/g, "ಗಿ").replace(/Uï/g, "ಗ್").replace(/UË/g, "ಗೌ").replace(/UÉÊ/g, "ಗೈ").replace(/UÉÆÃ/g, "ಗೋ").replace(/UÉÆ/g, "ಗೊ").replace(/UÉÃ/g, "ಗೇ").replace(/UÉ/g, "ಗೆ").replace(/UÁ/g, "ಗಾ").replace(/UÀÈ/g, "ಗೃ").replace(/UÀÆ/g, "ಗೂ").replace(/UÀÄ/g, "ಗು").replace(/UÀ/g, "ಗ").replace(/TÃ/g, "ಖೀ").replace(/T/g, "ಖಿ").replace(/Sï/g, "ಖ್").replace(/SË/g, "ಖೌ").replace(/SÉÊ/g, "ಖೈ").replace(/SÉÆÃ/g, "ಖೋ").replace(/SÉÆ/g, "ಖೊ").replace(/SÉÃ/g, "ಖೇ").replace(/SÉ/g, "ಖೆ").replace(/SÁ/g, "ಖಾ").replace(/RÈ/g, "ಖೃ").replace(/RÆ/g, "ಖೂ").replace(/RÄ/g, "ಖು").replace(/R/g, "ಖ").replace(/QÃ/g, "ಕೀ").replace(/Q/g, "ಕಿ").replace(/Pï/g, "ಕ್").replace(/PË/g, "ಕೌ").replace(/PÉÊ/g, "ಕೈ").replace(/PÉÆÃ/g, "ಕೋ").replace(/PÉÆ/g, "ಕೊ").replace(/PÉÃ/g, "ಕೇ").replace(/PÉ/g, "ಕೆ").replace(/PÁ/g, "ಕಾ").replace(/PÀÈ/g, "ಕೃ").replace(/PÀÆ/g, "ಕೂ").replace(/PÀÄ/g, "ಕು").replace(/PÀ/g, "ಕ").replace(/O/g, "ಔ").replace(/N/g, "ಓ").replace(/M/g, "ಒ").replace(/L/g, "ಐ").replace(/K/g, "ಏ").replace(/J/g, "ಎ").replace(/IÆ2/g, "ೠ").replace(/IÄ/g, "ಋ").replace(/H/g, "ಊ").replace(/G/g, "ಉ").replace(/F/g, "ಈ").replace(/E/g, "ಇ").replace(/D/g, "ಆ").replace(/C/g, "ಅ").replace(/AiÉÆÃ/g, "ಯೋ").replace(/AiÉÆ/g, "ಯೊ").replace(/AiÉÄÊ/g, "ಯೈ").replace(/AiÉÄÃ/g, "ಯೇ").replace(/AiÉÄ/g, "ಯೆ").replace(/AiÀÄÈ/g, "ಯೃ").replace(/AiÀÄÆ/g, "ಯೂ").replace(/AiÀÄÄ/g, "ಯು").replace(/AiÀÄ/g, "ಯ").replace(/AiÀiï/g, "ಯ್").replace(/AiÀiË/g, "ಯೌ").replace(/AiÀiÁ/g, "ಯಾ").replace(/0iÉÆÃ/g, "ಯೋ").replace(/0iÉÆ/g, "ಯೊ").replace(/0iÉÄÊ/g, "ಯೈ").replace(/0iÉÄÃ/g, "ಯೇ").replace(/0iÉÄ/g, "ಯೆ").replace(/0iÀÄÈ/g, "ಯೃ").replace(/0iÀÄÆ/g, "ಯೂ").replace(/0iÀÄÄ/g, "ಯು").replace(/0iÀÄ/g, "ಯ").replace(/0iÀiï/g, "ಯ್").replace(/0iÀiË/g, "ಯೌ").replace(/0iÀiÁ/g, "ಯಾ");
}
Kn.prototype._REGEX_ASCII_ZWNJ = new RegExp('(ï)([JRmpL°¬aej0μqC§Sªkv¿y¢¼lAbFU£E®¾±DGKPMQZo²¹z¶½¨»urT¦gndNfwWI¤¯tHc«µO¸VYºx¥©X])', 'g');
Kn.prototype._REGEX_ASCII_VATTAKSHARA_3 = new RegExp('([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])', 'g');
Kn.prototype._REGEX_ASCII_VATTAKSHARA_2 = new RegExp('([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])', 'g');
Kn.prototype._REGEX_ASCII_VATTAKSHARA_1 = new RegExp('([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])', 'g');
Kn.prototype._u2a_deerga_handle = function(txt) {
txt = txt.replace( /(Ã)([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])/g, function(match, g1, g2, g3, g4) { return g2 + g3 + g4 + g1; } );
txt = txt.replace( /(Ã)([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])/g, function(match, g1, g2, g3) { return g2 + g3 + g1; } );
txt = txt.replace( /(Ã)([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])/g, function(match, g1, g2) { return g2 + g1; } );
return txt;}
Kn.prototype._replace_vattakshara =function(txt){
return txt.replace(/Ì/g, "್ಕ").replace(/Í/g, "್ಖ").replace(/Î/g, "್ಗ").replace(/Ï/g, "್ಘ").replace(/Ð/g, "್ಙ").replace(/Ñ/g, "್ಚ").replace(/Ò/g, "್ಛ").replace(/Ó/g, "್ಜ").replace(/Ô/g, "್ಝ").replace(/Õ/g, "್ಞ").replace(/Ö/g, "್ಟ").replace(/×/g, "್ಠ").replace(/Ø/g, "್ಡ").replace(/Ù/g, "್ಢ").replace(/Ú/g, "್ಣ").replace(/Û/g, "್ತ").replace(/Ü/g, "್ಥ").replace(/Ý/g, "್ದ").replace(/Þ/g, "್ಧ").replace(/ß/g, "್ನ").replace(/à/g, "್ಪ").replace(/á/g, "್ಫ").replace(/â/g, "್ಬ").replace(/ã/g, "್ಭ").replace(/ä/g, "್ಮ").replace(/å/g, "್ಯ").replace(/æ/g, "್ರ").replace(/è/g, "್ಲ").replace(/é/g, "್ವ").replace(/ê/g, "್ಶ").replace(/ë/g, "್ಷ").replace(/ì/g, "್ಸ").replace(/í/g, "್ಹ").replace(/î/g, "್ಳ").replace(/ù/g, "್ಱ").replace(/ú/g, "್ೞ").replace(/ø/g, "ೃ").replace(/ñ/g, "ೄ").replace(/„/g, "ಽ").replace(/ó/g, "಼");
}
Kn.prototype._a2u_deerga_handle = function(txt) { return txt.replace( /([ಿೆೊ])(Ã)/g, function(match, g1, g2) { if (g1 == 'ಿ') { return 'ೀ'; } if (g1 == 'ೆ') { return 'ೇ'; } if (g1 == 'ೊ') { return 'ೋ'; } });}
Kn.prototype._REGEX_UNI_ASCII_ARKAVATTU = new RegExp('([ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])?(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])?([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])?([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])?ð', 'g');
Kn.prototype._REGEX_UNI_REPH_BEFORE_CONVERT = new RegExp('[^್]?([ರ])(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])?(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])?([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])?([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])?', 'g');
Kn.prototype._REGEX_UNI_REPH_WITHOUT_ZWJ = new RegExp('^([ರ])(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])?(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])?([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])?([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])?$', 'g');
Kn.prototype._REGEX_UNI_VATTAKSHARA = new RegExp('^([ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])‍?(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])?(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])?([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])?([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])?$', 'g');
Kn.prototype._REGEX_UNI_VOWEL_PLUS_ANUSVARA_VISARGA = new RegExp('^([ಅಆಇಈಉಊಋೠಎಏಐಒಓಔಅಂಅಃ])([ಂಃ])$', 'g');
Kn.prototype._REGEX_UNI_CONSONANT_PLUS_VOWEL = new RegExp('^([ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])?([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])?$', 'g');
Kn.prototype._anusvara_visarga = ["\u0c82", "\u0c83"];
Kn.prototype._vowels = ["\u0c85", "\u0c86", "\u0c87", "\u0c88", "\u0c89", "\u0c8a", "\u0c8b", "\u0ce0", "\u0c8e", "\u0c8f", "\u0c90", "\u0c92", "\u0c93", "\u0c94", "\u0c85\u0c82", "\u0c85\u0c83"];
Kn.prototype._halant = "\u0ccd";
Kn.prototype._consonants = ["\u0c95", "\u0c96", "\u0c97", "\u0c98", "\u0c99", "\u0c9a", "\u0c9b", "\u0c9c", "\u0c9d", "\u0c9e", "\u0c9f", "\u0ca0", "\u0ca1", "\u0ca2", "\u0ca3", "\u0ca4", "\u0ca5", "\u0ca6", "\u0ca7", "\u0ca8", "\u0caa", "\u0cab", "\u0cac", "\u0cad", "\u0cae", "\u0caf", "\u0cb0", "\u0cb2", "\u0cb5", "\u0cb6", "\u0cb7", "\u0cb8", "\u0cb9", "\u0cb3", "\u0cb1", "\u0cde"];
Kn.prototype._dep_vowels = ["\u0ccd", "\u0cbe", "\u0cbf", "\u0cc0", "\u0cc1", "\u0cc2", "\u0cc3", "\u0cc6", "\u0cc7", "\u0cc8", "\u0cca", "\u0ccb", "\u0ccc", "\u0c82", "\u0c83"];
Kn.prototype._u2a_map = {"\u0c82": "A", "\u0c83": "B", "\u0c85\u0c82": "CA", "\u0c85\u0c83": "CB", "\u0c85": "C", "\u0c86": "D", "\u0c87": "E", "\u0c88": "F", "\u0c89": "G", "\u0c8a": "H", "\u0c8b": "I\u00c4", "\u0ce0": "I\u00c62", "\u0c8e": "J", "\u0c8f": "K", "\u0c90": "L", "\u0c92": "M", "\u0c93": "N", "\u0c94": "O", "\u0c95\u0ccd": "P\u00ef", "\u0c95": "P\u00c0", "\u0c95\u0cbe": "P\u00c1", "\u0c95\u0cbf": "Q", "\u0c95\u0cc0": "Q\u00c3", "\u0c95\u0cc1": "P\u00c0\u00c4", "\u0c95\u0cc2": "P\u00c0\u00c6", "\u0c95\u0cc3": "P\u00c0\u00c8", "\u0c95\u0cc6": "P\u00c9", "\u0c95\u0cc7": "P\u00c9\u00c3", "\u0c95\u0cc8": "P\u00c9\u00ca", "\u0c95\u0cca": "P\u00c9\u00c6", "\u0c95\u0ccb": "P\u00c9\u00c6\u00c3", "\u0c95\u0ccc": "P\u00cb", "\u0c96\u0ccd": "S\u00ef", "\u0c96": "R", "\u0c96\u0cbe": "S\u00c1", "\u0c96\u0cbf": "T", "\u0c96\u0cc0": "T\u00c3", "\u0c96\u0cc1": "R\u00c4", "\u0c96\u0cc2": "R\u00c6", "\u0c96\u0cc3": "R\u00c8", "\u0c96\u0cc6": "S\u00c9", "\u0c96\u0cc7": "S\u00c9\u00c3", "\u0c96\u0cc8": "S\u00c9\u00ca", "\u0c96\u0cca": "S\u00c9\u00c6", "\u0c96\u0ccb": "S\u00c9\u00c6\u00c3", "\u0c96\u0ccc": "S\u00cb", "\u0c97\u0ccd": "U\u00ef", "\u0c97": "U\u00c0", "\u0c97\u0cbe": "U\u00c1", "\u0c97\u0cbf": "V", "\u0c97\u0cc0": "V\u00c3", "\u0c97\u0cc1": "U\u00c0\u00c4", "\u0c97\u0cc2": "U\u00c0\u00c6", "\u0c97\u0cc3": "U\u00c0\u00c8", "\u0c97\u0cc6": "U\u00c9", "\u0c97\u0cc7": "U\u00c9\u00c3", "\u0c97\u0cc8": "U\u00c9\u00ca", "\u0c97\u0cca": "U\u00c9\u00c6", "\u0c97\u0ccb": "U\u00c9\u00c6\u00c3", "\u0c97\u0ccc": "U\u00cb", "\u0c98\u0ccd": "W\u00ef", "\u0c98": "W\u00c0", "\u0c98\u0cbe": "W\u00c1", "\u0c98\u0cbf": "X", "\u0c98\u0cc0": "X\u00c3", "\u0c98\u0cc1": "W\u00c0\u00c4", "\u0c98\u0cc2": "W\u00c0\u00c6", "\u0c98\u0cc3": "W\u00c0\u00c8", "\u0c98\u0cc6": "W\u00c9", "\u0c98\u0cc7": "W\u00c9\u00c3", "\u0c98\u0cc8": "W\u00c9\u00ca", "\u0c98\u0cca": "W\u00c9\u00c6", "\u0c98\u0ccb": "W\u00c9\u00c6\u00c3", "\u0c98\u0ccc": "W\u00cb", "\u0c99\u0ccd": "Y\u00ef", "\u0c99": "Y", "\u0c9a\u0ccd": "Z\u00ef", "\u0c9a": "Z\u00c0", "\u0c9a\u0cbe": "Z\u00c1", "\u0c9a\u0cbf": "a", "\u0c9a\u0cc0": "a\u00c3", "\u0c9a\u0cc1": "Z\u00c0\u00c4", "\u0c9a\u0cc2": "Z\u00c0\u00c6", "\u0c9a\u0cc3": "Z\u00c0\u00c8", "\u0c9a\u0cc6": "Z\u00c9", "\u0c9a\u0cc7": "Z\u00c9\u00c3", "\u0c9a\u0cc8": "Z\u00c9\u00ca", "\u0c9a\u0cca": "Z\u00c9\u00c6", "\u0c9a\u0ccb": "Z\u00c9\u00c6\u00c3", "\u0c9a\u0ccc": "Z\u00cb", "\u0c9b\u0ccd": "b\u00ef", "\u0c9b": "b\u00c0", "\u0c9b\u0cbe": "b\u00c1", "\u0c9b\u0cbf": "c", "\u0c9b\u0cc0": "c\u00c3", "\u0c9b\u0cc1": "b\u00c0\u00c4", "\u0c9b\u0cc2": "b\u00c0\u00c6", "\u0c9b\u0cc3": "b\u00c0\u00c8", "\u0c9b\u0cc6": "b\u00c9", "\u0c9b\u0cc7": "b\u00c9\u00c3", "\u0c9b\u0cc8": "b\u00c9\u00ca", "\u0c9b\u0cca": "b\u00c9\u00c6", "\u0c9b\u0ccb": "b\u00c9\u00c6\u00c3", "\u0c9b\u0ccc": "b\u00cb", "\u0c9c\u0ccd": "e\u00ef", "\u0c9c": "d", "\u0c9c\u0cbe": "e\u00c1", "\u0c9c\u0cbf": "f", "\u0c9c\u0cc0": "f\u00c3", "\u0c9c\u0cc1": "d\u00c4", "\u0c9c\u0cc2": "d\u00c6", "\u0c9c\u0cc3": "d\u00c8", "\u0c9c\u0cc6": "e\u00c9", "\u0c9c\u0cc7": "e\u00c9\u00c3", "\u0c9c\u0cc8": "e\u00c9\u00ca", "\u0c9c\u0cca": "e\u00c9\u00c6", "\u0c9c\u0ccb": "e\u00c9\u00c6\u00c3", "\u0c9c\u0ccc": "e\u00cb", "\u0c9d\u0ccd": "g\u00c0hi\u00ef", "\u0c9d": "g\u00c0h\u00c4", "\u0c9d\u0cbe": "g\u00c0hi\u00c1", "\u0c9d\u0cbf": "jh\u00c4", "\u0c9d\u0cc0": "jh\u00c4\u00c3", "\u0c9d\u0cc1": "g\u00c0h\u00c4\u00c4", "\u0c9d\u0cc2": "g\u00c0h\u00c4\u00c6", "\u0c9d\u0cc3": "g\u00c0h\u00c4\u00c8", "\u0c9d\u0cc6": "g\u00c9h\u00c4", "\u0c9d\u0cc7": "g\u00c9h\u00c4\u00c3", "\u0c9d\u0cc8": "g\u00c9h\u00c4\u00ca", "\u0c9d\u0cca": "g\u00c9h\u00c6", "\u0c9d\u0ccb": "g\u00c9h\u00c6\u00c3", "\u0c9d\u0ccc": "g\u00c0hi\u00cb", "\u0c9e\u0ccd": "k\u00ef", "\u0c9e": "k", "\u0c9f\u0ccd": "m\u00ef", "\u0c9f": "l", "\u0c9f\u0cbe": "m\u00c1", "\u0c9f\u0cbf": "n", "\u0c9f\u0cc0": "n\u00c3", "\u0c9f\u0cc1": "l\u00c4", "\u0c9f\u0cc2": "l\u00c6", "\u0c9f\u0cc3": "l\u00c8", "\u0c9f\u0cc6": "m\u00c9", "\u0c9f\u0cc7": "m\u00c9\u00c3", "\u0c9f\u0cc8": "m\u00c9\u00ca", "\u0c9f\u0cca": "m\u00c9\u00c6", "\u0c9f\u0ccb": "m\u00c9\u00c6\u00c3", "\u0c9f\u0ccc": "m\u00cb", "\u0ca0\u0ccd": "o\u00ef", "\u0ca0": "o\u00c0", "\u0ca0\u0cbe": "o\u00c1", "\u0ca0\u0cbf": "p", "\u0ca0\u0cc0": "p\u00c3", "\u0ca0\u0cc1": "o\u00c0\u00c4", "\u0ca0\u0cc2": "o\u00c0\u00c6", "\u0ca0\u0cc3": "o\u00c0\u00c8", "\u0ca0\u0cc6": "o\u00c9", "\u0ca0\u0cc7": "o\u00c9\u00c3", "\u0ca0\u0cc8": "o\u00c9\u00ca", "\u0ca0\u0cca": "o\u00c9\u00c6", "\u0ca0\u0ccb": "o\u00c9\u00c6\u00c3", "\u0ca0\u0ccc": "o\u00cb", "\u0ca1\u0ccd": "q\u00ef", "\u0ca1": "q\u00c0", "\u0ca1\u0cbe": "q\u00c1", "\u0ca1\u0cbf": "r", "\u0ca1\u0cc0": "r\u00c3", "\u0ca1\u0cc1": "q\u00c0\u00c4", "\u0ca1\u0cc2": "q\u00c0\u00c6", "\u0ca1\u0cc3": "q\u00c0\u00c8", "\u0ca1\u0cc6": "q\u00c9", "\u0ca1\u0cc7": "q\u00c9\u00c3", "\u0ca1\u0cc8": "q\u00c9\u00ca", "\u0ca1\u0cca": "q\u00c9\u00c6", "\u0ca1\u0ccb": "q\u00c9\u00c6\u00c3", "\u0ca1\u0ccc": "q\u00cb", "\u0ca2\u0ccd": "qs\u00ef", "\u0ca2": "qs\u00c0", "\u0ca2\u0cbe": "qs\u00c1", "\u0ca2\u0cbf": "r\u00fc", "\u0ca2\u0cc0": "r\u00fc\u00c3", "\u0ca2\u0cc1": "qs\u00c0\u00c4", "\u0ca2\u0cc2": "qs\u00c0\u00c6", "\u0ca2\u0cc3": "qs\u00c0\u00c8", "\u0ca2\u0cc6": "qs\u00c9", "\u0ca2\u0cc7": "qs\u00c9\u00c3", "\u0ca2\u0cc8": "qs\u00c9\u00ca", "\u0ca2\u0cca": "qs\u00c9\u00c6", "\u0ca2\u0ccb": "qs\u00c9\u00c6\u00c3", "\u0ca2\u0ccc": "qs\u00cb", "\u0ca3\u0ccd": "u\u00ef", "\u0ca3": "t", "\u0ca3\u0cbe": "u\u00c1", "\u0ca3\u0cbf": "t\u00c2", "\u0ca3\u0cc0": "t\u00c2\u00c3", "\u0ca3\u0cc1": "t\u00c4", "\u0ca3\u0cc2": "t\u00c6", "\u0ca3\u0cc3": "t\u00c8", "\u0ca3\u0cc6": "u\u00c9", "\u0ca3\u0cc7": "u\u00c9\u00c3", "\u0ca3\u0cc8": "u\u00c9\u00ca", "\u0ca3\u0cca": "u\u00c9\u00c6", "\u0ca3\u0ccb": "u\u00c9\u00c6\u00c3", "\u0ca3\u0ccc": "u\u00cb", "\u0ca4\u0ccd": "v\u00ef", "\u0ca4": "v\u00c0", "\u0ca4\u0cbe": "v\u00c1", "\u0ca4\u0cbf": "w", "\u0ca4\u0cc0": "w\u00c3", "\u0ca4\u0cc1": "v\u00c0\u00c4", "\u0ca4\u0cc2": "v\u00c0\u00c6", "\u0ca4\u0cc3": "v\u00c0\u00c8", "\u0ca4\u0cc6": "v\u00c9", "\u0ca4\u0cc7": "v\u00c9\u00c3", "\u0ca4\u0cc8": "v\u00c9\u00ca", "\u0ca4\u0cca": "v\u00c9\u00c6", "\u0ca4\u0ccb": "v\u00c9\u00c6\u00c3", "\u0ca4\u0ccc": "v\u00cb", "\u0ca5\u0ccd": "x\u00ef", "\u0ca5": "x\u00c0", "\u0ca5\u0cbe": "x\u00c1", "\u0ca5\u0cbf": "y", "\u0ca5\u0cc0": "y\u00c3", "\u0ca5\u0cc1": "x\u00c0\u00c4", "\u0ca5\u0cc2": "x\u00c0\u00c6", "\u0ca5\u0cc3": "x\u00c0\u00c8", "\u0ca5\u0cc6": "x\u00c9", "\u0ca5\u0cc7": "x\u00c9\u00c3", "\u0ca5\u0cc8": "x\u00c9\u00ca", "\u0ca5\u0cca": "x\u00c9\u00c6", "\u0ca5\u0ccb": "x\u00c9\u00c6\u00c3", "\u0ca5\u0ccc": "x\u00cb", "\u0ca6\u0ccd": "z\u00ef", "\u0ca6": "z\u00c0", "\u0ca6\u0cbe": "z\u00c1", "\u0ca6\u0cbf": "\u00a2", "\u0ca6\u0cc0": "\u00a2\u00c3", "\u0ca6\u0cc1": "z\u00c0\u00c4", "\u0ca6\u0cc2": "z\u00c0\u00c6", "\u0ca6\u0cc3": "z\u00c0\u00c8", "\u0ca6\u0cc6": "z\u00c9", "\u0ca6\u0cc7": "z\u00c9\u00c3", "\u0ca6\u0cc8": "z\u00c9\u00ca", "\u0ca6\u0cca": "z\u00c9\u00c6", "\u0ca6\u0ccb": "z\u00c9\u00c6\u00c3", "\u0ca6\u0ccc": "z\u00cb", "\u0ca7\u0ccd": "zs\u00ef", "\u0ca7": "zs\u00c0", "\u0ca7\u0cbe": "zs\u00c1", "\u0ca7\u0cbf": "\u00a2\u00fc", "\u0ca7\u0cc0": "\u00a2\u00fc\u00c3", "\u0ca7\u0cc1": "zs\u00c0\u00c4", "\u0ca7\u0cc2": "zs\u00c0\u00c6", "\u0ca7\u0cc3": "zs\u00c0\u00c8", "\u0ca7\u0cc6": "zs\u00c9", "\u0ca7\u0cc7": "zs\u00c9\u00c3", "\u0ca7\u0cc8": "zs\u00c9\u00ca", "\u0ca7\u0cca": "zs\u00c9\u00c6", "\u0ca7\u0ccb": "zs\u00c9\u00c6\u00c3", "\u0ca7\u0ccc": "zs\u00cb", "\u0ca8\u0ccd": "\u00a3\u00ef", "\u0ca8": "\u00a3\u00c0", "\u0ca8\u0cbe": "\u00a3\u00c1", "\u0ca8\u0cbf": "\u00a4", "\u0ca8\u0cc0": "\u00a4\u00c3", "\u0ca8\u0cc1": "\u00a3\u00c0\u00c4", "\u0ca8\u0cc2": "\u00a3\u00c0\u00c6", "\u0ca8\u0cc3": "\u00a3\u00c0\u00c8", "\u0ca8\u0cc6": "\u00a3\u00c9", "\u0ca8\u0cc7": "\u00a3\u00c9\u00c3", "\u0ca8\u0cc8": "\u00a3\u00c9\u00ca", "\u0ca8\u0cca": "\u00a3\u00c9\u00c6", "\u0ca8\u0ccb": "\u00a3\u00c9\u00c6\u00c3", "\u0ca8\u0ccc": "\u00a3\u00cb", "\u0caa\u0ccd": "\u00a5\u00ef", "\u0caa": "\u00a5\u00c0", "\u0caa\u0cbe": "\u00a5\u00c1", "\u0caa\u0cbf": "\u00a6", "\u0caa\u0cc0": "\u00a6\u00c3", "\u0caa\u0cc1": "\u00a5\u00c0\u00c5", "\u0caa\u0cc2": "\u00a5\u00c0\u00c7", "\u0caa\u0cc3": "\u00a5\u00c0\u00c8", "\u0caa\u0cc6": "\u00a5\u00c9", "\u0caa\u0cc7": "\u00a5\u00c9\u00c3", "\u0caa\u0cc8": "\u00a5\u00c9\u00ca", "\u0caa\u0cca": "\u00a5\u00c9\u00c7", "\u0caa\u0ccb": "\u00a5\u00c9\u00c7\u00c3", "\u0caa\u0ccc": "\u00a5\u00cb", "\u0cab\u0ccd": "\u00a5s\u00ef", "\u0cab": "\u00a5s\u00c0", "\u0cab\u0cbe": "\u00a5s\u00c1", "\u0cab\u0cbf": "\u00a6\u00fc", "\u0cab\u0cc0": "\u00a6\u00fc\u00c3", "\u0cab\u0cc1": "\u00a5s\u00c0\u00c5", "\u0cab\u0cc2": "\u00a5s\u00c0\u00c7", "\u0cab\u0cc3": "\u00a5s\u00c0\u00c8", "\u0cab\u0cc6": "\u00a5s\u00c9", "\u0cab\u0cc7": "\u00a5s\u00c9\u00c3", "\u0cab\u0cc8": "\u00a5s\u00c9\u00ca", "\u0cab\u0cca": "\u00a5s\u00c9\u00c7", "\u0cab\u0ccb": "\u00a5s\u00c9\u00c7\u00c3", "\u0cab\u0ccc": "\u00a5s\u00cb", "\u0cac\u0ccd": "\u00a8\u00ef", "\u0cac": "\u00a7", "\u0cac\u0cbe": "\u00a8\u00c1", "\u0cac\u0cbf": "\u00a9", "\u0cac\u0cc0": "\u00a9\u00c3", "\u0cac\u0cc1": "\u00a7\u00c4", "\u0cac\u0cc2": "\u00a7\u00c6", "\u0cac\u0cc3": "\u00a7\u00c8", "\u0cac\u0cc6": "\u00a8\u00c9", "\u0cac\u0cc7": "\u00a8\u00c9\u00c3", "\u0cac\u0cc8": "\u00a8\u00c9\u00ca", "\u0cac\u0cca": "\u00a8\u00c9\u00c6", "\u0cac\u0ccb": "\u00a8\u00c9\u00c6\u00c3", "\u0cac\u0ccc": "\u00a8\u00cb", "\u0cad\u0ccd": "\u00a8s\u00ef", "\u0cad": "\u00a8s\u00c0", "\u0cad\u0cbe": "\u00a8s\u00c1", "\u0cad\u0cbf": "\u00a9\u00fc", "\u0cad\u0cc0": "\u00a9\u00fc\u00c3", "\u0cad\u0cc1": "\u00a8s\u00c0\u00c4", "\u0cad\u0cc2": "\u00a8s\u00c0\u00c6", "\u0cad\u0cc3": "\u00a8s\u00c0\u00c8", "\u0cad\u0cc6": "\u00a8s\u00c9", "\u0cad\u0cc7": "\u00a8s\u00c9\u00c3", "\u0cad\u0cc8": "\u00a8s\u00c9\u00ca", "\u0cad\u0cca": "\u00a8s\u00c9\u00c6", "\u0cad\u0ccb": "\u00a8s\u00c9\u00c6\u00c3", "\u0cad\u0ccc": "\u00a8s\u00cb", "\u0cae\u0ccd": "\u00aa\u00c0i\u00ef", "\u0cae": "\u00aa\u00c0\u00c4", "\u0cae\u0cbe": "\u00aa\u00c0i\u00c1", "\u0cae\u0cbf": "\u00ab\u00c4", "\u0cae\u0cc0": "\u00ab\u00c4\u00c3", "\u0cae\u0cc1": "\u00aa\u00c0\u00c4\u00c4", "\u0cae\u0cc2": "\u00aa\u00c0\u00c4\u00c6", "\u0cae\u0cc3": "\u00aa\u00c0\u00c4\u00c8", "\u0cae\u0cc6": "\u00aa\u00c9\u00c4", "\u0cae\u0cc7": "\u00aa\u00c9\u00c4\u00c3", "\u0cae\u0cc8": "\u00aa\u00c9\u00c4\u00ca", "\u0cae\u0cca": "\u00aa\u00c9\u00c6", "\u0cae\u0ccb": "\u00aa\u00c9\u00c6\u00c3", "\u0cae\u0ccc": "\u00aa\u00c0i\u00cb", "\u0caf\u0ccd": "Ai\u00c0i\u00ef", "\u0caf": "Ai\u00c0\u00c4", "\u0caf\u0cbe": "Ai\u00c0i\u00c1", "\u0caf\u0cbf": "\u00ac\u00c4", "\u0caf\u0cc0": "\u00ac\u00c4\u00c3", "\u0caf\u0cc1": "Ai\u00c0\u00c4\u00c4", "\u0caf\u0cc2": "Ai\u00c0\u00c4\u00c6", "\u0caf\u0cc3": "Ai\u00c0\u00c4\u00c8", "\u0caf\u0cc6": "Ai\u00c9\u00c4", "\u0caf\u0cc7": "Ai\u00c9\u00c4\u00c3", "\u0caf\u0cc8": "Ai\u00c9\u00c4\u00ca", "\u0caf\u0cca": "Ai\u00c9\u00c6", "\u0caf\u0ccb": "Ai\u00c9\u00c6\u00c3", "\u0caf\u0ccc": "Ai\u00c0i\u00cb", "\u0cb0\u0ccd": "g\u00ef", "\u0cb0": "g\u00c0", "\u0cb0\u0cbe": "g\u00c1", "\u0cb0\u0cbf": "j", "\u0cb0\u0cc0": "j\u00c3", "\u0cb0\u0cc1": "g\u00c0\u00c4", "\u0cb0\u0cc2": "g\u00c0\u00c6", "\u0cb0\u0cc3": "g\u00c0\u00c8", "\u0cb0\u0cc6": "g\u00c9", "\u0cb0\u0cc7": "g\u00c9\u00c3", "\u0cb0\u0cc8": "g\u00c9\u00ca", "\u0cb0\u0cca": "g\u00c9\u00c6", "\u0cb0\u0ccb": "g\u00c9\u00c6\u00c3", "\u0cb0\u0ccc": "g\u00cb", "\u0cb2\u0ccd": "\u00af\u00ef", "\u0cb2": "\u00ae", "\u0cb2\u0cbe": "\u00af\u00c1", "\u0cb2\u0cbf": "\u00b0", "\u0cb2\u0cc0": "\u00b0\u00c3", "\u0cb2\u0cc1": "\u00ae\u00c4", "\u0cb2\u0cc2": "\u00ae\u00c6", "\u0cb2\u0cc3": "\u00ae\u00c8", "\u0cb2\u0cc6": "\u00af\u00c9", "\u0cb2\u0cc7": "\u00af\u00c9\u00c3", "\u0cb2\u0cc8": "\u00af\u00c9\u00ca", "\u0cb2\u0cca": "\u00af\u00c9\u00c6", "\u0cb2\u0ccb": "\u00af\u00c9\u00c6\u00c3", "\u0cb2\u0ccc": "\u00af\u00cb", "\u0cb5\u0ccd": "\u00aa\u00ef", "\u0cb5": "\u00aa\u00c0", "\u0cb5\u0cbe": "\u00aa\u00c1", "\u0cb5\u0cbf": "\u00ab", "\u0cb5\u0cc0": "\u00ab\u00c3", "\u0cb5\u0cc1": "\u00aa\u00c0\u00c5", "\u0cb5\u0cc2": "\u00aa\u00c0\u00c7", "\u0cb5\u0cc3": "\u00aa\u00c0\u00c8", "\u0cb5\u0cc6": "\u00aa\u00c9", "\u0cb5\u0cc7": "\u00aa\u00c9\u00c3", "\u0cb5\u0cc8": "\u00aa\u00c9\u00ca", "\u0cb5\u0cca": "\u00aa\u00c9\u00c7", "\u0cb5\u0ccb": "\u00aa\u00c9\u00c7\u00c3", "\u0cb5\u0ccc": "\u00aa\u00cb", "\u0cb6\u0ccd": "\u00b1\u00ef", "\u0cb6": "\u00b1\u00c0", "\u0cb6\u0cbe": "\u00b1\u00c1", "\u0cb6\u0cbf": "\u00b2", "\u0cb6\u0cc0": "\u00b2\u00c3", "\u0cb6\u0cc1": "\u00b1\u00c0\u00c4", "\u0cb6\u0cc2": "\u00b1\u00c0\u00c6", "\u0cb6\u0cc3": "\u00b1\u00c0\u00c8", "\u0cb6\u0cc6": "\u00b1\u00c9", "\u0cb6\u0cc7": "\u00b1\u00c9\u00c3", "\u0cb6\u0cc8": "\u00b1\u00c9\u00ca", "\u0cb6\u0cca": "\u00b1\u00c9\u00c6", "\u0cb6\u0ccb": "\u00b1\u00c9\u00c6\u00c3", "\u0cb6\u0ccc": "\u00b1\u00cb", "\u0cb7\u0ccd": "\u03bc\u00ef", "\u0cb7": "\u03bc\u00c0", "\u0cb7\u0cbe": "\u03bc\u00c1", "\u0cb7\u0cbf": "\u00b6", "\u0cb7\u0cc0": "\u00b6\u00c3", "\u0cb7\u0cc1": "\u03bc\u00c0\u00c4", "\u0cb7\u0cc2": "\u03bc\u00c0\u00c6", "\u0cb7\u0cc3": "\u03bc\u00c0\u00c8", "\u0cb7\u0cc6": "\u03bc\u00c9", "\u0cb7\u0cc7": "\u03bc\u00c9\u00c3", "\u0cb7\u0cc8": "\u03bc\u00c9\u00ca", "\u0cb7\u0cca": "\u03bc\u00c9\u00c6", "\u0cb7\u0ccb": "\u03bc\u00c9\u00c6\u00c3", "\u0cb7\u0ccc": "\u03bc\u00cb", "\u0cb8\u0ccd": "\u00b8\u00ef", "\u0cb8": "\u00b8\u00c0", "\u0cb8\u0cbe": "\u00b8\u00c1", "\u0cb8\u0cbf": "\u00b9", "\u0cb8\u0cc0": "\u00b9\u00c3", "\u0cb8\u0cc1": "\u00b8\u00c0\u00c4", "\u0cb8\u0cc2": "\u00b8\u00c0\u00c6", "\u0cb8\u0cc3": "\u00b8\u00c0\u00c8", "\u0cb8\u0cc6": "\u00b8\u00c9", "\u0cb8\u0cc7": "\u00b8\u00c9\u00c3", "\u0cb8\u0cc8": "\u00b8\u00c9\u00ca", "\u0cb8\u0cca": "\u00b8\u00c9\u00c6", "\u0cb8\u0ccb": "\u00b8\u00c9\u00c6\u00c3", "\u0cb8\u0ccc": "\u00b8\u00cb", "\u0cb9\u0ccd": "\u00ba\u00ef", "\u0cb9": "\u00ba\u00c0", "\u0cb9\u0cbe": "\u00ba\u00c1", "\u0cb9\u0cbf": "\u00bb", "\u0cb9\u0cc0": "\u00bb\u00c3", "\u0cb9\u0cc1": "\u00ba\u00c0\u00c4", "\u0cb9\u0cc2": "\u00ba\u00c0\u00c6", "\u0cb9\u0cc3": "\u00ba\u00c0\u00c8", "\u0cb9\u0cc6": "\u00ba\u00c9", "\u0cb9\u0cc7": "\u00ba\u00c9\u00c3", "\u0cb9\u0cc8": "\u00ba\u00c9\u00ca", "\u0cb9\u0cca": "\u00ba\u00c9\u00c6", "\u0cb9\u0ccb": "\u00ba\u00c9\u00c6\u00c3", "\u0cb9\u0ccc": "\u00ba\u00cb", "\u0cb3\u0ccd": "\u00bc\u00ef", "\u0cb3": "\u00bc\u00c0", "\u0cb3\u0cbe": "\u00bc\u00c1", "\u0cb3\u0cbf": "\u00bd", "\u0cb3\u0cc0": "\u00bd\u00c3", "\u0cb3\u0cc1": "\u00bc\u00c0\u00c4", "\u0cb3\u0cc2": "\u00bc\u00c0\u00c6", "\u0cb3\u0cc3": "\u00bc\u00c0\u00c8", "\u0cb3\u0cc6": "\u00bc\u00c9", "\u0cb3\u0cc7": "\u00bc\u00c9\u00c3", "\u0cb3\u0cc8": "\u00bc\u00c9\u00ca", "\u0cb3\u0cca": "\u00bc\u00c9\u00c6", "\u0cb3\u0ccb": "\u00bc\u00c9\u00c6\u00c3", "\u0cb3\u0ccc": "\u00bc\u00cb", "\u0cb1\u0ccd\u200c": "\u00be\u00f5\u00ef", "\u0cb1": "\u00be\u00f5\u00c0", "\u0cb1\u0cbe": "\u00be\u00f5\u00c1", "\u0cb1\u0cbf": "\u00be\u00c2", "\u0cb1\u0cc1": "\u00be\u00c4", "\u0cb1\u0cc2": "\u00be\u00c6", "\u0cb1\u0cc3": "\u00be\u00c8", "\u0cb1\u0cc6": "\u00be\u00f5\u00c9", "\u0cb1\u0cc7": "\u00be\u00f5\u00c9\u00c3", "\u0cb1\u0cc8": "\u00be\u00f5\u00c9\u00ca", "\u0cb1\u0cca": "\u00be\u00f5\u00c9\u00c6", "\u0cb1\u0ccb": "\u00be\u00f5\u00c9\u00c6\u00c3", "\u0cb1\u0ccc": "\u00be\u00f5\u00cb", "\u0cde\u0ccd\u200c": "\u00bf\u00f5\u00ef", "\u0cde": "\u00bf\u00f5\u00c0", "\u0cde\u0cbe": "\u00bf\u00f5\u00c1", "\u0cde\u0cbf": "\u00bf\u00c2", "\u0cde\u0cc1": "\u00bf\u00c4", "\u0cde\u0cc2": "\u00bf\u00c6", "\u0cde\u0cc3": "\u00bf\u00c8", "\u0cde\u0cc6": "\u00bf\u00f5\u00c9", "\u0cde\u0cc7": "\u00bf\u00f5\u00c9\u00c3", "\u0cde\u0cc8": "\u00bf\u00f5\u00c9\u00ca", "\u0cde\u0cca": "\u00bf\u00f5\u00c9\u00c6", "\u0cde\u0ccb": "\u00bf\u00f5\u00c9\u00c6\u00c3", "\u0cde\u0ccc": "\u00bf\u00f5\u00cb", "\u0ccd\u0c95": "\u00cc", "\u0ccd\u0c96": "\u00cd", "\u0ccd\u0c97": "\u00ce", "\u0ccd\u0c98": "\u00cf", "\u0ccd\u0c99": "\u00d0", "\u0ccd\u0c9a": "\u00d1", "\u0ccd\u0c9b": "\u00d2", "\u0ccd\u0c9c": "\u00d3", "\u0ccd\u0c9d": "\u00d4", "\u0ccd\u0c9e": "\u00d5", "\u0ccd\u0c9f": "\u00d6", "\u0ccd\u0ca0": "\u00d7", "\u0ccd\u0ca1": "\u00d8", "\u0ccd\u0ca2": "\u00d9", "\u0ccd\u0ca3": "\u00da", "\u0ccd\u0ca4": "\u00db", "\u0ccd\u0ca5": "\u00dc", "\u0ccd\u0ca6": "\u00dd", "\u0ccd\u0ca7": "\u00de", "\u0ccd\u0ca8": "\u00df", "\u0ccd\u0caa": "\u00e0", "\u0ccd\u0cab": "\u00e1", "\u0ccd\u0cac": "\u00e2", "\u0ccd\u0cad": "\u00e3", "\u0ccd\u0cae": "\u00e4", "\u0ccd\u0caf": "\u00e5", "\u0ccd\u0cb0": "\u00e6", "\u0ccd\u0cb2": "\u00e8", "\u0ccd\u0cb5": "\u00e9", "\u0ccd\u0cb6": "\u00ea", "\u0ccd\u0cb7": "\u00eb", "\u0ccd\u0cb8": "\u00ec", "\u0ccd\u0cb9": "\u00ed", "\u0ccd\u0cb3": "\u00ee", "\u0ccd\u0cb1": "\u00f9", "\u0ccd\u0cde": "\u00fa"};
Kn.prototype._kn_numbers = ["\u0ce6", "\u0ce7", "\u0ce8", "\u0ce9", "\u0cea", "\u0ceb", "\u0cec", "\u0ced", "\u0cee", "\u0cef"];
Kn.prototype._en_numbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
Kn.prototype._ascii_halant = "\u00ef";
Kn.prototype._ascii_consonants_start_chars = ["J", "R", "m", "p", "L", "\u00b0", "\u00ac", "a", "e", "j", "0", "\u03bc", "q", "C", "\u00a7", "S", "\u00aa", "k", "v", "\u00bf", "y", "\u00a2", "\u00bc", "l", "A", "b", "F", "U", "\u00a3", "E", "\u00ae", "\u00be", "\u00b1", "D", "G", "K", "P", "M", "Q", "Z", "o", "\u00b2", "\u00b9", "z", "\u00b6", "\u00bd", "\u00a8", "\u00bb", "u", "r", "T", "\u00a6", "g", "n", "d", "N", "f", "w", "W", "I", "\u00a4", "\u00af", "t", "H", "c", "\u00ab", "\u00b5", "O", "\u00b8", "V", "Y", "\u00ba", "x", "\u00a5", "\u00a9", "X"];
Kn.prototype._uni_zwnj = "\u200c";
Kn.prototype._uni_zwj = "\u200d";
Kn.prototype._ascii_arkavattu = "\u00f0";
Kn.prototype._uni_ra = "\u0cb0";
Kn.prototype._unicode_anusvara_visarga = function(txt){return txt.replace(/ಂ/g,"A").replace(/ಃ/g,"B");}
Kn.prototype._to_ascii_numbers = function(txt){return txt.replace(/೦/g,"0").replace(/೧/g,"1").replace(/೨/g,"2").replace(/೩/g,"3").replace(/೪/g,"4").replace(/೫/g,"5").replace(/೬/g,"6").replace(/೭/g,"7").replace(/೮/g,"8").replace(/೯/g,"9");}
Kn.prototype._to_unicode_numbers = function(txt){return txt.replace(/0/g,"೦").replace(/1/g,"೧").replace(/2/g,"೨").replace(/3/g,"೩").replace(/4/g,"೪").replace(/5/g,"೫").replace(/6/g,"೬").replace(/7/g,"೭").replace(/8/g,"೮").replace(/9/g,"೯");}
function Kn(){};
var kn = new Kn();
Kn.prototype._uni_halant = "ccd";
Kn.prototype._uni_prev_value_chars = [
"cbe", "cbf", "cc0", "cc1",
"cc2", "cc3", "cc4", "cc6",
"cc7", "cc8", "cca", "ccb",
"ccc", "ccd", "c82", "c83", "200d"
];
Kn.prototype.letters = function(txt) {
function hexval(i) {
return txt[i].charCodeAt(0).toString(16);
}
function prev_hexval(i) {
if (txt[i-1]){
return txt[i-1].charCodeAt(0).toString(16);
}
return "";
};
function iskn(i) {
var re = new RegExp(/^[\u0C80-\u0CFF\u200D]+$/);
return txt[i].match(re) ? true : false;
};
var l = txt.length;
var out = [];
for (var i=0; i<l; i++) {
var cond = (this._uni_prev_value_chars.indexOf(hexval(i)) != -1 ||
prev_hexval(i) === this._uni_halant);
if (out.length > 0 && iskn(i) && cond) {
out[out.length-1] += txt[i];
}
else {
out.push(txt[i]);
}
}
return out;
};
Kn.prototype.length = function(txt){
return this.letters(txt).length;
};
Kn.prototype._rearrange_and_replace = function(inp){
// If inp is vowel, then no need to change
var that = this;
// If input letter is only vowel, then directly convert it
if (this._vowels.indexOf(inp) !== -1){
return this._u2a_map[inp];
}
// Anuswara visarga with vowels
inp = inp.replace(this._REGEX_UNI_VOWEL_PLUS_ANUSVARA_VISARGA, function(match, g1, g2){
return that._u2a_map[g1] + that._u2a_map[g2];
});
// Detect kaagunitha and convert to ASCII using Map
inp = inp.replace(this._REGEX_UNI_CONSONANT_PLUS_VOWEL, function(match, g1, g2, g3){
return that._substitute_ascii(g1, [g2, g3], []);
});
// Arkavattu vs Ra vattu
// If ZWJ is not used then use Arkavattu, First vattakshara after Ra
// is treated as new Base, and add arkavattu in the end
inp = inp.replace(this._REGEX_UNI_REPH_WITHOUT_ZWJ,
function(match, g1, g2, g3, g4, g5, g6){
// First vattakshara will become base
var base = g2.replace(that._halant, "");
var append_chars = [that._ascii_arkavattu];
return that._substitute_ascii(base, [g5, g6], [g3, g4], append_chars);
});
// Detect Vattakshara(with ZWJ or Without), Ignore ZWJ in match
inp = inp.replace(this._REGEX_UNI_VATTAKSHARA,
function(match, g1, g2, g3, g4, g5, g6){
return that._substitute_ascii(g1, [g5, g6], [g2, g3, g4]);
});
return inp;
}
Kn.prototype._substitute_ascii = function(base, dep_vowel, vattaksharagalu, append_chars){
var op = "";
if (dep_vowel[0] === undefined){
// Dependent vowel is not present, that means only consonant
// convert it directly using Map
op += this._u2a_map[base];
}
else{
if (this._anusvara_visarga.indexOf(dep_vowel[0]) === -1){
// If first dependent vowel is not Anuswara and visarga then
// join base and dep vowel since in ASCII vattakshara is added in
// the end after dep vowel(In Unicode it is dep vowel + vattakshara)
op += this._u2a_map[base + dep_vowel[0]];
}
else{
// Only base now, anuswara visarga will be added later
op += this._u2a_map[base];
}
}
// If Vattaksharagalu exists, replace with ASCII vattakshara and add
for (var i=0; i<vattaksharagalu.length; i++){
if (vattaksharagalu[i] !== undefined){
op += this._u2a_map[vattaksharagalu[i]];
}
}
// Previously not added anuswara visarga, add it now since vattakshara
// already added.
if (this._anusvara_visarga.indexOf(dep_vowel[0]) !== -1){
op += this._u2a_map[dep_vowel[0]];
}
// If contains second dep vowel add it to the converted
if (dep_vowel[1] !== undefined){
op += this._u2a_map[dep_vowel[1]];
}
if (append_chars !== undefined) {
op += append_chars.join("");
}
return op;
}
Kn.prototype._ascii_to_unicode_word = function (txt, english_numbers){
that = this;
// Insert ZWNJ if required before converting anything else
txt = txt.replace(this._REGEX_ASCII_ZWNJ,
function(match, g1, g2) {
return g1 + that._uni_zwnj + g2;
});
// Replace all which can be replaced using Maps
txt = this._replace_from_map(txt);
// Identify dependent vowel followed by 3 level vattaksharas
// Replace vattaksharas with equivalant unicode combination and
// reorg and move dep vowel to end
txt = txt.replace(this._REGEX_ASCII_VATTAKSHARA_3,
function(match, g1, g2, g3, g4){
return g2 + g3 + g4 + g1;
});
// Identify dependent vowel followed by 2 level vattaksharas
// Replace vattaksharas with equivalant unicode combination and
// reorg and move dep vowel to end
txt = txt.replace(this._REGEX_ASCII_VATTAKSHARA_2,
function(match, g1, g2, g3){
return g2 + g3 + g1;
});
// Identify dependent vowel followed by 1 level vattaksharas
// Replace vattaksharas with equivalant unicode combination and
// reorg and move dep vowel to end
txt = txt.replace(this._REGEX_ASCII_VATTAKSHARA_1,
function(match, g1, g2){
return g2 + g1;
});
// If any more vattakshara pending, without dependent vowel
// For example ಮ್ಮ
txt = this._replace_vattakshara(txt);
// Handle Numbers
if (english_numbers === undefined || !english_numbers) {
txt = this._to_unicode_numbers(txt);
}
txt = this._replace_a2u_anuswara_visarga(txt)
// Now it is converted to Unicode except few left out chars
// Handle Reph when ZWJ is used
txt = txt.replace(this._REGEX_UNI_REPH_BEFORE_CONVERT,
function(match, g1, g2, g3, g4, g5, g6){
// Add ZWJ after Ra and retain others as is
var op = g1 + that._uni_zwj + g2;
if (g3 !== undefined){
op += g3;
}
if (g4 !== undefined){
op += g4;
}
if (g5 !== undefined){
op += g5;
}
if (g6 !== undefined){
op += g6;
}
return op;
});
// Handle Reph when no ZWJ is used. If ascii arkavattu present in
// the end, remove it and add Ra to the beginning and make first
// char in Match as vattakshara
txt = txt.replace(this._REGEX_UNI_ASCII_ARKAVATTU,
function(match, g1, g2, g3, g4, g5){
var op = that._uni_ra + that._halant + g1;
if (g2 !== undefined){
op += g2;
}
if (g3 !== undefined){
op += g3;
}
if (g4 !== undefined){
op += g4;
}
if (g5 !== undefined){
op += g5;
}
return op;
});
return txt;
}
Kn.prototype._a2u_post_process = function(txt) {
return txt.replace("É", "ಕೆ"[1]);
}
Kn.prototype.ascii_to_unicode = function (txt, english_numbers, remove_extra_space){
if (remove_extra_space) {
txt = txt.replace(/[ \t]+/g,' ').trim();
}
var words = txt.split(" ");
var op = [];
var l = words.length;
for (var i=0; i<l; i++) {
var wl = words[i].length;
if (wl > 0 && words[i][0] === "$" && words[i][wl-1] === "$") {
op.push(words[i].replace(/^\$/g, "").replace(/\$$/g, ""));
} else {
op.push(this._ascii_to_unicode_word(words[i], english_numbers));
}
}
txt = this._a2u_deerga_handle(op.join(" "));
return this._a2u_post_process(txt);
}
Kn.prototype._unicode_to_ascii_word = function(txt, english_numbers){
var converted = [];
var that = this;
// Split into Kn letters and convert each letter to ASCII
this.letters(txt).map(function(letter){
converted.push(that._rearrange_and_replace(letter));
});
// Replace Anuswara and Visarga with ASCII chars
txt = this._unicode_anusvara_visarga(converted.join(""));
// Handle Numbers
// No special handling required, Font will change the look and feel
// of number in ASCII
txt = this._to_ascii_numbers(txt)
// ZWNJ
// Since ZWNJ is not available in Map, it is not replaced
// rest of the letters already replaced. We can remove this
// char from output since in ASCII chars will not mix
txt = txt.replace(/\u200c/g, "");
// Handle Reph
// Handle ZWJ and ZWNJ
return txt;
}
Kn.prototype._u2a_post_process = function(txt) {
return txt.replace("ÈÌ", "Ìø");
}
Kn.prototype.unicode_to_ascii = function (txt, english_numbers, remove_extra_space){
if (remove_extra_space) {
txt = txt.replace(/[ \t]+/g,' ').trim();
}
var words = txt.split(" ");
var op = [];
var l = words.length;
for (var i=0; i<l; i++) {
var wl = words[i].length;
if (wl > 0 && words[i][0] === "$" && words[i][wl-1] === "$") {
op.push(words[i].replace(/^\$/g, "").replace(/\$$/g, ""));
} else {
op.push(this._unicode_to_ascii_word(words[i], english_numbers));
}
}
txt = this._u2a_deerga_handle(op.join(" "));
return this._u2a_post_process(txt);
}
Kn.prototype._replace_a2u_anuswara_visarga = function(txt) { return txt.replace('A', 'ಂ').replace('B', 'ಃ');}
Kn.prototype._replace_from_map = function(txt){
return txt.replace(/μï/g, "ಷ್").replace(/μË/g, "ಷೌ").replace(/μÉÊ/g, "ಷೈ").replace(/μÉÆÃ/g, "ಷೋ").replace(/μÉÆ/g, "ಷೊ").replace(/μÉÃ/g, "ಷೇ").replace(/μÉ/g, "ಷೆ").replace(/μÁ/g, "ಷಾ").replace(/μÀÈ/g, "ಷೃ").replace(/μÀÆ/g, "ಷೂ").replace(/μÀÄ/g, "ಷು").replace(/μÀ/g, "ಷ").replace(/¿õï/g, "ೞ್‌").replace(/¿õË/g, "ೞೌ").replace(/¿õÉÊ/g, "ೞೈ").replace(/¿õÉÆÃ/g, "ೞೋ").replace(/¿õÉÆ/g, "ೞೊ").replace(/¿õÉÃ/g, "ೞೇ").replace(/¿õÉ/g, "ೞೆ").replace(/¿õÁ/g, "ೞಾ").replace(/¿õÀ/g, "ೞ").replace(/¿È/g, "ೞೃ").replace(/¿Æ/g, "ೞೂ").replace(/¿Ä/g, "ೞು").replace(/¿Â/g, "ೞಿ").replace(/¾õï/g, "ಱ್‌").replace(/¾õË/g, "ಱೌ").replace(/¾õÉÊ/g, "ಱೈ").replace(/¾õÉÆÃ/g, "ಱೋ").replace(/¾õÉÆ/g, "ಱೊ").replace(/¾õÉÃ/g, "ಱೇ").replace(/¾õÉ/g, "ಱೆ").replace(/¾õÁ/g, "ಱಾ").replace(/¾õÀ/g, "ಱ").replace(/¾È/g, "ಱೃ").replace(/¾Æ/g, "ಱೂ").replace(/¾Ä/g, "ಱು").replace(/¾Â/g, "ಱಿ").replace(/½Ã/g, "ಳೀ").replace(/½/g, "ಳಿ").replace(/¼ï/g, "ಳ್").replace(/¼Ë/g, "ಳೌ").replace(/¼ÉÊ/g, "ಳೈ").replace(/¼ÉÆÃ/g, "ಳೋ").replace(/¼ÉÆ/g, "ಳೊ").replace(/¼ÉÃ/g, "ಳೇ").replace(/¼É/g, "ಳೆ").replace(/¼Á/g, "ಳಾ").replace(/¼ÀÈ/g, "ಳೃ").replace(/¼ÀÆ/g, "ಳೂ").replace(/¼ÀÄ/g, "ಳು").replace(/¼À/g, "ಳ").replace(/»Ã/g, "ಹೀ").replace(/»/g, "ಹಿ").replace(/ºï/g, "ಹ್").replace(/ºË/g, "ಹೌ").replace(/ºÉÊ/g, "ಹೈ").replace(/ºÉÆÃ/g, "ಹೋ").replace(/ºÉÆ/g, "ಹೊ").replace(/ºÉÃ/g, "ಹೇ").replace(/ºÉ/g, "ಹೆ").replace(/ºÁ/g, "ಹಾ").replace(/ºÀÈ/g, "ಹೃ").replace(/ºÀÆ/g, "ಹೂ").replace(/ºÀÄ/g, "ಹು").replace(/ºÀ/g, "ಹ").replace(/¹Ã/g, "ಸೀ").replace(/¹/g, "ಸಿ").replace(/¸ï/g, "ಸ್").replace(/¸Ë/g, "ಸೌ").replace(/¸ÉÊ/g, "ಸೈ").replace(/¸ÉÆÃ/g, "ಸೋ").replace(/¸ÉÆ/g, "ಸೊ").replace(/¸ÉÃ/g, "ಸೇ").replace(/¸É/g, "ಸೆ").replace(/¸Á/g, "ಸಾ").replace(/¸ÀÈ/g, "ಸೃ").replace(/¸ÀÆ/g, "ಸೂ").replace(/¸ÀÄ/g, "ಸು").replace(/¸À/g, "ಸ").replace(/¶Ã/g, "ಷೀ").replace(/¶/g, "ಷಿ").replace(/µï/g, "ಷ್").replace(/µË/g, "ಷೌ").replace(/µÉÊ/g, "ಷೈ").replace(/µÉÆÃ/g, "ಷೋ").replace(/µÉÆ/g, "ಷೊ").replace(/µÉÃ/g, "ಷೇ").replace(/µÉ/g, "ಷೆ").replace(/µÁ/g, "ಷಾ").replace(/µÀÈ/g, "ಷೃ").replace(/µÀÆ/g, "ಷೂ").replace(/µÀÄ/g, "ಷು").replace(/µÀ/g, "ಷ").replace(/²Ã/g, "ಶೀ").replace(/²/g, "ಶಿ").replace(/±ï/g, "ಶ್").replace(/±Ë/g, "ಶೌ").replace(/±ÉÊ/g, "ಶೈ").replace(/±ÉÆÃ/g, "ಶೋ").replace(/±ÉÆ/g, "ಶೊ").replace(/±ÉÃ/g, "ಶೇ").replace(/±É/g, "ಶೆ").replace(/±Á/g, "ಶಾ").replace(/±ÀÈ/g, "ಶೃ").replace(/±ÀÆ/g, "ಶೂ").replace(/±ÀÄ/g, "ಶು").replace(/±À/g, "ಶ").replace(/°Ã/g, "ಲೀ").replace(/°/g, "ಲಿ").replace(/¯ï/g, "ಲ್").replace(/¯Ë/g, "ಲೌ").replace(/¯ÉÊ/g, "ಲೈ").replace(/¯ÉÆÃ/g, "ಲೋ").replace(/¯ÉÆ/g, "ಲೊ").replace(/¯ÉÃ/g, "ಲೇ").replace(/¯É/g, "ಲೆ").replace(/¯Á/g, "ಲಾ").replace(/®È/g, "ಲೃ").replace(/®Æ/g, "ಲೂ").replace(/®Ä/g, "ಲು").replace(/®/g, "ಲ").replace(/¬ÄÃ/g, "ಯೀ").replace(/¬Ä/g, "ಯಿ").replace(/«ÄÃ/g, "ಮೀ").replace(/«Ä/g, "ಮಿ").replace(/«Ã/g, "ವೀ").replace(/«/g, "ವಿ").replace(/ªï/g, "ವ್").replace(/ªË/g, "ವೌ").replace(/ªÉÊ/g, "ವೈ").replace(/ªÉÇÃ/g, "ವೋ").replace(/ªÉÇ/g, "ವೊ").replace(/ªÉÆÃ/g, "ಮೋ").replace(/ªÉÆ/g, "ಮೊ").replace(/ªÉÄÊ/g, "ಮೈ").replace(/ªÉÄÃ/g, "ಮೇ").replace(/ªÉÄ/g, "ಮೆ").replace(/ªÉÃ/g, "ವೇ").replace(/ªÉ/g, "ವೆ").replace(/ªÁ/g, "ವಾ").replace(/ªÀÈ/g, "ವೃ").replace(/ªÀÇ/g, "ವೂ").replace(/ªÀÅ/g, "ವು").replace(/ªÀÄÈ/g, "ಮೃ").replace(/ªÀÄÆ/g, "ಮೂ").replace(/ªÀÄÄ/g, "ಮು").replace(/ªÀÄ/g, "ಮ").replace(/ªÀiï/g, "ಮ್").replace(/ªÀiË/g, "ಮೌ").replace(/ªÀiÁ/g, "ಮಾ").replace(/ªÀ/g, "ವ").replace(/©üÃ/g, "ಭೀ").replace(/©ü/g, "ಭಿ").replace(/©Ã/g, "ಬೀ").replace(/©/g, "ಬಿ").replace(/¨ï/g, "ಬ್").replace(/¨Ë/g, "ಬೌ").replace(/¨ÉÊ/g, "ಬೈ").replace(/¨ÉÆÃ/g, "ಬೋ").replace(/¨ÉÆ/g, "ಬೊ").replace(/¨ÉÃ/g, "ಬೇ").replace(/¨É/g, "ಬೆ").replace(/¨Á/g, "ಬಾ").replace(/¨sï/g, "ಭ್").replace(/¨sË/g, "ಭೌ").replace(/¨sÉÊ/g, "ಭೈ").replace(/¨sÉÆÃ/g, "ಭೋ").replace(/¨sÉÆ/g, "ಭೊ").replace(/¨sÉÃ/g, "ಭೇ").replace(/¨sÉ/g, "ಭೆ").replace(/¨sÁ/g, "ಭಾ").replace(/¨sÀÈ/g, "ಭೃ").replace(/¨sÀÆ/g, "ಭೂ").replace(/¨sÀÄ/g, "ಭು").replace(/¨sÀ/g, "ಭ").replace(/§È/g, "ಬೃ").replace(/§Æ/g, "ಬೂ").replace(/§Ä/g, "ಬು").replace(/§/g, "ಬ").replace(/¦üÃ/g, "ಫೀ").replace(/¦ü/g, "ಫಿ").replace(/¦Ã/g, "ಪೀ").replace(/¦/g, "ಪಿ").replace(/¥ï/g, "ಪ್").replace(/¥Ë/g, "ಪೌ").replace(/¥ÉÊ/g, "ಪೈ").replace(/¥ÉÇÃ/g, "ಪೋ").replace(/¥ÉÇ/g, "ಪೊ").replace(/¥ÉÆÃ/g, "ಪೋ").replace(/¥ÉÆ/g, "ಪೊ").replace(/¥ÉÃ/g, "ಪೇ").replace(/¥É/g, "ಪೆ").replace(/¥Á/g, "ಪಾ").replace(/¥ÀÈ/g, "ಪೃ").replace(/¥ÀÇ/g, "ಪೂ").replace(/¥ÀÆ/g, "ಪೂ").replace(/¥ÀÅ/g, "ಪು").replace(/¥ÀÄ/g, "ಪು").replace(/¥À/g, "ಪ").replace(/¥sï/g, "ಫ್").replace(/¥sË/g, "ಫೌ").replace(/¥sÉÊ/g, "ಫೈ").replace(/¥sÉÇÃ/g, "ಫೋ").replace(/¥sÉÇ/g, "ಫೊ").replace(/¥sÉÆÃ/g, "ಫೋ").replace(/¥sÉÆ/g, "ಫೊ").replace(/¥sÉÃ/g, "ಫೇ").replace(/¥sÉ/g, "ಫೆ").replace(/¥sÁ/g, "ಫಾ").replace(/¥sÀÈ/g, "ಫೃ").replace(/¥sÀÇ/g, "ಫೂ").replace(/¥sÀÆ/g, "ಫೂ").replace(/¥sÀÅ/g, "ಫು").replace(/¥sÀÄ/g, "ಫು").replace(/¥sÀ/g, "ಫ").replace(/¤Ã/g, "ನೀ").replace(/¤/g, "ನಿ").replace(/£ï/g, "ನ್").replace(/£Ë/g, "ನೌ").replace(/£ÉÊ/g, "ನೈ").replace(/£ÉÆÃ/g, "ನೋ").replace(/£ÉÆ/g, "ನೊ").replace(/£ÉÃ/g, "ನೇ").replace(/£É/g, "ನೆ").replace(/£Á/g, "ನಾ").replace(/£ÀÈ/g, "ನೃ").replace(/£ÀÆ/g, "ನೂ").replace(/£ÀÄ/g, "ನು").replace(/£À/g, "ನ").replace(/¢üÃ/g, "ಧೀ").replace(/¢ü/g, "ಧಿ").replace(/¢Ã/g, "ದೀ").replace(/¢/g, "ದಿ").replace(/zï/g, "ದ್").replace(/zË/g, "ದೌ").replace(/zÉÊ/g, "ದೈ").replace(/zÉÆÃ/g, "ದೋ").replace(/zÉÆ/g, "ದೊ").replace(/zÉÃ/g, "ದೇ").replace(/zÉ/g, "ದೆ").replace(/zÁ/g, "ದಾ").replace(/zÀÈ/g, "ದೃ").replace(/zÀÆ/g, "ದೂ").replace(/zÀÄ/g, "ದು").replace(/zÀ/g, "ದ").replace(/zsï/g, "ಧ್").replace(/zsË/g, "ಧೌ").replace(/zsÉÊ/g, "ಧೈ").replace(/zsÉÆÃ/g, "ಧೋ").replace(/zsÉÆ/g, "ಧೊ").replace(/zsÉÃ/g, "ಧೇ").replace(/zsÉ/g, "ಧೆ").replace(/zsÁ/g, "ಧಾ").replace(/zsÀÈ/g, "ಧೃ").replace(/zsÀÆ/g, "ಧೂ").replace(/zsÀÄ/g, "ಧು").replace(/zsÀ/g, "ಧ").replace(/yÃ/g, "ಥೀ").replace(/y/g, "ಥಿ").replace(/xï/g, "ಥ್").replace(/xË/g, "ಥೌ").replace(/xÉÊ/g, "ಥೈ").replace(/xÉÆÃ/g, "ಥೋ").replace(/xÉÆ/g, "ಥೊ").replace(/xÉÃ/g, "ಥೇ").replace(/xÉ/g, "ಥೆ").replace(/xÁ/g, "ಥಾ").replace(/xÀÈ/g, "ಥೃ").replace(/xÀÆ/g, "ಥೂ").replace(/xÀÄ/g, "ಥು").replace(/xÀ/g, "ಥ").replace(/wÃ/g, "ತೀ").replace(/w/g, "ತಿ").replace(/vï/g, "ತ್").replace(/vË/g, "ತೌ").replace(/vÉÊ/g, "ತೈ").replace(/vÉÆÃ/g, "ತೋ").replace(/vÉÆ/g, "ತೊ").replace(/vÉÃ/g, "ತೇ").replace(/vÉ/g, "ತೆ").replace(/vÁ/g, "ತಾ").replace(/vÀÈ/g, "ತೃ").replace(/vÀÆ/g, "ತೂ").replace(/vÀÄ/g, "ತು").replace(/vÀ/g, "ತ").replace(/uï/g, "ಣ್").replace(/uË/g, "ಣೌ").replace(/uÉÊ/g, "ಣೈ").replace(/uÉÆÃ/g, "ಣೋ").replace(/uÉÆ/g, "ಣೊ").replace(/uÉÃ/g, "ಣೇ").replace(/uÉ/g, "ಣೆ").replace(/uÁ/g, "ಣಾ").replace(/tÈ/g, "ಣೃ").replace(/tÆ/g, "ಣೂ").replace(/tÄ/g, "ಣು").replace(/tÂÃ/g, "ಣೀ").replace(/tÂ/g, "ಣಿ").replace(/t/g, "ಣ").replace(/rüÃ/g, "ಢೀ").replace(/rü/g, "ಢಿ").replace(/rÃ/g, "ಡೀ").replace(/r/g, "ಡಿ").replace(/qï/g, "ಡ್").replace(/qË/g, "ಡೌ").replace(/qÉÊ/g, "ಡೈ").replace(/qÉÆÃ/g, "ಡೋ").replace(/qÉÆ/g, "ಡೊ").replace(/qÉÃ/g, "ಡೇ").replace(/qÉ/g, "ಡೆ").replace(/qÁ/g, "ಡಾ").replace(/qÀÈ/g, "ಡೃ").replace(/qÀÆ/g, "ಡೂ").replace(/qÀÄ/g, "ಡು").replace(/qÀ/g, "ಡ").replace(/qsï/g, "ಢ್").replace(/qsË/g, "ಢೌ").replace(/qsÉÊ/g, "ಢೈ").replace(/qsÉÆÃ/g, "ಢೋ").replace(/qsÉÆ/g, "ಢೊ").replace(/qsÉÃ/g, "ಢೇ").replace(/qsÉ/g, "ಢೆ").replace(/qsÁ/g, "ಢಾ").replace(/qsÀÈ/g, "ಢೃ").replace(/qsÀÆ/g, "ಢೂ").replace(/qsÀÄ/g, "ಢು").replace(/qsÀ/g, "ಢ").replace(/pÃ/g, "ಠೀ").replace(/p/g, "ಠಿ").replace(/oï/g, "ಠ್").replace(/oË/g, "ಠೌ").replace(/oÉÊ/g, "ಠೈ").replace(/oÉÆÃ/g, "ಠೋ").replace(/oÉÆ/g, "ಠೊ").replace(/oÉÃ/g, "ಠೇ").replace(/oÉ/g, "ಠೆ").replace(/oÁ/g, "ಠಾ").replace(/oÀÈ/g, "ಠೃ").replace(/oÀÆ/g, "ಠೂ").replace(/oÀÄ/g, "ಠು").replace(/oÀ/g, "ಠ").replace(/nÃ/g, "ಟೀ").replace(/n/g, "ಟಿ").replace(/mï/g, "ಟ್").replace(/mË/g, "ಟೌ").replace(/mÉÊ/g, "ಟೈ").replace(/mÉÆÃ/g, "ಟೋ").replace(/mÉÆ/g, "ಟೊ").replace(/mÉÃ/g, "ಟೇ").replace(/mÉ/g, "ಟೆ").replace(/mÁ/g, "ಟಾ").replace(/lÈ/g, "ಟೃ").replace(/lÆ/g, "ಟೂ").replace(/lÄ/g, "ಟು").replace(/l/g, "ಟ").replace(/kï/g, "ಞ್").replace(/k/g, "ಞ").replace(/jÃ/g, "ರೀ").replace(/jhÄÃ/g, "ಝೀ").replace(/jhÄ/g, "ಝಿ").replace(/j/g, "ರಿ").replace(/gï/g, "ರ್").replace(/gË/g, "ರೌ").replace(/gÉÊ/g, "ರೈ").replace(/gÉÆÃ/g, "ರೋ").replace(/gÉÆ/g, "ರೊ").replace(/gÉÃ/g, "ರೇ").replace(/gÉhÆÃ/g, "ಝೋ").replace(/gÉhÆ/g, "ಝೊ").replace(/gÉhÄÊ/g, "ಝೈ").replace(/gÉhÄÃ/g, "ಝೇ").replace(/gÉhÄ/g, "ಝೆ").replace(/gÉ/g, "ರೆ").replace(/gÁ/g, "ರಾ").replace(/gÀÈ/g, "ರೃ").replace(/gÀÆ/g, "ರೂ").replace(/gÀÄ/g, "ರು").replace(/gÀhÄÈ/g, "ಝೃ").replace(/gÀhÄÆ/g, "ಝೂ").replace(/gÀhÄÄ/g, "ಝು").replace(/gÀhÄ/g, "ಝ").replace(/gÀhiï/g, "ಝ್").replace(/gÀhiË/g, "ಝೌ").replace(/gÀhiÁ/g, "ಝಾ").replace(/gÀ/g, "ರ").replace(/fÃ/g, "ಜೀ").replace(/f/g, "ಜಿ").replace(/eï/g, "ಜ್").replace(/eË/g, "ಜೌ").replace(/eÉÊ/g, "ಜೈ").replace(/eÉÆÃ/g, "ಜೋ").replace(/eÉÆ/g, "ಜೊ").replace(/eÉÃ/g, "ಜೇ").replace(/eÉ/g, "ಜೆ").replace(/eÁ/g, "ಜಾ").replace(/dÈ/g, "ಜೃ").replace(/dÆ/g, "ಜೂ").replace(/dÄ/g, "ಜು").replace(/d/g, "ಜ").replace(/cÃ/g, "ಛೀ").replace(/c/g, "ಛಿ").replace(/bï/g, "ಛ್").replace(/bË/g, "ಛೌ").replace(/bÉÊ/g, "ಛೈ").replace(/bÉÆÃ/g, "ಛೋ").replace(/bÉÆ/g, "ಛೊ").replace(/bÉÃ/g, "ಛೇ").replace(/bÉ/g, "ಛೆ").replace(/bÁ/g, "ಛಾ").replace(/bÀÈ/g, "ಛೃ").replace(/bÀÆ/g, "ಛೂ").replace(/bÀÄ/g, "ಛು").replace(/bÀ/g, "ಛ").replace(/aÃ/g, "ಚೀ").replace(/a/g, "ಚಿ").replace(/Zï/g, "ಚ್").replace(/ZË/g, "ಚೌ").replace(/ZÉÊ/g, "ಚೈ").replace(/ZÉÆÃ/g, "ಚೋ").replace(/ZÉÆ/g, "ಚೊ").replace(/ZÉÃ/g, "ಚೇ").replace(/ZÉ/g, "ಚೆ").replace(/ZÁ/g, "ಚಾ").replace(/ZÀÈ/g, "ಚೃ").replace(/ZÀÆ/g, "ಚೂ").replace(/ZÀÄ/g, "ಚು").replace(/ZÀ/g, "ಚ").replace(/Yï/g, "ಙ್").replace(/Y/g, "ಙ").replace(/XÃ/g, "ಘೀ").replace(/X/g, "ಘಿ").replace(/Wï/g, "ಘ್").replace(/WË/g, "ಘೌ").replace(/WÉÊ/g, "ಘೈ").replace(/WÉÆÃ/g, "ಘೋ").replace(/WÉÆ/g, "ಘೊ").replace(/WÉÃ/g, "ಘೇ").replace(/WÉ/g, "ಘೆ").replace(/WÁ/g, "ಘಾ").replace(/WÀÈ/g, "ಘೃ").replace(/WÀÆ/g, "ಘೂ").replace(/WÀÄ/g, "ಘು").replace(/WÀ/g, "ಘ").replace(/VÃ/g, "ಗೀ").replace(/V/g, "ಗಿ").replace(/Uï/g, "ಗ್").replace(/UË/g, "ಗೌ").replace(/UÉÊ/g, "ಗೈ").replace(/UÉÆÃ/g, "ಗೋ").replace(/UÉÆ/g, "ಗೊ").replace(/UÉÃ/g, "ಗೇ").replace(/UÉ/g, "ಗೆ").replace(/UÁ/g, "ಗಾ").replace(/UÀÈ/g, "ಗೃ").replace(/UÀÆ/g, "ಗೂ").replace(/UÀÄ/g, "ಗು").replace(/UÀ/g, "ಗ").replace(/TÃ/g, "ಖೀ").replace(/T/g, "ಖಿ").replace(/Sï/g, "ಖ್").replace(/SË/g, "ಖೌ").replace(/SÉÊ/g, "ಖೈ").replace(/SÉÆÃ/g, "ಖೋ").replace(/SÉÆ/g, "ಖೊ").replace(/SÉÃ/g, "ಖೇ").replace(/SÉ/g, "ಖೆ").replace(/SÁ/g, "ಖಾ").replace(/RÈ/g, "ಖೃ").replace(/RÆ/g, "ಖೂ").replace(/RÄ/g, "ಖು").replace(/R/g, "ಖ").replace(/QÃ/g, "ಕೀ").replace(/Q/g, "ಕಿ").replace(/Pï/g, "ಕ್").replace(/PË/g, "ಕೌ").replace(/PÉÊ/g, "ಕೈ").replace(/PÉÆÃ/g, "ಕೋ").replace(/PÉÆ/g, "ಕೊ").replace(/PÉÃ/g, "ಕೇ").replace(/PÉ/g, "ಕೆ").replace(/PÁ/g, "ಕಾ").replace(/PÀÈ/g, "ಕೃ").replace(/PÀÆ/g, "ಕೂ").replace(/PÀÄ/g, "ಕು").replace(/PÀ/g, "ಕ").replace(/O/g, "ಔ").replace(/N/g, "ಓ").replace(/M/g, "ಒ").replace(/L/g, "ಐ").replace(/K/g, "ಏ").replace(/J/g, "ಎ").replace(/IÆ2/g, "ೠ").replace(/IÄ/g, "ಋ").replace(/H/g, "ಊ").replace(/G/g, "ಉ").replace(/F/g, "ಈ").replace(/E/g, "ಇ").replace(/D/g, "ಆ").replace(/C/g, "ಅ").replace(/AiÉÆÃ/g, "ಯೋ").replace(/AiÉÆ/g, "ಯೊ").replace(/AiÉÄÊ/g, "ಯೈ").replace(/AiÉÄÃ/g, "ಯೇ").replace(/AiÉÄ/g, "ಯೆ").replace(/AiÀÄÈ/g, "ಯೃ").replace(/AiÀÄÆ/g, "ಯೂ").replace(/AiÀÄÄ/g, "ಯು").replace(/AiÀÄ/g, "ಯ").replace(/AiÀiï/g, "ಯ್").replace(/AiÀiË/g, "ಯೌ").replace(/AiÀiÁ/g, "ಯಾ").replace(/0iÉÆÃ/g, "ಯೋ").replace(/0iÉÆ/g, "ಯೊ").replace(/0iÉÄÊ/g, "ಯೈ").replace(/0iÉÄÃ/g, "ಯೇ").replace(/0iÉÄ/g, "ಯೆ").replace(/0iÀÄÈ/g, "ಯೃ").replace(/0iÀÄÆ/g, "ಯೂ").replace(/0iÀÄÄ/g, "ಯು").replace(/0iÀÄ/g, "ಯ").replace(/0iÀiï/g, "ಯ್").replace(/0iÀiË/g, "ಯೌ").replace(/0iÀiÁ/g, "ಯಾ");
}
Kn.prototype._REGEX_ASCII_ZWNJ = new RegExp('(ï)([JRmpL°¬aej0μqC§Sªkv¿y¢¼lAbFU£E®¾±DGKPMQZo²¹z¶½¨»urT¦gndNfwWI¤¯tHc«µO¸VYºx¥©X])', 'g');
Kn.prototype._REGEX_ASCII_VATTAKSHARA_3 = new RegExp('([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])', 'g');
Kn.prototype._REGEX_ASCII_VATTAKSHARA_2 = new RegExp('([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])', 'g');
Kn.prototype._REGEX_ASCII_VATTAKSHARA_1 = new RegExp('([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])', 'g');
Kn.prototype._u2a_deerga_handle = function(txt) {
txt = txt.replace( /(Ã)([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])/g, function(match, g1, g2, g3, g4) { return g2 + g3 + g4 + g1; } );
txt = txt.replace( /(Ã)([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])/g, function(match, g1, g2, g3) { return g2 + g3 + g1; } );
txt = txt.replace( /(Ã)([ÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæèéêëìíîùú])/g, function(match, g1, g2) { return g2 + g1; } );
return txt;}
Kn.prototype._replace_vattakshara =function(txt){
return txt.replace(/Ì/g, "್ಕ").replace(/Í/g, "್ಖ").replace(/Î/g, "್ಗ").replace(/Ï/g, "್ಘ").replace(/Ð/g, "್ಙ").replace(/Ñ/g, "್ಚ").replace(/Ò/g, "್ಛ").replace(/Ó/g, "್ಜ").replace(/Ô/g, "್ಝ").replace(/Õ/g, "್ಞ").replace(/Ö/g, "್ಟ").replace(/×/g, "್ಠ").replace(/Ø/g, "್ಡ").replace(/Ù/g, "್ಢ").replace(/Ú/g, "್ಣ").replace(/Û/g, "್ತ").replace(/Ü/g, "್ಥ").replace(/Ý/g, "್ದ").replace(/Þ/g, "್ಧ").replace(/ß/g, "್ನ").replace(/à/g, "್ಪ").replace(/á/g, "್ಫ").replace(/â/g, "್ಬ").replace(/ã/g, "್ಭ").replace(/ä/g, "್ಮ").replace(/å/g, "್ಯ").replace(/æ/g, "್ರ").replace(/è/g, "್ಲ").replace(/é/g, "್ವ").replace(/ê/g, "್ಶ").replace(/ë/g, "್ಷ").replace(/ì/g, "್ಸ").replace(/í/g, "್ಹ").replace(/î/g, "್ಳ").replace(/ù/g, "್ಱ").replace(/ú/g, "್ೞ").replace(/ø/g, "ೃ").replace(/ñ/g, "ೄ").replace(/„/g, "ಽ").replace(/ó/g, "಼");
}
Kn.prototype._a2u_deerga_handle = function(txt) { return txt.replace( /([ಿೆೊ])(Ã)/g, function(match, g1, g2) { if (g1 == 'ಿ') { return 'ೀ'; } if (g1 == 'ೆ') { return 'ೇ'; } if (g1 == 'ೊ') { return 'ೋ'; } });}
Kn.prototype._REGEX_UNI_ASCII_ARKAVATTU = new RegExp('([ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])?(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])?([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])?([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])?ð', 'g');
Kn.prototype._REGEX_UNI_REPH_BEFORE_CONVERT = new RegExp('[^್]?([ರ])(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])?(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])?([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])?([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])?', 'g');
Kn.prototype._REGEX_UNI_REPH_WITHOUT_ZWJ = new RegExp('^([ರ])(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])?(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])?([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])?([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])?$', 'g');
Kn.prototype._REGEX_UNI_VATTAKSHARA = new RegExp('^([ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])‍?(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])?(್[ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])?([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])?([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])?$', 'g');
Kn.prototype._REGEX_UNI_VOWEL_PLUS_ANUSVARA_VISARGA = new RegExp('^([ಅಆಇಈಉಊಋೠಎಏಐಒಓಔಅಂಅಃ])([ಂಃ])$', 'g');
Kn.prototype._REGEX_UNI_CONSONANT_PLUS_VOWEL = new RegExp('^([ಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಲವಶಷಸಹಳಱೞ])([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])?([್ಾಿೀುೂೃೆೇೈೊೋೌಂಃ])?$', 'g');
Kn.prototype._anusvara_visarga = ["\u0c82", "\u0c83"];
Kn.prototype._vowels = ["\u0c85", "\u0c86", "\u0c87", "\u0c88", "\u0c89", "\u0c8a", "\u0c8b", "\u0ce0", "\u0c8e", "\u0c8f", "\u0c90", "\u0c92", "\u0c93", "\u0c94", "\u0c85\u0c82", "\u0c85\u0c83"];
Kn.prototype._halant = "\u0ccd";
Kn.prototype._consonants = ["\u0c95", "\u0c96", "\u0c97", "\u0c98", "\u0c99", "\u0c9a", "\u0c9b", "\u0c9c", "\u0c9d", "\u0c9e", "\u0c9f", "\u0ca0", "\u0ca1", "\u0ca2", "\u0ca3", "\u0ca4", "\u0ca5", "\u0ca6", "\u0ca7", "\u0ca8", "\u0caa", "\u0cab", "\u0cac", "\u0cad", "\u0cae", "\u0caf", "\u0cb0", "\u0cb2", "\u0cb5", "\u0cb6", "\u0cb7", "\u0cb8", "\u0cb9", "\u0cb3", "\u0cb1", "\u0cde"];
Kn.prototype._dep_vowels = ["\u0ccd", "\u0cbe", "\u0cbf", "\u0cc0", "\u0cc1", "\u0cc2", "\u0cc3", "\u0cc6", "\u0cc7", "\u0cc8", "\u0cca", "\u0ccb", "\u0ccc", "\u0c82", "\u0c83"];
Kn.prototype._u2a_map = {"\u0c82": "A", "\u0c83": "B", "\u0c85\u0c82": "CA", "\u0c85\u0c83": "CB", "\u0c85": "C", "\u0c86": "D", "\u0c87": "E", "\u0c88": "F", "\u0c89": "G", "\u0c8a": "H", "\u0c8b": "I\u00c4", "\u0ce0": "I\u00c62", "\u0c8e": "J", "\u0c8f": "K", "\u0c90": "L", "\u0c92": "M", "\u0c93": "N", "\u0c94": "O", "\u0c95\u0ccd": "P\u00ef", "\u0c95": "P\u00c0", "\u0c95\u0cbe": "P\u00c1", "\u0c95\u0cbf": "Q", "\u0c95\u0cc0": "Q\u00c3", "\u0c95\u0cc1": "P\u00c0\u00c4", "\u0c95\u0cc2": "P\u00c0\u00c6", "\u0c95\u0cc3": "P\u00c0\u00c8", "\u0c95\u0cc6": "P\u00c9", "\u0c95\u0cc7": "P\u00c9\u00c3", "\u0c95\u0cc8": "P\u00c9\u00ca", "\u0c95\u0cca": "P\u00c9\u00c6", "\u0c95\u0ccb": "P\u00c9\u00c6\u00c3", "\u0c95\u0ccc": "P\u00cb", "\u0c96\u0ccd": "S\u00ef", "\u0c96": "R", "\u0c96\u0cbe": "S\u00c1", "\u0c96\u0cbf": "T", "\u0c96\u0cc0": "T\u00c3", "\u0c96\u0cc1": "R\u00c4", "\u0c96\u0cc2": "R\u00c6", "\u0c96\u0cc3": "R\u00c8", "\u0c96\u0cc6": "S\u00c9", "\u0c96\u0cc7": "S\u00c9\u00c3", "\u0c96\u0cc8": "S\u00c9\u00ca", "\u0c96\u0cca": "S\u00c9\u00c6", "\u0c96\u0ccb": "S\u00c9\u00c6\u00c3", "\u0c96\u0ccc": "S\u00cb", "\u0c97\u0ccd": "U\u00ef", "\u0c97": "U\u00c0", "\u0c97\u0cbe": "U\u00c1", "\u0c97\u0cbf": "V", "\u0c97\u0cc0": "V\u00c3", "\u0c97\u0cc1": "U\u00c0\u00c4", "\u0c97\u0cc2": "U\u00c0\u00c6", "\u0c97\u0cc3": "U\u00c0\u00c8", "\u0c97\u0cc6": "U\u00c9", "\u0c97\u0cc7": "U\u00c9\u00c3", "\u0c97\u0cc8": "U\u00c9\u00ca", "\u0c97\u0cca": "U\u00c9\u00c6", "\u0c97\u0ccb": "U\u00c9\u00c6\u00c3", "\u0c97\u0ccc": "U\u00cb", "\u0c98\u0ccd": "W\u00ef", "\u0c98": "W\u00c0", "\u0c98\u0cbe": "W\u00c1", "\u0c98\u0cbf": "X", "\u0c98\u0cc0": "X\u00c3", "\u0c98\u0cc1": "W\u00c0\u00c4", "\u0c98\u0cc2": "W\u00c0\u00c6", "\u0c98\u0cc3": "W\u00c0\u00c8", "\u0c98\u0cc6": "W\u00c9", "\u0c98\u0cc7": "W\u00c9\u00c3", "\u0c98\u0cc8": "W\u00c9\u00ca", "\u0c98\u0cca": "W\u00c9\u00c6", "\u0c98\u0ccb": "W\u00c9\u00c6\u00c3", "\u0c98\u0ccc": "W\u00cb", "\u0c99\u0ccd": "Y\u00ef", "\u0c99": "Y", "\u0c9a\u0ccd": "Z\u00ef", "\u0c9a": "Z\u00c0", "\u0c9a\u0cbe": "Z\u00c1", "\u0c9a\u0cbf": "a", "\u0c9a\u0cc0": "a\u00c3", "\u0c9a\u0cc1": "Z\u00c0\u00c4", "\u0c9a\u0cc2": "Z\u00c0\u00c6", "\u0c9a\u0cc3": "Z\u00c0\u00c8", "\u0c9a\u0cc6": "Z\u00c9", "\u0c9a\u0cc7": "Z\u00c9\u00c3", "\u0c9a\u0cc8": "Z\u00c9\u00ca", "\u0c9a\u0cca": "Z\u00c9\u00c6", "\u0c9a\u0ccb": "Z\u00c9\u00c6\u00c3", "\u0c9a\u0ccc": "Z\u00cb", "\u0c9b\u0ccd": "b\u00ef", "\u0c9b": "b\u00c0", "\u0c9b\u0cbe": "b\u00c1", "\u0c9b\u0cbf": "c", "\u0c9b\u0cc0": "c\u00c3", "\u0c9b\u0cc1": "b\u00c0\u00c4", "\u0c9b\u0cc2": "b\u00c0\u00c6", "\u0c9b\u0cc3": "b\u00c0\u00c8", "\u0c9b\u0cc6": "b\u00c9", "\u0c9b\u0cc7": "b\u00c9\u00c3", "\u0c9b\u0cc8": "b\u00c9\u00ca", "\u0c9b\u0cca": "b\u00c9\u00c6", "\u0c9b\u0ccb": "b\u00c9\u00c6\u00c3", "\u0c9b\u0ccc": "b\u00cb", "\u0c9c\u0ccd": "e\u00ef", "\u0c9c": "d", "\u0c9c\u0cbe": "e\u00c1", "\u0c9c\u0cbf": "f", "\u0c9c\u0cc0": "f\u00c3", "\u0c9c\u0cc1": "d\u00c4", "\u0c9c\u0cc2": "d\u00c6", "\u0c9c\u0cc3": "d\u00c8", "\u0c9c\u0cc6": "e\u00c9", "\u0c9c\u0cc7": "e\u00c9\u00c3", "\u0c9c\u0cc8": "e\u00c9\u00ca", "\u0c9c\u0cca": "e\u00c9\u00c6", "\u0c9c\u0ccb": "e\u00c9\u00c6\u00c3", "\u0c9c\u0ccc": "e\u00cb", "\u0c9d\u0ccd": "g\u00c0hi\u00ef", "\u0c9d": "g\u00c0h\u00c4", "\u0c9d\u0cbe": "g\u00c0hi\u00c1", "\u0c9d\u0cbf": "jh\u00c4", "\u0c9d\u0cc0": "jh\u00c4\u00c3", "\u0c9d\u0cc1": "g\u00c0h\u00c4\u00c4", "\u0c9d\u0cc2": "g\u00c0h\u00c4\u00c6", "\u0c9d\u0cc3": "g\u00c0h\u00c4\u00c8", "\u0c9d\u0cc6": "g\u00c9h\u00c4", "\u0c9d\u0cc7": "g\u00c9h\u00c4\u00c3", "\u0c9d\u0cc8": "g\u00c9h\u00c4\u00ca", "\u0c9d\u0cca": "g\u00c9h\u00c6", "\u0c9d\u0ccb": "g\u00c9h\u00c6\u00c3", "\u0c9d\u0ccc": "g\u00c0hi\u00cb", "\u0c9e\u0ccd": "k\u00ef", "\u0c9e": "k", "\u0c9f\u0ccd": "m\u00ef", "\u0c9f": "l", "\u0c9f\u0cbe": "m\u00c1", "\u0c9f\u0cbf": "n", "\u0c9f\u0cc0": "n\u00c3", "\u0c9f\u0cc1": "l\u00c4", "\u0c9f\u0cc2": "l\u00c6", "\u0c9f\u0cc3": "l\u00c8", "\u0c9f\u0cc6": "m\u00c9", "\u0c9f\u0cc7": "m\u00c9\u00c3", "\u0c9f\u0cc8": "m\u00c9\u00ca", "\u0c9f\u0cca": "m\u00c9\u00c6", "\u0c9f\u0ccb": "m\u00c9\u00c6\u00c3", "\u0c9f\u0ccc": "m\u00cb", "\u0ca0\u0ccd": "o\u00ef", "\u0ca0": "o\u00c0", "\u0ca0\u0cbe": "o\u00c1", "\u0ca0\u0cbf": "p", "\u0ca0\u0cc0": "p\u00c3", "\u0ca0\u0cc1": "o\u00c0\u00c4", "\u0ca0\u0cc2": "o\u00c0\u00c6", "\u0ca0\u0cc3": "o\u00c0\u00c8", "\u0ca0\u0cc6": "o\u00c9", "\u0ca0\u0cc7": "o\u00c9\u00c3", "\u0ca0\u0cc8": "o\u00c9\u00ca", "\u0ca0\u0cca": "o\u00c9\u00c6", "\u0ca0\u0ccb": "o\u00c9\u00c6\u00c3", "\u0ca0\u0ccc": "o\u00cb", "\u0ca1\u0ccd": "q\u00ef", "\u0ca1": "q\u00c0", "\u0ca1\u0cbe": "q\u00c1", "\u0ca1\u0cbf": "r", "\u0ca1\u0cc0": "r\u00c3", "\u0ca1\u0cc1": "q\u00c0\u00c4", "\u0ca1\u0cc2": "q\u00c0\u00c6", "\u0ca1\u0cc3": "q\u00c0\u00c8", "\u0ca1\u0cc6": "q\u00c9", "\u0ca1\u0cc7": "q\u00c9\u00c3", "\u0ca1\u0cc8": "q\u00c9\u00ca", "\u0ca1\u0cca": "q\u00c9\u00c6", "\u0ca1\u0ccb": "q\u00c9\u00c6\u00c3", "\u0ca1\u0ccc": "q\u00cb", "\u0ca2\u0ccd": "qs\u00ef", "\u0ca2": "qs\u00c0", "\u0ca2\u0cbe": "qs\u00c1", "\u0ca2\u0cbf": "r\u00fc", "\u0ca2\u0cc0": "r\u00fc\u00c3", "\u0ca2\u0cc1": "qs\u00c0\u00c4", "\u0ca2\u0cc2": "qs\u00c0\u00c6", "\u0ca2\u0cc3": "qs\u00c0\u00c8", "\u0ca2\u0cc6": "qs\u00c9", "\u0ca2\u0cc7": "qs\u00c9\u00c3", "\u0ca2\u0cc8": "qs\u00c9\u00ca", "\u0ca2\u0cca": "qs\u00c9\u00c6", "\u0ca2\u0ccb": "qs\u00c9\u00c6\u00c3", "\u0ca2\u0ccc": "qs\u00cb", "\u0ca3\u0ccd": "u\u00ef", "\u0ca3": "t", "\u0ca3\u0cbe": "u\u00c1", "\u0ca3\u0cbf": "t\u00c2", "\u0ca3\u0cc0": "t\u00c2\u00c3", "\u0ca3\u0cc1": "t\u00c4", "\u0ca3\u0cc2": "t\u00c6", "\u0ca3\u0cc3": "t\u00c8", "\u0ca3\u0cc6": "u\u00c9", "\u0ca3\u0cc7": "u\u00c9\u00c3", "\u0ca3\u0cc8": "u\u00c9\u00ca", "\u0ca3\u0cca": "u\u00c9\u00c6", "\u0ca3\u0ccb": "u\u00c9\u00c6\u00c3", "\u0ca3\u0ccc": "u\u00cb", "\u0ca4\u0ccd": "v\u00ef", "\u0ca4": "v\u00c0", "\u0ca4\u0cbe": "v\u00c1", "\u0ca4\u0cbf": "w", "\u0ca4\u0cc0": "w\u00c3", "\u0ca4\u0cc1": "v\u00c0\u00c4", "\u0ca4\u0cc2": "v\u00c0\u00c6", "\u0ca4\u0cc3": "v\u00c0\u00c8", "\u0ca4\u0cc6": "v\u00c9", "\u0ca4\u0cc7": "v\u00c9\u00c3", "\u0ca4\u0cc8": "v\u00c9\u00ca", "\u0ca4\u0cca": "v\u00c9\u00c6", "\u0ca4\u0ccb": "v\u00c9\u00c6\u00c3", "\u0ca4\u0ccc": "v\u00cb", "\u0ca5\u0ccd": "x\u00ef", "\u0ca5": "x\u00c0", "\u0ca5\u0cbe": "x\u00c1", "\u0ca5\u0cbf": "y", "\u0ca5\u0cc0": "y\u00c3", "\u0ca5\u0cc1": "x\u00c0\u00c4", "\u0ca5\u0cc2": "x\u00c0\u00c6", "\u0ca5\u0cc3": "x\u00c0\u00c8", "\u0ca5\u0cc6": "x\u00c9", "\u0ca5\u0cc7": "x\u00c9\u00c3", "\u0ca5\u0cc8": "x\u00c9\u00ca", "\u0ca5\u0cca": "x\u00c9\u00c6", "\u0ca5\u0ccb": "x\u00c9\u00c6\u00c3", "\u0ca5\u0ccc": "x\u00cb", "\u0ca6\u0ccd": "z\u00ef", "\u0ca6": "z\u00c0", "\u0ca6\u0cbe": "z\u00c1", "\u0ca6\u0cbf": "\u00a2", "\u0ca6\u0cc0": "\u00a2\u00c3", "\u0ca6\u0cc1": "z\u00c0\u00c4", "\u0ca6\u0cc2": "z\u00c0\u00c6", "\u0ca6\u0cc3": "z\u00c0\u00c8", "\u0ca6\u0cc6": "z\u00c9", "\u0ca6\u0cc7": "z\u00c9\u00c3", "\u0ca6\u0cc8": "z\u00c9\u00ca", "\u0ca6\u0cca": "z\u00c9\u00c6", "\u0ca6\u0ccb": "z\u00c9\u00c6\u00c3", "\u0ca6\u0ccc": "z\u00cb", "\u0ca7\u0ccd": "zs\u00ef", "\u0ca7": "zs\u00c0", "\u0ca7\u0cbe": "zs\u00c1", "\u0ca7\u0cbf": "\u00a2\u00fc", "\u0ca7\u0cc0": "\u00a2\u00fc\u00c3", "\u0ca7\u0cc1": "zs\u00c0\u00c4", "\u0ca7\u0cc2": "zs\u00c0\u00c6", "\u0ca7\u0cc3": "zs\u00c0\u00c8", "\u0ca7\u0cc6": "zs\u00c9", "\u0ca7\u0cc7": "zs\u00c9\u00c3", "\u0ca7\u0cc8": "zs\u00c9\u00ca", "\u0ca7\u0cca": "zs\u00c9\u00c6", "\u0ca7\u0ccb": "zs\u00c9\u00c6\u00c3", "\u0ca7\u0ccc": "zs\u00cb", "\u0ca8\u0ccd": "\u00a3\u00ef", "\u0ca8": "\u00a3\u00c0", "\u0ca8\u0cbe": "\u00a3\u00c1", "\u0ca8\u0cbf": "\u00a4", "\u0ca8\u0cc0": "\u00a4\u00c3", "\u0ca8\u0cc1": "\u00a3\u00c0\u00c4", "\u0ca8\u0cc2": "\u00a3\u00c0\u00c6", "\u0ca8\u0cc3": "\u00a3\u00c0\u00c8", "\u0ca8\u0cc6": "\u00a3\u00c9", "\u0ca8\u0cc7": "\u00a3\u00c9\u00c3", "\u0ca8\u0cc8": "\u00a3\u00c9\u00ca", "\u0ca8\u0cca": "\u00a3\u00c9\u00c6", "\u0ca8\u0ccb": "\u00a3\u00c9\u00c6\u00c3", "\u0ca8\u0ccc": "\u00a3\u00cb", "\u0caa\u0ccd": "\u00a5\u00ef", "\u0caa": "\u00a5\u00c0", "\u0caa\u0cbe": "\u00a5\u00c1", "\u0caa\u0cbf": "\u00a6", "\u0caa\u0cc0": "\u00a6\u00c3", "\u0caa\u0cc1": "\u00a5\u00c0\u00c5", "\u0caa\u0cc2": "\u00a5\u00c0\u00c7", "\u0caa\u0cc3": "\u00a5\u00c0\u00c8", "\u0caa\u0cc6": "\u00a5\u00c9", "\u0caa\u0cc7": "\u00a5\u00c9\u00c3", "\u0caa\u0cc8": "\u00a5\u00c9\u00ca", "\u0caa\u0cca": "\u00a5\u00c9\u00c7", "\u0caa\u0ccb": "\u00a5\u00c9\u00c7\u00c3", "\u0caa\u0ccc": "\u00a5\u00cb", "\u0cab\u0ccd": "\u00a5s\u00ef", "\u0cab": "\u00a5s\u00c0", "\u0cab\u0cbe": "\u00a5s\u00c1", "\u0cab\u0cbf": "\u00a6\u00fc", "\u0cab\u0cc0": "\u00a6\u00fc\u00c3", "\u0cab\u0cc1": "\u00a5s\u00c0\u00c5", "\u0cab\u0cc2": "\u00a5s\u00c0\u00c7", "\u0cab\u0cc3": "\u00a5s\u00c0\u00c8", "\u0cab\u0cc6": "\u00a5s\u00c9", "\u0cab\u0cc7": "\u00a5s\u00c9\u00c3", "\u0cab\u0cc8": "\u00a5s\u00c9\u00ca", "\u0cab\u0cca": "\u00a5s\u00c9\u00c7", "\u0cab\u0ccb": "\u00a5s\u00c9\u00c7\u00c3", "\u0cab\u0ccc": "\u00a5s\u00cb", "\u0cac\u0ccd": "\u00a8\u00ef", "\u0cac": "\u00a7", "\u0cac\u0cbe": "\u00a8\u00c1", "\u0cac\u0cbf": "\u00a9", "\u0cac\u0cc0": "\u00a9\u00c3", "\u0cac\u0cc1": "\u00a7\u00c4", "\u0cac\u0cc2": "\u00a7\u00c6", "\u0cac\u0cc3": "\u00a7\u00c8", "\u0cac\u0cc6": "\u00a8\u00c9", "\u0cac\u0cc7": "\u00a8\u00c9\u00c3", "\u0cac\u0cc8": "\u00a8\u00c9\u00ca", "\u0cac\u0cca": "\u00a8\u00c9\u00c6", "\u0cac\u0ccb": "\u00a8\u00c9\u00c6\u00c3", "\u0cac\u0ccc": "\u00a8\u00cb", "\u0cad\u0ccd": "\u00a8s\u00ef", "\u0cad": "\u00a8s\u00c0", "\u0cad\u0cbe": "\u00a8s\u00c1", "\u0cad\u0cbf": "\u00a9\u00fc", "\u0cad\u0cc0": "\u00a9\u00fc\u00c3", "\u0cad\u0cc1": "\u00a8s\u00c0\u00c4", "\u0cad\u0cc2": "\u00a8s\u00c0\u00c6", "\u0cad\u0cc3": "\u00a8s\u00c0\u00c8", "\u0cad\u0cc6": "\u00a8s\u00c9", "\u0cad\u0cc7": "\u00a8s\u00c9\u00c3", "\u0cad\u0cc8": "\u00a8s\u00c9\u00ca", "\u0cad\u0cca": "\u00a8s\u00c9\u00c6", "\u0cad\u0ccb": "\u00a8s\u00c9\u00c6\u00c3", "\u0cad\u0ccc": "\u00a8s\u00cb", "\u0cae\u0ccd": "\u00aa\u00c0i\u00ef", "\u0cae": "\u00aa\u00c0\u00c4", "\u0cae\u0cbe": "\u00aa\u00c0i\u00c1", "\u0cae\u0cbf": "\u00ab\u00c4", "\u0cae\u0cc0": "\u00ab\u00c4\u00c3", "\u0cae\u0cc1": "\u00aa\u00c0\u00c4\u00c4", "\u0cae\u0cc2": "\u00aa\u00c0\u00c4\u00c6", "\u0cae\u0cc3": "\u00aa\u00c0\u00c4\u00c8", "\u0cae\u0cc6": "\u00aa\u00c9\u00c4", "\u0cae\u0cc7": "\u00aa\u00c9\u00c4\u00c3", "\u0cae\u0cc8": "\u00aa\u00c9\u00c4\u00ca", "\u0cae\u0cca": "\u00aa\u00c9\u00c6", "\u0cae\u0ccb": "\u00aa\u00c9\u00c6\u00c3", "\u0cae\u0ccc": "\u00aa\u00c0i\u00cb", "\u0caf\u0ccd": "Ai\u00c0i\u00ef", "\u0caf": "Ai\u00c0\u00c4", "\u0caf\u0cbe": "Ai\u00c0i\u00c1", "\u0caf\u0cbf": "\u00ac\u00c4", "\u0caf\u0cc0": "\u00ac\u00c4\u00c3", "\u0caf\u0cc1": "Ai\u00c0\u00c4\u00c4", "\u0caf\u0cc2": "Ai\u00c0\u00c4\u00c6", "\u0caf\u0cc3": "Ai\u00c0\u00c4\u00c8", "\u0caf\u0cc6": "Ai\u00c9\u00c4", "\u0caf\u0cc7": "Ai\u00c9\u00c4\u00c3", "\u0caf\u0cc8": "Ai\u00c9\u00c4\u00ca", "\u0caf\u0cca": "Ai\u00c9\u00c6", "\u0caf\u0ccb": "Ai\u00c9\u00c6\u00c3", "\u0caf\u0ccc": "Ai\u00c0i\u00cb", "\u0cb0\u0ccd": "g\u00ef", "\u0cb0": "g\u00c0", "\u0cb0\u0cbe": "g\u00c1", "\u0cb0\u0cbf": "j", "\u0cb0\u0cc0": "j\u00c3", "\u0cb0\u0cc1": "g\u00c0\u00c4", "\u0cb0\u0cc2": "g\u00c0\u00c6", "\u0cb0\u0cc3": "g\u00c0\u00c8", "\u0cb0\u0cc6": "g\u00c9", "\u0cb0\u0cc7": "g\u00c9\u00c3", "\u0cb0\u0cc8": "g\u00c9\u00ca", "\u0cb0\u0cca": "g\u00c9\u00c6", "\u0cb0\u0ccb": "g\u00c9\u00c6\u00c3", "\u0cb0\u0ccc": "g\u00cb", "\u0cb2\u0ccd": "\u00af\u00ef", "\u0cb2": "\u00ae", "\u0cb2\u0cbe": "\u00af\u00c1", "\u0cb2\u0cbf": "\u00b0", "\u0cb2\u0cc0": "\u00b0\u00c3", "\u0cb2\u0cc1": "\u00ae\u00c4", "\u0cb2\u0cc2": "\u00ae\u00c6", "\u0cb2\u0cc3": "\u00ae\u00c8", "\u0cb2\u0cc6": "\u00af\u00c9", "\u0cb2\u0cc7": "\u00af\u00c9\u00c3", "\u0cb2\u0cc8": "\u00af\u00c9\u00ca", "\u0cb2\u0cca": "\u00af\u00c9\u00c6", "\u0cb2\u0ccb": "\u00af\u00c9\u00c6\u00c3", "\u0cb2\u0ccc": "\u00af\u00cb", "\u0cb5\u0ccd": "\u00aa\u00ef", "\u0cb5": "\u00aa\u00c0", "\u0cb5\u0cbe": "\u00aa\u00c1", "\u0cb5\u0cbf": "\u00ab", "\u0cb5\u0cc0": "\u00ab\u00c3", "\u0cb5\u0cc1": "\u00aa\u00c0\u00c5", "\u0cb5\u0cc2": "\u00aa\u00c0\u00c7", "\u0cb5\u0cc3": "\u00aa\u00c0\u00c8", "\u0cb5\u0cc6": "\u00aa\u00c9", "\u0cb5\u0cc7": "\u00aa\u00c9\u00c3", "\u0cb5\u0cc8": "\u00aa\u00c9\u00ca", "\u0cb5\u0cca": "\u00aa\u00c9\u00c7", "\u0cb5\u0ccb": "\u00aa\u00c9\u00c7\u00c3", "\u0cb5\u0ccc": "\u00aa\u00cb", "\u0cb6\u0ccd": "\u00b1\u00ef", "\u0cb6": "\u00b1\u00c0", "\u0cb6\u0cbe": "\u00b1\u00c1", "\u0cb6\u0cbf": "\u00b2", "\u0cb6\u0cc0": "\u00b2\u00c3", "\u0cb6\u0cc1": "\u00b1\u00c0\u00c4", "\u0cb6\u0cc2": "\u00b1\u00c0\u00c6", "\u0cb6\u0cc3": "\u00b1\u00c0\u00c8", "\u0cb6\u0cc6": "\u00b1\u00c9", "\u0cb6\u0cc7": "\u00b1\u00c9\u00c3", "\u0cb6\u0cc8": "\u00b1\u00c9\u00ca", "\u0cb6\u0cca": "\u00b1\u00c9\u00c6", "\u0cb6\u0ccb": "\u00b1\u00c9\u00c6\u00c3", "\u0cb6\u0ccc": "\u00b1\u00cb", "\u0cb7\u0ccd": "\u03bc\u00ef", "\u0cb7": "\u03bc\u00c0", "\u0cb7\u0cbe": "\u03bc\u00c1", "\u0cb7\u0cbf": "\u00b6", "\u0cb7\u0cc0": "\u00b6\u00c3", "\u0cb7\u0cc1": "\u03bc\u00c0\u00c4", "\u0cb7\u0cc2": "\u03bc\u00c0\u00c6", "\u0cb7\u0cc3": "\u03bc\u00c0\u00c8", "\u0cb7\u0cc6": "\u03bc\u00c9", "\u0cb7\u0cc7": "\u03bc\u00c9\u00c3", "\u0cb7\u0cc8": "\u03bc\u00c9\u00ca", "\u0cb7\u0cca": "\u03bc\u00c9\u00c6", "\u0cb7\u0ccb": "\u03bc\u00c9\u00c6\u00c3", "\u0cb7\u0ccc": "\u03bc\u00cb", "\u0cb8\u0ccd": "\u00b8\u00ef", "\u0cb8": "\u00b8\u00c0", "\u0cb8\u0cbe": "\u00b8\u00c1", "\u0cb8\u0cbf": "\u00b9", "\u0cb8\u0cc0": "\u00b9\u00c3", "\u0cb8\u0cc1": "\u00b8\u00c0\u00c4", "\u0cb8\u0cc2": "\u00b8\u00c0\u00c6", "\u0cb8\u0cc3": "\u00b8\u00c0\u00c8", "\u0cb8\u0cc6": "\u00b8\u00c9", "\u0cb8\u0cc7": "\u00b8\u00c9\u00c3", "\u0cb8\u0cc8": "\u00b8\u00c9\u00ca", "\u0cb8\u0cca": "\u00b8\u00c9\u00c6", "\u0cb8\u0ccb": "\u00b8\u00c9\u00c6\u00c3", "\u0cb8\u0ccc": "\u00b8\u00cb", "\u0cb9\u0ccd": "\u00ba\u00ef", "\u0cb9": "\u00ba\u00c0", "\u0cb9\u0cbe": "\u00ba\u00c1", "\u0cb9\u0cbf": "\u00bb", "\u0cb9\u0cc0": "\u00bb\u00c3", "\u0cb9\u0cc1": "\u00ba\u00c0\u00c4", "\u0cb9\u0cc2": "\u00ba\u00c0\u00c6", "\u0cb9\u0cc3": "\u00ba\u00c0\u00c8", "\u0cb9\u0cc6": "\u00ba\u00c9", "\u0cb9\u0cc7": "\u00ba\u00c9\u00c3", "\u0cb9\u0cc8": "\u00ba\u00c9\u00ca", "\u0cb9\u0cca": "\u00ba\u00c9\u00c6", "\u0cb9\u0ccb": "\u00ba\u00c9\u00c6\u00c3", "\u0cb9\u0ccc": "\u00ba\u00cb", "\u0cb3\u0ccd": "\u00bc\u00ef", "\u0cb3": "\u00bc\u00c0", "\u0cb3\u0cbe": "\u00bc\u00c1", "\u0cb3\u0cbf": "\u00bd", "\u0cb3\u0cc0": "\u00bd\u00c3", "\u0cb3\u0cc1": "\u00bc\u00c0\u00c4", "\u0cb3\u0cc2": "\u00bc\u00c0\u00c6", "\u0cb3\u0cc3": "\u00bc\u00c0\u00c8", "\u0cb3\u0cc6": "\u00bc\u00c9", "\u0cb3\u0cc7": "\u00bc\u00c9\u00c3", "\u0cb3\u0cc8": "\u00bc\u00c9\u00ca", "\u0cb3\u0cca": "\u00bc\u00c9\u00c6", "\u0cb3\u0ccb": "\u00bc\u00c9\u00c6\u00c3", "\u0cb3\u0ccc": "\u00bc\u00cb", "\u0cb1\u0ccd\u200c": "\u00be\u00f5\u00ef", "\u0cb1": "\u00be\u00f5\u00c0", "\u0cb1\u0cbe": "\u00be\u00f5\u00c1", "\u0cb1\u0cbf": "\u00be\u00c2", "\u0cb1\u0cc1": "\u00be\u00c4", "\u0cb1\u0cc2": "\u00be\u00c6", "\u0cb1\u0cc3": "\u00be\u00c8", "\u0cb1\u0cc6": "\u00be\u00f5\u00c9", "\u0cb1\u0cc7": "\u00be\u00f5\u00c9\u00c3", "\u0cb1\u0cc8": "\u00be\u00f5\u00c9\u00ca", "\u0cb1\u0cca": "\u00be\u00f5\u00c9\u00c6", "\u0cb1\u0ccb": "\u00be\u00f5\u00c9\u00c6\u00c3", "\u0cb1\u0ccc": "\u00be\u00f5\u00cb", "\u0cde\u0ccd\u200c": "\u00bf\u00f5\u00ef", "\u0cde": "\u00bf\u00f5\u00c0", "\u0cde\u0cbe": "\u00bf\u00f5\u00c1", "\u0cde\u0cbf": "\u00bf\u00c2", "\u0cde\u0cc1": "\u00bf\u00c4", "\u0cde\u0cc2": "\u00bf\u00c6", "\u0cde\u0cc3": "\u00bf\u00c8", "\u0cde\u0cc6": "\u00bf\u00f5\u00c9", "\u0cde\u0cc7": "\u00bf\u00f5\u00c9\u00c3", "\u0cde\u0cc8": "\u00bf\u00f5\u00c9\u00ca", "\u0cde\u0cca": "\u00bf\u00f5\u00c9\u00c6", "\u0cde\u0ccb": "\u00bf\u00f5\u00c9\u00c6\u00c3", "\u0cde\u0ccc": "\u00bf\u00f5\u00cb", "\u0ccd\u0c95": "\u00cc", "\u0ccd\u0c96": "\u00cd", "\u0ccd\u0c97": "\u00ce", "\u0ccd\u0c98": "\u00cf", "\u0ccd\u0c99": "\u00d0", "\u0ccd\u0c9a": "\u00d1", "\u0ccd\u0c9b": "\u00d2", "\u0ccd\u0c9c": "\u00d3", "\u0ccd\u0c9d": "\u00d4", "\u0ccd\u0c9e": "\u00d5", "\u0ccd\u0c9f": "\u00d6", "\u0ccd\u0ca0": "\u00d7", "\u0ccd\u0ca1": "\u00d8", "\u0ccd\u0ca2": "\u00d9", "\u0ccd\u0ca3": "\u00da", "\u0ccd\u0ca4": "\u00db", "\u0ccd\u0ca5": "\u00dc", "\u0ccd\u0ca6": "\u00dd", "\u0ccd\u0ca7": "\u00de", "\u0ccd\u0ca8": "\u00df", "\u0ccd\u0caa": "\u00e0", "\u0ccd\u0cab": "\u00e1", "\u0ccd\u0cac": "\u00e2", "\u0ccd\u0cad": "\u00e3", "\u0ccd\u0cae": "\u00e4", "\u0ccd\u0caf": "\u00e5", "\u0ccd\u0cb0": "\u00e6", "\u0ccd\u0cb2": "\u00e8", "\u0ccd\u0cb5": "\u00e9", "\u0ccd\u0cb6": "\u00ea", "\u0ccd\u0cb7": "\u00eb", "\u0ccd\u0cb8": "\u00ec", "\u0ccd\u0cb9": "\u00ed", "\u0ccd\u0cb3": "\u00ee", "\u0ccd\u0cb1": "\u00f9", "\u0ccd\u0cde": "\u00fa"};
Kn.prototype._kn_numbers = ["\u0ce6", "\u0ce7", "\u0ce8", "\u0ce9", "\u0cea", "\u0ceb", "\u0cec", "\u0ced", "\u0cee", "\u0cef"];
Kn.prototype._en_numbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
Kn.prototype._ascii_halant = "\u00ef";
Kn.prototype._ascii_consonants_start_chars = ["J", "R", "m", "p", "L", "\u00b0", "\u00ac", "a", "e", "j", "0", "\u03bc", "q", "C", "\u00a7", "S", "\u00aa", "k", "v", "\u00bf", "y", "\u00a2", "\u00bc", "l", "A", "b", "F", "U", "\u00a3", "E", "\u00ae", "\u00be", "\u00b1", "D", "G", "K", "P", "M", "Q", "Z", "o", "\u00b2", "\u00b9", "z", "\u00b6", "\u00bd", "\u00a8", "\u00bb", "u", "r", "T", "\u00a6", "g", "n", "d", "N", "f", "w", "W", "I", "\u00a4", "\u00af", "t", "H", "c", "\u00ab", "\u00b5", "O", "\u00b8", "V", "Y", "\u00ba", "x", "\u00a5", "\u00a9", "X"];
Kn.prototype._uni_zwnj = "\u200c";
Kn.prototype._uni_zwj = "\u200d";
Kn.prototype._ascii_arkavattu = "\u00f0";
Kn.prototype._uni_ra = "\u0cb0";
Kn.prototype._unicode_anusvara_visarga = function(txt){return txt.replace(/ಂ/g,"A").replace(/ಃ/g,"B");}
Kn.prototype._to_ascii_numbers = function(txt){return txt.replace(/೦/g,"0").replace(/೧/g,"1").replace(/೨/g,"2").replace(/೩/g,"3").replace(/೪/g,"4").replace(/೫/g,"5").replace(/೬/g,"6").replace(/೭/g,"7").replace(/೮/g,"8").replace(/೯/g,"9");}
Kn.prototype._to_unicode_numbers = function(txt){return txt.replace(/0/g,"೦").replace(/1/g,"೧").replace(/2/g,"೨").replace(/3/g,"೩").replace(/4/g,"೪").replace(/5/g,"೫").replace(/6/g,"೬").replace(/7/g,"೭").replace(/8/g,"೮").replace(/9/g,"೯");}
function Kn(){};
var kn = new Kn();
Kn.prototype._uni_halant = "ccd";
Kn.prototype._uni_prev_value_chars = [
"cbe", "cbf", "cc0", "cc1",
"cc2", "cc3", "cc4", "cc6",
"cc7", "cc8", "cca", "ccb",
"ccc", "ccd", "c82", "c83", "200d"
];
Kn.prototype.letters = function(txt) {
function hexval(i) {
return txt[i].charCodeAt(0).toString(16);
}
function prev_hexval(i) {
if (txt[i-1]){
return txt[i-1].charCodeAt(0).toString(16);
}
return "";
};
function iskn(i) {
var re = new RegExp(/^[\u0C80-\u0CFF\u200D]+$/);
return txt[i].match(re) ? true : false;
};
var l = txt.length;
var out = [];
for (var i=0; i<l; i++) {
var cond = (this._uni_prev_value_chars.indexOf(hexval(i)) != -1 ||
prev_hexval(i) === this._uni_halant);
if (out.length > 0 && iskn(i) && cond) {
out[out.length-1] += txt[i];
}
else {
out.push(txt[i]);
}
}
return out;
};
Kn.prototype.length = function(txt){
return this.letters(txt).length;
};
Kn.prototype._rearrange_and_replace = function(inp){
// If inp is vowel, then no need to change
var that = this;
// If input letter is only vowel, then directly convert it
if (this._vowels.indexOf(inp) !== -1){
return this._u2a_map[inp];
}
// Anuswara visarga with vowels
inp = inp.replace(this._REGEX_UNI_VOWEL_PLUS_ANUSVARA_VISARGA, function(match, g1, g2){
return that._u2a_map[g1] + that._u2a_map[g2];
});
// Detect kaagunitha and convert to ASCII using Map
inp = inp.replace(this._REGEX_UNI_CONSONANT_PLUS_VOWEL, function(match, g1, g2, g3){
return that._substitute_ascii(g1, [g2, g3], []);
});
// Arkavattu vs Ra vattu
// If ZWJ is not used then use Arkavattu, First vattakshara after Ra
// is treated as new Base, and add arkavattu in the end
inp = inp.replace(this._REGEX_UNI_REPH_WITHOUT_ZWJ,
function(match, g1, g2, g3, g4, g5, g6){
// First vattakshara will become base
var base = g2.replace(that._halant, "");
var append_chars = [that._ascii_arkavattu];
return that._substitute_ascii(base, [g5, g6], [g3, g4], append_chars);
});
// Detect Vattakshara(with ZWJ or Without), Ignore ZWJ in match
inp = inp.replace(this._REGEX_UNI_VATTAKSHARA,
function(match, g1, g2, g3, g4, g5, g6){
return that._substitute_ascii(g1, [g5, g6], [g2, g3, g4]);
});
return inp;
}
Kn.prototype._substitute_ascii = function(base, dep_vowel, vattaksharagalu, append_chars){
var op = "";
if (dep_vowel[0] === undefined){
// Dependent vowel is not present, that means only consonant
// convert it directly using Map
op += this._u2a_map[base];
}
else{
if (this._anusvara_visarga.indexOf(dep_vowel[0]) === -1){
// If first dependent vowel is not Anuswara and visarga then
// join base and dep vowel since in ASCII vattakshara is added in
// the end after dep vowel(In Unicode it is dep vowel + vattakshara)
op += this._u2a_map[base + dep_vowel[0]];
}
else{
// Only base now, anuswara visarga will be added later
op += this._u2a_map[base];
}
}
// If Vattaksharagalu exists, replace with ASCII vattakshara and add
for (var i=0; i<vattaksharagalu.length; i++){
if (vattaksharagalu[i] !== undefined){
op += this._u2a_map[vattaksharagalu[i]];
}
}
// Previously not added anuswara visarga, add it now since vattakshara
// already added.
if (this._anusvara_visarga.indexOf(dep_vowel[0]) !== -1){
op += this._u2a_map[dep_vowel[0]];
}
// If contains second dep vowel add it to the converted
if (dep_vowel[1] !== undefined){
op += this._u2a_map[dep_vowel[1]];
}
if (append_chars !== undefined) {
op += append_chars.join("");
}
return op;
}
Kn.prototype._ascii_to_unicode_word = function (txt, english_numbers){
that = this;
// Insert ZWNJ if required before converting anything else
txt = txt.replace(this._REGEX_ASCII_ZWNJ,
function(match, g1, g2) {
return g1 + that._uni_zwnj + g2;
});
// Replace all which can be replaced using Maps
txt = this._replace_from_map(txt);
// Identify dependent vowel followed by 3 level vattaksharas
// Replace vattaksharas with equivalant unicode combination and
// reorg and move dep vowel to end
txt = txt.replace(this._REGEX_ASCII_VATTAKSHARA_3,
function(match, g1, g2, g3, g4){
return g2 + g3 + g4 + g1;
});
// Identify dependent vowel followed by 2 level vattaksharas
// Replace vattaksharas with equivalant unicode combination and
// reorg and move dep vowel to end
txt = txt.replace(this._REGEX_ASCII_VATTAKSHARA_2,
function(match, g1, g2, g3){
return g2 + g3 + g1;
});
// Identify dependent vowel followed by 1 level vattaksharas
// Replace vattaksharas with equivalant unicode combination and
// reorg and move dep vowel to end
txt = txt.replace(this._REGEX_ASCII_VATTAKSHARA_1,
function(match, g1, g2){
return g2 + g1;
});
// If any more vattakshara pending, without dependent vowel
// For example ಮ್ಮ
txt = this._replace_vattakshara(txt);
// Handle Numbers
if (english_numbers === undefined || !english_numbers) {
txt = this._to_unicode_numbers(txt);
}
txt = this._replace_a2u_anuswara_visarga(txt)
// Now it is converted to Unicode except few left out chars
// Handle Reph when ZWJ is used
txt = txt.replace(this._REGEX_UNI_REPH_BEFORE_CONVERT,
function(match, g1, g2, g3, g4, g5, g6){
// Add ZWJ after Ra and retain others as is
var op = g1 + that._uni_zwj + g2;
if (g3 !== undefined){
op += g3;
}
if (g4 !== undefined){
op += g4;
}
if (g5 !== undefined){
op += g5;
}
if (g6 !== undefined){
op += g6;
}
return op;
});
// Handle Reph when no ZWJ is used. If ascii arkavattu present in
// the end, remove it and add Ra to the beginning and make first
// char in Match as vattakshara
txt = txt.replace(this._REGEX_UNI_ASCII_ARKAVATTU,
function(match, g1, g2, g3, g4, g5){
var op = that._uni_ra + that._halant + g1;
if (g2 !== undefined){
op += g2;
}
if (g3 !== undefined){
op += g3;
}
if (g4 !== undefined){
op += g4;
}
if (g5 !== undefined){
op += g5;
}
return op;
});
return txt;
}
Kn.prototype._a2u_post_process = function(txt) {
return txt.replace("É", "ಕೆ"[1]);
}
Kn.prototype.ascii_to_unicode = function (txt, english_numbers, remove_extra_space){
if (remove_extra_space) {
txt = txt.replace(/[ \t]+/g,' ').trim();
}
var words = txt.split(" ");
var op = [];
var l = words.length;
for (var i=0; i<l; i++) {
var wl = words[i].length;
if (wl > 0 && words[i][0] === "$" && words[i][wl-1] === "$") {
op.push(words[i].replace(/^\$/g, "").replace(/\$$/g, ""));
} else {
op.push(this._ascii_to_unicode_word(words[i], english_numbers));
}
}
txt = this._a2u_deerga_handle(op.join(" "));
return this._a2u_post_process(txt);
}
Kn.prototype._unicode_to_ascii_word = function(txt, english_numbers){
var converted = [];
var that = this;
// Split into Kn letters and convert each letter to ASCII
this.letters(txt).map(function(letter){
converted.push(that._rearrange_and_replace(letter));
});
// Replace Anuswara and Visarga with ASCII chars
txt = this._unicode_anusvara_visarga(converted.join(""));
// Handle Numbers
// No special handling required, Font will change the look and feel
// of number in ASCII
txt = this._to_ascii_numbers(txt)
// ZWNJ
// Since ZWNJ is not available in Map, it is not replaced
// rest of the letters already replaced. We can remove this
// char from output since in ASCII chars will not mix
txt = txt.replace(/\u200c/g, "");
// Handle Reph
// Handle ZWJ and ZWNJ
return txt;
}
Kn.prototype._u2a_post_process = function(txt) {
return txt.replace("ÈÌ", "Ìø");
}
Kn.prototype.unicode_to_ascii = function (txt, english_numbers, remove_extra_space){
if (remove_extra_space) {
txt = txt.replace(/[ \t]+/g,' ').trim();
}
var words = txt.split(" ");
var op = [];
var l = words.length;
for (var i=0; i<l; i++) {
var wl = words[i].length;
if (wl > 0 && words[i][0] === "$" && words[i][wl-1] === "$") {
op.push(words[i].replace(/^\$/g, "").replace(/\$$/g, ""));
} else {
op.push(this._unicode_to_ascii_word(words[i], english_numbers));
}
}
txt = this._u2a_deerga_handle(op.join(" "));
return this._u2a_post_process(txt);
}
{
"name": "sanka_web",
"productName": "sanka_web",
"description": "My Electron application description",
"keywords": [],
"main": "./main.js",
"version": "1.0.0",
"author": "RJDNET",
"scripts": {
"start": "electron ."
},
"dependencies": {},
"devDependencies": {
"electron": "24.1.2"
}
}
/*!
* QUnit 2.0.1
* https://qunitjs.com/
*
* Copyright jQuery Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
* Date: 2016-07-23T19:39Z
*/
/** Font Family and Sizes */
#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult {
font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
}
#qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
#qunit-tests { font-size: smaller; }
/** Resets */
#qunit-tests, #qunit-header, #qunit-banner, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
margin: 0;
padding: 0;
}
/** Header (excluding toolbar) */
#qunit-header {
padding: 0.5em 0 0.5em 1em;
color: #8699A4;
background-color: #0D3349;
font-size: 1.5em;
line-height: 1em;
font-weight: 400;
border-radius: 5px 5px 0 0;
}
#qunit-header a {
text-decoration: none;
color: #C2CCD1;
}
#qunit-header a:hover,
#qunit-header a:focus {
color: #FFF;
}
#qunit-banner {
height: 5px;
}
#qunit-filteredTest {
padding: 0.5em 1em 0.5em 1em;
color: #366097;
background-color: #F4FF77;
}
#qunit-userAgent {
padding: 0.5em 1em 0.5em 1em;
color: #FFF;
background-color: #2B81AF;
text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
}
/** Toolbar */
#qunit-testrunner-toolbar {
padding: 0.5em 1em 0.5em 1em;
color: #5E740B;
background-color: #EEE;
}
#qunit-testrunner-toolbar .clearfix {
height: 0;
clear: both;
}
#qunit-testrunner-toolbar label {
display: inline-block;
}
#qunit-testrunner-toolbar input[type=checkbox],
#qunit-testrunner-toolbar input[type=radio] {
margin: 3px;
vertical-align: -2px;
}
#qunit-testrunner-toolbar input[type=text] {
box-sizing: border-box;
height: 1.6em;
}
.qunit-url-config,
.qunit-filter,
#qunit-modulefilter {
display: inline-block;
line-height: 2.1em;
}
.qunit-filter,
#qunit-modulefilter {
float: right;
position: relative;
margin-left: 1em;
}
.qunit-url-config label {
margin-right: 0.5em;
}
#qunit-modulefilter-search {
box-sizing: border-box;
width: 400px;
}
#qunit-modulefilter-search-container:after {
position: absolute;
right: 0.3em;
content: "\25bc";
color: black;
}
#qunit-modulefilter-dropdown {
/* align with #qunit-modulefilter-search */
box-sizing: border-box;
width: 400px;
position: absolute;
right: 0;
top: 50%;
margin-top: 0.8em;
border: 1px solid #D3D3D3;
border-top: none;
border-radius: 0 0 .25em .25em;
color: #000;
background-color: #F5F5F5;
z-index: 99;
}
#qunit-modulefilter-dropdown a {
color: inherit;
text-decoration: none;
}
#qunit-modulefilter-dropdown .clickable.checked {
font-weight: bold;
color: #000;
background-color: #D2E0E6;
}
#qunit-modulefilter-dropdown .clickable:hover {
color: #FFF;
background-color: #0D3349;
}
#qunit-modulefilter-actions {
display: block;
overflow: auto;
/* align with #qunit-modulefilter-dropdown-list */
font: smaller/1.5em sans-serif;
}
#qunit-modulefilter-dropdown #qunit-modulefilter-actions > * {
box-sizing: border-box;
max-height: 2.8em;
display: block;
padding: 0.4em;
}
#qunit-modulefilter-dropdown #qunit-modulefilter-actions > button {
float: right;
font: inherit;
}
#qunit-modulefilter-dropdown #qunit-modulefilter-actions > :last-child {
/* insert padding to align with checkbox margins */
padding-left: 3px;
}
#qunit-modulefilter-dropdown-list {
max-height: 200px;
overflow-y: auto;
margin: 0;
border-top: 2px groove threedhighlight;
padding: 0.4em 0 0;
font: smaller/1.5em sans-serif;
}
#qunit-modulefilter-dropdown-list li {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
#qunit-modulefilter-dropdown-list .clickable {
display: block;
padding-left: 0.15em;
}
/** Tests: Pass/Fail */
#qunit-tests {
list-style-position: inside;
}
#qunit-tests li {
padding: 0.4em 1em 0.4em 1em;
border-bottom: 1px solid #FFF;
list-style-position: inside;
}
#qunit-tests > li {
display: none;
}
#qunit-tests li.running,
#qunit-tests li.pass,
#qunit-tests li.fail,
#qunit-tests li.skipped {
display: list-item;
}
#qunit-tests.hidepass {
position: relative;
}
#qunit-tests.hidepass li.running,
#qunit-tests.hidepass li.pass {
visibility: hidden;
position: absolute;
width: 0;
height: 0;
padding: 0;
border: 0;
margin: 0;
}
#qunit-tests li strong {
cursor: pointer;
}
#qunit-tests li.skipped strong {
cursor: default;
}
#qunit-tests li a {
padding: 0.5em;
color: #C2CCD1;
text-decoration: none;
}
#qunit-tests li p a {
padding: 0.25em;
color: #6B6464;
}
#qunit-tests li a:hover,
#qunit-tests li a:focus {
color: #000;
}
#qunit-tests li .runtime {
float: right;
font-size: smaller;
}
.qunit-assert-list {
margin-top: 0.5em;
padding: 0.5em;
background-color: #FFF;
border-radius: 5px;
}
.qunit-source {
margin: 0.6em 0 0.3em;
}
.qunit-collapsed {
display: none;
}
#qunit-tests table {
border-collapse: collapse;
margin-top: 0.2em;
}
#qunit-tests th {
text-align: right;
vertical-align: top;
padding: 0 0.5em 0 0;
}
#qunit-tests td {
vertical-align: top;
}
#qunit-tests pre {
margin: 0;
white-space: pre-wrap;
word-wrap: break-word;
}
#qunit-tests del {
color: #374E0C;
background-color: #E0F2BE;
text-decoration: none;
}
#qunit-tests ins {
color: #500;
background-color: #FFCACA;
text-decoration: none;
}
/*** Test Counts */
#qunit-tests b.counts { color: #000; }
#qunit-tests b.passed { color: #5E740B; }
#qunit-tests b.failed { color: #710909; }
#qunit-tests li li {
padding: 5px;
background-color: #FFF;
border-bottom: none;
list-style-position: inside;
}
/*** Passing Styles */
#qunit-tests li li.pass {
color: #3C510C;
background-color: #FFF;
border-left: 10px solid #C6E746;
}
#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
#qunit-tests .pass .test-name { color: #366097; }
#qunit-tests .pass .test-actual,
#qunit-tests .pass .test-expected { color: #999; }
#qunit-banner.qunit-pass { background-color: #C6E746; }
/*** Failing Styles */
#qunit-tests li li.fail {
color: #710909;
background-color: #FFF;
border-left: 10px solid #EE5757;
white-space: pre;
}
#qunit-tests > li:last-child {
border-radius: 0 0 5px 5px;
}
#qunit-tests .fail { color: #000; background-color: #EE5757; }
#qunit-tests .fail .test-name,
#qunit-tests .fail .module-name { color: #000; }
#qunit-tests .fail .test-actual { color: #EE5757; }
#qunit-tests .fail .test-expected { color: #008000; }
#qunit-banner.qunit-fail { background-color: #EE5757; }
/*** Skipped tests */
#qunit-tests .skipped {
background-color: #EBECE9;
}
#qunit-tests .qunit-skipped-label {
background-color: #F4FF77;
display: inline-block;
font-style: normal;
color: #366097;
line-height: 1.8em;
padding: 0 0.5em;
margin: -0.4em 0.4em -0.4em 0;
}
/** Result */
#qunit-testresult {
padding: 0.5em 1em 0.5em 1em;
color: #2B81AF;
background-color: #D2E0E6;
border-bottom: 1px solid #FFF;
}
#qunit-testresult .module-name {
font-weight: 700;
}
/** Fixture */
#qunit-fixture {
position: absolute;
top: -10000px;
left: -10000px;
width: 1000px;
height: 1000px;
}
/*!
* QUnit 2.0.1
* https://qunitjs.com/
*
* Copyright jQuery Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
* Date: 2016-07-23T19:39Z
*/
( function( global ) {
var QUnit = {};
var Date = global.Date;
var now = Date.now || function() {
return new Date().getTime();
};
var setTimeout = global.setTimeout;
var clearTimeout = global.clearTimeout;
// Store a local window from the global to allow direct references.
var window = global.window;
var defined = {
document: window && window.document !== undefined,
setTimeout: setTimeout !== undefined,
sessionStorage: ( function() {
var x = "qunit-test-string";
try {
sessionStorage.setItem( x, x );
sessionStorage.removeItem( x );
return true;
} catch ( e ) {
return false;
}
}() )
};
var fileName = ( sourceFromStacktrace( 0 ) || "" ).replace( /(:\d+)+\)?/, "" ).replace( /.+\//, "" );
var globalStartCalled = false;
var runStarted = false;
var autorun = false;
var toString = Object.prototype.toString,
hasOwn = Object.prototype.hasOwnProperty;
// Returns a new Array with the elements that are in a but not in b
function diff( a, b ) {
var i, j,
result = a.slice();
for ( i = 0; i < result.length; i++ ) {
for ( j = 0; j < b.length; j++ ) {
if ( result[ i ] === b[ j ] ) {
result.splice( i, 1 );
i--;
break;
}
}
}
return result;
}
// From jquery.js
function inArray( elem, array ) {
if ( array.indexOf ) {
return array.indexOf( elem );
}
for ( var i = 0, length = array.length; i < length; i++ ) {
if ( array[ i ] === elem ) {
return i;
}
}
return -1;
}
/**
* Makes a clone of an object using only Array or Object as base,
* and copies over the own enumerable properties.
*
* @param {Object} obj
* @return {Object} New object with only the own properties (recursively).
*/
function objectValues ( obj ) {
var key, val,
vals = QUnit.is( "array", obj ) ? [] : {};
for ( key in obj ) {
if ( hasOwn.call( obj, key ) ) {
val = obj[ key ];
vals[ key ] = val === Object( val ) ? objectValues( val ) : val;
}
}
return vals;
}
function extend( a, b, undefOnly ) {
for ( var prop in b ) {
if ( hasOwn.call( b, prop ) ) {
if ( b[ prop ] === undefined ) {
delete a[ prop ];
} else if ( !( undefOnly && typeof a[ prop ] !== "undefined" ) ) {
a[ prop ] = b[ prop ];
}
}
}
return a;
}
function objectType( obj ) {
if ( typeof obj === "undefined" ) {
return "undefined";
}
// Consider: typeof null === object
if ( obj === null ) {
return "null";
}
var match = toString.call( obj ).match( /^\[object\s(.*)\]$/ ),
type = match && match[ 1 ];
switch ( type ) {
case "Number":
if ( isNaN( obj ) ) {
return "nan";
}
return "number";
case "String":
case "Boolean":
case "Array":
case "Set":
case "Map":
case "Date":
case "RegExp":
case "Function":
case "Symbol":
return type.toLowerCase();
}
if ( typeof obj === "object" ) {
return "object";
}
}
// Safe object type checking
function is( type, obj ) {
return QUnit.objectType( obj ) === type;
}
// Doesn't support IE9, it will return undefined on these browsers
// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
function extractStacktrace( e, offset ) {
offset = offset === undefined ? 4 : offset;
var stack, include, i;
if ( e.stack ) {
stack = e.stack.split( "\n" );
if ( /^error$/i.test( stack[ 0 ] ) ) {
stack.shift();
}
if ( fileName ) {
include = [];
for ( i = offset; i < stack.length; i++ ) {
if ( stack[ i ].indexOf( fileName ) !== -1 ) {
break;
}
include.push( stack[ i ] );
}
if ( include.length ) {
return include.join( "\n" );
}
}
return stack[ offset ];
}
}
function sourceFromStacktrace( offset ) {
var error = new Error();
// Support: Safari <=7 only, IE <=10 - 11 only
// Not all browsers generate the `stack` property for `new Error()`, see also #636
if ( !error.stack ) {
try {
throw error;
} catch ( err ) {
error = err;
}
}
return extractStacktrace( error, offset );
}
/**
* Config object: Maintain internal state
* Later exposed as QUnit.config
* `config` initialized at top of scope
*/
var config = {
// The queue of tests to run
queue: [],
// Block until document ready
blocking: true,
// By default, run previously failed tests first
// very useful in combination with "Hide passed tests" checked
reorder: true,
// By default, modify document.title when suite is done
altertitle: true,
// HTML Reporter: collapse every test except the first failing test
// If false, all failing tests will be expanded
collapse: true,
// By default, scroll to top of the page when suite is done
scrolltop: true,
// Depth up-to which object will be dumped
maxDepth: 5,
// When enabled, all tests must call expect()
requireExpects: false,
// Placeholder for user-configurable form-exposed URL parameters
urlConfig: [],
// Set of all modules.
modules: [],
// Stack of nested modules
moduleStack: [],
// The first unnamed module
currentModule: {
name: "",
tests: []
},
callbacks: {}
};
// Push a loose unnamed module to the modules collection
config.modules.push( config.currentModule );
// Register logging callbacks
function registerLoggingCallbacks( obj ) {
var i, l, key,
callbackNames = [ "begin", "done", "log", "testStart", "testDone",
"moduleStart", "moduleDone" ];
function registerLoggingCallback( key ) {
var loggingCallback = function( callback ) {
if ( objectType( callback ) !== "function" ) {
throw new Error(
"QUnit logging methods require a callback function as their first parameters."
);
}
config.callbacks[ key ].push( callback );
};
return loggingCallback;
}
for ( i = 0, l = callbackNames.length; i < l; i++ ) {
key = callbackNames[ i ];
// Initialize key collection of logging callback
if ( objectType( config.callbacks[ key ] ) === "undefined" ) {
config.callbacks[ key ] = [];
}
obj[ key ] = registerLoggingCallback( key );
}
}
function runLoggingCallbacks( key, args ) {
var i, l, callbacks;
callbacks = config.callbacks[ key ];
for ( i = 0, l = callbacks.length; i < l; i++ ) {
callbacks[ i ]( args );
}
}
( function() {
if ( !defined.document ) {
return;
}
// `onErrorFnPrev` initialized at top of scope
// Preserve other handlers
var onErrorFnPrev = window.onerror;
// Cover uncaught exceptions
// Returning true will suppress the default browser handler,
// returning false will let it run.
window.onerror = function( error, filePath, linerNr ) {
var ret = false;
if ( onErrorFnPrev ) {
ret = onErrorFnPrev( error, filePath, linerNr );
}
// Treat return value as window.onerror itself does,
// Only do our handling if not suppressed.
if ( ret !== true ) {
if ( QUnit.config.current ) {
if ( QUnit.config.current.ignoreGlobalErrors ) {
return true;
}
QUnit.pushFailure( error, filePath + ":" + linerNr );
} else {
QUnit.test( "global failure", extend( function() {
QUnit.pushFailure( error, filePath + ":" + linerNr );
}, { validTest: true } ) );
}
return false;
}
return ret;
};
}() );
// Figure out if we're running the tests from a server or not
QUnit.isLocal = !( defined.document && window.location.protocol !== "file:" );
// Expose the current QUnit version
QUnit.version = "2.0.1";
extend( QUnit, {
// Call on start of module test to prepend name to all tests
module: function( name, testEnvironment, executeNow ) {
var module, moduleFns;
var currentModule = config.currentModule;
if ( arguments.length === 2 ) {
if ( objectType( testEnvironment ) === "function" ) {
executeNow = testEnvironment;
testEnvironment = undefined;
}
}
module = createModule();
if ( testEnvironment && ( testEnvironment.setup || testEnvironment.teardown ) ) {
console.warn(
"Module's `setup` and `teardown` are not hooks anymore on QUnit 2.0, use " +
"`beforeEach` and `afterEach` instead\n" +
"Details in our upgrade guide at https://qunitjs.com/upgrade-guide-2.x/"
);
}
moduleFns = {
before: setHook( module, "before" ),
beforeEach: setHook( module, "beforeEach" ),
afterEach: setHook( module, "afterEach" ),
after: setHook( module, "after" )
};
if ( objectType( executeNow ) === "function" ) {
config.moduleStack.push( module );
setCurrentModule( module );
executeNow.call( module.testEnvironment, moduleFns );
config.moduleStack.pop();
module = module.parentModule || currentModule;
}
setCurrentModule( module );
function createModule() {
var parentModule = config.moduleStack.length ?
config.moduleStack.slice( -1 )[ 0 ] : null;
var moduleName = parentModule !== null ?
[ parentModule.name, name ].join( " > " ) : name;
var module = {
name: moduleName,
parentModule: parentModule,
tests: [],
moduleId: generateHash( moduleName ),
testsRun: 0
};
var env = {};
if ( parentModule ) {
parentModule.childModule = module;
extend( env, parentModule.testEnvironment );
delete env.beforeEach;
delete env.afterEach;
}
extend( env, testEnvironment );
module.testEnvironment = env;
config.modules.push( module );
return module;
}
function setCurrentModule( module ) {
config.currentModule = module;
}
},
test: test,
skip: skip,
only: only,
start: function( count ) {
var globalStartAlreadyCalled = globalStartCalled;
if ( !config.current ) {
globalStartCalled = true;
if ( runStarted ) {
throw new Error( "Called start() while test already started running" );
} else if ( globalStartAlreadyCalled || count > 1 ) {
throw new Error( "Called start() outside of a test context too many times" );
} else if ( config.autostart ) {
throw new Error( "Called start() outside of a test context when " +
"QUnit.config.autostart was true" );
} else if ( !config.pageLoaded ) {
// The page isn't completely loaded yet, so bail out and let `QUnit.load` handle it
config.autostart = true;
return;
}
} else {
throw new Error(
"QUnit.start cannot be called inside a test context. This feature is removed in " +
"QUnit 2.0. For async tests, use QUnit.test() with assert.async() instead.\n" +
"Details in our upgrade guide at https://qunitjs.com/upgrade-guide-2.x/"
);
}
scheduleBegin();
},
config: config,
is: is,
objectType: objectType,
extend: extend,
load: function() {
config.pageLoaded = true;
// Initialize the configuration options
extend( config, {
stats: { all: 0, bad: 0 },
moduleStats: { all: 0, bad: 0 },
started: 0,
updateRate: 1000,
autostart: true,
filter: ""
}, true );
if ( !runStarted ) {
config.blocking = false;
if ( config.autostart ) {
scheduleBegin();
}
}
},
stack: function( offset ) {
offset = ( offset || 0 ) + 2;
return sourceFromStacktrace( offset );
}
} );
registerLoggingCallbacks( QUnit );
function scheduleBegin() {
runStarted = true;
// Add a slight delay to allow definition of more modules and tests.
if ( defined.setTimeout ) {
setTimeout( function() {
begin();
}, 13 );
} else {
begin();
}
}
function begin() {
var i, l,
modulesLog = [];
// If the test run hasn't officially begun yet
if ( !config.started ) {
// Record the time of the test run's beginning
config.started = now();
// Delete the loose unnamed module if unused.
if ( config.modules[ 0 ].name === "" && config.modules[ 0 ].tests.length === 0 ) {
config.modules.shift();
}
// Avoid unnecessary information by not logging modules' test environments
for ( i = 0, l = config.modules.length; i < l; i++ ) {
modulesLog.push( {
name: config.modules[ i ].name,
tests: config.modules[ i ].tests
} );
}
// The test run is officially beginning now
runLoggingCallbacks( "begin", {
totalTests: Test.count,
modules: modulesLog
} );
}
config.blocking = false;
process( true );
}
function process( last ) {
function next() {
process( last );
}
var start = now();
config.depth = ( config.depth || 0 ) + 1;
while ( config.queue.length && !config.blocking ) {
if ( !defined.setTimeout || config.updateRate <= 0 ||
( ( now() - start ) < config.updateRate ) ) {
if ( config.current ) {
// Reset async tracking for each phase of the Test lifecycle
config.current.usedAsync = false;
}
config.queue.shift()();
} else {
setTimeout( next, 13 );
break;
}
}
config.depth--;
if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {
done();
}
}
function done() {
var runtime, passed;
autorun = true;
// Log the last module results
if ( config.previousModule ) {
runLoggingCallbacks( "moduleDone", {
name: config.previousModule.name,
tests: config.previousModule.tests,
failed: config.moduleStats.bad,
passed: config.moduleStats.all - config.moduleStats.bad,
total: config.moduleStats.all,
runtime: now() - config.moduleStats.started
} );
}
delete config.previousModule;
runtime = now() - config.started;
passed = config.stats.all - config.stats.bad;
runLoggingCallbacks( "done", {
failed: config.stats.bad,
passed: passed,
total: config.stats.all,
runtime: runtime
} );
}
function setHook( module, hookName ) {
if ( module.testEnvironment === undefined ) {
module.testEnvironment = {};
}
return function( callback ) {
module.testEnvironment[ hookName ] = callback;
};
}
var unitSampler,
focused = false,
priorityCount = 0;
function Test( settings ) {
var i, l;
++Test.count;
this.expected = null;
extend( this, settings );
this.assertions = [];
this.semaphore = 0;
this.usedAsync = false;
this.module = config.currentModule;
this.stack = sourceFromStacktrace( 3 );
// Register unique strings
for ( i = 0, l = this.module.tests; i < l.length; i++ ) {
if ( this.module.tests[ i ].name === this.testName ) {
this.testName += " ";
}
}
this.testId = generateHash( this.module.name, this.testName );
this.module.tests.push( {
name: this.testName,
testId: this.testId
} );
if ( settings.skip ) {
// Skipped tests will fully ignore any sent callback
this.callback = function() {};
this.async = false;
this.expected = 0;
} else {
this.assert = new Assert( this );
}
}
Test.count = 0;
Test.prototype = {
before: function() {
if (
// Emit moduleStart when we're switching from one module to another
this.module !== config.previousModule ||
// They could be equal (both undefined) but if the previousModule property doesn't
// yet exist it means this is the first test in a suite that isn't wrapped in a
// module, in which case we'll just emit a moduleStart event for 'undefined'.
// Without this, reporters can get testStart before moduleStart which is a problem.
!hasOwn.call( config, "previousModule" )
) {
if ( hasOwn.call( config, "previousModule" ) ) {
runLoggingCallbacks( "moduleDone", {
name: config.previousModule.name,
tests: config.previousModule.tests,
failed: config.moduleStats.bad,
passed: config.moduleStats.all - config.moduleStats.bad,
total: config.moduleStats.all,
runtime: now() - config.moduleStats.started
} );
}
config.previousModule = this.module;
config.moduleStats = { all: 0, bad: 0, started: now() };
runLoggingCallbacks( "moduleStart", {
name: this.module.name,
tests: this.module.tests
} );
}
config.current = this;
if ( this.module.testEnvironment ) {
delete this.module.testEnvironment.before;
delete this.module.testEnvironment.beforeEach;
delete this.module.testEnvironment.afterEach;
delete this.module.testEnvironment.after;
}
this.testEnvironment = extend( {}, this.module.testEnvironment );
this.started = now();
runLoggingCallbacks( "testStart", {
name: this.testName,
module: this.module.name,
testId: this.testId
} );
if ( !config.pollution ) {
saveGlobal();
}
},
run: function() {
var promise;
config.current = this;
this.callbackStarted = now();
if ( config.notrycatch ) {
runTest( this );
return;
}
try {
runTest( this );
} catch ( e ) {
this.pushFailure( "Died on test #" + ( this.assertions.length + 1 ) + " " +
this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
// Else next test will carry the responsibility
saveGlobal();
// Restart the tests if they're blocking
if ( config.blocking ) {
internalRecover( this );
}
}
function runTest( test ) {
promise = test.callback.call( test.testEnvironment, test.assert );
test.resolvePromise( promise );
}
},
after: function() {
checkPollution();
},
queueHook: function( hook, hookName, hookOwner ) {
var promise,
test = this;
return function runHook() {
if ( hookName === "before" ) {
if ( hookOwner.testsRun !== 0 ) {
return;
}
test.preserveEnvironment = true;
}
if ( hookName === "after" && hookOwner.testsRun !== numberOfTests( hookOwner ) - 1 ) {
return;
}
config.current = test;
if ( config.notrycatch ) {
callHook();
return;
}
try {
callHook();
} catch ( error ) {
test.pushFailure( hookName + " failed on " + test.testName + ": " +
( error.message || error ), extractStacktrace( error, 0 ) );
}
function callHook() {
promise = hook.call( test.testEnvironment, test.assert );
test.resolvePromise( promise, hookName );
}
};
},
// Currently only used for module level hooks, can be used to add global level ones
hooks: function( handler ) {
var hooks = [];
function processHooks( test, module ) {
if ( module.parentModule ) {
processHooks( test, module.parentModule );
}
if ( module.testEnvironment &&
QUnit.objectType( module.testEnvironment[ handler ] ) === "function" ) {
hooks.push( test.queueHook( module.testEnvironment[ handler ], handler, module ) );
}
}
// Hooks are ignored on skipped tests
if ( !this.skip ) {
processHooks( this, this.module );
}
return hooks;
},
finish: function() {
config.current = this;
if ( config.requireExpects && this.expected === null ) {
this.pushFailure( "Expected number of assertions to be defined, but expect() was " +
"not called.", this.stack );
} else if ( this.expected !== null && this.expected !== this.assertions.length ) {
this.pushFailure( "Expected " + this.expected + " assertions, but " +
this.assertions.length + " were run", this.stack );
} else if ( this.expected === null && !this.assertions.length ) {
this.pushFailure( "Expected at least one assertion, but none were run - call " +
"expect(0) to accept zero assertions.", this.stack );
}
var i,
skipped = !!this.skip,
bad = 0;
this.runtime = now() - this.started;
config.stats.all += this.assertions.length;
config.moduleStats.all += this.assertions.length;
for ( i = 0; i < this.assertions.length; i++ ) {
if ( !this.assertions[ i ].result ) {
bad++;
config.stats.bad++;
config.moduleStats.bad++;
}
}
notifyTestsRan( this.module );
runLoggingCallbacks( "testDone", {
name: this.testName,
module: this.module.name,
skipped: skipped,
failed: bad,
passed: this.assertions.length - bad,
total: this.assertions.length,
runtime: skipped ? 0 : this.runtime,
// HTML Reporter use
assertions: this.assertions,
testId: this.testId,
// Source of Test
source: this.stack
} );
config.current = undefined;
},
preserveTestEnvironment: function() {
if ( this.preserveEnvironment ) {
this.module.testEnvironment = this.testEnvironment;
this.testEnvironment = extend( {}, this.module.testEnvironment );
}
},
queue: function() {
var priority,
test = this;
if ( !this.valid() ) {
return;
}
function run() {
// Each of these can by async
synchronize( [
function() {
test.before();
},
test.hooks( "before" ),
function() {
test.preserveTestEnvironment();
},
test.hooks( "beforeEach" ),
function() {
test.run();
},
test.hooks( "afterEach" ).reverse(),
test.hooks( "after" ).reverse(),
function() {
test.after();
},
function() {
test.finish();
}
] );
}
// Prioritize previously failed tests, detected from sessionStorage
priority = QUnit.config.reorder && defined.sessionStorage &&
+sessionStorage.getItem( "qunit-test-" + this.module.name + "-" + this.testName );
return synchronize( run, priority, config.seed );
},
pushResult: function( resultInfo ) {
// Destructure of resultInfo = { result, actual, expected, message, negative }
var source,
details = {
module: this.module.name,
name: this.testName,
result: resultInfo.result,
message: resultInfo.message,
actual: resultInfo.actual,
expected: resultInfo.expected,
testId: this.testId,
negative: resultInfo.negative || false,
runtime: now() - this.started
};
if ( !resultInfo.result ) {
source = sourceFromStacktrace();
if ( source ) {
details.source = source;
}
}
runLoggingCallbacks( "log", details );
this.assertions.push( {
result: !!resultInfo.result,
message: resultInfo.message
} );
},
pushFailure: function( message, source, actual ) {
if ( !( this instanceof Test ) ) {
throw new Error( "pushFailure() assertion outside test context, was " +
sourceFromStacktrace( 2 ) );
}
var details = {
module: this.module.name,
name: this.testName,
result: false,
message: message || "error",
actual: actual || null,
testId: this.testId,
runtime: now() - this.started
};
if ( source ) {
details.source = source;
}
runLoggingCallbacks( "log", details );
this.assertions.push( {
result: false,
message: message
} );
},
resolvePromise: function( promise, phase ) {
var then, resume, message,
test = this;
if ( promise != null ) {
then = promise.then;
if ( QUnit.objectType( then ) === "function" ) {
resume = internalStop( test );
then.call(
promise,
function() { resume(); },
function( error ) {
message = "Promise rejected " +
( !phase ? "during" : phase.replace( /Each$/, "" ) ) +
" " + test.testName + ": " + ( error.message || error );
test.pushFailure( message, extractStacktrace( error, 0 ) );
// Else next test will carry the responsibility
saveGlobal();
// Unblock
resume();
}
);
}
}
},
valid: function() {
var filter = config.filter,
regexFilter = /^(!?)\/([\w\W]*)\/(i?$)/.exec( filter ),
module = config.module && config.module.toLowerCase(),
fullName = ( this.module.name + ": " + this.testName );
function moduleChainNameMatch( testModule ) {
var testModuleName = testModule.name ? testModule.name.toLowerCase() : null;
if ( testModuleName === module ) {
return true;
} else if ( testModule.parentModule ) {
return moduleChainNameMatch( testModule.parentModule );
} else {
return false;
}
}
function moduleChainIdMatch( testModule ) {
return inArray( testModule.moduleId, config.moduleId ) > -1 ||
testModule.parentModule && moduleChainIdMatch( testModule.parentModule );
}
// Internally-generated tests are always valid
if ( this.callback && this.callback.validTest ) {
return true;
}
if ( config.moduleId && config.moduleId.length > 0 &&
!moduleChainIdMatch( this.module ) ) {
return false;
}
if ( config.testId && config.testId.length > 0 &&
inArray( this.testId, config.testId ) < 0 ) {
return false;
}
if ( module && !moduleChainNameMatch( this.module ) ) {
return false;
}
if ( !filter ) {
return true;
}
return regexFilter ?
this.regexFilter( !!regexFilter[ 1 ], regexFilter[ 2 ], regexFilter[ 3 ], fullName ) :
this.stringFilter( filter, fullName );
},
regexFilter: function( exclude, pattern, flags, fullName ) {
var regex = new RegExp( pattern, flags );
var match = regex.test( fullName );
return match !== exclude;
},
stringFilter: function( filter, fullName ) {
filter = filter.toLowerCase();
fullName = fullName.toLowerCase();
var include = filter.charAt( 0 ) !== "!";
if ( !include ) {
filter = filter.slice( 1 );
}
// If the filter matches, we need to honour include
if ( fullName.indexOf( filter ) !== -1 ) {
return include;
}
// Otherwise, do the opposite
return !include;
}
};
QUnit.pushFailure = function() {
if ( !QUnit.config.current ) {
throw new Error( "pushFailure() assertion outside test context, in " +
sourceFromStacktrace( 2 ) );
}
// Gets current test obj
var currentTest = QUnit.config.current;
return currentTest.pushFailure.apply( currentTest, arguments );
};
// Based on Java's String.hashCode, a simple but not
// rigorously collision resistant hashing function
function generateHash( module, testName ) {
var hex,
i = 0,
hash = 0,
str = module + "\x1C" + testName,
len = str.length;
for ( ; i < len; i++ ) {
hash = ( ( hash << 5 ) - hash ) + str.charCodeAt( i );
hash |= 0;
}
// Convert the possibly negative integer hash code into an 8 character hex string, which isn't
// strictly necessary but increases user understanding that the id is a SHA-like hash
hex = ( 0x100000000 + hash ).toString( 16 );
if ( hex.length < 8 ) {
hex = "0000000" + hex;
}
return hex.slice( -8 );
}
function synchronize( callback, priority, seed ) {
var last = !priority,
index;
if ( QUnit.objectType( callback ) === "array" ) {
while ( callback.length ) {
synchronize( callback.shift() );
}
return;
}
if ( priority ) {
config.queue.splice( priorityCount++, 0, callback );
} else if ( seed ) {
if ( !unitSampler ) {
unitSampler = unitSamplerGenerator( seed );
}
// Insert into a random position after all priority items
index = Math.floor( unitSampler() * ( config.queue.length - priorityCount + 1 ) );
config.queue.splice( priorityCount + index, 0, callback );
} else {
config.queue.push( callback );
}
if ( autorun && !config.blocking ) {
process( last );
}
}
function unitSamplerGenerator( seed ) {
// 32-bit xorshift, requires only a nonzero seed
// http://excamera.com/sphinx/article-xorshift.html
var sample = parseInt( generateHash( seed ), 16 ) || -1;
return function() {
sample ^= sample << 13;
sample ^= sample >>> 17;
sample ^= sample << 5;
// ECMAScript has no unsigned number type
if ( sample < 0 ) {
sample += 0x100000000;
}
return sample / 0x100000000;
};
}
function saveGlobal() {
config.pollution = [];
if ( config.noglobals ) {
for ( var key in global ) {
if ( hasOwn.call( global, key ) ) {
// In Opera sometimes DOM element ids show up here, ignore them
if ( /^qunit-test-output/.test( key ) ) {
continue;
}
config.pollution.push( key );
}
}
}
}
function checkPollution() {
var newGlobals,
deletedGlobals,
old = config.pollution;
saveGlobal();
newGlobals = diff( config.pollution, old );
if ( newGlobals.length > 0 ) {
QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join( ", " ) );
}
deletedGlobals = diff( old, config.pollution );
if ( deletedGlobals.length > 0 ) {
QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join( ", " ) );
}
}
// Will be exposed as QUnit.test
function test( testName, callback ) {
if ( focused ) { return; }
var newTest;
newTest = new Test( {
testName: testName,
callback: callback
} );
newTest.queue();
}
// Will be exposed as QUnit.skip
function skip( testName ) {
if ( focused ) { return; }
var test = new Test( {
testName: testName,
skip: true
} );
test.queue();
}
// Will be exposed as QUnit.only
function only( testName, callback ) {
var newTest;
if ( focused ) { return; }
QUnit.config.queue.length = 0;
focused = true;
newTest = new Test( {
testName: testName,
callback: callback
} );
newTest.queue();
}
// Put a hold on processing and return a function that will release it.
function internalStop( test ) {
var released = false;
test.semaphore += 1;
config.blocking = true;
// Set a recovery timeout, if so configured.
if ( config.testTimeout && defined.setTimeout ) {
clearTimeout( config.timeout );
config.timeout = setTimeout( function() {
QUnit.pushFailure( "Test timed out", sourceFromStacktrace( 2 ) );
internalRecover( test );
}, config.testTimeout );
}
return function resume() {
if ( released ) {
return;
}
released = true;
test.semaphore -= 1;
internalStart( test );
};
}
// Forcefully release all processing holds.
function internalRecover( test ) {
test.semaphore = 0;
internalStart( test );
}
// Release a processing hold, scheduling a resumption attempt if no holds remain.
function internalStart( test ) {
// If semaphore is non-numeric, throw error
if ( isNaN( test.semaphore ) ) {
test.semaphore = 0;
QUnit.pushFailure(
"Invalid value on test.semaphore",
sourceFromStacktrace( 2 )
);
return;
}
// Don't start until equal number of stop-calls
if ( test.semaphore > 0 ) {
return;
}
// Throw an Error if start is called more often than stop
if ( test.semaphore < 0 ) {
test.semaphore = 0;
QUnit.pushFailure(
"Tried to restart test while already started (test's semaphore was 0 already)",
sourceFromStacktrace( 2 )
);
return;
}
// Add a slight delay to allow more assertions etc.
if ( defined.setTimeout ) {
if ( config.timeout ) {
clearTimeout( config.timeout );
}
config.timeout = setTimeout( function() {
if ( test.semaphore > 0 ) {
return;
}
if ( config.timeout ) {
clearTimeout( config.timeout );
}
begin();
}, 13 );
} else {
begin();
}
}
function numberOfTests( module ) {
var count = module.tests.length;
while ( module = module.childModule ) {
count += module.tests.length;
}
return count;
}
function notifyTestsRan( module ) {
module.testsRun++;
while ( module = module.parentModule ) {
module.testsRun++;
}
}
function Assert( testContext ) {
this.test = testContext;
}
// Assert helpers
QUnit.assert = Assert.prototype = {
// Specify the number of expected assertions to guarantee that failed test
// (no assertions are run at all) don't slip through.
expect: function( asserts ) {
if ( arguments.length === 1 ) {
this.test.expected = asserts;
} else {
return this.test.expected;
}
},
// Put a hold on processing and return a function that will release it a maximum of once.
async: function( count ) {
var resume,
test = this.test,
popped = false,
acceptCallCount = count;
if ( typeof acceptCallCount === "undefined" ) {
acceptCallCount = 1;
}
test.usedAsync = true;
resume = internalStop( test );
return function done() {
if ( popped ) {
test.pushFailure( "Too many calls to the `assert.async` callback",
sourceFromStacktrace( 2 ) );
return;
}
acceptCallCount -= 1;
if ( acceptCallCount > 0 ) {
return;
}
popped = true;
resume();
};
},
// Exports test.push() to the user API
// Alias of pushResult.
push: function( result, actual, expected, message, negative ) {
var currentAssert = this instanceof Assert ? this : QUnit.config.current.assert;
return currentAssert.pushResult( {
result: result,
actual: actual,
expected: expected,
message: message,
negative: negative
} );
},
pushResult: function( resultInfo ) {
// Destructure of resultInfo = { result, actual, expected, message, negative }
var assert = this,
currentTest = ( assert instanceof Assert && assert.test ) || QUnit.config.current;
// Backwards compatibility fix.
// Allows the direct use of global exported assertions and QUnit.assert.*
// Although, it's use is not recommended as it can leak assertions
// to other tests from async tests, because we only get a reference to the current test,
// not exactly the test where assertion were intended to be called.
if ( !currentTest ) {
throw new Error( "assertion outside test context, in " + sourceFromStacktrace( 2 ) );
}
if ( currentTest.usedAsync === true && currentTest.semaphore === 0 ) {
currentTest.pushFailure( "Assertion after the final `assert.async` was resolved",
sourceFromStacktrace( 2 ) );
// Allow this assertion to continue running anyway...
}
if ( !( assert instanceof Assert ) ) {
assert = currentTest.assert;
}
return assert.test.pushResult( resultInfo );
},
ok: function( result, message ) {
message = message || ( result ? "okay" : "failed, expected argument to be truthy, was: " +
QUnit.dump.parse( result ) );
this.pushResult( {
result: !!result,
actual: result,
expected: true,
message: message
} );
},
notOk: function( result, message ) {
message = message || ( !result ? "okay" : "failed, expected argument to be falsy, was: " +
QUnit.dump.parse( result ) );
this.pushResult( {
result: !result,
actual: result,
expected: false,
message: message
} );
},
equal: function( actual, expected, message ) {
/*jshint eqeqeq:false */
this.pushResult( {
result: expected == actual,
actual: actual,
expected: expected,
message: message
} );
},
notEqual: function( actual, expected, message ) {
/*jshint eqeqeq:false */
this.pushResult( {
result: expected != actual,
actual: actual,
expected: expected,
message: message,
negative: true
} );
},
propEqual: function( actual, expected, message ) {
actual = objectValues( actual );
expected = objectValues( expected );
this.pushResult( {
result: QUnit.equiv( actual, expected ),
actual: actual,
expected: expected,
message: message
} );
},
notPropEqual: function( actual, expected, message ) {
actual = objectValues( actual );
expected = objectValues( expected );
this.pushResult( {
result: !QUnit.equiv( actual, expected ),
actual: actual,
expected: expected,
message: message,
negative: true
} );
},
deepEqual: function( actual, expected, message ) {
this.pushResult( {
result: QUnit.equiv( actual, expected ),
actual: actual,
expected: expected,
message: message
} );
},
notDeepEqual: function( actual, expected, message ) {
this.pushResult( {
result: !QUnit.equiv( actual, expected ),
actual: actual,
expected: expected,
message: message,
negative: true
} );
},
strictEqual: function( actual, expected, message ) {
this.pushResult( {
result: expected === actual,
actual: actual,
expected: expected,
message: message
} );
},
notStrictEqual: function( actual, expected, message ) {
this.pushResult( {
result: expected !== actual,
actual: actual,
expected: expected,
message: message,
negative: true
} );
},
"throws": function( block, expected, message ) {
var actual, expectedType,
expectedOutput = expected,
ok = false,
currentTest = ( this instanceof Assert && this.test ) || QUnit.config.current;
// 'expected' is optional unless doing string comparison
if ( QUnit.objectType( expected ) === "string" ) {
if ( message == null ) {
message = expected;
expected = null;
} else {
throw new Error(
"throws/raises does not accept a string value for the expected argument.\n" +
"Use a non-string object value (e.g. regExp) instead if it's necessary." +
"Details in our upgrade guide at https://qunitjs.com/upgrade-guide-2.x/"
);
}
}
currentTest.ignoreGlobalErrors = true;
try {
block.call( currentTest.testEnvironment );
} catch ( e ) {
actual = e;
}
currentTest.ignoreGlobalErrors = false;
if ( actual ) {
expectedType = QUnit.objectType( expected );
// We don't want to validate thrown error
if ( !expected ) {
ok = true;
expectedOutput = null;
// Expected is a regexp
} else if ( expectedType === "regexp" ) {
ok = expected.test( errorString( actual ) );
// Expected is a constructor, maybe an Error constructor
} else if ( expectedType === "function" && actual instanceof expected ) {
ok = true;
// Expected is an Error object
} else if ( expectedType === "object" ) {
ok = actual instanceof expected.constructor &&
actual.name === expected.name &&
actual.message === expected.message;
// Expected is a validation function which returns true if validation passed
} else if ( expectedType === "function" && expected.call( {}, actual ) === true ) {
expectedOutput = null;
ok = true;
}
}
currentTest.assert.pushResult( {
result: ok,
actual: actual,
expected: expectedOutput,
message: message
} );
}
};
// Provide an alternative to assert.throws(), for environments that consider throws a reserved word
// Known to us are: Closure Compiler, Narwhal
( function() {
/*jshint sub:true */
Assert.prototype.raises = Assert.prototype [ "throws" ]; //jscs:ignore requireDotNotation
}() );
function errorString( error ) {
var name, message,
resultErrorString = error.toString();
if ( resultErrorString.substring( 0, 7 ) === "[object" ) {
name = error.name ? error.name.toString() : "Error";
message = error.message ? error.message.toString() : "";
if ( name && message ) {
return name + ": " + message;
} else if ( name ) {
return name;
} else if ( message ) {
return message;
} else {
return "Error";
}
} else {
return resultErrorString;
}
}
// Test for equality any JavaScript type.
// Author: Philippe Rathé <prathe@gmail.com>
QUnit.equiv = ( function() {
// Stack to decide between skip/abort functions
var callers = [];
// Stack to avoiding loops from circular referencing
var parents = [];
var parentsB = [];
var getProto = Object.getPrototypeOf || function( obj ) {
/*jshint proto: true */
return obj.__proto__;
};
function useStrictEquality( b, a ) {
// To catch short annotation VS 'new' annotation of a declaration. e.g.:
// `var i = 1;`
// `var j = new Number(1);`
if ( typeof a === "object" ) {
a = a.valueOf();
}
if ( typeof b === "object" ) {
b = b.valueOf();
}
return a === b;
}
function compareConstructors( a, b ) {
var protoA = getProto( a );
var protoB = getProto( b );
// Comparing constructors is more strict than using `instanceof`
if ( a.constructor === b.constructor ) {
return true;
}
// Ref #851
// If the obj prototype descends from a null constructor, treat it
// as a null prototype.
if ( protoA && protoA.constructor === null ) {
protoA = null;
}
if ( protoB && protoB.constructor === null ) {
protoB = null;
}
// Allow objects with no prototype to be equivalent to
// objects with Object as their constructor.
if ( ( protoA === null && protoB === Object.prototype ) ||
( protoB === null && protoA === Object.prototype ) ) {
return true;
}
return false;
}
function getRegExpFlags( regexp ) {
return "flags" in regexp ? regexp.flags : regexp.toString().match( /[gimuy]*$/ )[ 0 ];
}
var callbacks = {
"string": useStrictEquality,
"boolean": useStrictEquality,
"number": useStrictEquality,
"null": useStrictEquality,
"undefined": useStrictEquality,
"symbol": useStrictEquality,
"date": useStrictEquality,
"nan": function() {
return true;
},
"regexp": function( b, a ) {
return a.source === b.source &&
// Include flags in the comparison
getRegExpFlags( a ) === getRegExpFlags( b );
},
// - skip when the property is a method of an instance (OOP)
// - abort otherwise,
// initial === would have catch identical references anyway
"function": function() {
var caller = callers[ callers.length - 1 ];
return caller !== Object && typeof caller !== "undefined";
},
"array": function( b, a ) {
var i, j, len, loop, aCircular, bCircular;
len = a.length;
if ( len !== b.length ) {
// Safe and faster
return false;
}
// Track reference to avoid circular references
parents.push( a );
parentsB.push( b );
for ( i = 0; i < len; i++ ) {
loop = false;
for ( j = 0; j < parents.length; j++ ) {
aCircular = parents[ j ] === a[ i ];
bCircular = parentsB[ j ] === b[ i ];
if ( aCircular || bCircular ) {
if ( a[ i ] === b[ i ] || aCircular && bCircular ) {
loop = true;
} else {
parents.pop();
parentsB.pop();
return false;
}
}
}
if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {
parents.pop();
parentsB.pop();
return false;
}
}
parents.pop();
parentsB.pop();
return true;
},
"set": function( b, a ) {
var innerEq,
outerEq = true;
if ( a.size !== b.size ) {
return false;
}
a.forEach( function( aVal ) {
innerEq = false;
b.forEach( function( bVal ) {
if ( innerEquiv( bVal, aVal ) ) {
innerEq = true;
}
} );
if ( !innerEq ) {
outerEq = false;
}
} );
return outerEq;
},
"map": function( b, a ) {
var innerEq,
outerEq = true;
if ( a.size !== b.size ) {
return false;
}
a.forEach( function( aVal, aKey ) {
innerEq = false;
b.forEach( function( bVal, bKey ) {
if ( innerEquiv( [ bVal, bKey ], [ aVal, aKey ] ) ) {
innerEq = true;
}
} );
if ( !innerEq ) {
outerEq = false;
}
} );
return outerEq;
},
"object": function( b, a ) {
var i, j, loop, aCircular, bCircular;
// Default to true
var eq = true;
var aProperties = [];
var bProperties = [];
if ( compareConstructors( a, b ) === false ) {
return false;
}
// Stack constructor before traversing properties
callers.push( a.constructor );
// Track reference to avoid circular references
parents.push( a );
parentsB.push( b );
// Be strict: don't ensure hasOwnProperty and go deep
for ( i in a ) {
loop = false;
for ( j = 0; j < parents.length; j++ ) {
aCircular = parents[ j ] === a[ i ];
bCircular = parentsB[ j ] === b[ i ];
if ( aCircular || bCircular ) {
if ( a[ i ] === b[ i ] || aCircular && bCircular ) {
loop = true;
} else {
eq = false;
break;
}
}
}
aProperties.push( i );
if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {
eq = false;
break;
}
}
parents.pop();
parentsB.pop();
// Unstack, we are done
callers.pop();
for ( i in b ) {
// Collect b's properties
bProperties.push( i );
}
// Ensures identical properties name
return eq && innerEquiv( aProperties.sort(), bProperties.sort() );
}
};
function typeEquiv( a, b ) {
var type = QUnit.objectType( a );
return QUnit.objectType( b ) === type && callbacks[ type ]( b, a );
}
// The real equiv function
function innerEquiv( a, b ) {
// We're done when there's nothing more to compare
if ( arguments.length < 2 ) {
return true;
}
// Require type-specific equality
return ( a === b || typeEquiv( a, b ) ) &&
// ...across all consecutive argument pairs
( arguments.length === 2 || innerEquiv.apply( this, [].slice.call( arguments, 1 ) ) );
}
return innerEquiv;
}() );
// Based on jsDump by Ariel Flesler
// http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html
QUnit.dump = ( function() {
function quote( str ) {
return "\"" + str.toString().replace( /\\/g, "\\\\" ).replace( /"/g, "\\\"" ) + "\"";
}
function literal( o ) {
return o + "";
}
function join( pre, arr, post ) {
var s = dump.separator(),
base = dump.indent(),
inner = dump.indent( 1 );
if ( arr.join ) {
arr = arr.join( "," + s + inner );
}
if ( !arr ) {
return pre + post;
}
return [ pre, inner + arr, base + post ].join( s );
}
function array( arr, stack ) {
var i = arr.length,
ret = new Array( i );
if ( dump.maxDepth && dump.depth > dump.maxDepth ) {
return "[object Array]";
}
this.up();
while ( i-- ) {
ret[ i ] = this.parse( arr[ i ], undefined, stack );
}
this.down();
return join( "[", ret, "]" );
}
function isArray( obj ) {
return (
//Native Arrays
toString.call( obj ) === "[object Array]" ||
// NodeList objects
( typeof obj.length === "number" && obj.item !== undefined ) &&
( obj.length ?
obj.item( 0 ) === obj[ 0 ] :
( obj.item( 0 ) === null && obj[ 0 ] === undefined )
)
);
}
var reName = /^function (\w+)/,
dump = {
// The objType is used mostly internally, you can fix a (custom) type in advance
parse: function( obj, objType, stack ) {
stack = stack || [];
var res, parser, parserType,
inStack = inArray( obj, stack );
if ( inStack !== -1 ) {
return "recursion(" + ( inStack - stack.length ) + ")";
}
objType = objType || this.typeOf( obj );
parser = this.parsers[ objType ];
parserType = typeof parser;
if ( parserType === "function" ) {
stack.push( obj );
res = parser.call( this, obj, stack );
stack.pop();
return res;
}
return ( parserType === "string" ) ? parser : this.parsers.error;
},
typeOf: function( obj ) {
var type;
if ( obj === null ) {
type = "null";
} else if ( typeof obj === "undefined" ) {
type = "undefined";
} else if ( QUnit.is( "regexp", obj ) ) {
type = "regexp";
} else if ( QUnit.is( "date", obj ) ) {
type = "date";
} else if ( QUnit.is( "function", obj ) ) {
type = "function";
} else if ( obj.setInterval !== undefined &&
obj.document !== undefined &&
obj.nodeType === undefined ) {
type = "window";
} else if ( obj.nodeType === 9 ) {
type = "document";
} else if ( obj.nodeType ) {
type = "node";
} else if ( isArray( obj ) ) {
type = "array";
} else if ( obj.constructor === Error.prototype.constructor ) {
type = "error";
} else {
type = typeof obj;
}
return type;
},
separator: function() {
return this.multiline ? this.HTML ? "<br />" : "\n" : this.HTML ? "&#160;" : " ";
},
// Extra can be a number, shortcut for increasing-calling-decreasing
indent: function( extra ) {
if ( !this.multiline ) {
return "";
}
var chr = this.indentChar;
if ( this.HTML ) {
chr = chr.replace( /\t/g, " " ).replace( / /g, "&#160;" );
}
return new Array( this.depth + ( extra || 0 ) ).join( chr );
},
up: function( a ) {
this.depth += a || 1;
},
down: function( a ) {
this.depth -= a || 1;
},
setParser: function( name, parser ) {
this.parsers[ name ] = parser;
},
// The next 3 are exposed so you can use them
quote: quote,
literal: literal,
join: join,
depth: 1,
maxDepth: QUnit.config.maxDepth,
// This is the list of parsers, to modify them, use dump.setParser
parsers: {
window: "[Window]",
document: "[Document]",
error: function( error ) {
return "Error(\"" + error.message + "\")";
},
unknown: "[Unknown]",
"null": "null",
"undefined": "undefined",
"function": function( fn ) {
var ret = "function",
// Functions never have name in IE
name = "name" in fn ? fn.name : ( reName.exec( fn ) || [] )[ 1 ];
if ( name ) {
ret += " " + name;
}
ret += "(";
ret = [ ret, dump.parse( fn, "functionArgs" ), "){" ].join( "" );
return join( ret, dump.parse( fn, "functionCode" ), "}" );
},
array: array,
nodelist: array,
"arguments": array,
object: function( map, stack ) {
var keys, key, val, i, nonEnumerableProperties,
ret = [];
if ( dump.maxDepth && dump.depth > dump.maxDepth ) {
return "[object Object]";
}
dump.up();
keys = [];
for ( key in map ) {
keys.push( key );
}
// Some properties are not always enumerable on Error objects.
nonEnumerableProperties = [ "message", "name" ];
for ( i in nonEnumerableProperties ) {
key = nonEnumerableProperties[ i ];
if ( key in map && inArray( key, keys ) < 0 ) {
keys.push( key );
}
}
keys.sort();
for ( i = 0; i < keys.length; i++ ) {
key = keys[ i ];
val = map[ key ];
ret.push( dump.parse( key, "key" ) + ": " +
dump.parse( val, undefined, stack ) );
}
dump.down();
return join( "{", ret, "}" );
},
node: function( node ) {
var len, i, val,
open = dump.HTML ? "&lt;" : "<",
close = dump.HTML ? "&gt;" : ">",
tag = node.nodeName.toLowerCase(),
ret = open + tag,
attrs = node.attributes;
if ( attrs ) {
for ( i = 0, len = attrs.length; i < len; i++ ) {
val = attrs[ i ].nodeValue;
// IE6 includes all attributes in .attributes, even ones not explicitly
// set. Those have values like undefined, null, 0, false, "" or
// "inherit".
if ( val && val !== "inherit" ) {
ret += " " + attrs[ i ].nodeName + "=" +
dump.parse( val, "attribute" );
}
}
}
ret += close;
// Show content of TextNode or CDATASection
if ( node.nodeType === 3 || node.nodeType === 4 ) {
ret += node.nodeValue;
}
return ret + open + "/" + tag + close;
},
// Function calls it internally, it's the arguments part of the function
functionArgs: function( fn ) {
var args,
l = fn.length;
if ( !l ) {
return "";
}
args = new Array( l );
while ( l-- ) {
// 97 is 'a'
args[ l ] = String.fromCharCode( 97 + l );
}
return " " + args.join( ", " ) + " ";
},
// Object calls it internally, the key part of an item in a map
key: quote,
// Function calls it internally, it's the content of the function
functionCode: "[code]",
// Node calls it internally, it's a html attribute value
attribute: quote,
string: quote,
date: quote,
regexp: literal,
number: literal,
"boolean": literal,
symbol: function( sym ) {
return sym.toString();
}
},
// If true, entities are escaped ( <, >, \t, space and \n )
HTML: false,
// Indentation unit
indentChar: " ",
// If true, items in a collection, are separated by a \n, else just a space.
multiline: true
};
return dump;
}() );
// Back compat
QUnit.jsDump = QUnit.dump;
function applyDeprecated( name ) {
return function() {
throw new Error(
name + " is removed in QUnit 2.0.\n" +
"Details in our upgrade guide at https://qunitjs.com/upgrade-guide-2.x/"
);
};
}
Object.keys( Assert.prototype ).forEach( function( key ) {
QUnit[ key ] = applyDeprecated( "`QUnit." + key + "`" );
} );
QUnit.asyncTest = function() {
throw new Error(
"asyncTest is removed in QUnit 2.0, use QUnit.test() with assert.async() instead.\n" +
"Details in our upgrade guide at https://qunitjs.com/upgrade-guide-2.x/"
);
};
QUnit.stop = function() {
throw new Error(
"QUnit.stop is removed in QUnit 2.0, use QUnit.test() with assert.async() instead.\n" +
"Details in our upgrade guide at https://qunitjs.com/upgrade-guide-2.x/"
);
};
function resetThrower() {
throw new Error(
"QUnit.reset is removed in QUnit 2.0 without replacement.\n" +
"Details in our upgrade guide at https://qunitjs.com/upgrade-guide-2.x/"
);
}
Object.defineProperty( QUnit, "reset", {
get: function() {
return resetThrower;
},
set: resetThrower
} );
if ( defined.document ) {
if ( window.QUnit ) {
throw new Error( "QUnit has already been defined." );
}
[
"test",
"module",
"expect",
"start",
"ok",
"notOk",
"equal",
"notEqual",
"propEqual",
"notPropEqual",
"deepEqual",
"notDeepEqual",
"strictEqual",
"notStrictEqual",
"throws",
"raises"
].forEach( function( key ) {
window[ key ] = applyDeprecated( "The global `" + key + "`" );
} );
window.QUnit = QUnit;
}
// For nodejs
if ( typeof module !== "undefined" && module && module.exports ) {
module.exports = QUnit;
// For consistency with CommonJS environments' exports
module.exports.QUnit = QUnit;
}
// For CommonJS with exports, but without module.exports, like Rhino
if ( typeof exports !== "undefined" && exports ) {
exports.QUnit = QUnit;
}
if ( typeof define === "function" && define.amd ) {
define( function() {
return QUnit;
} );
QUnit.config.autostart = false;
}
// Get a reference to the global object, like window in browsers
}( ( function() {
return this;
}() ) ) );
( function() {
if ( typeof window === "undefined" || !window.document ) {
return;
}
var config = QUnit.config,
hasOwn = Object.prototype.hasOwnProperty;
// Stores fixture HTML for resetting later
function storeFixture() {
// Avoid overwriting user-defined values
if ( hasOwn.call( config, "fixture" ) ) {
return;
}
var fixture = document.getElementById( "qunit-fixture" );
if ( fixture ) {
config.fixture = fixture.innerHTML;
}
}
QUnit.begin( storeFixture );
// Resets the fixture DOM element if available.
function resetFixture() {
if ( config.fixture == null ) {
return;
}
var fixture = document.getElementById( "qunit-fixture" );
if ( fixture ) {
fixture.innerHTML = config.fixture;
}
}
QUnit.testStart( resetFixture );
}() );
( function() {
// Only interact with URLs via window.location
var location = typeof window !== "undefined" && window.location;
if ( !location ) {
return;
}
var urlParams = getUrlParams();
QUnit.urlParams = urlParams;
// Match module/test by inclusion in an array
QUnit.config.moduleId = [].concat( urlParams.moduleId || [] );
QUnit.config.testId = [].concat( urlParams.testId || [] );
// Exact case-insensitive match of the module name
QUnit.config.module = urlParams.module;
// Regular expression or case-insenstive substring match against "moduleName: testName"
QUnit.config.filter = urlParams.filter;
// Test order randomization
if ( urlParams.seed === true ) {
// Generate a random seed if the option is specified without a value
QUnit.config.seed = Math.random().toString( 36 ).slice( 2 );
} else if ( urlParams.seed ) {
QUnit.config.seed = urlParams.seed;
}
// Add URL-parameter-mapped config values with UI form rendering data
QUnit.config.urlConfig.push(
{
id: "hidepassed",
label: "Hide passed tests",
tooltip: "Only show tests and assertions that fail. Stored as query-strings."
},
{
id: "noglobals",
label: "Check for Globals",
tooltip: "Enabling this will test if any test introduces new properties on the " +
"global object (`window` in Browsers). Stored as query-strings."
},
{
id: "notrycatch",
label: "No try-catch",
tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging " +
"exceptions in IE reasonable. Stored as query-strings."
}
);
QUnit.begin( function() {
var i, option,
urlConfig = QUnit.config.urlConfig;
for ( i = 0; i < urlConfig.length; i++ ) {
// Options can be either strings or objects with nonempty "id" properties
option = QUnit.config.urlConfig[ i ];
if ( typeof option !== "string" ) {
option = option.id;
}
if ( QUnit.config[ option ] === undefined ) {
QUnit.config[ option ] = urlParams[ option ];
}
}
} );
function getUrlParams() {
var i, param, name, value;
var urlParams = {};
var params = location.search.slice( 1 ).split( "&" );
var length = params.length;
for ( i = 0; i < length; i++ ) {
if ( params[ i ] ) {
param = params[ i ].split( "=" );
name = decodeQueryParam( param[ 0 ] );
// Allow just a key to turn on a flag, e.g., test.html?noglobals
value = param.length === 1 ||
decodeQueryParam( param.slice( 1 ).join( "=" ) ) ;
if ( urlParams[ name ] ) {
urlParams[ name ] = [].concat( urlParams[ name ], value );
} else {
urlParams[ name ] = value;
}
}
}
return urlParams;
}
function decodeQueryParam( param ) {
return decodeURIComponent( param.replace( /\+/g, "%20" ) );
}
// Don't load the HTML Reporter on non-browser environments
if ( typeof window === "undefined" || !window.document ) {
return;
}
QUnit.init = function() {
throw new Error(
"QUnit.init is removed in QUnit 2.0, use QUnit.test() with assert.async() instead.\n" +
"Details in our upgrade guide at https://qunitjs.com/upgrade-guide-2.x/"
);
};
var config = QUnit.config,
document = window.document,
collapseNext = false,
hasOwn = Object.prototype.hasOwnProperty,
unfilteredUrl = setUrl( { filter: undefined, module: undefined,
moduleId: undefined, testId: undefined } ),
defined = {
sessionStorage: ( function() {
var x = "qunit-test-string";
try {
sessionStorage.setItem( x, x );
sessionStorage.removeItem( x );
return true;
} catch ( e ) {
return false;
}
}() )
},
modulesList = [];
// Escape text for attribute or text content.
function escapeText( s ) {
if ( !s ) {
return "";
}
s = s + "";
// Both single quotes and double quotes (for attributes)
return s.replace( /['"<>&]/g, function( s ) {
switch ( s ) {
case "'":
return "&#039;";
case "\"":
return "&quot;";
case "<":
return "&lt;";
case ">":
return "&gt;";
case "&":
return "&amp;";
}
} );
}
function addEvent( elem, type, fn ) {
elem.addEventListener( type, fn, false );
}
function removeEvent( elem, type, fn ) {
elem.removeEventListener( type, fn, false );
}
function addEvents( elems, type, fn ) {
var i = elems.length;
while ( i-- ) {
addEvent( elems[ i ], type, fn );
}
}
function hasClass( elem, name ) {
return ( " " + elem.className + " " ).indexOf( " " + name + " " ) >= 0;
}
function addClass( elem, name ) {
if ( !hasClass( elem, name ) ) {
elem.className += ( elem.className ? " " : "" ) + name;
}
}
function toggleClass( elem, name, force ) {
if ( force || typeof force === "undefined" && !hasClass( elem, name ) ) {
addClass( elem, name );
} else {
removeClass( elem, name );
}
}
function removeClass( elem, name ) {
var set = " " + elem.className + " ";
// Class name may appear multiple times
while ( set.indexOf( " " + name + " " ) >= 0 ) {
set = set.replace( " " + name + " ", " " );
}
// Trim for prettiness
elem.className = typeof set.trim === "function" ? set.trim() : set.replace( /^\s+|\s+$/g, "" );
}
function id( name ) {
return document.getElementById && document.getElementById( name );
}
function interceptNavigation( ev ) {
applyUrlParams();
if ( ev && ev.preventDefault ) {
ev.preventDefault();
}
return false;
}
function getUrlConfigHtml() {
var i, j, val,
escaped, escapedTooltip,
selection = false,
urlConfig = config.urlConfig,
urlConfigHtml = "";
for ( i = 0; i < urlConfig.length; i++ ) {
// Options can be either strings or objects with nonempty "id" properties
val = config.urlConfig[ i ];
if ( typeof val === "string" ) {
val = {
id: val,
label: val
};
}
escaped = escapeText( val.id );
escapedTooltip = escapeText( val.tooltip );
if ( !val.value || typeof val.value === "string" ) {
urlConfigHtml += "<label for='qunit-urlconfig-" + escaped +
"' title='" + escapedTooltip + "'><input id='qunit-urlconfig-" + escaped +
"' name='" + escaped + "' type='checkbox'" +
( val.value ? " value='" + escapeText( val.value ) + "'" : "" ) +
( config[ val.id ] ? " checked='checked'" : "" ) +
" title='" + escapedTooltip + "' />" + escapeText( val.label ) + "</label>";
} else {
urlConfigHtml += "<label for='qunit-urlconfig-" + escaped +
"' title='" + escapedTooltip + "'>" + val.label +
": </label><select id='qunit-urlconfig-" + escaped +
"' name='" + escaped + "' title='" + escapedTooltip + "'><option></option>";
if ( QUnit.is( "array", val.value ) ) {
for ( j = 0; j < val.value.length; j++ ) {
escaped = escapeText( val.value[ j ] );
urlConfigHtml += "<option value='" + escaped + "'" +
( config[ val.id ] === val.value[ j ] ?
( selection = true ) && " selected='selected'" : "" ) +
">" + escaped + "</option>";
}
} else {
for ( j in val.value ) {
if ( hasOwn.call( val.value, j ) ) {
urlConfigHtml += "<option value='" + escapeText( j ) + "'" +
( config[ val.id ] === j ?
( selection = true ) && " selected='selected'" : "" ) +
">" + escapeText( val.value[ j ] ) + "</option>";
}
}
}
if ( config[ val.id ] && !selection ) {
escaped = escapeText( config[ val.id ] );
urlConfigHtml += "<option value='" + escaped +
"' selected='selected' disabled='disabled'>" + escaped + "</option>";
}
urlConfigHtml += "</select>";
}
}
return urlConfigHtml;
}
// Handle "click" events on toolbar checkboxes and "change" for select menus.
// Updates the URL with the new state of `config.urlConfig` values.
function toolbarChanged() {
var updatedUrl, value, tests,
field = this,
params = {};
// Detect if field is a select menu or a checkbox
if ( "selectedIndex" in field ) {
value = field.options[ field.selectedIndex ].value || undefined;
} else {
value = field.checked ? ( field.defaultValue || true ) : undefined;
}
params[ field.name ] = value;
updatedUrl = setUrl( params );
// Check if we can apply the change without a page refresh
if ( "hidepassed" === field.name && "replaceState" in window.history ) {
QUnit.urlParams[ field.name ] = value;
config[ field.name ] = value || false;
tests = id( "qunit-tests" );
if ( tests ) {
toggleClass( tests, "hidepass", value || false );
}
window.history.replaceState( null, "", updatedUrl );
} else {
window.location = updatedUrl;
}
}
function setUrl( params ) {
var key, arrValue, i,
querystring = "?",
location = window.location;
params = QUnit.extend( QUnit.extend( {}, QUnit.urlParams ), params );
for ( key in params ) {
// Skip inherited or undefined properties
if ( hasOwn.call( params, key ) && params[ key ] !== undefined ) {
// Output a parameter for each value of this key (but usually just one)
arrValue = [].concat( params[ key ] );
for ( i = 0; i < arrValue.length; i++ ) {
querystring += encodeURIComponent( key );
if ( arrValue[ i ] !== true ) {
querystring += "=" + encodeURIComponent( arrValue[ i ] );
}
querystring += "&";
}
}
}
return location.protocol + "//" + location.host +
location.pathname + querystring.slice( 0, -1 );
}
function applyUrlParams() {
var i,
selectedModules = [],
modulesList = id( "qunit-modulefilter-dropdown-list" ).getElementsByTagName( "input" ),
filter = id( "qunit-filter-input" ).value;
for ( i = 0; i < modulesList.length; i++ ) {
if ( modulesList[ i ].checked ) {
selectedModules.push( modulesList[ i ].value );
}
}
window.location = setUrl( {
filter: ( filter === "" ) ? undefined : filter,
moduleId: ( selectedModules.length === 0 ) ? undefined : selectedModules,
// Remove module and testId filter
module: undefined,
testId: undefined
} );
}
function toolbarUrlConfigContainer() {
var urlConfigContainer = document.createElement( "span" );
urlConfigContainer.innerHTML = getUrlConfigHtml();
addClass( urlConfigContainer, "qunit-url-config" );
addEvents( urlConfigContainer.getElementsByTagName( "input" ), "change", toolbarChanged );
addEvents( urlConfigContainer.getElementsByTagName( "select" ), "change", toolbarChanged );
return urlConfigContainer;
}
function toolbarLooseFilter() {
var filter = document.createElement( "form" ),
label = document.createElement( "label" ),
input = document.createElement( "input" ),
button = document.createElement( "button" );
addClass( filter, "qunit-filter" );
label.innerHTML = "Filter: ";
input.type = "text";
input.value = config.filter || "";
input.name = "filter";
input.id = "qunit-filter-input";
button.innerHTML = "Go";
label.appendChild( input );
filter.appendChild( label );
filter.appendChild( document.createTextNode( " " ) );
filter.appendChild( button );
addEvent( filter, "submit", interceptNavigation );
return filter;
}
function moduleListHtml () {
var i, checked,
html = "";
for ( i = 0; i < config.modules.length; i++ ) {
if ( config.modules[ i ].name !== "" ) {
checked = config.moduleId.indexOf( config.modules[ i ].moduleId ) > -1;
html += "<li><label class='clickable" + ( checked ? " checked" : "" ) +
"'><input type='checkbox' " + "value='" + config.modules[ i ].moduleId + "'" +
( checked ? " checked='checked'" : "" ) + " />" +
escapeText( config.modules[ i ].name ) + "</label></li>";
}
}
return html;
}
function toolbarModuleFilter () {
var allCheckbox, commit, reset,
moduleFilter = document.createElement( "form" ),
label = document.createElement( "label" ),
moduleSearch = document.createElement( "input" ),
dropDown = document.createElement( "div" ),
actions = document.createElement( "span" ),
dropDownList = document.createElement( "ul" ),
dirty = false;
moduleSearch.id = "qunit-modulefilter-search";
addEvent( moduleSearch, "input", searchInput );
addEvent( moduleSearch, "input", searchFocus );
addEvent( moduleSearch, "focus", searchFocus );
addEvent( moduleSearch, "click", searchFocus );
label.id = "qunit-modulefilter-search-container";
label.innerHTML = "Module: ";
label.appendChild( moduleSearch );
actions.id = "qunit-modulefilter-actions";
actions.innerHTML =
"<button style='display:none'>Apply</button>" +
"<button type='reset' style='display:none'>Reset</button>" +
"<label class='clickable" +
( config.moduleId.length ? "" : " checked" ) +
"'><input type='checkbox'" + ( config.moduleId.length ? "" : " checked='checked'" ) +
">All modules</label>";
allCheckbox = actions.lastChild.firstChild;
commit = actions.firstChild;
reset = commit.nextSibling;
addEvent( commit, "click", applyUrlParams );
dropDownList.id = "qunit-modulefilter-dropdown-list";
dropDownList.innerHTML = moduleListHtml();
dropDown.id = "qunit-modulefilter-dropdown";
dropDown.style.display = "none";
dropDown.appendChild( actions );
dropDown.appendChild( dropDownList );
addEvent( dropDown, "change", selectionChange );
selectionChange();
moduleFilter.id = "qunit-modulefilter";
moduleFilter.appendChild( label );
moduleFilter.appendChild( dropDown ) ;
addEvent( moduleFilter, "submit", interceptNavigation );
addEvent( moduleFilter, "reset", function() {
// Let the reset happen, then update styles
window.setTimeout( selectionChange );
} );
// Enables show/hide for the dropdown
function searchFocus() {
if ( dropDown.style.display !== "none" ) {
return;
}
dropDown.style.display = "block";
addEvent( document, "click", hideHandler );
addEvent( document, "keydown", hideHandler );
// Hide on Escape keydown or outside-container click
function hideHandler( e ) {
var inContainer = moduleFilter.contains( e.target );
if ( e.keyCode === 27 || !inContainer ) {
if ( e.keyCode === 27 && inContainer ) {
moduleSearch.focus();
}
dropDown.style.display = "none";
removeEvent( document, "click", hideHandler );
removeEvent( document, "keydown", hideHandler );
moduleSearch.value = "";
searchInput();
}
}
}
// Processes module search box input
function searchInput() {
var i, item,
searchText = moduleSearch.value.toLowerCase(),
listItems = dropDownList.children;
for ( i = 0; i < listItems.length; i++ ) {
item = listItems[ i ];
if ( !searchText || item.textContent.toLowerCase().indexOf( searchText ) > -1 ) {
item.style.display = "";
} else {
item.style.display = "none";
}
}
}
// Processes selection changes
function selectionChange( evt ) {
var i, item,
checkbox = evt && evt.target || allCheckbox,
modulesList = dropDownList.getElementsByTagName( "input" ),
selectedNames = [];
toggleClass( checkbox.parentNode, "checked", checkbox.checked );
dirty = false;
if ( checkbox.checked && checkbox !== allCheckbox ) {
allCheckbox.checked = false;
removeClass( allCheckbox.parentNode, "checked" );
}
for ( i = 0; i < modulesList.length; i++ ) {
item = modulesList[ i ];
if ( !evt ) {
toggleClass( item.parentNode, "checked", item.checked );
} else if ( checkbox === allCheckbox && checkbox.checked ) {
item.checked = false;
removeClass( item.parentNode, "checked" );
}
dirty = dirty || ( item.checked !== item.defaultChecked );
if ( item.checked ) {
selectedNames.push( item.parentNode.textContent );
}
}
commit.style.display = reset.style.display = dirty ? "" : "none";
moduleSearch.placeholder = selectedNames.join( ", " ) || allCheckbox.parentNode.textContent;
moduleSearch.title = "Type to filter list. Current selection:\n" +
( selectedNames.join( "\n" ) || allCheckbox.parentNode.textContent );
}
return moduleFilter;
}
function appendToolbar() {
var toolbar = id( "qunit-testrunner-toolbar" );
if ( toolbar ) {
toolbar.appendChild( toolbarUrlConfigContainer() );
toolbar.appendChild( toolbarModuleFilter() );
toolbar.appendChild( toolbarLooseFilter() );
toolbar.appendChild( document.createElement( "div" ) ).className = "clearfix";
}
}
function appendHeader() {
var header = id( "qunit-header" );
if ( header ) {
header.innerHTML = "<a href='" + escapeText( unfilteredUrl ) + "'>" + header.innerHTML +
"</a> ";
}
}
function appendBanner() {
var banner = id( "qunit-banner" );
if ( banner ) {
banner.className = "";
}
}
function appendTestResults() {
var tests = id( "qunit-tests" ),
result = id( "qunit-testresult" );
if ( result ) {
result.parentNode.removeChild( result );
}
if ( tests ) {
tests.innerHTML = "";
result = document.createElement( "p" );
result.id = "qunit-testresult";
result.className = "result";
tests.parentNode.insertBefore( result, tests );
result.innerHTML = "Running...<br />&#160;";
}
}
function appendFilteredTest() {
var testId = QUnit.config.testId;
if ( !testId || testId.length <= 0 ) {
return "";
}
return "<div id='qunit-filteredTest'>Rerunning selected tests: " +
escapeText( testId.join( ", " ) ) +
" <a id='qunit-clearFilter' href='" +
escapeText( unfilteredUrl ) +
"'>Run all tests</a></div>";
}
function appendUserAgent() {
var userAgent = id( "qunit-userAgent" );
if ( userAgent ) {
userAgent.innerHTML = "";
userAgent.appendChild(
document.createTextNode(
"QUnit " + QUnit.version + "; " + navigator.userAgent
)
);
}
}
function appendInterface() {
var qunit = id( "qunit" );
if ( qunit ) {
qunit.innerHTML =
"<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
"<h2 id='qunit-banner'></h2>" +
"<div id='qunit-testrunner-toolbar'></div>" +
appendFilteredTest() +
"<h2 id='qunit-userAgent'></h2>" +
"<ol id='qunit-tests'></ol>";
}
appendHeader();
appendBanner();
appendTestResults();
appendUserAgent();
appendToolbar();
}
function appendTestsList( modules ) {
var i, l, x, z, test, moduleObj;
for ( i = 0, l = modules.length; i < l; i++ ) {
moduleObj = modules[ i ];
for ( x = 0, z = moduleObj.tests.length; x < z; x++ ) {
test = moduleObj.tests[ x ];
appendTest( test.name, test.testId, moduleObj.name );
}
}
}
function appendTest( name, testId, moduleName ) {
var title, rerunTrigger, testBlock, assertList,
tests = id( "qunit-tests" );
if ( !tests ) {
return;
}
title = document.createElement( "strong" );
title.innerHTML = getNameHtml( name, moduleName );
rerunTrigger = document.createElement( "a" );
rerunTrigger.innerHTML = "Rerun";
rerunTrigger.href = setUrl( { testId: testId } );
testBlock = document.createElement( "li" );
testBlock.appendChild( title );
testBlock.appendChild( rerunTrigger );
testBlock.id = "qunit-test-output-" + testId;
assertList = document.createElement( "ol" );
assertList.className = "qunit-assert-list";
testBlock.appendChild( assertList );
tests.appendChild( testBlock );
}
// HTML Reporter initialization and load
QUnit.begin( function( details ) {
var i, moduleObj, tests;
// Sort modules by name for the picker
for ( i = 0; i < details.modules.length; i++ ) {
moduleObj = details.modules[ i ];
if ( moduleObj.name ) {
modulesList.push( moduleObj.name );
}
}
modulesList.sort( function( a, b ) {
return a.localeCompare( b );
} );
// Initialize QUnit elements
appendInterface();
appendTestsList( details.modules );
tests = id( "qunit-tests" );
if ( tests && config.hidepassed ) {
addClass( tests, "hidepass" );
}
} );
QUnit.done( function( details ) {
var i, key,
banner = id( "qunit-banner" ),
tests = id( "qunit-tests" ),
html = [
"Tests completed in ",
details.runtime,
" milliseconds.<br />",
"<span class='passed'>",
details.passed,
"</span> assertions of <span class='total'>",
details.total,
"</span> passed, <span class='failed'>",
details.failed,
"</span> failed."
].join( "" );
if ( banner ) {
banner.className = details.failed ? "qunit-fail" : "qunit-pass";
}
if ( tests ) {
id( "qunit-testresult" ).innerHTML = html;
}
if ( config.altertitle && document.title ) {
// Show ✖ for good, ✔ for bad suite result in title
// use escape sequences in case file gets loaded with non-utf-8-charset
document.title = [
( details.failed ? "\u2716" : "\u2714" ),
document.title.replace( /^[\u2714\u2716] /i, "" )
].join( " " );
}
// Clear own sessionStorage items if all tests passed
if ( config.reorder && defined.sessionStorage && details.failed === 0 ) {
for ( i = 0; i < sessionStorage.length; i++ ) {
key = sessionStorage.key( i++ );
if ( key.indexOf( "qunit-test-" ) === 0 ) {
sessionStorage.removeItem( key );
}
}
}
// Scroll back to top to show results
if ( config.scrolltop && window.scrollTo ) {
window.scrollTo( 0, 0 );
}
} );
function getNameHtml( name, module ) {
var nameHtml = "";
if ( module ) {
nameHtml = "<span class='module-name'>" + escapeText( module ) + "</span>: ";
}
nameHtml += "<span class='test-name'>" + escapeText( name ) + "</span>";
return nameHtml;
}
QUnit.testStart( function( details ) {
var running, testBlock, bad;
testBlock = id( "qunit-test-output-" + details.testId );
if ( testBlock ) {
testBlock.className = "running";
} else {
// Report later registered tests
appendTest( details.name, details.testId, details.module );
}
running = id( "qunit-testresult" );
if ( running ) {
bad = QUnit.config.reorder && defined.sessionStorage &&
+sessionStorage.getItem( "qunit-test-" + details.module + "-" + details.name );
running.innerHTML = ( bad ?
"Rerunning previously failed test: <br />" :
"Running: <br />" ) +
getNameHtml( details.name, details.module );
}
} );
function stripHtml( string ) {
// Strip tags, html entity and whitespaces
return string.replace( /<\/?[^>]+(>|$)/g, "" ).replace( /\&quot;/g, "" ).replace( /\s+/g, "" );
}
QUnit.log( function( details ) {
var assertList, assertLi,
message, expected, actual, diff,
showDiff = false,
testItem = id( "qunit-test-output-" + details.testId );
if ( !testItem ) {
return;
}
message = escapeText( details.message ) || ( details.result ? "okay" : "failed" );
message = "<span class='test-message'>" + message + "</span>";
message += "<span class='runtime'>@ " + details.runtime + " ms</span>";
// The pushFailure doesn't provide details.expected
// when it calls, it's implicit to also not show expected and diff stuff
// Also, we need to check details.expected existence, as it can exist and be undefined
if ( !details.result && hasOwn.call( details, "expected" ) ) {
if ( details.negative ) {
expected = "NOT " + QUnit.dump.parse( details.expected );
} else {
expected = QUnit.dump.parse( details.expected );
}
actual = QUnit.dump.parse( details.actual );
message += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" +
escapeText( expected ) +
"</pre></td></tr>";
if ( actual !== expected ) {
message += "<tr class='test-actual'><th>Result: </th><td><pre>" +
escapeText( actual ) + "</pre></td></tr>";
// Don't show diff if actual or expected are booleans
if ( !( /^(true|false)$/.test( actual ) ) &&
!( /^(true|false)$/.test( expected ) ) ) {
diff = QUnit.diff( expected, actual );
showDiff = stripHtml( diff ).length !==
stripHtml( expected ).length +
stripHtml( actual ).length;
}
// Don't show diff if expected and actual are totally different
if ( showDiff ) {
message += "<tr class='test-diff'><th>Diff: </th><td><pre>" +
diff + "</pre></td></tr>";
}
} else if ( expected.indexOf( "[object Array]" ) !== -1 ||
expected.indexOf( "[object Object]" ) !== -1 ) {
message += "<tr class='test-message'><th>Message: </th><td>" +
"Diff suppressed as the depth of object is more than current max depth (" +
QUnit.config.maxDepth + ").<p>Hint: Use <code>QUnit.dump.maxDepth</code> to " +
" run with a higher max depth or <a href='" +
escapeText( setUrl( { maxDepth: -1 } ) ) + "'>" +
"Rerun</a> without max depth.</p></td></tr>";
} else {
message += "<tr class='test-message'><th>Message: </th><td>" +
"Diff suppressed as the expected and actual results have an equivalent" +
" serialization</td></tr>";
}
if ( details.source ) {
message += "<tr class='test-source'><th>Source: </th><td><pre>" +
escapeText( details.source ) + "</pre></td></tr>";
}
message += "</table>";
// This occurs when pushFailure is set and we have an extracted stack trace
} else if ( !details.result && details.source ) {
message += "<table>" +
"<tr class='test-source'><th>Source: </th><td><pre>" +
escapeText( details.source ) + "</pre></td></tr>" +
"</table>";
}
assertList = testItem.getElementsByTagName( "ol" )[ 0 ];
assertLi = document.createElement( "li" );
assertLi.className = details.result ? "pass" : "fail";
assertLi.innerHTML = message;
assertList.appendChild( assertLi );
} );
QUnit.testDone( function( details ) {
var testTitle, time, testItem, assertList,
good, bad, testCounts, skipped, sourceName,
tests = id( "qunit-tests" );
if ( !tests ) {
return;
}
testItem = id( "qunit-test-output-" + details.testId );
assertList = testItem.getElementsByTagName( "ol" )[ 0 ];
good = details.passed;
bad = details.failed;
// Store result when possible
if ( config.reorder && defined.sessionStorage ) {
if ( bad ) {
sessionStorage.setItem( "qunit-test-" + details.module + "-" + details.name, bad );
} else {
sessionStorage.removeItem( "qunit-test-" + details.module + "-" + details.name );
}
}
if ( bad === 0 ) {
// Collapse the passing tests
addClass( assertList, "qunit-collapsed" );
} else if ( bad && config.collapse && !collapseNext ) {
// Skip collapsing the first failing test
collapseNext = true;
} else {
// Collapse remaining tests
addClass( assertList, "qunit-collapsed" );
}
// The testItem.firstChild is the test name
testTitle = testItem.firstChild;
testCounts = bad ?
"<b class='failed'>" + bad + "</b>, " + "<b class='passed'>" + good + "</b>, " :
"";
testTitle.innerHTML += " <b class='counts'>(" + testCounts +
details.assertions.length + ")</b>";
if ( details.skipped ) {
testItem.className = "skipped";
skipped = document.createElement( "em" );
skipped.className = "qunit-skipped-label";
skipped.innerHTML = "skipped";
testItem.insertBefore( skipped, testTitle );
} else {
addEvent( testTitle, "click", function() {
toggleClass( assertList, "qunit-collapsed" );
} );
testItem.className = bad ? "fail" : "pass";
time = document.createElement( "span" );
time.className = "runtime";
time.innerHTML = details.runtime + " ms";
testItem.insertBefore( time, assertList );
}
// Show the source of the test when showing assertions
if ( details.source ) {
sourceName = document.createElement( "p" );
sourceName.innerHTML = "<strong>Source: </strong>" + details.source;
addClass( sourceName, "qunit-source" );
if ( bad === 0 ) {
addClass( sourceName, "qunit-collapsed" );
}
addEvent( testTitle, "click", function() {
toggleClass( sourceName, "qunit-collapsed" );
} );
testItem.appendChild( sourceName );
}
} );
// Avoid readyState issue with phantomjs
// Ref: #818
var notPhantom = ( function( p ) {
return !( p && p.version && p.version.major > 0 );
} )( window.phantom );
if ( notPhantom && document.readyState === "complete" ) {
QUnit.load();
} else {
addEvent( window, "load", QUnit.load );
}
/*
* This file is a modified version of google-diff-match-patch's JavaScript implementation
* (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js),
* modifications are licensed as more fully set forth in LICENSE.txt.
*
* The original source of google-diff-match-patch is attributable and licensed as follows:
*
* Copyright 2006 Google Inc.
* https://code.google.com/p/google-diff-match-patch/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* More Info:
* https://code.google.com/p/google-diff-match-patch/
*
* Usage: QUnit.diff(expected, actual)
*
*/
QUnit.diff = ( function() {
function DiffMatchPatch() {
}
// DIFF FUNCTIONS
/**
* The data structure representing a diff is an array of tuples:
* [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]
* which means: delete 'Hello', add 'Goodbye' and keep ' world.'
*/
var DIFF_DELETE = -1,
DIFF_INSERT = 1,
DIFF_EQUAL = 0;
/**
* Find the differences between two texts. Simplifies the problem by stripping
* any common prefix or suffix off the texts before diffing.
* @param {string} text1 Old string to be diffed.
* @param {string} text2 New string to be diffed.
* @param {boolean=} optChecklines Optional speedup flag. If present and false,
* then don't run a line-level diff first to identify the changed areas.
* Defaults to true, which does a faster, slightly less optimal diff.
* @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
*/
DiffMatchPatch.prototype.DiffMain = function( text1, text2, optChecklines ) {
var deadline, checklines, commonlength,
commonprefix, commonsuffix, diffs;
// The diff must be complete in up to 1 second.
deadline = ( new Date() ).getTime() + 1000;
// Check for null inputs.
if ( text1 === null || text2 === null ) {
throw new Error( "Null input. (DiffMain)" );
}
// Check for equality (speedup).
if ( text1 === text2 ) {
if ( text1 ) {
return [
[ DIFF_EQUAL, text1 ]
];
}
return [];
}
if ( typeof optChecklines === "undefined" ) {
optChecklines = true;
}
checklines = optChecklines;
// Trim off common prefix (speedup).
commonlength = this.diffCommonPrefix( text1, text2 );
commonprefix = text1.substring( 0, commonlength );
text1 = text1.substring( commonlength );
text2 = text2.substring( commonlength );
// Trim off common suffix (speedup).
commonlength = this.diffCommonSuffix( text1, text2 );
commonsuffix = text1.substring( text1.length - commonlength );
text1 = text1.substring( 0, text1.length - commonlength );
text2 = text2.substring( 0, text2.length - commonlength );
// Compute the diff on the middle block.
diffs = this.diffCompute( text1, text2, checklines, deadline );
// Restore the prefix and suffix.
if ( commonprefix ) {
diffs.unshift( [ DIFF_EQUAL, commonprefix ] );
}
if ( commonsuffix ) {
diffs.push( [ DIFF_EQUAL, commonsuffix ] );
}
this.diffCleanupMerge( diffs );
return diffs;
};
/**
* Reduce the number of edits by eliminating operationally trivial equalities.
* @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
*/
DiffMatchPatch.prototype.diffCleanupEfficiency = function( diffs ) {
var changes, equalities, equalitiesLength, lastequality,
pointer, preIns, preDel, postIns, postDel;
changes = false;
equalities = []; // Stack of indices where equalities are found.
equalitiesLength = 0; // Keeping our own length var is faster in JS.
/** @type {?string} */
lastequality = null;
// Always equal to diffs[equalities[equalitiesLength - 1]][1]
pointer = 0; // Index of current position.
// Is there an insertion operation before the last equality.
preIns = false;
// Is there a deletion operation before the last equality.
preDel = false;
// Is there an insertion operation after the last equality.
postIns = false;
// Is there a deletion operation after the last equality.
postDel = false;
while ( pointer < diffs.length ) {
// Equality found.
if ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) {
if ( diffs[ pointer ][ 1 ].length < 4 && ( postIns || postDel ) ) {
// Candidate found.
equalities[ equalitiesLength++ ] = pointer;
preIns = postIns;
preDel = postDel;
lastequality = diffs[ pointer ][ 1 ];
} else {
// Not a candidate, and can never become one.
equalitiesLength = 0;
lastequality = null;
}
postIns = postDel = false;
// An insertion or deletion.
} else {
if ( diffs[ pointer ][ 0 ] === DIFF_DELETE ) {
postDel = true;
} else {
postIns = true;
}
/*
* Five types to be split:
* <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>
* <ins>A</ins>X<ins>C</ins><del>D</del>
* <ins>A</ins><del>B</del>X<ins>C</ins>
* <ins>A</del>X<ins>C</ins><del>D</del>
* <ins>A</ins><del>B</del>X<del>C</del>
*/
if ( lastequality && ( ( preIns && preDel && postIns && postDel ) ||
( ( lastequality.length < 2 ) &&
( preIns + preDel + postIns + postDel ) === 3 ) ) ) {
// Duplicate record.
diffs.splice(
equalities[ equalitiesLength - 1 ],
0,
[ DIFF_DELETE, lastequality ]
);
// Change second copy to insert.
diffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;
equalitiesLength--; // Throw away the equality we just deleted;
lastequality = null;
if ( preIns && preDel ) {
// No changes made which could affect previous entry, keep going.
postIns = postDel = true;
equalitiesLength = 0;
} else {
equalitiesLength--; // Throw away the previous equality.
pointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;
postIns = postDel = false;
}
changes = true;
}
}
pointer++;
}
if ( changes ) {
this.diffCleanupMerge( diffs );
}
};
/**
* Convert a diff array into a pretty HTML report.
* @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
* @param {integer} string to be beautified.
* @return {string} HTML representation.
*/
DiffMatchPatch.prototype.diffPrettyHtml = function( diffs ) {
var op, data, x,
html = [];
for ( x = 0; x < diffs.length; x++ ) {
op = diffs[ x ][ 0 ]; // Operation (insert, delete, equal)
data = diffs[ x ][ 1 ]; // Text of change.
switch ( op ) {
case DIFF_INSERT:
html[ x ] = "<ins>" + escapeText( data ) + "</ins>";
break;
case DIFF_DELETE:
html[ x ] = "<del>" + escapeText( data ) + "</del>";
break;
case DIFF_EQUAL:
html[ x ] = "<span>" + escapeText( data ) + "</span>";
break;
}
}
return html.join( "" );
};
/**
* Determine the common prefix of two strings.
* @param {string} text1 First string.
* @param {string} text2 Second string.
* @return {number} The number of characters common to the start of each
* string.
*/
DiffMatchPatch.prototype.diffCommonPrefix = function( text1, text2 ) {
var pointermid, pointermax, pointermin, pointerstart;
// Quick check for common null cases.
if ( !text1 || !text2 || text1.charAt( 0 ) !== text2.charAt( 0 ) ) {
return 0;
}
// Binary search.
// Performance analysis: https://neil.fraser.name/news/2007/10/09/
pointermin = 0;
pointermax = Math.min( text1.length, text2.length );
pointermid = pointermax;
pointerstart = 0;
while ( pointermin < pointermid ) {
if ( text1.substring( pointerstart, pointermid ) ===
text2.substring( pointerstart, pointermid ) ) {
pointermin = pointermid;
pointerstart = pointermin;
} else {
pointermax = pointermid;
}
pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );
}
return pointermid;
};
/**
* Determine the common suffix of two strings.
* @param {string} text1 First string.
* @param {string} text2 Second string.
* @return {number} The number of characters common to the end of each string.
*/
DiffMatchPatch.prototype.diffCommonSuffix = function( text1, text2 ) {
var pointermid, pointermax, pointermin, pointerend;
// Quick check for common null cases.
if ( !text1 ||
!text2 ||
text1.charAt( text1.length - 1 ) !== text2.charAt( text2.length - 1 ) ) {
return 0;
}
// Binary search.
// Performance analysis: https://neil.fraser.name/news/2007/10/09/
pointermin = 0;
pointermax = Math.min( text1.length, text2.length );
pointermid = pointermax;
pointerend = 0;
while ( pointermin < pointermid ) {
if ( text1.substring( text1.length - pointermid, text1.length - pointerend ) ===
text2.substring( text2.length - pointermid, text2.length - pointerend ) ) {
pointermin = pointermid;
pointerend = pointermin;
} else {
pointermax = pointermid;
}
pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );
}
return pointermid;
};
/**
* Find the differences between two texts. Assumes that the texts do not
* have any common prefix or suffix.
* @param {string} text1 Old string to be diffed.
* @param {string} text2 New string to be diffed.
* @param {boolean} checklines Speedup flag. If false, then don't run a
* line-level diff first to identify the changed areas.
* If true, then run a faster, slightly less optimal diff.
* @param {number} deadline Time when the diff should be complete by.
* @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
* @private
*/
DiffMatchPatch.prototype.diffCompute = function( text1, text2, checklines, deadline ) {
var diffs, longtext, shorttext, i, hm,
text1A, text2A, text1B, text2B,
midCommon, diffsA, diffsB;
if ( !text1 ) {
// Just add some text (speedup).
return [
[ DIFF_INSERT, text2 ]
];
}
if ( !text2 ) {
// Just delete some text (speedup).
return [
[ DIFF_DELETE, text1 ]
];
}
longtext = text1.length > text2.length ? text1 : text2;
shorttext = text1.length > text2.length ? text2 : text1;
i = longtext.indexOf( shorttext );
if ( i !== -1 ) {
// Shorter text is inside the longer text (speedup).
diffs = [
[ DIFF_INSERT, longtext.substring( 0, i ) ],
[ DIFF_EQUAL, shorttext ],
[ DIFF_INSERT, longtext.substring( i + shorttext.length ) ]
];
// Swap insertions for deletions if diff is reversed.
if ( text1.length > text2.length ) {
diffs[ 0 ][ 0 ] = diffs[ 2 ][ 0 ] = DIFF_DELETE;
}
return diffs;
}
if ( shorttext.length === 1 ) {
// Single character string.
// After the previous speedup, the character can't be an equality.
return [
[ DIFF_DELETE, text1 ],
[ DIFF_INSERT, text2 ]
];
}
// Check to see if the problem can be split in two.
hm = this.diffHalfMatch( text1, text2 );
if ( hm ) {
// A half-match was found, sort out the return data.
text1A = hm[ 0 ];
text1B = hm[ 1 ];
text2A = hm[ 2 ];
text2B = hm[ 3 ];
midCommon = hm[ 4 ];
// Send both pairs off for separate processing.
diffsA = this.DiffMain( text1A, text2A, checklines, deadline );
diffsB = this.DiffMain( text1B, text2B, checklines, deadline );
// Merge the results.
return diffsA.concat( [
[ DIFF_EQUAL, midCommon ]
], diffsB );
}
if ( checklines && text1.length > 100 && text2.length > 100 ) {
return this.diffLineMode( text1, text2, deadline );
}
return this.diffBisect( text1, text2, deadline );
};
/**
* Do the two texts share a substring which is at least half the length of the
* longer text?
* This speedup can produce non-minimal diffs.
* @param {string} text1 First string.
* @param {string} text2 Second string.
* @return {Array.<string>} Five element Array, containing the prefix of
* text1, the suffix of text1, the prefix of text2, the suffix of
* text2 and the common middle. Or null if there was no match.
* @private
*/
DiffMatchPatch.prototype.diffHalfMatch = function( text1, text2 ) {
var longtext, shorttext, dmp,
text1A, text2B, text2A, text1B, midCommon,
hm1, hm2, hm;
longtext = text1.length > text2.length ? text1 : text2;
shorttext = text1.length > text2.length ? text2 : text1;
if ( longtext.length < 4 || shorttext.length * 2 < longtext.length ) {
return null; // Pointless.
}
dmp = this; // 'this' becomes 'window' in a closure.
/**
* Does a substring of shorttext exist within longtext such that the substring
* is at least half the length of longtext?
* Closure, but does not reference any external variables.
* @param {string} longtext Longer string.
* @param {string} shorttext Shorter string.
* @param {number} i Start index of quarter length substring within longtext.
* @return {Array.<string>} Five element Array, containing the prefix of
* longtext, the suffix of longtext, the prefix of shorttext, the suffix
* of shorttext and the common middle. Or null if there was no match.
* @private
*/
function diffHalfMatchI( longtext, shorttext, i ) {
var seed, j, bestCommon, prefixLength, suffixLength,
bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB;
// Start with a 1/4 length substring at position i as a seed.
seed = longtext.substring( i, i + Math.floor( longtext.length / 4 ) );
j = -1;
bestCommon = "";
while ( ( j = shorttext.indexOf( seed, j + 1 ) ) !== -1 ) {
prefixLength = dmp.diffCommonPrefix( longtext.substring( i ),
shorttext.substring( j ) );
suffixLength = dmp.diffCommonSuffix( longtext.substring( 0, i ),
shorttext.substring( 0, j ) );
if ( bestCommon.length < suffixLength + prefixLength ) {
bestCommon = shorttext.substring( j - suffixLength, j ) +
shorttext.substring( j, j + prefixLength );
bestLongtextA = longtext.substring( 0, i - suffixLength );
bestLongtextB = longtext.substring( i + prefixLength );
bestShorttextA = shorttext.substring( 0, j - suffixLength );
bestShorttextB = shorttext.substring( j + prefixLength );
}
}
if ( bestCommon.length * 2 >= longtext.length ) {
return [ bestLongtextA, bestLongtextB,
bestShorttextA, bestShorttextB, bestCommon
];
} else {
return null;
}
}
// First check if the second quarter is the seed for a half-match.
hm1 = diffHalfMatchI( longtext, shorttext,
Math.ceil( longtext.length / 4 ) );
// Check again based on the third quarter.
hm2 = diffHalfMatchI( longtext, shorttext,
Math.ceil( longtext.length / 2 ) );
if ( !hm1 && !hm2 ) {
return null;
} else if ( !hm2 ) {
hm = hm1;
} else if ( !hm1 ) {
hm = hm2;
} else {
// Both matched. Select the longest.
hm = hm1[ 4 ].length > hm2[ 4 ].length ? hm1 : hm2;
}
// A half-match was found, sort out the return data.
text1A, text1B, text2A, text2B;
if ( text1.length > text2.length ) {
text1A = hm[ 0 ];
text1B = hm[ 1 ];
text2A = hm[ 2 ];
text2B = hm[ 3 ];
} else {
text2A = hm[ 0 ];
text2B = hm[ 1 ];
text1A = hm[ 2 ];
text1B = hm[ 3 ];
}
midCommon = hm[ 4 ];
return [ text1A, text1B, text2A, text2B, midCommon ];
};
/**
* Do a quick line-level diff on both strings, then rediff the parts for
* greater accuracy.
* This speedup can produce non-minimal diffs.
* @param {string} text1 Old string to be diffed.
* @param {string} text2 New string to be diffed.
* @param {number} deadline Time when the diff should be complete by.
* @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
* @private
*/
DiffMatchPatch.prototype.diffLineMode = function( text1, text2, deadline ) {
var a, diffs, linearray, pointer, countInsert,
countDelete, textInsert, textDelete, j;
// Scan the text on a line-by-line basis first.
a = this.diffLinesToChars( text1, text2 );
text1 = a.chars1;
text2 = a.chars2;
linearray = a.lineArray;
diffs = this.DiffMain( text1, text2, false, deadline );
// Convert the diff back to original text.
this.diffCharsToLines( diffs, linearray );
// Eliminate freak matches (e.g. blank lines)
this.diffCleanupSemantic( diffs );
// Rediff any replacement blocks, this time character-by-character.
// Add a dummy entry at the end.
diffs.push( [ DIFF_EQUAL, "" ] );
pointer = 0;
countDelete = 0;
countInsert = 0;
textDelete = "";
textInsert = "";
while ( pointer < diffs.length ) {
switch ( diffs[ pointer ][ 0 ] ) {
case DIFF_INSERT:
countInsert++;
textInsert += diffs[ pointer ][ 1 ];
break;
case DIFF_DELETE:
countDelete++;
textDelete += diffs[ pointer ][ 1 ];
break;
case DIFF_EQUAL:
// Upon reaching an equality, check for prior redundancies.
if ( countDelete >= 1 && countInsert >= 1 ) {
// Delete the offending records and add the merged ones.
diffs.splice( pointer - countDelete - countInsert,
countDelete + countInsert );
pointer = pointer - countDelete - countInsert;
a = this.DiffMain( textDelete, textInsert, false, deadline );
for ( j = a.length - 1; j >= 0; j-- ) {
diffs.splice( pointer, 0, a[ j ] );
}
pointer = pointer + a.length;
}
countInsert = 0;
countDelete = 0;
textDelete = "";
textInsert = "";
break;
}
pointer++;
}
diffs.pop(); // Remove the dummy entry at the end.
return diffs;
};
/**
* Find the 'middle snake' of a diff, split the problem in two
* and return the recursively constructed diff.
* See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.
* @param {string} text1 Old string to be diffed.
* @param {string} text2 New string to be diffed.
* @param {number} deadline Time at which to bail if not yet complete.
* @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
* @private
*/
DiffMatchPatch.prototype.diffBisect = function( text1, text2, deadline ) {
var text1Length, text2Length, maxD, vOffset, vLength,
v1, v2, x, delta, front, k1start, k1end, k2start,
k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2;
// Cache the text lengths to prevent multiple calls.
text1Length = text1.length;
text2Length = text2.length;
maxD = Math.ceil( ( text1Length + text2Length ) / 2 );
vOffset = maxD;
vLength = 2 * maxD;
v1 = new Array( vLength );
v2 = new Array( vLength );
// Setting all elements to -1 is faster in Chrome & Firefox than mixing
// integers and undefined.
for ( x = 0; x < vLength; x++ ) {
v1[ x ] = -1;
v2[ x ] = -1;
}
v1[ vOffset + 1 ] = 0;
v2[ vOffset + 1 ] = 0;
delta = text1Length - text2Length;
// If the total number of characters is odd, then the front path will collide
// with the reverse path.
front = ( delta % 2 !== 0 );
// Offsets for start and end of k loop.
// Prevents mapping of space beyond the grid.
k1start = 0;
k1end = 0;
k2start = 0;
k2end = 0;
for ( d = 0; d < maxD; d++ ) {
// Bail out if deadline is reached.
if ( ( new Date() ).getTime() > deadline ) {
break;
}
// Walk the front path one step.
for ( k1 = -d + k1start; k1 <= d - k1end; k1 += 2 ) {
k1Offset = vOffset + k1;
if ( k1 === -d || ( k1 !== d && v1[ k1Offset - 1 ] < v1[ k1Offset + 1 ] ) ) {
x1 = v1[ k1Offset + 1 ];
} else {
x1 = v1[ k1Offset - 1 ] + 1;
}
y1 = x1 - k1;
while ( x1 < text1Length && y1 < text2Length &&
text1.charAt( x1 ) === text2.charAt( y1 ) ) {
x1++;
y1++;
}
v1[ k1Offset ] = x1;
if ( x1 > text1Length ) {
// Ran off the right of the graph.
k1end += 2;
} else if ( y1 > text2Length ) {
// Ran off the bottom of the graph.
k1start += 2;
} else if ( front ) {
k2Offset = vOffset + delta - k1;
if ( k2Offset >= 0 && k2Offset < vLength && v2[ k2Offset ] !== -1 ) {
// Mirror x2 onto top-left coordinate system.
x2 = text1Length - v2[ k2Offset ];
if ( x1 >= x2 ) {
// Overlap detected.
return this.diffBisectSplit( text1, text2, x1, y1, deadline );
}
}
}
}
// Walk the reverse path one step.
for ( k2 = -d + k2start; k2 <= d - k2end; k2 += 2 ) {
k2Offset = vOffset + k2;
if ( k2 === -d || ( k2 !== d && v2[ k2Offset - 1 ] < v2[ k2Offset + 1 ] ) ) {
x2 = v2[ k2Offset + 1 ];
} else {
x2 = v2[ k2Offset - 1 ] + 1;
}
y2 = x2 - k2;
while ( x2 < text1Length && y2 < text2Length &&
text1.charAt( text1Length - x2 - 1 ) ===
text2.charAt( text2Length - y2 - 1 ) ) {
x2++;
y2++;
}
v2[ k2Offset ] = x2;
if ( x2 > text1Length ) {
// Ran off the left of the graph.
k2end += 2;
} else if ( y2 > text2Length ) {
// Ran off the top of the graph.
k2start += 2;
} else if ( !front ) {
k1Offset = vOffset + delta - k2;
if ( k1Offset >= 0 && k1Offset < vLength && v1[ k1Offset ] !== -1 ) {
x1 = v1[ k1Offset ];
y1 = vOffset + x1 - k1Offset;
// Mirror x2 onto top-left coordinate system.
x2 = text1Length - x2;
if ( x1 >= x2 ) {
// Overlap detected.
return this.diffBisectSplit( text1, text2, x1, y1, deadline );
}
}
}
}
}
// Diff took too long and hit the deadline or
// number of diffs equals number of characters, no commonality at all.
return [
[ DIFF_DELETE, text1 ],
[ DIFF_INSERT, text2 ]
];
};
/**
* Given the location of the 'middle snake', split the diff in two parts
* and recurse.
* @param {string} text1 Old string to be diffed.
* @param {string} text2 New string to be diffed.
* @param {number} x Index of split point in text1.
* @param {number} y Index of split point in text2.
* @param {number} deadline Time at which to bail if not yet complete.
* @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
* @private
*/
DiffMatchPatch.prototype.diffBisectSplit = function( text1, text2, x, y, deadline ) {
var text1a, text1b, text2a, text2b, diffs, diffsb;
text1a = text1.substring( 0, x );
text2a = text2.substring( 0, y );
text1b = text1.substring( x );
text2b = text2.substring( y );
// Compute both diffs serially.
diffs = this.DiffMain( text1a, text2a, false, deadline );
diffsb = this.DiffMain( text1b, text2b, false, deadline );
return diffs.concat( diffsb );
};
/**
* Reduce the number of edits by eliminating semantically trivial equalities.
* @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
*/
DiffMatchPatch.prototype.diffCleanupSemantic = function( diffs ) {
var changes, equalities, equalitiesLength, lastequality,
pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1,
lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2;
changes = false;
equalities = []; // Stack of indices where equalities are found.
equalitiesLength = 0; // Keeping our own length var is faster in JS.
/** @type {?string} */
lastequality = null;
// Always equal to diffs[equalities[equalitiesLength - 1]][1]
pointer = 0; // Index of current position.
// Number of characters that changed prior to the equality.
lengthInsertions1 = 0;
lengthDeletions1 = 0;
// Number of characters that changed after the equality.
lengthInsertions2 = 0;
lengthDeletions2 = 0;
while ( pointer < diffs.length ) {
if ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) { // Equality found.
equalities[ equalitiesLength++ ] = pointer;
lengthInsertions1 = lengthInsertions2;
lengthDeletions1 = lengthDeletions2;
lengthInsertions2 = 0;
lengthDeletions2 = 0;
lastequality = diffs[ pointer ][ 1 ];
} else { // An insertion or deletion.
if ( diffs[ pointer ][ 0 ] === DIFF_INSERT ) {
lengthInsertions2 += diffs[ pointer ][ 1 ].length;
} else {
lengthDeletions2 += diffs[ pointer ][ 1 ].length;
}
// Eliminate an equality that is smaller or equal to the edits on both
// sides of it.
if ( lastequality && ( lastequality.length <=
Math.max( lengthInsertions1, lengthDeletions1 ) ) &&
( lastequality.length <= Math.max( lengthInsertions2,
lengthDeletions2 ) ) ) {
// Duplicate record.
diffs.splice(
equalities[ equalitiesLength - 1 ],
0,
[ DIFF_DELETE, lastequality ]
);
// Change second copy to insert.
diffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;
// Throw away the equality we just deleted.
equalitiesLength--;
// Throw away the previous equality (it needs to be reevaluated).
equalitiesLength--;
pointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;
// Reset the counters.
lengthInsertions1 = 0;
lengthDeletions1 = 0;
lengthInsertions2 = 0;
lengthDeletions2 = 0;
lastequality = null;
changes = true;
}
}
pointer++;
}
// Normalize the diff.
if ( changes ) {
this.diffCleanupMerge( diffs );
}
// Find any overlaps between deletions and insertions.
// e.g: <del>abcxxx</del><ins>xxxdef</ins>
// -> <del>abc</del>xxx<ins>def</ins>
// e.g: <del>xxxabc</del><ins>defxxx</ins>
// -> <ins>def</ins>xxx<del>abc</del>
// Only extract an overlap if it is as big as the edit ahead or behind it.
pointer = 1;
while ( pointer < diffs.length ) {
if ( diffs[ pointer - 1 ][ 0 ] === DIFF_DELETE &&
diffs[ pointer ][ 0 ] === DIFF_INSERT ) {
deletion = diffs[ pointer - 1 ][ 1 ];
insertion = diffs[ pointer ][ 1 ];
overlapLength1 = this.diffCommonOverlap( deletion, insertion );
overlapLength2 = this.diffCommonOverlap( insertion, deletion );
if ( overlapLength1 >= overlapLength2 ) {
if ( overlapLength1 >= deletion.length / 2 ||
overlapLength1 >= insertion.length / 2 ) {
// Overlap found. Insert an equality and trim the surrounding edits.
diffs.splice(
pointer,
0,
[ DIFF_EQUAL, insertion.substring( 0, overlapLength1 ) ]
);
diffs[ pointer - 1 ][ 1 ] =
deletion.substring( 0, deletion.length - overlapLength1 );
diffs[ pointer + 1 ][ 1 ] = insertion.substring( overlapLength1 );
pointer++;
}
} else {
if ( overlapLength2 >= deletion.length / 2 ||
overlapLength2 >= insertion.length / 2 ) {
// Reverse overlap found.
// Insert an equality and swap and trim the surrounding edits.
diffs.splice(
pointer,
0,
[ DIFF_EQUAL, deletion.substring( 0, overlapLength2 ) ]
);
diffs[ pointer - 1 ][ 0 ] = DIFF_INSERT;
diffs[ pointer - 1 ][ 1 ] =
insertion.substring( 0, insertion.length - overlapLength2 );
diffs[ pointer + 1 ][ 0 ] = DIFF_DELETE;
diffs[ pointer + 1 ][ 1 ] =
deletion.substring( overlapLength2 );
pointer++;
}
}
pointer++;
}
pointer++;
}
};
/**
* Determine if the suffix of one string is the prefix of another.
* @param {string} text1 First string.
* @param {string} text2 Second string.
* @return {number} The number of characters common to the end of the first
* string and the start of the second string.
* @private
*/
DiffMatchPatch.prototype.diffCommonOverlap = function( text1, text2 ) {
var text1Length, text2Length, textLength,
best, length, pattern, found;
// Cache the text lengths to prevent multiple calls.
text1Length = text1.length;
text2Length = text2.length;
// Eliminate the null case.
if ( text1Length === 0 || text2Length === 0 ) {
return 0;
}
// Truncate the longer string.
if ( text1Length > text2Length ) {
text1 = text1.substring( text1Length - text2Length );
} else if ( text1Length < text2Length ) {
text2 = text2.substring( 0, text1Length );
}
textLength = Math.min( text1Length, text2Length );
// Quick check for the worst case.
if ( text1 === text2 ) {
return textLength;
}
// Start by looking for a single character match
// and increase length until no match is found.
// Performance analysis: https://neil.fraser.name/news/2010/11/04/
best = 0;
length = 1;
while ( true ) {
pattern = text1.substring( textLength - length );
found = text2.indexOf( pattern );
if ( found === -1 ) {
return best;
}
length += found;
if ( found === 0 || text1.substring( textLength - length ) ===
text2.substring( 0, length ) ) {
best = length;
length++;
}
}
};
/**
* Split two texts into an array of strings. Reduce the texts to a string of
* hashes where each Unicode character represents one line.
* @param {string} text1 First string.
* @param {string} text2 Second string.
* @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}
* An object containing the encoded text1, the encoded text2 and
* the array of unique strings.
* The zeroth element of the array of unique strings is intentionally blank.
* @private
*/
DiffMatchPatch.prototype.diffLinesToChars = function( text1, text2 ) {
var lineArray, lineHash, chars1, chars2;
lineArray = []; // E.g. lineArray[4] === 'Hello\n'
lineHash = {}; // E.g. lineHash['Hello\n'] === 4
// '\x00' is a valid character, but various debuggers don't like it.
// So we'll insert a junk entry to avoid generating a null character.
lineArray[ 0 ] = "";
/**
* Split a text into an array of strings. Reduce the texts to a string of
* hashes where each Unicode character represents one line.
* Modifies linearray and linehash through being a closure.
* @param {string} text String to encode.
* @return {string} Encoded string.
* @private
*/
function diffLinesToCharsMunge( text ) {
var chars, lineStart, lineEnd, lineArrayLength, line;
chars = "";
// Walk the text, pulling out a substring for each line.
// text.split('\n') would would temporarily double our memory footprint.
// Modifying text would create many large strings to garbage collect.
lineStart = 0;
lineEnd = -1;
// Keeping our own length variable is faster than looking it up.
lineArrayLength = lineArray.length;
while ( lineEnd < text.length - 1 ) {
lineEnd = text.indexOf( "\n", lineStart );
if ( lineEnd === -1 ) {
lineEnd = text.length - 1;
}
line = text.substring( lineStart, lineEnd + 1 );
lineStart = lineEnd + 1;
if ( lineHash.hasOwnProperty ? lineHash.hasOwnProperty( line ) :
( lineHash[ line ] !== undefined ) ) {
chars += String.fromCharCode( lineHash[ line ] );
} else {
chars += String.fromCharCode( lineArrayLength );
lineHash[ line ] = lineArrayLength;
lineArray[ lineArrayLength++ ] = line;
}
}
return chars;
}
chars1 = diffLinesToCharsMunge( text1 );
chars2 = diffLinesToCharsMunge( text2 );
return {
chars1: chars1,
chars2: chars2,
lineArray: lineArray
};
};
/**
* Rehydrate the text in a diff from a string of line hashes to real lines of
* text.
* @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
* @param {!Array.<string>} lineArray Array of unique strings.
* @private
*/
DiffMatchPatch.prototype.diffCharsToLines = function( diffs, lineArray ) {
var x, chars, text, y;
for ( x = 0; x < diffs.length; x++ ) {
chars = diffs[ x ][ 1 ];
text = [];
for ( y = 0; y < chars.length; y++ ) {
text[ y ] = lineArray[ chars.charCodeAt( y ) ];
}
diffs[ x ][ 1 ] = text.join( "" );
}
};
/**
* Reorder and merge like edit sections. Merge equalities.
* Any edit section can move as long as it doesn't cross an equality.
* @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
*/
DiffMatchPatch.prototype.diffCleanupMerge = function( diffs ) {
var pointer, countDelete, countInsert, textInsert, textDelete,
commonlength, changes, diffPointer, position;
diffs.push( [ DIFF_EQUAL, "" ] ); // Add a dummy entry at the end.
pointer = 0;
countDelete = 0;
countInsert = 0;
textDelete = "";
textInsert = "";
commonlength;
while ( pointer < diffs.length ) {
switch ( diffs[ pointer ][ 0 ] ) {
case DIFF_INSERT:
countInsert++;
textInsert += diffs[ pointer ][ 1 ];
pointer++;
break;
case DIFF_DELETE:
countDelete++;
textDelete += diffs[ pointer ][ 1 ];
pointer++;
break;
case DIFF_EQUAL:
// Upon reaching an equality, check for prior redundancies.
if ( countDelete + countInsert > 1 ) {
if ( countDelete !== 0 && countInsert !== 0 ) {
// Factor out any common prefixes.
commonlength = this.diffCommonPrefix( textInsert, textDelete );
if ( commonlength !== 0 ) {
if ( ( pointer - countDelete - countInsert ) > 0 &&
diffs[ pointer - countDelete - countInsert - 1 ][ 0 ] ===
DIFF_EQUAL ) {
diffs[ pointer - countDelete - countInsert - 1 ][ 1 ] +=
textInsert.substring( 0, commonlength );
} else {
diffs.splice( 0, 0, [ DIFF_EQUAL,
textInsert.substring( 0, commonlength )
] );
pointer++;
}
textInsert = textInsert.substring( commonlength );
textDelete = textDelete.substring( commonlength );
}
// Factor out any common suffixies.
commonlength = this.diffCommonSuffix( textInsert, textDelete );
if ( commonlength !== 0 ) {
diffs[ pointer ][ 1 ] = textInsert.substring( textInsert.length -
commonlength ) + diffs[ pointer ][ 1 ];
textInsert = textInsert.substring( 0, textInsert.length -
commonlength );
textDelete = textDelete.substring( 0, textDelete.length -
commonlength );
}
}
// Delete the offending records and add the merged ones.
if ( countDelete === 0 ) {
diffs.splice( pointer - countInsert,
countDelete + countInsert, [ DIFF_INSERT, textInsert ] );
} else if ( countInsert === 0 ) {
diffs.splice( pointer - countDelete,
countDelete + countInsert, [ DIFF_DELETE, textDelete ] );
} else {
diffs.splice(
pointer - countDelete - countInsert,
countDelete + countInsert,
[ DIFF_DELETE, textDelete ], [ DIFF_INSERT, textInsert ]
);
}
pointer = pointer - countDelete - countInsert +
( countDelete ? 1 : 0 ) + ( countInsert ? 1 : 0 ) + 1;
} else if ( pointer !== 0 && diffs[ pointer - 1 ][ 0 ] === DIFF_EQUAL ) {
// Merge this equality with the previous one.
diffs[ pointer - 1 ][ 1 ] += diffs[ pointer ][ 1 ];
diffs.splice( pointer, 1 );
} else {
pointer++;
}
countInsert = 0;
countDelete = 0;
textDelete = "";
textInsert = "";
break;
}
}
if ( diffs[ diffs.length - 1 ][ 1 ] === "" ) {
diffs.pop(); // Remove the dummy entry at the end.
}
// Second pass: look for single edits surrounded on both sides by equalities
// which can be shifted sideways to eliminate an equality.
// e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC
changes = false;
pointer = 1;
// Intentionally ignore the first and last element (don't need checking).
while ( pointer < diffs.length - 1 ) {
if ( diffs[ pointer - 1 ][ 0 ] === DIFF_EQUAL &&
diffs[ pointer + 1 ][ 0 ] === DIFF_EQUAL ) {
diffPointer = diffs[ pointer ][ 1 ];
position = diffPointer.substring(
diffPointer.length - diffs[ pointer - 1 ][ 1 ].length
);
// This is a single edit surrounded by equalities.
if ( position === diffs[ pointer - 1 ][ 1 ] ) {
// Shift the edit over the previous equality.
diffs[ pointer ][ 1 ] = diffs[ pointer - 1 ][ 1 ] +
diffs[ pointer ][ 1 ].substring( 0, diffs[ pointer ][ 1 ].length -
diffs[ pointer - 1 ][ 1 ].length );
diffs[ pointer + 1 ][ 1 ] =
diffs[ pointer - 1 ][ 1 ] + diffs[ pointer + 1 ][ 1 ];
diffs.splice( pointer - 1, 1 );
changes = true;
} else if ( diffPointer.substring( 0, diffs[ pointer + 1 ][ 1 ].length ) ===
diffs[ pointer + 1 ][ 1 ] ) {
// Shift the edit over the next equality.
diffs[ pointer - 1 ][ 1 ] += diffs[ pointer + 1 ][ 1 ];
diffs[ pointer ][ 1 ] =
diffs[ pointer ][ 1 ].substring( diffs[ pointer + 1 ][ 1 ].length ) +
diffs[ pointer + 1 ][ 1 ];
diffs.splice( pointer + 1, 1 );
changes = true;
}
}
pointer++;
}
// If shifts were made, the diff needs reordering and another shift sweep.
if ( changes ) {
this.diffCleanupMerge( diffs );
}
};
return function( o, n ) {
var diff, output, text;
diff = new DiffMatchPatch();
output = diff.DiffMain( o, n );
diff.diffCleanupEfficiency( output );
text = diff.diffPrettyHtml( output );
return text;
};
}() );
}() );
QUnit.test("u2a ಂ => A", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಂ"), "A");});
QUnit.test("a2u A => ಂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("A"), "ಂ");});
QUnit.test("u2a ಃ => B", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಃ"), "B");});
QUnit.test("a2u B => ಃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("B"), "ಃ");});
QUnit.test("u2a ಅ => C", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಅ"), "C");});
QUnit.test("a2u C => ಅ", function(assert){assert.strictEqual(kn.ascii_to_unicode("C"), "ಅ");});
QUnit.test("u2a ಆ => D", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಆ"), "D");});
QUnit.test("a2u D => ಆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("D"), "ಆ");});
QUnit.test("u2a ಇ => E", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಇ"), "E");});
QUnit.test("a2u E => ಇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("E"), "ಇ");});
QUnit.test("u2a ಈ => F", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಈ"), "F");});
QUnit.test("a2u F => ಈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("F"), "ಈ");});
QUnit.test("u2a ಉ => G", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಉ"), "G");});
QUnit.test("a2u G => ಉ", function(assert){assert.strictEqual(kn.ascii_to_unicode("G"), "ಉ");});
QUnit.test("u2a ಊ => H", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಊ"), "H");});
QUnit.test("a2u H => ಊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("H"), "ಊ");});
QUnit.test("u2a ಋ => IÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಋ"), "IÄ");});
QUnit.test("a2u IÄ => ಋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("IÄ"), "ಋ");});
QUnit.test("u2a ಎ => J", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಎ"), "J");});
QUnit.test("a2u J => ಎ", function(assert){assert.strictEqual(kn.ascii_to_unicode("J"), "ಎ");});
QUnit.test("u2a ಏ => K", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಏ"), "K");});
QUnit.test("a2u K => ಏ", function(assert){assert.strictEqual(kn.ascii_to_unicode("K"), "ಏ");});
QUnit.test("u2a ಐ => L", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಐ"), "L");});
QUnit.test("a2u L => ಐ", function(assert){assert.strictEqual(kn.ascii_to_unicode("L"), "ಐ");});
QUnit.test("u2a ಒ => M", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಒ"), "M");});
QUnit.test("a2u M => ಒ", function(assert){assert.strictEqual(kn.ascii_to_unicode("M"), "ಒ");});
QUnit.test("u2a ಓ => N", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಓ"), "N");});
QUnit.test("a2u N => ಓ", function(assert){assert.strictEqual(kn.ascii_to_unicode("N"), "ಓ");});
QUnit.test("u2a ಔ => O", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಔ"), "O");});
QUnit.test("a2u O => ಔ", function(assert){assert.strictEqual(kn.ascii_to_unicode("O"), "ಔ");});
QUnit.test("u2a ಅಂ => CA", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಅಂ"), "CA");});
QUnit.test("a2u CA => ಅಂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("CA"), "ಅಂ");});
QUnit.test("u2a ಅಃ => CB", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಅಃ"), "CB");});
QUnit.test("a2u CB => ಅಃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("CB"), "ಅಃ");});
QUnit.test("u2a ಅಂ => CA", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಅಂ"), "CA");});
QUnit.test("a2u CA => ಅಂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("CA"), "ಅಂ");});
QUnit.test("u2a ಆಂ => DA", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಆಂ"), "DA");});
QUnit.test("a2u DA => ಆಂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("DA"), "ಆಂ");});
QUnit.test("u2a ಇಂ => EA", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಇಂ"), "EA");});
QUnit.test("a2u EA => ಇಂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("EA"), "ಇಂ");});
QUnit.test("u2a ಈಂ => FA", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಈಂ"), "FA");});
QUnit.test("a2u FA => ಈಂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("FA"), "ಈಂ");});
QUnit.test("u2a ಉಂ => GA", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಉಂ"), "GA");});
QUnit.test("a2u GA => ಉಂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("GA"), "ಉಂ");});
QUnit.test("u2a ಊಂ => HA", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಊಂ"), "HA");});
QUnit.test("a2u HA => ಊಂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("HA"), "ಊಂ");});
QUnit.test("u2a ಋಂ => IÄA", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಋಂ"), "IÄA");});
QUnit.test("a2u IÄA => ಋಂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("IÄA"), "ಋಂ");});
QUnit.test("u2a ಎಂ => JA", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಎಂ"), "JA");});
QUnit.test("a2u JA => ಎಂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("JA"), "ಎಂ");});
QUnit.test("u2a ಏಂ => KA", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಏಂ"), "KA");});
QUnit.test("a2u KA => ಏಂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("KA"), "ಏಂ");});
QUnit.test("u2a ಐಂ => LA", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಐಂ"), "LA");});
QUnit.test("a2u LA => ಐಂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("LA"), "ಐಂ");});
QUnit.test("u2a ಒಂ => MA", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಒಂ"), "MA");});
QUnit.test("a2u MA => ಒಂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("MA"), "ಒಂ");});
QUnit.test("u2a ಓಂ => NA", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಓಂ"), "NA");});
QUnit.test("a2u NA => ಓಂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("NA"), "ಓಂ");});
QUnit.test("u2a ಔಂ => OA", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಔಂ"), "OA");});
QUnit.test("a2u OA => ಔಂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("OA"), "ಔಂ");});
QUnit.test("u2a ಅಃ => CB", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಅಃ"), "CB");});
QUnit.test("a2u CB => ಅಃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("CB"), "ಅಃ");});
QUnit.test("u2a ಆಃ => DB", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಆಃ"), "DB");});
QUnit.test("a2u DB => ಆಃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("DB"), "ಆಃ");});
QUnit.test("u2a ಇಃ => EB", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಇಃ"), "EB");});
QUnit.test("a2u EB => ಇಃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("EB"), "ಇಃ");});
QUnit.test("u2a ಈಃ => FB", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಈಃ"), "FB");});
QUnit.test("a2u FB => ಈಃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("FB"), "ಈಃ");});
QUnit.test("u2a ಉಃ => GB", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಉಃ"), "GB");});
QUnit.test("a2u GB => ಉಃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("GB"), "ಉಃ");});
QUnit.test("u2a ಊಃ => HB", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಊಃ"), "HB");});
QUnit.test("a2u HB => ಊಃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("HB"), "ಊಃ");});
QUnit.test("u2a ಋಃ => IÄB", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಋಃ"), "IÄB");});
QUnit.test("a2u IÄB => ಋಃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("IÄB"), "ಋಃ");});
QUnit.test("u2a ಎಃ => JB", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಎಃ"), "JB");});
QUnit.test("a2u JB => ಎಃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("JB"), "ಎಃ");});
QUnit.test("u2a ಏಃ => KB", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಏಃ"), "KB");});
QUnit.test("a2u KB => ಏಃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("KB"), "ಏಃ");});
QUnit.test("u2a ಐಃ => LB", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಐಃ"), "LB");});
QUnit.test("a2u LB => ಐಃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("LB"), "ಐಃ");});
QUnit.test("u2a ಒಃ => MB", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಒಃ"), "MB");});
QUnit.test("a2u MB => ಒಃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("MB"), "ಒಃ");});
QUnit.test("u2a ಓಃ => NB", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಓಃ"), "NB");});
QUnit.test("a2u NB => ಓಃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("NB"), "ಓಃ");});
QUnit.test("u2a ಔಃ => OB", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಔಃ"), "OB");});
QUnit.test("a2u OB => ಔಃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("OB"), "ಔಃ");});
QUnit.test("u2a ಕ್ => Pï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಕ್"), "Pï");});
QUnit.test("a2u Pï => ಕ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("Pï"), "ಕ್");});
QUnit.test("u2a ಕ => PÀ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಕ"), "PÀ");});
QUnit.test("a2u PÀ => ಕ", function(assert){assert.strictEqual(kn.ascii_to_unicode("PÀ"), "ಕ");});
QUnit.test("u2a ಕಾ => PÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಕಾ"), "PÁ");});
QUnit.test("a2u PÁ => ಕಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("PÁ"), "ಕಾ");});
QUnit.test("u2a ಕಿ => Q", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಕಿ"), "Q");});
QUnit.test("a2u Q => ಕಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("Q"), "ಕಿ");});
QUnit.test("u2a ಕೀ => QÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಕೀ"), "QÃ");});
QUnit.test("a2u QÃ => ಕೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("QÃ"), "ಕೀ");});
QUnit.test("u2a ಕು => PÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಕು"), "PÀÄ");});
QUnit.test("a2u PÀÄ => ಕು", function(assert){assert.strictEqual(kn.ascii_to_unicode("PÀÄ"), "ಕು");});
QUnit.test("u2a ಕೂ => PÀÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಕೂ"), "PÀÆ");});
QUnit.test("a2u PÀÆ => ಕೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("PÀÆ"), "ಕೂ");});
QUnit.test("u2a ಕೃ => PÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಕೃ"), "PÀÈ");});
QUnit.test("a2u PÀÈ => ಕೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("PÀÈ"), "ಕೃ");});
QUnit.test("u2a ಕೆ => PÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಕೆ"), "PÉ");});
QUnit.test("a2u PÉ => ಕೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("PÉ"), "ಕೆ");});
QUnit.test("u2a ಕೇ => PÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಕೇ"), "PÉÃ");});
QUnit.test("a2u PÉÃ => ಕೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("PÉÃ"), "ಕೇ");});
QUnit.test("u2a ಕೈ => PÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಕೈ"), "PÉÊ");});
QUnit.test("a2u PÉÊ => ಕೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("PÉÊ"), "ಕೈ");});
QUnit.test("u2a ಕೊ => PÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಕೊ"), "PÉÆ");});
QUnit.test("a2u PÉÆ => ಕೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("PÉÆ"), "ಕೊ");});
QUnit.test("u2a ಕೋ => PÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಕೋ"), "PÉÆÃ");});
QUnit.test("a2u PÉÆÃ => ಕೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("PÉÆÃ"), "ಕೋ");});
QUnit.test("u2a ಕೌ => PË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಕೌ"), "PË");});
QUnit.test("a2u PË => ಕೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("PË"), "ಕೌ");});
QUnit.test("u2a ಖ್ => Sï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಖ್"), "Sï");});
QUnit.test("a2u Sï => ಖ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("Sï"), "ಖ್");});
QUnit.test("u2a ಖ => R", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಖ"), "R");});
QUnit.test("a2u R => ಖ", function(assert){assert.strictEqual(kn.ascii_to_unicode("R"), "ಖ");});
QUnit.test("u2a ಖಾ => SÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಖಾ"), "SÁ");});
QUnit.test("a2u SÁ => ಖಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("SÁ"), "ಖಾ");});
QUnit.test("u2a ಖಿ => T", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಖಿ"), "T");});
QUnit.test("a2u T => ಖಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("T"), "ಖಿ");});
QUnit.test("u2a ಖೀ => TÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಖೀ"), "TÃ");});
QUnit.test("a2u TÃ => ಖೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("TÃ"), "ಖೀ");});
QUnit.test("u2a ಖು => RÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಖು"), "RÄ");});
QUnit.test("a2u RÄ => ಖು", function(assert){assert.strictEqual(kn.ascii_to_unicode("RÄ"), "ಖು");});
QUnit.test("u2a ಖೂ => RÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಖೂ"), "RÆ");});
QUnit.test("a2u RÆ => ಖೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("RÆ"), "ಖೂ");});
QUnit.test("u2a ಖೃ => RÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಖೃ"), "RÈ");});
QUnit.test("a2u RÈ => ಖೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("RÈ"), "ಖೃ");});
QUnit.test("u2a ಖೆ => SÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಖೆ"), "SÉ");});
QUnit.test("a2u SÉ => ಖೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("SÉ"), "ಖೆ");});
QUnit.test("u2a ಖೇ => SÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಖೇ"), "SÉÃ");});
QUnit.test("a2u SÉÃ => ಖೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("SÉÃ"), "ಖೇ");});
QUnit.test("u2a ಖೈ => SÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಖೈ"), "SÉÊ");});
QUnit.test("a2u SÉÊ => ಖೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("SÉÊ"), "ಖೈ");});
QUnit.test("u2a ಖೊ => SÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಖೊ"), "SÉÆ");});
QUnit.test("a2u SÉÆ => ಖೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("SÉÆ"), "ಖೊ");});
QUnit.test("u2a ಖೋ => SÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಖೋ"), "SÉÆÃ");});
QUnit.test("a2u SÉÆÃ => ಖೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("SÉÆÃ"), "ಖೋ");});
QUnit.test("u2a ಖೌ => SË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಖೌ"), "SË");});
QUnit.test("a2u SË => ಖೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("SË"), "ಖೌ");});
QUnit.test("u2a ಗ್ => Uï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಗ್"), "Uï");});
QUnit.test("a2u Uï => ಗ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("Uï"), "ಗ್");});
QUnit.test("u2a ಗ => UÀ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಗ"), "UÀ");});
QUnit.test("a2u UÀ => ಗ", function(assert){assert.strictEqual(kn.ascii_to_unicode("UÀ"), "ಗ");});
QUnit.test("u2a ಗಾ => UÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಗಾ"), "UÁ");});
QUnit.test("a2u UÁ => ಗಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("UÁ"), "ಗಾ");});
QUnit.test("u2a ಗಿ => V", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಗಿ"), "V");});
QUnit.test("a2u V => ಗಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("V"), "ಗಿ");});
QUnit.test("u2a ಗೀ => VÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಗೀ"), "VÃ");});
QUnit.test("a2u VÃ => ಗೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("VÃ"), "ಗೀ");});
QUnit.test("u2a ಗು => UÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಗು"), "UÀÄ");});
QUnit.test("a2u UÀÄ => ಗು", function(assert){assert.strictEqual(kn.ascii_to_unicode("UÀÄ"), "ಗು");});
QUnit.test("u2a ಗೂ => UÀÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಗೂ"), "UÀÆ");});
QUnit.test("a2u UÀÆ => ಗೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("UÀÆ"), "ಗೂ");});
QUnit.test("u2a ಗೃ => UÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಗೃ"), "UÀÈ");});
QUnit.test("a2u UÀÈ => ಗೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("UÀÈ"), "ಗೃ");});
QUnit.test("u2a ಗೆ => UÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಗೆ"), "UÉ");});
QUnit.test("a2u UÉ => ಗೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("UÉ"), "ಗೆ");});
QUnit.test("u2a ಗೇ => UÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಗೇ"), "UÉÃ");});
QUnit.test("a2u UÉÃ => ಗೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("UÉÃ"), "ಗೇ");});
QUnit.test("u2a ಗೈ => UÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಗೈ"), "UÉÊ");});
QUnit.test("a2u UÉÊ => ಗೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("UÉÊ"), "ಗೈ");});
QUnit.test("u2a ಗೊ => UÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಗೊ"), "UÉÆ");});
QUnit.test("a2u UÉÆ => ಗೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("UÉÆ"), "ಗೊ");});
QUnit.test("u2a ಗೋ => UÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಗೋ"), "UÉÆÃ");});
QUnit.test("a2u UÉÆÃ => ಗೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("UÉÆÃ"), "ಗೋ");});
QUnit.test("u2a ಗೌ => UË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಗೌ"), "UË");});
QUnit.test("a2u UË => ಗೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("UË"), "ಗೌ");});
QUnit.test("u2a ಘ್ => Wï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಘ್"), "Wï");});
QUnit.test("a2u Wï => ಘ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("Wï"), "ಘ್");});
QUnit.test("u2a ಘ => WÀ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಘ"), "WÀ");});
QUnit.test("a2u WÀ => ಘ", function(assert){assert.strictEqual(kn.ascii_to_unicode("WÀ"), "ಘ");});
QUnit.test("u2a ಘಾ => WÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಘಾ"), "WÁ");});
QUnit.test("a2u WÁ => ಘಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("WÁ"), "ಘಾ");});
QUnit.test("u2a ಘಿ => X", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಘಿ"), "X");});
QUnit.test("a2u X => ಘಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("X"), "ಘಿ");});
QUnit.test("u2a ಘೀ => XÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಘೀ"), "XÃ");});
QUnit.test("a2u XÃ => ಘೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("XÃ"), "ಘೀ");});
QUnit.test("u2a ಘು => WÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಘು"), "WÀÄ");});
QUnit.test("a2u WÀÄ => ಘು", function(assert){assert.strictEqual(kn.ascii_to_unicode("WÀÄ"), "ಘು");});
QUnit.test("u2a ಘೂ => WÀÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಘೂ"), "WÀÆ");});
QUnit.test("a2u WÀÆ => ಘೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("WÀÆ"), "ಘೂ");});
QUnit.test("u2a ಘೃ => WÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಘೃ"), "WÀÈ");});
QUnit.test("a2u WÀÈ => ಘೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("WÀÈ"), "ಘೃ");});
QUnit.test("u2a ಘೆ => WÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಘೆ"), "WÉ");});
QUnit.test("a2u WÉ => ಘೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("WÉ"), "ಘೆ");});
QUnit.test("u2a ಘೇ => WÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಘೇ"), "WÉÃ");});
QUnit.test("a2u WÉÃ => ಘೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("WÉÃ"), "ಘೇ");});
QUnit.test("u2a ಘೈ => WÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಘೈ"), "WÉÊ");});
QUnit.test("a2u WÉÊ => ಘೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("WÉÊ"), "ಘೈ");});
QUnit.test("u2a ಘೊ => WÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಘೊ"), "WÉÆ");});
QUnit.test("a2u WÉÆ => ಘೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("WÉÆ"), "ಘೊ");});
QUnit.test("u2a ಘೋ => WÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಘೋ"), "WÉÆÃ");});
QUnit.test("a2u WÉÆÃ => ಘೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("WÉÆÃ"), "ಘೋ");});
QUnit.test("u2a ಘೌ => WË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಘೌ"), "WË");});
QUnit.test("a2u WË => ಘೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("WË"), "ಘೌ");});
QUnit.test("u2a ಚ್ => Zï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಚ್"), "Zï");});
QUnit.test("a2u Zï => ಚ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("Zï"), "ಚ್");});
QUnit.test("u2a ಚ => ZÀ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಚ"), "ZÀ");});
QUnit.test("a2u ZÀ => ಚ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ZÀ"), "ಚ");});
QUnit.test("u2a ಚಾ => ZÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಚಾ"), "ZÁ");});
QUnit.test("a2u ZÁ => ಚಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ZÁ"), "ಚಾ");});
QUnit.test("u2a ಚಿ => a", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಚಿ"), "a");});
QUnit.test("a2u a => ಚಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("a"), "ಚಿ");});
QUnit.test("u2a ಚೀ => aÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಚೀ"), "aÃ");});
QUnit.test("a2u aà => ಚೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("aÃ"), "ಚೀ");});
QUnit.test("u2a ಚು => ZÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಚು"), "ZÀÄ");});
QUnit.test("a2u ZÀÄ => ಚು", function(assert){assert.strictEqual(kn.ascii_to_unicode("ZÀÄ"), "ಚು");});
QUnit.test("u2a ಚೂ => ZÀÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಚೂ"), "ZÀÆ");});
QUnit.test("a2u ZÀÆ => ಚೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ZÀÆ"), "ಚೂ");});
QUnit.test("u2a ಚೃ => ZÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಚೃ"), "ZÀÈ");});
QUnit.test("a2u ZÀÈ => ಚೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ZÀÈ"), "ಚೃ");});
QUnit.test("u2a ಚೆ => ZÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಚೆ"), "ZÉ");});
QUnit.test("a2u ZÉ => ಚೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ZÉ"), "ಚೆ");});
QUnit.test("u2a ಚೇ => ZÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಚೇ"), "ZÉÃ");});
QUnit.test("a2u ZÉÃ => ಚೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ZÉÃ"), "ಚೇ");});
QUnit.test("u2a ಚೈ => ZÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಚೈ"), "ZÉÊ");});
QUnit.test("a2u ZÉÊ => ಚೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ZÉÊ"), "ಚೈ");});
QUnit.test("u2a ಚೊ => ZÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಚೊ"), "ZÉÆ");});
QUnit.test("a2u ZÉÆ => ಚೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ZÉÆ"), "ಚೊ");});
QUnit.test("u2a ಚೋ => ZÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಚೋ"), "ZÉÆÃ");});
QUnit.test("a2u ZÉÆÃ => ಚೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ZÉÆÃ"), "ಚೋ");});
QUnit.test("u2a ಚೌ => ZË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಚೌ"), "ZË");});
QUnit.test("a2u ZË => ಚೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ZË"), "ಚೌ");});
QUnit.test("u2a ಛ್ => bï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಛ್"), "bï");});
QUnit.test("a2u bï => ಛ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("bï"), "ಛ್");});
QUnit.test("u2a ಛ => bÀ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಛ"), "bÀ");});
QUnit.test("a2u bÀ => ಛ", function(assert){assert.strictEqual(kn.ascii_to_unicode("bÀ"), "ಛ");});
QUnit.test("u2a ಛಾ => bÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಛಾ"), "bÁ");});
QUnit.test("a2u bÁ => ಛಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("bÁ"), "ಛಾ");});
QUnit.test("u2a ಛಿ => c", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಛಿ"), "c");});
QUnit.test("a2u c => ಛಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("c"), "ಛಿ");});
QUnit.test("u2a ಛೀ => cÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಛೀ"), "cÃ");});
QUnit.test("a2u cà => ಛೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("cÃ"), "ಛೀ");});
QUnit.test("u2a ಛು => bÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಛು"), "bÀÄ");});
QUnit.test("a2u bÀÄ => ಛು", function(assert){assert.strictEqual(kn.ascii_to_unicode("bÀÄ"), "ಛು");});
QUnit.test("u2a ಛೂ => bÀÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಛೂ"), "bÀÆ");});
QUnit.test("a2u bÀÆ => ಛೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("bÀÆ"), "ಛೂ");});
QUnit.test("u2a ಛೃ => bÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಛೃ"), "bÀÈ");});
QUnit.test("a2u bÀÈ => ಛೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("bÀÈ"), "ಛೃ");});
QUnit.test("u2a ಛೆ => bÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಛೆ"), "bÉ");});
QUnit.test("a2u bÉ => ಛೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("bÉ"), "ಛೆ");});
QUnit.test("u2a ಛೇ => bÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಛೇ"), "bÉÃ");});
QUnit.test("a2u bÉÃ => ಛೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("bÉÃ"), "ಛೇ");});
QUnit.test("u2a ಛೈ => bÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಛೈ"), "bÉÊ");});
QUnit.test("a2u bÉÊ => ಛೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("bÉÊ"), "ಛೈ");});
QUnit.test("u2a ಛೊ => bÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಛೊ"), "bÉÆ");});
QUnit.test("a2u bÉÆ => ಛೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("bÉÆ"), "ಛೊ");});
QUnit.test("u2a ಛೋ => bÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಛೋ"), "bÉÆÃ");});
QUnit.test("a2u bÉÆÃ => ಛೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("bÉÆÃ"), "ಛೋ");});
QUnit.test("u2a ಛೌ => bË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಛೌ"), "bË");});
QUnit.test("a2u bË => ಛೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("bË"), "ಛೌ");});
QUnit.test("u2a ಜ್ => eï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಜ್"), "eï");});
QUnit.test("a2u eï => ಜ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("eï"), "ಜ್");});
QUnit.test("u2a ಜ => d", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಜ"), "d");});
QUnit.test("a2u d => ಜ", function(assert){assert.strictEqual(kn.ascii_to_unicode("d"), "ಜ");});
QUnit.test("u2a ಜಾ => eÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಜಾ"), "eÁ");});
QUnit.test("a2u eÁ => ಜಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("eÁ"), "ಜಾ");});
QUnit.test("u2a ಜಿ => f", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಜಿ"), "f");});
QUnit.test("a2u f => ಜಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("f"), "ಜಿ");});
QUnit.test("u2a ಜೀ => fÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಜೀ"), "fÃ");});
QUnit.test("a2u fà => ಜೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("fÃ"), "ಜೀ");});
QUnit.test("u2a ಜು => dÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಜು"), "dÄ");});
QUnit.test("a2u dÄ => ಜು", function(assert){assert.strictEqual(kn.ascii_to_unicode("dÄ"), "ಜು");});
QUnit.test("u2a ಜೂ => dÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಜೂ"), "dÆ");});
QUnit.test("a2u dÆ => ಜೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("dÆ"), "ಜೂ");});
QUnit.test("u2a ಜೃ => dÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಜೃ"), "dÈ");});
QUnit.test("a2u dÈ => ಜೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("dÈ"), "ಜೃ");});
QUnit.test("u2a ಜೆ => eÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಜೆ"), "eÉ");});
QUnit.test("a2u eÉ => ಜೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("eÉ"), "ಜೆ");});
QUnit.test("u2a ಜೇ => eÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಜೇ"), "eÉÃ");});
QUnit.test("a2u eÉÃ => ಜೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("eÉÃ"), "ಜೇ");});
QUnit.test("u2a ಜೈ => eÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಜೈ"), "eÉÊ");});
QUnit.test("a2u eÉÊ => ಜೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("eÉÊ"), "ಜೈ");});
QUnit.test("u2a ಜೊ => eÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಜೊ"), "eÉÆ");});
QUnit.test("a2u eÉÆ => ಜೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("eÉÆ"), "ಜೊ");});
QUnit.test("u2a ಜೋ => eÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಜೋ"), "eÉÆÃ");});
QUnit.test("a2u eÉÆÃ => ಜೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("eÉÆÃ"), "ಜೋ");});
QUnit.test("u2a ಜೌ => eË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಜೌ"), "eË");});
QUnit.test("a2u eË => ಜೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("eË"), "ಜೌ");});
QUnit.test("u2a ಝ್ => gÀhiï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಝ್"), "gÀhiï");});
QUnit.test("a2u gÀhiï => ಝ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÀhiï"), "ಝ್");});
QUnit.test("u2a ಝ => gÀhÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಝ"), "gÀhÄ");});
QUnit.test("a2u gÀhÄ => ಝ", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÀhÄ"), "ಝ");});
QUnit.test("u2a ಝಾ => gÀhiÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಝಾ"), "gÀhiÁ");});
QUnit.test("a2u gÀhiÁ => ಝಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÀhiÁ"), "ಝಾ");});
QUnit.test("u2a ಝಿ => jhÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಝಿ"), "jhÄ");});
QUnit.test("a2u jhÄ => ಝಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("jhÄ"), "ಝಿ");});
QUnit.test("u2a ಝೀ => jhÄÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಝೀ"), "jhÄÃ");});
QUnit.test("a2u jhÄÃ => ಝೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("jhÄÃ"), "ಝೀ");});
QUnit.test("u2a ಝು => gÀhÄÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಝು"), "gÀhÄÄ");});
QUnit.test("a2u gÀhÄÄ => ಝು", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÀhÄÄ"), "ಝು");});
QUnit.test("u2a ಝೂ => gÀhÄÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಝೂ"), "gÀhÄÆ");});
QUnit.test("a2u gÀhÄÆ => ಝೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÀhÄÆ"), "ಝೂ");});
QUnit.test("u2a ಝೃ => gÀhÄÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಝೃ"), "gÀhÄÈ");});
QUnit.test("a2u gÀhÄÈ => ಝೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÀhÄÈ"), "ಝೃ");});
QUnit.test("u2a ಝೆ => gÉhÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಝೆ"), "gÉhÄ");});
QUnit.test("a2u gÉhÄ => ಝೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÉhÄ"), "ಝೆ");});
QUnit.test("u2a ಝೇ => gÉhÄÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಝೇ"), "gÉhÄÃ");});
QUnit.test("a2u gÉhÄÃ => ಝೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÉhÄÃ"), "ಝೇ");});
QUnit.test("u2a ಝೈ => gÉhÄÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಝೈ"), "gÉhÄÊ");});
QUnit.test("a2u gÉhÄÊ => ಝೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÉhÄÊ"), "ಝೈ");});
QUnit.test("u2a ಝೊ => gÉhÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಝೊ"), "gÉhÆ");});
QUnit.test("a2u gÉhÆ => ಝೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÉhÆ"), "ಝೊ");});
QUnit.test("u2a ಝೋ => gÉhÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಝೋ"), "gÉhÆÃ");});
QUnit.test("a2u gÉhÆÃ => ಝೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÉhÆÃ"), "ಝೋ");});
QUnit.test("u2a ಝೌ => gÀhiË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಝೌ"), "gÀhiË");});
QUnit.test("a2u gÀhiË => ಝೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÀhiË"), "ಝೌ");});
QUnit.test("u2a ಟ್ => mï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಟ್"), "mï");});
QUnit.test("a2u mï => ಟ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("mï"), "ಟ್");});
QUnit.test("u2a ಟ => l", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಟ"), "l");});
QUnit.test("a2u l => ಟ", function(assert){assert.strictEqual(kn.ascii_to_unicode("l"), "ಟ");});
QUnit.test("u2a ಟಾ => mÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಟಾ"), "mÁ");});
QUnit.test("a2u mÁ => ಟಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("mÁ"), "ಟಾ");});
QUnit.test("u2a ಟಿ => n", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಟಿ"), "n");});
QUnit.test("a2u n => ಟಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("n"), "ಟಿ");});
QUnit.test("u2a ಟೀ => nÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಟೀ"), "nÃ");});
QUnit.test("a2u nà => ಟೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("nÃ"), "ಟೀ");});
QUnit.test("u2a ಟು => lÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಟು"), "lÄ");});
QUnit.test("a2u lÄ => ಟು", function(assert){assert.strictEqual(kn.ascii_to_unicode("lÄ"), "ಟು");});
QUnit.test("u2a ಟೂ => lÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಟೂ"), "lÆ");});
QUnit.test("a2u lÆ => ಟೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("lÆ"), "ಟೂ");});
QUnit.test("u2a ಟೃ => lÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಟೃ"), "lÈ");});
QUnit.test("a2u lÈ => ಟೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("lÈ"), "ಟೃ");});
QUnit.test("u2a ಟೆ => mÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಟೆ"), "mÉ");});
QUnit.test("a2u mÉ => ಟೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("mÉ"), "ಟೆ");});
QUnit.test("u2a ಟೇ => mÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಟೇ"), "mÉÃ");});
QUnit.test("a2u mÉÃ => ಟೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("mÉÃ"), "ಟೇ");});
QUnit.test("u2a ಟೈ => mÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಟೈ"), "mÉÊ");});
QUnit.test("a2u mÉÊ => ಟೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("mÉÊ"), "ಟೈ");});
QUnit.test("u2a ಟೊ => mÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಟೊ"), "mÉÆ");});
QUnit.test("a2u mÉÆ => ಟೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("mÉÆ"), "ಟೊ");});
QUnit.test("u2a ಟೋ => mÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಟೋ"), "mÉÆÃ");});
QUnit.test("a2u mÉÆÃ => ಟೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("mÉÆÃ"), "ಟೋ");});
QUnit.test("u2a ಟೌ => mË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಟೌ"), "mË");});
QUnit.test("a2u mË => ಟೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("mË"), "ಟೌ");});
QUnit.test("u2a ಠ್ => oï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಠ್"), "oï");});
QUnit.test("a2u oï => ಠ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("oï"), "ಠ್");});
QUnit.test("u2a ಠ => oÀ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಠ"), "oÀ");});
QUnit.test("a2u oÀ => ಠ", function(assert){assert.strictEqual(kn.ascii_to_unicode("oÀ"), "ಠ");});
QUnit.test("u2a ಠಾ => oÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಠಾ"), "oÁ");});
QUnit.test("a2u oÁ => ಠಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("oÁ"), "ಠಾ");});
QUnit.test("u2a ಠಿ => p", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಠಿ"), "p");});
QUnit.test("a2u p => ಠಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("p"), "ಠಿ");});
QUnit.test("u2a ಠೀ => pÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಠೀ"), "pÃ");});
QUnit.test("a2u pà => ಠೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("pÃ"), "ಠೀ");});
QUnit.test("u2a ಠು => oÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಠು"), "oÀÄ");});
QUnit.test("a2u oÀÄ => ಠು", function(assert){assert.strictEqual(kn.ascii_to_unicode("oÀÄ"), "ಠು");});
QUnit.test("u2a ಠೂ => oÀÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಠೂ"), "oÀÆ");});
QUnit.test("a2u oÀÆ => ಠೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("oÀÆ"), "ಠೂ");});
QUnit.test("u2a ಠೃ => oÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಠೃ"), "oÀÈ");});
QUnit.test("a2u oÀÈ => ಠೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("oÀÈ"), "ಠೃ");});
QUnit.test("u2a ಠೆ => oÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಠೆ"), "oÉ");});
QUnit.test("a2u oÉ => ಠೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("oÉ"), "ಠೆ");});
QUnit.test("u2a ಠೇ => oÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಠೇ"), "oÉÃ");});
QUnit.test("a2u oÉÃ => ಠೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("oÉÃ"), "ಠೇ");});
QUnit.test("u2a ಠೈ => oÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಠೈ"), "oÉÊ");});
QUnit.test("a2u oÉÊ => ಠೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("oÉÊ"), "ಠೈ");});
QUnit.test("u2a ಠೊ => oÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಠೊ"), "oÉÆ");});
QUnit.test("a2u oÉÆ => ಠೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("oÉÆ"), "ಠೊ");});
QUnit.test("u2a ಠೋ => oÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಠೋ"), "oÉÆÃ");});
QUnit.test("a2u oÉÆÃ => ಠೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("oÉÆÃ"), "ಠೋ");});
QUnit.test("u2a ಠೌ => oË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಠೌ"), "oË");});
QUnit.test("a2u oË => ಠೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("oË"), "ಠೌ");});
QUnit.test("u2a ಡ್ => qï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಡ್"), "qï");});
QUnit.test("a2u qï => ಡ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("qï"), "ಡ್");});
QUnit.test("u2a ಡ => qÀ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಡ"), "qÀ");});
QUnit.test("a2u qÀ => ಡ", function(assert){assert.strictEqual(kn.ascii_to_unicode("qÀ"), "ಡ");});
QUnit.test("u2a ಡಾ => qÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಡಾ"), "qÁ");});
QUnit.test("a2u qÁ => ಡಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("qÁ"), "ಡಾ");});
QUnit.test("u2a ಡಿ => r", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಡಿ"), "r");});
QUnit.test("a2u r => ಡಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("r"), "ಡಿ");});
QUnit.test("u2a ಡೀ => rÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಡೀ"), "rÃ");});
QUnit.test("a2u rà => ಡೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("rÃ"), "ಡೀ");});
QUnit.test("u2a ಡು => qÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಡು"), "qÀÄ");});
QUnit.test("a2u qÀÄ => ಡು", function(assert){assert.strictEqual(kn.ascii_to_unicode("qÀÄ"), "ಡು");});
QUnit.test("u2a ಡೂ => qÀÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಡೂ"), "qÀÆ");});
QUnit.test("a2u qÀÆ => ಡೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("qÀÆ"), "ಡೂ");});
QUnit.test("u2a ಡೃ => qÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಡೃ"), "qÀÈ");});
QUnit.test("a2u qÀÈ => ಡೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("qÀÈ"), "ಡೃ");});
QUnit.test("u2a ಡೆ => qÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಡೆ"), "qÉ");});
QUnit.test("a2u qÉ => ಡೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("qÉ"), "ಡೆ");});
QUnit.test("u2a ಡೇ => qÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಡೇ"), "qÉÃ");});
QUnit.test("a2u qÉÃ => ಡೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("qÉÃ"), "ಡೇ");});
QUnit.test("u2a ಡೈ => qÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಡೈ"), "qÉÊ");});
QUnit.test("a2u qÉÊ => ಡೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("qÉÊ"), "ಡೈ");});
QUnit.test("u2a ಡೊ => qÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಡೊ"), "qÉÆ");});
QUnit.test("a2u qÉÆ => ಡೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("qÉÆ"), "ಡೊ");});
QUnit.test("u2a ಡೋ => qÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಡೋ"), "qÉÆÃ");});
QUnit.test("a2u qÉÆÃ => ಡೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("qÉÆÃ"), "ಡೋ");});
QUnit.test("u2a ಡೌ => qË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಡೌ"), "qË");});
QUnit.test("a2u qË => ಡೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("qË"), "ಡೌ");});
QUnit.test("u2a ಢ್ => qsï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಢ್"), "qsï");});
QUnit.test("a2u qsï => ಢ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("qsï"), "ಢ್");});
QUnit.test("u2a ಢ => qsÀ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಢ"), "qsÀ");});
QUnit.test("a2u qsÀ => ಢ", function(assert){assert.strictEqual(kn.ascii_to_unicode("qsÀ"), "ಢ");});
QUnit.test("u2a ಢಾ => qsÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಢಾ"), "qsÁ");});
QUnit.test("a2u qsÁ => ಢಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("qsÁ"), "ಢಾ");});
QUnit.test("u2a ಢಿ => rü", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಢಿ"), "rü");});
QUnit.test("a2u rü => ಢಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("rü"), "ಢಿ");});
QUnit.test("u2a ಢೀ => rüÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಢೀ"), "rüÃ");});
QUnit.test("a2u rüà => ಢೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("rüÃ"), "ಢೀ");});
QUnit.test("u2a ಢು => qsÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಢು"), "qsÀÄ");});
QUnit.test("a2u qsÀÄ => ಢು", function(assert){assert.strictEqual(kn.ascii_to_unicode("qsÀÄ"), "ಢು");});
QUnit.test("u2a ಢೂ => qsÀÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಢೂ"), "qsÀÆ");});
QUnit.test("a2u qsÀÆ => ಢೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("qsÀÆ"), "ಢೂ");});
QUnit.test("u2a ಢೃ => qsÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಢೃ"), "qsÀÈ");});
QUnit.test("a2u qsÀÈ => ಢೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("qsÀÈ"), "ಢೃ");});
QUnit.test("u2a ಢೆ => qsÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಢೆ"), "qsÉ");});
QUnit.test("a2u qsÉ => ಢೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("qsÉ"), "ಢೆ");});
QUnit.test("u2a ಢೇ => qsÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಢೇ"), "qsÉÃ");});
QUnit.test("a2u qsÉÃ => ಢೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("qsÉÃ"), "ಢೇ");});
QUnit.test("u2a ಢೈ => qsÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಢೈ"), "qsÉÊ");});
QUnit.test("a2u qsÉÊ => ಢೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("qsÉÊ"), "ಢೈ");});
QUnit.test("u2a ಢೊ => qsÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಢೊ"), "qsÉÆ");});
QUnit.test("a2u qsÉÆ => ಢೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("qsÉÆ"), "ಢೊ");});
QUnit.test("u2a ಢೋ => qsÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಢೋ"), "qsÉÆÃ");});
QUnit.test("a2u qsÉÆÃ => ಢೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("qsÉÆÃ"), "ಢೋ");});
QUnit.test("u2a ಢೌ => qsË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಢೌ"), "qsË");});
QUnit.test("a2u qsË => ಢೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("qsË"), "ಢೌ");});
QUnit.test("u2a ಣ್ => uï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಣ್"), "uï");});
QUnit.test("a2u uï => ಣ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("uï"), "ಣ್");});
QUnit.test("u2a ಣ => t", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಣ"), "t");});
QUnit.test("a2u t => ಣ", function(assert){assert.strictEqual(kn.ascii_to_unicode("t"), "ಣ");});
QUnit.test("u2a ಣಾ => uÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಣಾ"), "uÁ");});
QUnit.test("a2u uÁ => ಣಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("uÁ"), "ಣಾ");});
QUnit.test("u2a ಣಿ => tÂ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಣಿ"), "tÂ");});
QUnit.test("a2u t => ಣಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("tÂ"), "ಣಿ");});
QUnit.test("u2a ಣೀ => tÂÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಣೀ"), "tÂÃ");});
QUnit.test("a2u tÂÃ => ಣೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("tÂÃ"), "ಣೀ");});
QUnit.test("u2a ಣು => tÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಣು"), "tÄ");});
QUnit.test("a2u tÄ => ಣು", function(assert){assert.strictEqual(kn.ascii_to_unicode("tÄ"), "ಣು");});
QUnit.test("u2a ಣೂ => tÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಣೂ"), "tÆ");});
QUnit.test("a2u tÆ => ಣೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("tÆ"), "ಣೂ");});
QUnit.test("u2a ಣೃ => tÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಣೃ"), "tÈ");});
QUnit.test("a2u tÈ => ಣೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("tÈ"), "ಣೃ");});
QUnit.test("u2a ಣೆ => uÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಣೆ"), "uÉ");});
QUnit.test("a2u uÉ => ಣೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("uÉ"), "ಣೆ");});
QUnit.test("u2a ಣೇ => uÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಣೇ"), "uÉÃ");});
QUnit.test("a2u uÉÃ => ಣೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("uÉÃ"), "ಣೇ");});
QUnit.test("u2a ಣೈ => uÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಣೈ"), "uÉÊ");});
QUnit.test("a2u uÉÊ => ಣೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("uÉÊ"), "ಣೈ");});
QUnit.test("u2a ಣೊ => uÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಣೊ"), "uÉÆ");});
QUnit.test("a2u uÉÆ => ಣೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("uÉÆ"), "ಣೊ");});
QUnit.test("u2a ಣೋ => uÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಣೋ"), "uÉÆÃ");});
QUnit.test("a2u uÉÆÃ => ಣೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("uÉÆÃ"), "ಣೋ");});
QUnit.test("u2a ಣೌ => uË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಣೌ"), "uË");});
QUnit.test("a2u uË => ಣೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("uË"), "ಣೌ");});
QUnit.test("u2a ತ್ => vï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ತ್"), "vï");});
QUnit.test("a2u vï => ತ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("vï"), "ತ್");});
QUnit.test("u2a ತ => vÀ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ತ"), "vÀ");});
QUnit.test("a2u vÀ => ತ", function(assert){assert.strictEqual(kn.ascii_to_unicode("vÀ"), "ತ");});
QUnit.test("u2a ತಾ => vÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ತಾ"), "vÁ");});
QUnit.test("a2u vÁ => ತಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("vÁ"), "ತಾ");});
QUnit.test("u2a ತಿ => w", function(assert){assert.strictEqual(kn.unicode_to_ascii("ತಿ"), "w");});
QUnit.test("a2u w => ತಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("w"), "ತಿ");});
QUnit.test("u2a ತೀ => wÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ತೀ"), "wÃ");});
QUnit.test("a2u wà => ತೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("wÃ"), "ತೀ");});
QUnit.test("u2a ತು => vÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ತು"), "vÀÄ");});
QUnit.test("a2u vÀÄ => ತು", function(assert){assert.strictEqual(kn.ascii_to_unicode("vÀÄ"), "ತು");});
QUnit.test("u2a ತೂ => vÀÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ತೂ"), "vÀÆ");});
QUnit.test("a2u vÀÆ => ತೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("vÀÆ"), "ತೂ");});
QUnit.test("u2a ತೃ => vÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ತೃ"), "vÀÈ");});
QUnit.test("a2u vÀÈ => ತೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("vÀÈ"), "ತೃ");});
QUnit.test("u2a ತೆ => vÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ತೆ"), "vÉ");});
QUnit.test("a2u vÉ => ತೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("vÉ"), "ತೆ");});
QUnit.test("u2a ತೇ => vÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ತೇ"), "vÉÃ");});
QUnit.test("a2u vÉÃ => ತೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("vÉÃ"), "ತೇ");});
QUnit.test("u2a ತೈ => vÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ತೈ"), "vÉÊ");});
QUnit.test("a2u vÉÊ => ತೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("vÉÊ"), "ತೈ");});
QUnit.test("u2a ತೊ => vÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ತೊ"), "vÉÆ");});
QUnit.test("a2u vÉÆ => ತೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("vÉÆ"), "ತೊ");});
QUnit.test("u2a ತೋ => vÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ತೋ"), "vÉÆÃ");});
QUnit.test("a2u vÉÆÃ => ತೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("vÉÆÃ"), "ತೋ");});
QUnit.test("u2a ತೌ => vË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ತೌ"), "vË");});
QUnit.test("a2u vË => ತೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("vË"), "ತೌ");});
QUnit.test("u2a ಥ್ => xï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಥ್"), "xï");});
QUnit.test("a2u xï => ಥ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("xï"), "ಥ್");});
QUnit.test("u2a ಥ => xÀ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಥ"), "xÀ");});
QUnit.test("a2u xÀ => ಥ", function(assert){assert.strictEqual(kn.ascii_to_unicode("xÀ"), "ಥ");});
QUnit.test("u2a ಥಾ => xÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಥಾ"), "xÁ");});
QUnit.test("a2u xÁ => ಥಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("xÁ"), "ಥಾ");});
QUnit.test("u2a ಥಿ => y", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಥಿ"), "y");});
QUnit.test("a2u y => ಥಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("y"), "ಥಿ");});
QUnit.test("u2a ಥೀ => yÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಥೀ"), "yÃ");});
QUnit.test("a2u yà => ಥೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("yÃ"), "ಥೀ");});
QUnit.test("u2a ಥು => xÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಥು"), "xÀÄ");});
QUnit.test("a2u xÀÄ => ಥು", function(assert){assert.strictEqual(kn.ascii_to_unicode("xÀÄ"), "ಥು");});
QUnit.test("u2a ಥೂ => xÀÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಥೂ"), "xÀÆ");});
QUnit.test("a2u xÀÆ => ಥೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("xÀÆ"), "ಥೂ");});
QUnit.test("u2a ಥೃ => xÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಥೃ"), "xÀÈ");});
QUnit.test("a2u xÀÈ => ಥೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("xÀÈ"), "ಥೃ");});
QUnit.test("u2a ಥೆ => xÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಥೆ"), "xÉ");});
QUnit.test("a2u xÉ => ಥೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("xÉ"), "ಥೆ");});
QUnit.test("u2a ಥೇ => xÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಥೇ"), "xÉÃ");});
QUnit.test("a2u xÉÃ => ಥೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("xÉÃ"), "ಥೇ");});
QUnit.test("u2a ಥೈ => xÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಥೈ"), "xÉÊ");});
QUnit.test("a2u xÉÊ => ಥೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("xÉÊ"), "ಥೈ");});
QUnit.test("u2a ಥೊ => xÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಥೊ"), "xÉÆ");});
QUnit.test("a2u xÉÆ => ಥೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("xÉÆ"), "ಥೊ");});
QUnit.test("u2a ಥೋ => xÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಥೋ"), "xÉÆÃ");});
QUnit.test("a2u xÉÆÃ => ಥೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("xÉÆÃ"), "ಥೋ");});
QUnit.test("u2a ಥೌ => xË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಥೌ"), "xË");});
QUnit.test("a2u xË => ಥೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("xË"), "ಥೌ");});
QUnit.test("u2a ದ್ => zï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ದ್"), "zï");});
QUnit.test("a2u zï => ದ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("zï"), "ದ್");});
QUnit.test("u2a ದ => zÀ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ದ"), "zÀ");});
QUnit.test("a2u zÀ => ದ", function(assert){assert.strictEqual(kn.ascii_to_unicode("zÀ"), "ದ");});
QUnit.test("u2a ದಾ => zÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ದಾ"), "zÁ");});
QUnit.test("a2u zÁ => ದಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("zÁ"), "ದಾ");});
QUnit.test("u2a ದಿ => ¢", function(assert){assert.strictEqual(kn.unicode_to_ascii("ದಿ"), "¢");});
QUnit.test("a2u ¢ => ದಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¢"), "ದಿ");});
QUnit.test("u2a ದೀ => ¢Ã", function(assert){assert.strictEqual(kn.unicode_to_ascii("ದೀ"), "¢Ã");});
QUnit.test("a2u ¢Ã => ದೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¢Ã"), "ದೀ");});
QUnit.test("u2a ದು => zÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ದು"), "zÀÄ");});
QUnit.test("a2u zÀÄ => ದು", function(assert){assert.strictEqual(kn.ascii_to_unicode("zÀÄ"), "ದು");});
QUnit.test("u2a ದೂ => zÀÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ದೂ"), "zÀÆ");});
QUnit.test("a2u zÀÆ => ದೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("zÀÆ"), "ದೂ");});
QUnit.test("u2a ದೃ => zÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ದೃ"), "zÀÈ");});
QUnit.test("a2u zÀÈ => ದೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("zÀÈ"), "ದೃ");});
QUnit.test("u2a ದೆ => zÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ದೆ"), "zÉ");});
QUnit.test("a2u zÉ => ದೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("zÉ"), "ದೆ");});
QUnit.test("u2a ದೇ => zÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ದೇ"), "zÉÃ");});
QUnit.test("a2u zÉÃ => ದೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("zÉÃ"), "ದೇ");});
QUnit.test("u2a ದೈ => zÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ದೈ"), "zÉÊ");});
QUnit.test("a2u zÉÊ => ದೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("zÉÊ"), "ದೈ");});
QUnit.test("u2a ದೊ => zÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ದೊ"), "zÉÆ");});
QUnit.test("a2u zÉÆ => ದೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("zÉÆ"), "ದೊ");});
QUnit.test("u2a ದೋ => zÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ದೋ"), "zÉÆÃ");});
QUnit.test("a2u zÉÆÃ => ದೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("zÉÆÃ"), "ದೋ");});
QUnit.test("u2a ದೌ => zË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ದೌ"), "zË");});
QUnit.test("a2u zË => ದೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("zË"), "ದೌ");});
QUnit.test("u2a ಧ್ => zsï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಧ್"), "zsï");});
QUnit.test("a2u zsï => ಧ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("zsï"), "ಧ್");});
QUnit.test("u2a ಧ => zsÀ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಧ"), "zsÀ");});
QUnit.test("a2u zsÀ => ಧ", function(assert){assert.strictEqual(kn.ascii_to_unicode("zsÀ"), "ಧ");});
QUnit.test("u2a ಧಾ => zsÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಧಾ"), "zsÁ");});
QUnit.test("a2u zsÁ => ಧಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("zsÁ"), "ಧಾ");});
QUnit.test("u2a ಧಿ => ¢ü", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಧಿ"), "¢ü");});
QUnit.test("a2u ¢ü => ಧಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¢ü"), "ಧಿ");});
QUnit.test("u2a ಧೀ => ¢üÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಧೀ"), "¢üÃ");});
QUnit.test("a2u ¢üà => ಧೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¢üÃ"), "ಧೀ");});
QUnit.test("u2a ಧು => zsÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಧು"), "zsÀÄ");});
QUnit.test("a2u zsÀÄ => ಧು", function(assert){assert.strictEqual(kn.ascii_to_unicode("zsÀÄ"), "ಧು");});
QUnit.test("u2a ಧೂ => zsÀÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಧೂ"), "zsÀÆ");});
QUnit.test("a2u zsÀÆ => ಧೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("zsÀÆ"), "ಧೂ");});
QUnit.test("u2a ಧೃ => zsÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಧೃ"), "zsÀÈ");});
QUnit.test("a2u zsÀÈ => ಧೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("zsÀÈ"), "ಧೃ");});
QUnit.test("u2a ಧೆ => zsÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಧೆ"), "zsÉ");});
QUnit.test("a2u zsÉ => ಧೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("zsÉ"), "ಧೆ");});
QUnit.test("u2a ಧೇ => zsÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಧೇ"), "zsÉÃ");});
QUnit.test("a2u zsÉÃ => ಧೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("zsÉÃ"), "ಧೇ");});
QUnit.test("u2a ಧೈ => zsÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಧೈ"), "zsÉÊ");});
QUnit.test("a2u zsÉÊ => ಧೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("zsÉÊ"), "ಧೈ");});
QUnit.test("u2a ಧೊ => zsÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಧೊ"), "zsÉÆ");});
QUnit.test("a2u zsÉÆ => ಧೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("zsÉÆ"), "ಧೊ");});
QUnit.test("u2a ಧೋ => zsÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಧೋ"), "zsÉÆÃ");});
QUnit.test("a2u zsÉÆÃ => ಧೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("zsÉÆÃ"), "ಧೋ");});
QUnit.test("u2a ಧೌ => zsË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಧೌ"), "zsË");});
QUnit.test("a2u zsË => ಧೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("zsË"), "ಧೌ");});
QUnit.test("u2a ನ್ => £ï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ನ್"), "£ï");});
QUnit.test("a2u £ï => ನ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("£ï"), "ನ್");});
QUnit.test("u2a ನ => £À", function(assert){assert.strictEqual(kn.unicode_to_ascii("ನ"), "£À");});
QUnit.test("a2u £À => ನ", function(assert){assert.strictEqual(kn.ascii_to_unicode("£À"), "ನ");});
QUnit.test("u2a ನಾ => £Á", function(assert){assert.strictEqual(kn.unicode_to_ascii("ನಾ"), "£Á");});
QUnit.test("a2u £Á => ನಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("£Á"), "ನಾ");});
QUnit.test("u2a ನಿ => ¤", function(assert){assert.strictEqual(kn.unicode_to_ascii("ನಿ"), "¤");});
QUnit.test("a2u ¤ => ನಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¤"), "ನಿ");});
QUnit.test("u2a ನೀ => ¤Ã", function(assert){assert.strictEqual(kn.unicode_to_ascii("ನೀ"), "¤Ã");});
QUnit.test("a2u ¤Ã => ನೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¤Ã"), "ನೀ");});
QUnit.test("u2a ನು => £ÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ನು"), "£ÀÄ");});
QUnit.test("a2u £ÀÄ => ನು", function(assert){assert.strictEqual(kn.ascii_to_unicode("£ÀÄ"), "ನು");});
QUnit.test("u2a ನೂ => £ÀÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ನೂ"), "£ÀÆ");});
QUnit.test("a2u £ÀÆ => ನೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("£ÀÆ"), "ನೂ");});
QUnit.test("u2a ನೃ => £ÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ನೃ"), "£ÀÈ");});
QUnit.test("a2u £ÀÈ => ನೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("£ÀÈ"), "ನೃ");});
QUnit.test("u2a ನೆ => £É", function(assert){assert.strictEqual(kn.unicode_to_ascii("ನೆ"), "£É");});
QUnit.test("a2u £É => ನೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("£É"), "ನೆ");});
QUnit.test("u2a ನೇ => £ÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ನೇ"), "£ÉÃ");});
QUnit.test("a2u £Éà => ನೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("£ÉÃ"), "ನೇ");});
QUnit.test("u2a ನೈ => £ÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ನೈ"), "£ÉÊ");});
QUnit.test("a2u £ÉÊ => ನೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("£ÉÊ"), "ನೈ");});
QUnit.test("u2a ನೊ => £ÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ನೊ"), "£ÉÆ");});
QUnit.test("a2u £ÉÆ => ನೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("£ÉÆ"), "ನೊ");});
QUnit.test("u2a ನೋ => £ÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ನೋ"), "£ÉÆÃ");});
QUnit.test("a2u £ÉÆà => ನೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("£ÉÆÃ"), "ನೋ");});
QUnit.test("u2a ನೌ => £Ë", function(assert){assert.strictEqual(kn.unicode_to_ascii("ನೌ"), "£Ë");});
QUnit.test("a2u £Ë => ನೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("£Ë"), "ನೌ");});
QUnit.test("u2a ಪ್ => ¥ï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಪ್"), "¥ï");});
QUnit.test("a2u ¥ï => ಪ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥ï"), "ಪ್");});
QUnit.test("u2a ಪ => ¥À", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಪ"), "¥À");});
QUnit.test("a2u ¥À => ಪ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥À"), "ಪ");});
QUnit.test("u2a ಪಾ => ¥Á", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಪಾ"), "¥Á");});
QUnit.test("a2u ¥Á => ಪಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥Á"), "ಪಾ");});
QUnit.test("u2a ಪಿ => ¦", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಪಿ"), "¦");});
QUnit.test("a2u ¦ => ಪಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¦"), "ಪಿ");});
QUnit.test("u2a ಪೀ => ¦Ã", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಪೀ"), "¦Ã");});
QUnit.test("a2u ¦Ã => ಪೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¦Ã"), "ಪೀ");});
QUnit.test("u2a ಪು => ¥ÀÅ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಪು"), "¥ÀÅ");});
QUnit.test("a2u ¥ÀÅ => ಪು", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥ÀÅ"), "ಪು");});
QUnit.test("u2a ಪೂ => ¥ÀÇ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಪೂ"), "¥ÀÇ");});
QUnit.test("a2u ¥ÀÇ => ಪೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥ÀÇ"), "ಪೂ");});
QUnit.test("u2a ಪೃ => ¥ÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಪೃ"), "¥ÀÈ");});
QUnit.test("a2u ¥ÀÈ => ಪೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥ÀÈ"), "ಪೃ");});
QUnit.test("u2a ಪೆ => ¥É", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಪೆ"), "¥É");});
QUnit.test("a2u ¥É => ಪೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥É"), "ಪೆ");});
QUnit.test("u2a ಪೇ => ¥ÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಪೇ"), "¥ÉÃ");});
QUnit.test("a2u ¥Éà => ಪೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥ÉÃ"), "ಪೇ");});
QUnit.test("u2a ಪೈ => ¥ÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಪೈ"), "¥ÉÊ");});
QUnit.test("a2u ¥ÉÊ => ಪೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥ÉÊ"), "ಪೈ");});
QUnit.test("u2a ಪೊ => ¥ÉÇ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಪೊ"), "¥ÉÇ");});
QUnit.test("a2u ¥ÉÇ => ಪೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥ÉÇ"), "ಪೊ");});
QUnit.test("u2a ಪೋ => ¥ÉÇÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಪೋ"), "¥ÉÇÃ");});
QUnit.test("a2u ¥ÉÇà => ಪೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥ÉÇÃ"), "ಪೋ");});
QUnit.test("u2a ಪೌ => ¥Ë", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಪೌ"), "¥Ë");});
QUnit.test("a2u ¥Ë => ಪೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥Ë"), "ಪೌ");});
QUnit.test("u2a ಫ್ => ¥sï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಫ್"), "¥sï");});
QUnit.test("a2u ¥sï => ಫ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥sï"), "ಫ್");});
QUnit.test("u2a ಫ => ¥sÀ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಫ"), "¥sÀ");});
QUnit.test("a2u ¥sÀ => ಫ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥sÀ"), "ಫ");});
QUnit.test("u2a ಫಾ => ¥sÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಫಾ"), "¥sÁ");});
QUnit.test("a2u ¥sÁ => ಫಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥sÁ"), "ಫಾ");});
QUnit.test("u2a ಫಿ => ¦ü", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಫಿ"), "¦ü");});
QUnit.test("a2u ¦ü => ಫಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¦ü"), "ಫಿ");});
QUnit.test("u2a ಫೀ => ¦üÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಫೀ"), "¦üÃ");});
QUnit.test("a2u ¦üà => ಫೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¦üÃ"), "ಫೀ");});
QUnit.test("u2a ಫು => ¥sÀÅ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಫು"), "¥sÀÅ");});
QUnit.test("a2u ¥sÀÅ => ಫು", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥sÀÅ"), "ಫು");});
QUnit.test("u2a ಫೂ => ¥sÀÇ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಫೂ"), "¥sÀÇ");});
QUnit.test("a2u ¥sÀÇ => ಫೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥sÀÇ"), "ಫೂ");});
QUnit.test("u2a ಫೃ => ¥sÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಫೃ"), "¥sÀÈ");});
QUnit.test("a2u ¥sÀÈ => ಫೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥sÀÈ"), "ಫೃ");});
QUnit.test("u2a ಫೆ => ¥sÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಫೆ"), "¥sÉ");});
QUnit.test("a2u ¥sÉ => ಫೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥sÉ"), "ಫೆ");});
QUnit.test("u2a ಫೇ => ¥sÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಫೇ"), "¥sÉÃ");});
QUnit.test("a2u ¥sÉÃ => ಫೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥sÉÃ"), "ಫೇ");});
QUnit.test("u2a ಫೈ => ¥sÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಫೈ"), "¥sÉÊ");});
QUnit.test("a2u ¥sÉÊ => ಫೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥sÉÊ"), "ಫೈ");});
QUnit.test("u2a ಫೊ => ¥sÉÇ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಫೊ"), "¥sÉÇ");});
QUnit.test("a2u ¥sÉÇ => ಫೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥sÉÇ"), "ಫೊ");});
QUnit.test("u2a ಫೋ => ¥sÉÇÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಫೋ"), "¥sÉÇÃ");});
QUnit.test("a2u ¥sÉÇÃ => ಫೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥sÉÇÃ"), "ಫೋ");});
QUnit.test("u2a ಫೌ => ¥sË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಫೌ"), "¥sË");});
QUnit.test("a2u ¥sË => ಫೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¥sË"), "ಫೌ");});
QUnit.test("u2a ಬ್ => ¨ï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಬ್"), "¨ï");});
QUnit.test("a2u ¨ï => ಬ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("¨ï"), "ಬ್");});
QUnit.test("u2a ಬ => §", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಬ"), "§");});
QUnit.test("a2u § => ಬ", function(assert){assert.strictEqual(kn.ascii_to_unicode("§"), "ಬ");});
QUnit.test("u2a ಬಾ => ¨Á", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಬಾ"), "¨Á");});
QUnit.test("a2u ¨Á => ಬಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¨Á"), "ಬಾ");});
QUnit.test("u2a ಬಿ => ©", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಬಿ"), "©");});
QUnit.test("a2u © => ಬಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("©"), "ಬಿ");});
QUnit.test("u2a ಬೀ => ©Ã", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಬೀ"), "©Ã");});
QUnit.test("a2u ©Ã => ಬೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("©Ã"), "ಬೀ");});
QUnit.test("u2a ಬು => §Ä", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಬು"), "§Ä");});
QUnit.test("a2u §Ä => ಬು", function(assert){assert.strictEqual(kn.ascii_to_unicode("§Ä"), "ಬು");});
QUnit.test("u2a ಬೂ => §Æ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಬೂ"), "§Æ");});
QUnit.test("a2u §Æ => ಬೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("§Æ"), "ಬೂ");});
QUnit.test("u2a ಬೃ => §È", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಬೃ"), "§È");});
QUnit.test("a2u §È => ಬೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("§È"), "ಬೃ");});
QUnit.test("u2a ಬೆ => ¨É", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಬೆ"), "¨É");});
QUnit.test("a2u ¨É => ಬೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¨É"), "ಬೆ");});
QUnit.test("u2a ಬೇ => ¨ÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಬೇ"), "¨ÉÃ");});
QUnit.test("a2u ¨Éà => ಬೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¨ÉÃ"), "ಬೇ");});
QUnit.test("u2a ಬೈ => ¨ÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಬೈ"), "¨ÉÊ");});
QUnit.test("a2u ¨ÉÊ => ಬೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¨ÉÊ"), "ಬೈ");});
QUnit.test("u2a ಬೊ => ¨ÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಬೊ"), "¨ÉÆ");});
QUnit.test("a2u ¨ÉÆ => ಬೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¨ÉÆ"), "ಬೊ");});
QUnit.test("u2a ಬೋ => ¨ÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಬೋ"), "¨ÉÆÃ");});
QUnit.test("a2u ¨ÉÆà => ಬೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¨ÉÆÃ"), "ಬೋ");});
QUnit.test("u2a ಬೌ => ¨Ë", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಬೌ"), "¨Ë");});
QUnit.test("a2u ¨Ë => ಬೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¨Ë"), "ಬೌ");});
QUnit.test("u2a ಭ್ => ¨sï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಭ್"), "¨sï");});
QUnit.test("a2u ¨sï => ಭ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("¨sï"), "ಭ್");});
QUnit.test("u2a ಭ => ¨sÀ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಭ"), "¨sÀ");});
QUnit.test("a2u ¨sÀ => ಭ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¨sÀ"), "ಭ");});
QUnit.test("u2a ಭಾ => ¨sÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಭಾ"), "¨sÁ");});
QUnit.test("a2u ¨sÁ => ಭಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¨sÁ"), "ಭಾ");});
QUnit.test("u2a ಭಿ => ©ü", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಭಿ"), "©ü");});
QUnit.test("a2u ©ü => ಭಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("©ü"), "ಭಿ");});
QUnit.test("u2a ಭೀ => ©üÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಭೀ"), "©üÃ");});
QUnit.test("a2u ©üà => ಭೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("©üÃ"), "ಭೀ");});
QUnit.test("u2a ಭು => ¨sÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಭು"), "¨sÀÄ");});
QUnit.test("a2u ¨sÀÄ => ಭು", function(assert){assert.strictEqual(kn.ascii_to_unicode("¨sÀÄ"), "ಭು");});
QUnit.test("u2a ಭೂ => ¨sÀÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಭೂ"), "¨sÀÆ");});
QUnit.test("a2u ¨sÀÆ => ಭೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¨sÀÆ"), "ಭೂ");});
QUnit.test("u2a ಭೃ => ¨sÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಭೃ"), "¨sÀÈ");});
QUnit.test("a2u ¨sÀÈ => ಭೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¨sÀÈ"), "ಭೃ");});
QUnit.test("u2a ಭೆ => ¨sÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಭೆ"), "¨sÉ");});
QUnit.test("a2u ¨sÉ => ಭೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¨sÉ"), "ಭೆ");});
QUnit.test("u2a ಭೇ => ¨sÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಭೇ"), "¨sÉÃ");});
QUnit.test("a2u ¨sÉÃ => ಭೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¨sÉÃ"), "ಭೇ");});
QUnit.test("u2a ಭೈ => ¨sÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಭೈ"), "¨sÉÊ");});
QUnit.test("a2u ¨sÉÊ => ಭೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¨sÉÊ"), "ಭೈ");});
QUnit.test("u2a ಭೊ => ¨sÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಭೊ"), "¨sÉÆ");});
QUnit.test("a2u ¨sÉÆ => ಭೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¨sÉÆ"), "ಭೊ");});
QUnit.test("u2a ಭೋ => ¨sÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಭೋ"), "¨sÉÆÃ");});
QUnit.test("a2u ¨sÉÆÃ => ಭೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¨sÉÆÃ"), "ಭೋ");});
QUnit.test("u2a ಭೌ => ¨sË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಭೌ"), "¨sË");});
QUnit.test("a2u ¨sË => ಭೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¨sË"), "ಭೌ");});
QUnit.test("u2a ಮ್ => ªÀiï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಮ್"), "ªÀiï");});
QUnit.test("a2u ªÀiï => ಮ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÀiï"), "ಮ್");});
QUnit.test("u2a ಮ => ªÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಮ"), "ªÀÄ");});
QUnit.test("a2u ªÀÄ => ಮ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÀÄ"), "ಮ");});
QUnit.test("u2a ಮಾ => ªÀiÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಮಾ"), "ªÀiÁ");});
QUnit.test("a2u ªÀiÁ => ಮಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÀiÁ"), "ಮಾ");});
QUnit.test("u2a ಮಿ => «Ä", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಮಿ"), "«Ä");});
QUnit.test("a2u «Ä => ಮಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("«Ä"), "ಮಿ");});
QUnit.test("u2a ಮೀ => «ÄÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಮೀ"), "«ÄÃ");});
QUnit.test("a2u «ÄÃ => ಮೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("«ÄÃ"), "ಮೀ");});
QUnit.test("u2a ಮು => ªÀÄÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಮು"), "ªÀÄÄ");});
QUnit.test("a2u ªÀÄÄ => ಮು", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÀÄÄ"), "ಮು");});
QUnit.test("u2a ಮೂ => ªÀÄÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಮೂ"), "ªÀÄÆ");});
QUnit.test("a2u ªÀÄÆ => ಮೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÀÄÆ"), "ಮೂ");});
QUnit.test("u2a ಮೃ => ªÀÄÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಮೃ"), "ªÀÄÈ");});
QUnit.test("a2u ªÀÄÈ => ಮೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÀÄÈ"), "ಮೃ");});
QUnit.test("u2a ಮೆ => ªÉÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಮೆ"), "ªÉÄ");});
QUnit.test("a2u ªÉÄ => ಮೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÉÄ"), "ಮೆ");});
QUnit.test("u2a ಮೇ => ªÉÄÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಮೇ"), "ªÉÄÃ");});
QUnit.test("a2u ªÉÄà => ಮೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÉÄÃ"), "ಮೇ");});
QUnit.test("u2a ಮೈ => ªÉÄÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಮೈ"), "ªÉÄÊ");});
QUnit.test("a2u ªÉÄÊ => ಮೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÉÄÊ"), "ಮೈ");});
QUnit.test("u2a ಮೊ => ªÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಮೊ"), "ªÉÆ");});
QUnit.test("a2u ªÉÆ => ಮೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÉÆ"), "ಮೊ");});
QUnit.test("u2a ಮೋ => ªÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಮೋ"), "ªÉÆÃ");});
QUnit.test("a2u ªÉÆà => ಮೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÉÆÃ"), "ಮೋ");});
QUnit.test("u2a ಮೌ => ªÀiË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಮೌ"), "ªÀiË");});
QUnit.test("a2u ªÀiË => ಮೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÀiË"), "ಮೌ");});
QUnit.test("u2a ಯ್ => AiÀiï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಯ್"), "AiÀiï");});
QUnit.test("a2u AiÀiï => ಯ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("AiÀiï"), "ಯ್");});
QUnit.test("u2a ಯ => AiÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಯ"), "AiÀÄ");});
QUnit.test("a2u AiÀÄ => ಯ", function(assert){assert.strictEqual(kn.ascii_to_unicode("AiÀÄ"), "ಯ");});
QUnit.test("u2a ಯಾ => AiÀiÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಯಾ"), "AiÀiÁ");});
QUnit.test("a2u AiÀiÁ => ಯಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("AiÀiÁ"), "ಯಾ");});
QUnit.test("u2a ಯಿ => ¬Ä", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಯಿ"), "¬Ä");});
QUnit.test("a2u ¬Ä => ಯಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¬Ä"), "ಯಿ");});
QUnit.test("u2a ಯೀ => ¬ÄÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಯೀ"), "¬ÄÃ");});
QUnit.test("a2u ¬Äà => ಯೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¬ÄÃ"), "ಯೀ");});
QUnit.test("u2a ಯು => AiÀÄÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಯು"), "AiÀÄÄ");});
QUnit.test("a2u AiÀÄÄ => ಯು", function(assert){assert.strictEqual(kn.ascii_to_unicode("AiÀÄÄ"), "ಯು");});
QUnit.test("u2a ಯೂ => AiÀÄÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಯೂ"), "AiÀÄÆ");});
QUnit.test("a2u AiÀÄÆ => ಯೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("AiÀÄÆ"), "ಯೂ");});
QUnit.test("u2a ಯೃ => AiÀÄÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಯೃ"), "AiÀÄÈ");});
QUnit.test("a2u AiÀÄÈ => ಯೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("AiÀÄÈ"), "ಯೃ");});
QUnit.test("u2a ಯೆ => AiÉÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಯೆ"), "AiÉÄ");});
QUnit.test("a2u AiÉÄ => ಯೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("AiÉÄ"), "ಯೆ");});
QUnit.test("u2a ಯೇ => AiÉÄÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಯೇ"), "AiÉÄÃ");});
QUnit.test("a2u AiÉÄÃ => ಯೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("AiÉÄÃ"), "ಯೇ");});
QUnit.test("u2a ಯೈ => AiÉÄÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಯೈ"), "AiÉÄÊ");});
QUnit.test("a2u AiÉÄÊ => ಯೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("AiÉÄÊ"), "ಯೈ");});
QUnit.test("u2a ಯೊ => AiÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಯೊ"), "AiÉÆ");});
QUnit.test("a2u AiÉÆ => ಯೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("AiÉÆ"), "ಯೊ");});
QUnit.test("u2a ಯೋ => AiÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಯೋ"), "AiÉÆÃ");});
QUnit.test("a2u AiÉÆÃ => ಯೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("AiÉÆÃ"), "ಯೋ");});
QUnit.test("u2a ಯೌ => AiÀiË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಯೌ"), "AiÀiË");});
QUnit.test("a2u AiÀiË => ಯೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("AiÀiË"), "ಯೌ");});
QUnit.test("u2a ರ್ => gï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ರ್"), "gï");});
QUnit.test("a2u gï => ರ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("gï"), "ರ್");});
QUnit.test("u2a ರ => gÀ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ರ"), "gÀ");});
QUnit.test("a2u gÀ => ರ", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÀ"), "ರ");});
QUnit.test("u2a ರಾ => gÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ರಾ"), "gÁ");});
QUnit.test("a2u gÁ => ರಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÁ"), "ರಾ");});
QUnit.test("u2a ರಿ => j", function(assert){assert.strictEqual(kn.unicode_to_ascii("ರಿ"), "j");});
QUnit.test("a2u j => ರಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("j"), "ರಿ");});
QUnit.test("u2a ರೀ => jÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ರೀ"), "jÃ");});
QUnit.test("a2u jà => ರೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("jÃ"), "ರೀ");});
QUnit.test("u2a ರು => gÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ರು"), "gÀÄ");});
QUnit.test("a2u gÀÄ => ರು", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÀÄ"), "ರು");});
QUnit.test("u2a ರೂ => gÀÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ರೂ"), "gÀÆ");});
QUnit.test("a2u gÀÆ => ರೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÀÆ"), "ರೂ");});
QUnit.test("u2a ರೃ => gÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ರೃ"), "gÀÈ");});
QUnit.test("a2u gÀÈ => ರೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÀÈ"), "ರೃ");});
QUnit.test("u2a ರೆ => gÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ರೆ"), "gÉ");});
QUnit.test("a2u gÉ => ರೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÉ"), "ರೆ");});
QUnit.test("u2a ರೇ => gÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ರೇ"), "gÉÃ");});
QUnit.test("a2u gÉÃ => ರೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÉÃ"), "ರೇ");});
QUnit.test("u2a ರೈ => gÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ರೈ"), "gÉÊ");});
QUnit.test("a2u gÉÊ => ರೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÉÊ"), "ರೈ");});
QUnit.test("u2a ರೊ => gÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ರೊ"), "gÉÆ");});
QUnit.test("a2u gÉÆ => ರೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÉÆ"), "ರೊ");});
QUnit.test("u2a ರೋ => gÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ರೋ"), "gÉÆÃ");});
QUnit.test("a2u gÉÆÃ => ರೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("gÉÆÃ"), "ರೋ");});
QUnit.test("u2a ರೌ => gË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ರೌ"), "gË");});
QUnit.test("a2u gË => ರೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("gË"), "ರೌ");});
QUnit.test("u2a ಲ್ => ¯ï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಲ್"), "¯ï");});
QUnit.test("a2u ¯ï => ಲ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("¯ï"), "ಲ್");});
QUnit.test("u2a ಲ => ®", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಲ"), "®");});
QUnit.test("a2u ® => ಲ", function(assert){assert.strictEqual(kn.ascii_to_unicode("®"), "ಲ");});
QUnit.test("u2a ಲಾ => ¯Á", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಲಾ"), "¯Á");});
QUnit.test("a2u ¯Á => ಲಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¯Á"), "ಲಾ");});
QUnit.test("u2a ಲಿ => °", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಲಿ"), "°");});
QUnit.test("a2u ° => ಲಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("°"), "ಲಿ");});
QUnit.test("u2a ಲೀ => °Ã", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಲೀ"), "°Ã");});
QUnit.test("a2u °Ã => ಲೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("°Ã"), "ಲೀ");});
QUnit.test("u2a ಲು => ®Ä", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಲು"), "®Ä");});
QUnit.test("a2u ®Ä => ಲು", function(assert){assert.strictEqual(kn.ascii_to_unicode("®Ä"), "ಲು");});
QUnit.test("u2a ಲೂ => ®Æ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಲೂ"), "®Æ");});
QUnit.test("a2u ®Æ => ಲೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("®Æ"), "ಲೂ");});
QUnit.test("u2a ಲೃ => ®È", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಲೃ"), "®È");});
QUnit.test("a2u ®È => ಲೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("®È"), "ಲೃ");});
QUnit.test("u2a ಲೆ => ¯É", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಲೆ"), "¯É");});
QUnit.test("a2u ¯É => ಲೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¯É"), "ಲೆ");});
QUnit.test("u2a ಲೇ => ¯ÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಲೇ"), "¯ÉÃ");});
QUnit.test("a2u ¯Éà => ಲೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¯ÉÃ"), "ಲೇ");});
QUnit.test("u2a ಲೈ => ¯ÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಲೈ"), "¯ÉÊ");});
QUnit.test("a2u ¯ÉÊ => ಲೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¯ÉÊ"), "ಲೈ");});
QUnit.test("u2a ಲೊ => ¯ÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಲೊ"), "¯ÉÆ");});
QUnit.test("a2u ¯ÉÆ => ಲೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¯ÉÆ"), "ಲೊ");});
QUnit.test("u2a ಲೋ => ¯ÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಲೋ"), "¯ÉÆÃ");});
QUnit.test("a2u ¯ÉÆà => ಲೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¯ÉÆÃ"), "ಲೋ");});
QUnit.test("u2a ಲೌ => ¯Ë", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಲೌ"), "¯Ë");});
QUnit.test("a2u ¯Ë => ಲೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¯Ë"), "ಲೌ");});
QUnit.test("u2a ವ್ => ªï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ವ್"), "ªï");});
QUnit.test("a2u ªï => ವ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªï"), "ವ್");});
QUnit.test("u2a ವ => ªÀ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ವ"), "ªÀ");});
QUnit.test("a2u ªÀ => ವ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÀ"), "ವ");});
QUnit.test("u2a ವಾ => ªÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ವಾ"), "ªÁ");});
QUnit.test("a2u ªÁ => ವಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÁ"), "ವಾ");});
QUnit.test("u2a ವಿ => «", function(assert){assert.strictEqual(kn.unicode_to_ascii("ವಿ"), "«");});
QUnit.test("a2u « => ವಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("«"), "ವಿ");});
QUnit.test("u2a ವೀ => «Ã", function(assert){assert.strictEqual(kn.unicode_to_ascii("ವೀ"), "«Ã");});
QUnit.test("a2u «Ã => ವೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("«Ã"), "ವೀ");});
QUnit.test("u2a ವು => ªÀÅ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ವು"), "ªÀÅ");});
QUnit.test("a2u ªÀÅ => ವು", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÀÅ"), "ವು");});
QUnit.test("u2a ವೂ => ªÀÇ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ವೂ"), "ªÀÇ");});
QUnit.test("a2u ªÀÇ => ವೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÀÇ"), "ವೂ");});
QUnit.test("u2a ವೃ => ªÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ವೃ"), "ªÀÈ");});
QUnit.test("a2u ªÀÈ => ವೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÀÈ"), "ವೃ");});
QUnit.test("u2a ವೆ => ªÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ವೆ"), "ªÉ");});
QUnit.test("a2u ªÉ => ವೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÉ"), "ವೆ");});
QUnit.test("u2a ವೇ => ªÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ವೇ"), "ªÉÃ");});
QUnit.test("a2u ªÉà => ವೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÉÃ"), "ವೇ");});
QUnit.test("u2a ವೈ => ªÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ವೈ"), "ªÉÊ");});
QUnit.test("a2u ªÉÊ => ವೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÉÊ"), "ವೈ");});
QUnit.test("u2a ವೊ => ªÉÇ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ವೊ"), "ªÉÇ");});
QUnit.test("a2u ªÉÇ => ವೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÉÇ"), "ವೊ");});
QUnit.test("u2a ವೋ => ªÉÇÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ವೋ"), "ªÉÇÃ");});
QUnit.test("a2u ªÉÇà => ವೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªÉÇÃ"), "ವೋ");});
QUnit.test("u2a ವೌ => ªË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ವೌ"), "ªË");});
QUnit.test("a2u ªË => ವೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ªË"), "ವೌ");});
QUnit.test("u2a ಶ್ => ±ï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಶ್"), "±ï");});
QUnit.test("a2u ±ï => ಶ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("±ï"), "ಶ್");});
QUnit.test("u2a ಶ => ±À", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಶ"), "±À");});
QUnit.test("a2u ±À => ಶ", function(assert){assert.strictEqual(kn.ascii_to_unicode("±À"), "ಶ");});
QUnit.test("u2a ಶಾ => ±Á", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಶಾ"), "±Á");});
QUnit.test("a2u ±Á => ಶಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("±Á"), "ಶಾ");});
QUnit.test("u2a ಶಿ => ²", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಶಿ"), "²");});
QUnit.test("a2u ² => ಶಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("²"), "ಶಿ");});
QUnit.test("u2a ಶೀ => ²Ã", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಶೀ"), "²Ã");});
QUnit.test("a2u ²Ã => ಶೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("²Ã"), "ಶೀ");});
QUnit.test("u2a ಶು => ±ÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಶು"), "±ÀÄ");});
QUnit.test("a2u ±ÀÄ => ಶು", function(assert){assert.strictEqual(kn.ascii_to_unicode("±ÀÄ"), "ಶು");});
QUnit.test("u2a ಶೂ => ±ÀÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಶೂ"), "±ÀÆ");});
QUnit.test("a2u ±ÀÆ => ಶೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("±ÀÆ"), "ಶೂ");});
QUnit.test("u2a ಶೃ => ±ÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಶೃ"), "±ÀÈ");});
QUnit.test("a2u ±ÀÈ => ಶೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("±ÀÈ"), "ಶೃ");});
QUnit.test("u2a ಶೆ => ±É", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಶೆ"), "±É");});
QUnit.test("a2u ±É => ಶೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("±É"), "ಶೆ");});
QUnit.test("u2a ಶೇ => ±ÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಶೇ"), "±ÉÃ");});
QUnit.test("a2u ±Éà => ಶೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("±ÉÃ"), "ಶೇ");});
QUnit.test("u2a ಶೈ => ±ÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಶೈ"), "±ÉÊ");});
QUnit.test("a2u ±ÉÊ => ಶೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("±ÉÊ"), "ಶೈ");});
QUnit.test("u2a ಶೊ => ±ÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಶೊ"), "±ÉÆ");});
QUnit.test("a2u ±ÉÆ => ಶೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("±ÉÆ"), "ಶೊ");});
QUnit.test("u2a ಶೋ => ±ÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಶೋ"), "±ÉÆÃ");});
QUnit.test("a2u ±ÉÆà => ಶೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("±ÉÆÃ"), "ಶೋ");});
QUnit.test("u2a ಶೌ => ±Ë", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಶೌ"), "±Ë");});
QUnit.test("a2u ±Ë => ಶೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("±Ë"), "ಶೌ");});
QUnit.test("u2a ಷ್ => μï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಷ್"), "μï");});
QUnit.test("a2u μï => ಷ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("μï"), "ಷ್");});
QUnit.test("u2a ಷ => μÀ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಷ"), "μÀ");});
QUnit.test("a2u μÀ => ಷ", function(assert){assert.strictEqual(kn.ascii_to_unicode("μÀ"), "ಷ");});
QUnit.test("u2a ಷಾ => μÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಷಾ"), "μÁ");});
QUnit.test("a2u μÁ => ಷಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("μÁ"), "ಷಾ");});
QUnit.test("u2a ಷಿ => ¶", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಷಿ"), "¶");});
QUnit.test("a2u ¶ => ಷಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¶"), "ಷಿ");});
QUnit.test("u2a ಷೀ => ¶Ã", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಷೀ"), "¶Ã");});
QUnit.test("a2u ¶Ã => ಷೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¶Ã"), "ಷೀ");});
QUnit.test("u2a ಷು => μÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಷು"), "μÀÄ");});
QUnit.test("a2u μÀÄ => ಷು", function(assert){assert.strictEqual(kn.ascii_to_unicode("μÀÄ"), "ಷು");});
QUnit.test("u2a ಷೂ => μÀÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಷೂ"), "μÀÆ");});
QUnit.test("a2u μÀÆ => ಷೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("μÀÆ"), "ಷೂ");});
QUnit.test("u2a ಷೃ => μÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಷೃ"), "μÀÈ");});
QUnit.test("a2u μÀÈ => ಷೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("μÀÈ"), "ಷೃ");});
QUnit.test("u2a ಷೆ => μÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಷೆ"), "μÉ");});
QUnit.test("a2u μÉ => ಷೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("μÉ"), "ಷೆ");});
QUnit.test("u2a ಷೇ => μÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಷೇ"), "μÉÃ");});
QUnit.test("a2u μÉà => ಷೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("μÉÃ"), "ಷೇ");});
QUnit.test("u2a ಷೈ => μÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಷೈ"), "μÉÊ");});
QUnit.test("a2u μÉÊ => ಷೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("μÉÊ"), "ಷೈ");});
QUnit.test("u2a ಷೊ => μÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಷೊ"), "μÉÆ");});
QUnit.test("a2u μÉÆ => ಷೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("μÉÆ"), "ಷೊ");});
QUnit.test("u2a ಷೋ => μÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಷೋ"), "μÉÆÃ");});
QUnit.test("a2u μÉÆà => ಷೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("μÉÆÃ"), "ಷೋ");});
QUnit.test("u2a ಷೌ => μË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಷೌ"), "μË");});
QUnit.test("a2u μË => ಷೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("μË"), "ಷೌ");});
QUnit.test("u2a ಸ್ => ¸ï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಸ್"), "¸ï");});
QUnit.test("a2u ¸ï => ಸ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("¸ï"), "ಸ್");});
QUnit.test("u2a ಸ => ¸À", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಸ"), "¸À");});
QUnit.test("a2u ¸À => ಸ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¸À"), "ಸ");});
QUnit.test("u2a ಸಾ => ¸Á", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಸಾ"), "¸Á");});
QUnit.test("a2u ¸Á => ಸಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¸Á"), "ಸಾ");});
QUnit.test("u2a ಸಿ => ¹", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಸಿ"), "¹");});
QUnit.test("a2u ¹ => ಸಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¹"), "ಸಿ");});
QUnit.test("u2a ಸೀ => ¹Ã", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಸೀ"), "¹Ã");});
QUnit.test("a2u ¹Ã => ಸೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¹Ã"), "ಸೀ");});
QUnit.test("u2a ಸು => ¸ÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಸು"), "¸ÀÄ");});
QUnit.test("a2u ¸ÀÄ => ಸು", function(assert){assert.strictEqual(kn.ascii_to_unicode("¸ÀÄ"), "ಸು");});
QUnit.test("u2a ಸೂ => ¸ÀÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಸೂ"), "¸ÀÆ");});
QUnit.test("a2u ¸ÀÆ => ಸೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¸ÀÆ"), "ಸೂ");});
QUnit.test("u2a ಸೃ => ¸ÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಸೃ"), "¸ÀÈ");});
QUnit.test("a2u ¸ÀÈ => ಸೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¸ÀÈ"), "ಸೃ");});
QUnit.test("u2a ಸೆ => ¸É", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಸೆ"), "¸É");});
QUnit.test("a2u ¸É => ಸೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¸É"), "ಸೆ");});
QUnit.test("u2a ಸೇ => ¸ÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಸೇ"), "¸ÉÃ");});
QUnit.test("a2u ¸Éà => ಸೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¸ÉÃ"), "ಸೇ");});
QUnit.test("u2a ಸೈ => ¸ÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಸೈ"), "¸ÉÊ");});
QUnit.test("a2u ¸ÉÊ => ಸೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¸ÉÊ"), "ಸೈ");});
QUnit.test("u2a ಸೊ => ¸ÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಸೊ"), "¸ÉÆ");});
QUnit.test("a2u ¸ÉÆ => ಸೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¸ÉÆ"), "ಸೊ");});
QUnit.test("u2a ಸೋ => ¸ÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಸೋ"), "¸ÉÆÃ");});
QUnit.test("a2u ¸ÉÆà => ಸೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¸ÉÆÃ"), "ಸೋ");});
QUnit.test("u2a ಸೌ => ¸Ë", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಸೌ"), "¸Ë");});
QUnit.test("a2u ¸Ë => ಸೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¸Ë"), "ಸೌ");});
QUnit.test("u2a ಹ್ => ºï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಹ್"), "ºï");});
QUnit.test("a2u ºï => ಹ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("ºï"), "ಹ್");});
QUnit.test("u2a ಹ => ºÀ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಹ"), "ºÀ");});
QUnit.test("a2u ºÀ => ಹ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ºÀ"), "ಹ");});
QUnit.test("u2a ಹಾ => ºÁ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಹಾ"), "ºÁ");});
QUnit.test("a2u ºÁ => ಹಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ºÁ"), "ಹಾ");});
QUnit.test("u2a ಹಿ => »", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಹಿ"), "»");});
QUnit.test("a2u » => ಹಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("»"), "ಹಿ");});
QUnit.test("u2a ಹೀ => »Ã", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಹೀ"), "»Ã");});
QUnit.test("a2u »Ã => ಹೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("»Ã"), "ಹೀ");});
QUnit.test("u2a ಹು => ºÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಹು"), "ºÀÄ");});
QUnit.test("a2u ºÀÄ => ಹು", function(assert){assert.strictEqual(kn.ascii_to_unicode("ºÀÄ"), "ಹು");});
QUnit.test("u2a ಹೂ => ºÀÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಹೂ"), "ºÀÆ");});
QUnit.test("a2u ºÀÆ => ಹೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ºÀÆ"), "ಹೂ");});
QUnit.test("u2a ಹೃ => ºÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಹೃ"), "ºÀÈ");});
QUnit.test("a2u ºÀÈ => ಹೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ºÀÈ"), "ಹೃ");});
QUnit.test("u2a ಹೆ => ºÉ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಹೆ"), "ºÉ");});
QUnit.test("a2u ºÉ => ಹೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ºÉ"), "ಹೆ");});
QUnit.test("u2a ಹೇ => ºÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಹೇ"), "ºÉÃ");});
QUnit.test("a2u ºÉà => ಹೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ºÉÃ"), "ಹೇ");});
QUnit.test("u2a ಹೈ => ºÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಹೈ"), "ºÉÊ");});
QUnit.test("a2u ºÉÊ => ಹೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ºÉÊ"), "ಹೈ");});
QUnit.test("u2a ಹೊ => ºÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಹೊ"), "ºÉÆ");});
QUnit.test("a2u ºÉÆ => ಹೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ºÉÆ"), "ಹೊ");});
QUnit.test("u2a ಹೋ => ºÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಹೋ"), "ºÉÆÃ");});
QUnit.test("a2u ºÉÆà => ಹೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ºÉÆÃ"), "ಹೋ");});
QUnit.test("u2a ಹೌ => ºË", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಹೌ"), "ºË");});
QUnit.test("a2u ºË => ಹೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("ºË"), "ಹೌ");});
QUnit.test("u2a ಳ್ => ¼ï", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಳ್"), "¼ï");});
QUnit.test("a2u ¼ï => ಳ್", function(assert){assert.strictEqual(kn.ascii_to_unicode("¼ï"), "ಳ್");});
QUnit.test("u2a ಳ => ¼À", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಳ"), "¼À");});
QUnit.test("a2u ¼À => ಳ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¼À"), "ಳ");});
QUnit.test("u2a ಳಾ => ¼Á", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಳಾ"), "¼Á");});
QUnit.test("a2u ¼Á => ಳಾ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¼Á"), "ಳಾ");});
QUnit.test("u2a ಳಿ => ½", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಳಿ"), "½");});
QUnit.test("a2u ½ => ಳಿ", function(assert){assert.strictEqual(kn.ascii_to_unicode("½"), "ಳಿ");});
QUnit.test("u2a ಳೀ => ½Ã", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಳೀ"), "½Ã");});
QUnit.test("a2u ½Ã => ಳೀ", function(assert){assert.strictEqual(kn.ascii_to_unicode("½Ã"), "ಳೀ");});
QUnit.test("u2a ಳು => ¼ÀÄ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಳು"), "¼ÀÄ");});
QUnit.test("a2u ¼ÀÄ => ಳು", function(assert){assert.strictEqual(kn.ascii_to_unicode("¼ÀÄ"), "ಳು");});
QUnit.test("u2a ಳೂ => ¼ÀÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಳೂ"), "¼ÀÆ");});
QUnit.test("a2u ¼ÀÆ => ಳೂ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¼ÀÆ"), "ಳೂ");});
QUnit.test("u2a ಳೃ => ¼ÀÈ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಳೃ"), "¼ÀÈ");});
QUnit.test("a2u ¼ÀÈ => ಳೃ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¼ÀÈ"), "ಳೃ");});
QUnit.test("u2a ಳೆ => ¼É", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಳೆ"), "¼É");});
QUnit.test("a2u ¼É => ಳೆ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¼É"), "ಳೆ");});
QUnit.test("u2a ಳೇ => ¼ÉÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಳೇ"), "¼ÉÃ");});
QUnit.test("a2u ¼Éà => ಳೇ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¼ÉÃ"), "ಳೇ");});
QUnit.test("u2a ಳೈ => ¼ÉÊ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಳೈ"), "¼ÉÊ");});
QUnit.test("a2u ¼ÉÊ => ಳೈ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¼ÉÊ"), "ಳೈ");});
QUnit.test("u2a ಳೊ => ¼ÉÆ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಳೊ"), "¼ÉÆ");});
QUnit.test("a2u ¼ÉÆ => ಳೊ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¼ÉÆ"), "ಳೊ");});
QUnit.test("u2a ಳೋ => ¼ÉÆÃ", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಳೋ"), "¼ÉÆÃ");});
QUnit.test("a2u ¼ÉÆà => ಳೋ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¼ÉÆÃ"), "ಳೋ");});
QUnit.test("u2a ಳೌ => ¼Ë", function(assert){assert.strictEqual(kn.unicode_to_ascii("ಳೌ"), "¼Ë");});
QUnit.test("a2u ¼Ë => ಳೌ", function(assert){assert.strictEqual(kn.ascii_to_unicode("¼Ë"), "ಳೌ");});
var data = [
["¸ÁévÀAvÀæ", "ಸ್ವಾತಂತ್ರ"],
["AiÀÄdÕ", "ಯಜ್ಞ"],
["PÁåA¥ÉÇÌÃ", "ಕ್ಯಾಂಪ್ಕೋ"],
["¥ÉÇæ", "ಪ್ರೊ"],
["DAiÉÄÌ", "ಆಯ್ಕೆ"],
["®PÀëå", "ಲಕ್ಷ್ಯ"],
["J®ègÉƼÀUÉÆAzÁUÀÄ ªÀÄAPÀÄwªÀÄä", "ಎಲ್ಲರೊಳಗೊಂದಾಗು ಮಂಕುತಿಮ್ಮ"],
["PÀ£ÀßqÀ ªÀÄvÀÄÛ ¸ÀA¸ÀÌøw E¯ÁSÉ", "ಕನ್ನಡ ಮತ್ತು ಸಂಸ್ಕೃತಿ ಇಲಾಖೆ"],
["Pïgï", "ಕ್‌ರ್"],
["gÁåAPï", "ರ‍್ಯಾಂಕ್"],
["AiÀiÁAðPï", "ರ್ಯಾಂಕ್"],
["¸ÀÆAiÀÄð", "ಸೂರ್ಯ"],
["¸ÀÆAiÀiÁð", "ಸೂರ್ಯಾ"],
["PÁåPï", "ಕ್ಯಾಕ್"],
["UÉÆæPï", "ಗ್ರೊಕ್"],
["¥ÀæweÉÕ", "ಪ್ರತಿಜ್ಞೆ"],
["¦æÃw", "ಪ್ರೀತಿ"],
["CAiÉÆåÃ", "ಅಯ್ಯೋ"],
["UÁæªÀiÁ¥sÉÇãÀÄ", "ಗ್ರಾಮಾಫೋನು"],
["¨ÉÃrPÉƼÀÄîwÛzÉÝãÉ", "ಬೇಡಿಕೊಳ್ಳುತ್ತಿದ್ದೇನೆ"],
["UÉÆþõÀÎgÉ", "ಗೋಱ್ಗರೆ"],
["ªÀÄÆgÀÄ ¥ÉÇæmÁ£ïUÀ¼ÀÄ", "ಮೂರು ಪ್ರೊಟಾನ್‌ಗಳು"],
["¨sÁμɬÄAzÀ", "ಭಾಷೆಯಿಂದ"],
["¥ÉÇÃZÀÄðVøï", "ಪೋರ್ಚುಗೀಸ್"],
["ªÀiÁqÀÄvÀÛÉA§ÄzÀgÀ°è", "ಮಾಡುತ್ತೆಂಬುದರಲ್ಲಿ", true],
["ªÀiÁqÀÄvÉÛA§ÄzÀgÀ°è", "ಮಾಡುತ್ತೆಂಬುದರಲ್ಲಿ"],
["CªÀ¢üAiÀÄ°èAiÉÄÃ", "ಅವಧಿಯಲ್ಲಿಯೇ"],
["CªÀ¢ü0iÀÄ°è0iÉÄÃ", "ಅವಧಿಯಲ್ಲಿಯೇ", true]
]
data.forEach(function(item){
QUnit.test( "a2u " + item[0] + " => " + item[1], function( assert ) {
assert.strictEqual(kn.ascii_to_unicode(item[0]), item[1]);
});
if (item[2] === undefined) {
QUnit.test( "u2a " + item[1] + " => " + item[0], function( assert ) {
assert.strictEqual(kn.unicode_to_ascii(item[1]), item[0]);
});
}
});
QUnit.test( "u2a ೦ ೧ ೨ ೩ ೪ ೫ ೬ ೭ ೮ ೯ => 0 1 2 3 4 5 6 7 8 9", function( assert ) {
assert.strictEqual(kn.unicode_to_ascii("೦ ೧ ೨ ೩ ೪ ೫ ೬ ೭ ೮ ೯"), "0 1 2 3 4 5 6 7 8 9");
});
QUnit.test( "u2a 0 1 2 3 4 5 6 7 8 9 => 0 1 2 3 4 5 6 7 8 9", function( assert ) {
assert.strictEqual(kn.unicode_to_ascii("0 1 2 3 4 5 6 7 8 9"), "0 1 2 3 4 5 6 7 8 9");
});
QUnit.test( "a2u 0 1 2 3 4 5 6 7 8 9 => ೦ ೧ ೨ ೩ ೪ ೫ ೬ ೭ ೮ ೯", function( assert ) {
assert.strictEqual(kn.ascii_to_unicode("0 1 2 3 4 5 6 7 8 9"), "೦ ೧ ೨ ೩ ೪ ೫ ೬ ೭ ೮ ೯");
});
QUnit.test( "a2u 0 1 2 3 4 5 6 7 8 9 => 0 1 2 3 4 5 6 7 8 9", function( assert ) {
assert.strictEqual(kn.ascii_to_unicode("0 1 2 3 4 5 6 7 8 9", true), "0 1 2 3 4 5 6 7 8 9");
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment