User:PerfektesChaos/js/stringLib/d.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/// PerfektesChaos/js/stringLib/d.js
/// 2018-08-24 PerfektesChaos@de.wikipedia
/// Fingerprint: #0#0#
/// String utility package
/* global mw:true, mediaWiki:false, window:false                       */
/* jshint bitwise:false, forin:false,
          curly:true, eqeqeq:true, latedef:true,
          laxbreak:true,
          nocomma:true, strict:true, undef:true, unused:true           */
var VERSION  =  -2.2,
    BB;



/// @license GPL [//www.mediawiki.org/w/COPYING] (+GFDL, LGPL, CC-BY-SA)
/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program;
 * if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 * http://www.gnu.org/copyleft/gpl.html
 */



BB  =  function (appObj) {
   /* String utility package.
         .camelCasing()
         .capitalize()
         .charEntity()
         .charEntityAt()
         .charEntityCode()
         .charEntityHTML4()
         .charEntityHTML5single()
         .deCapitalize()
         .decodeOctet()
         .decodeXML()
         .escapeLight()
         .fromCharCode()
         .fromNum()
         .hexcode()
         .isASCII()
         .isBlank()
         .isLetter()
         .isWhiteBlank()
         .makeString()
         .parseIntNumber()
         .setChar()
         .setString()
         .sortAppropriate()
         .sortChar()
         .sortLocale()
         .sortString()
         .spaced()
         .substrEnd()
         .terminated()
         .trim()
         .trimL()
         .trimR()
         .uniques()
          < .charEnt5single
         >< .locateEntities
         >< .sortLang
         >< .sortMode
         >< .spaces
         >< .sticks
      Requires: JavaScript 1.3  (String.charCodeAt String.fromCharCode)
      2017-01-01 PerfektesChaos@de.wikipedia
    */
   "use strict";
   var STRLIB  =  appObj;
   /// </nowiki>
   STRLIB.doc  =  "[[w:en:User:PerfektesChaos/js/stringLib]]";
   /// <nowiki>



   if (typeof(STRLIB.locateEntities) !== "boolean") {
      STRLIB.locateEntities  =
         /**
          User option: Expect any HTML entity
          @version 2012-03-19 PerfektesChaos@de.wikipedia
          @REMARK  <TT>true</TT>  or <TT>false</TT>
         */
         false;
   }
   if (STRLIB.sortLang === undefined) {
      STRLIB.sortLang  =
         /**
          User option: Language used for sorting
          @version 2012-03-19 PerfektesChaos@de.wikipedia
          @REMARK  string or <TT>false</TT>
         */
         false;
   }
   if (STRLIB.sortMode === undefined) {
      // string or false
      STRLIB.sortMode  =
         /**
          User option: Special sorting mode
          @version 2013-03-18 PerfektesChaos@de.wikipedia
          @REMARK  string like 'de-DIN31638' or <TT>false</TT>
         */
         //   "de-DIN31638" not yet passed to sorting
         false;
   }
   if (typeof(STRLIB.spaces) !== "string") {
      STRLIB.spaces  =
         /**
          Various types of spaces
          @version 2012-03-19 PerfektesChaos@de.wikipedia
          @REMARK  string with all spaces except ASCII
         */
      String.fromCharCode(  160,
                           5760,
                           8192,
                           8193,
                           8194,
                           8195,
                           8196,
                           8197,
                           8198,
                           8199,
                           8200,
                           8201,
                           8202,
                           8239,
                           8287,
                          12288,
                          12351);
   }
   if (typeof(STRLIB.sticks) !== "string") {
      STRLIB.sticks  =
         /**
          Various types of horizontal dashes and lines
          @version 2012-03-19 PerfektesChaos@de.wikipedia
          @REMARK  string with all dashes
                   including ASCII hyphen-minus in front
         */
         String.fromCharCode(   45,
                               173,    // shy
                              8208,    // hyphen
                              8209,    // nb-hyphen
                              8210,    // figure dash
                              8211,    // ndash
                              8212,    // mdash
                              8213,    // horizontal bar
                              8259,    // hyphen bullet
                              8722,    // minus
                              9472);   // box drawings light horizontal
   }
   //8204  // zwnj  _re_ZW
   //8205  // zwj   _re_ZW



STRLIB.charEnt5single  =  {
   /**
    HTML 5 single character entities
    @version 2016-09-18 PerfektesChaos@de.wikipedia
    @REMARK  object assigning numbers to names
   */
Aacute:0xC1,
aacute:0xE1,
Abreve:0x0102,
abreve:0x0103,
ac:0x223E,
acd:0x223F,
Acirc:0xC2,
acirc:0xE2,
acute:0xB4,
Acy:0x0410,
acy:0x0430,
AElig:0xC6,
aelig:0xE6,
af:0x2061,
Afr:0x1D504,
afr:0x1D51E,
Agrave:0xC0,
agrave:0xE0,
alefsym:0x2135,
aleph:0x2135,
Alpha:0x0391,
alpha:0x03B1,
Amacr:0x0100,
amacr:0x0101,
amalg:0x2A3F,
AMP:0x26,
amp:0x26,
and:0x2227,
And:0x2A53,
andand:0x2A55,
andd:0x2A5C,
andslope:0x2A58,
andv:0x2A5A,
ang:0x2220,
ange:0x29A4,
angle:0x2220,
angmsd:0x2221,
angmsdaa:0x29A8,
angmsdab:0x29A9,
angmsdac:0x29AA,
angmsdad:0x29AB,
angmsdae:0x29AC,
angmsdaf:0x29AD,
angmsdag:0x29AE,
angmsdah:0x29AF,
angrt:0x221F,
angrtvb:0x22BE,
angrtvbd:0x299D,
angsph:0x2222,
angst:0xC5,
angzarr:0x237C,
Aogon:0x0104,
aogon:0x0105,
Aopf:0x1D538,
aopf:0x1D552,
ap:0x2248,
apacir:0x2A6F,
ape:0x224A,
apE:0x2A70,
apid:0x224B,
apos:0x27,
ApplyFunction:0x2061,
approx:0x2248,
approxeq:0x224A,
Aring:0xC5,
aring:0xE5,
Ascr:0x1D49C,
ascr:0x1D4B6,
Assign:0x2254,
ast:0x2A,
asymp:0x2248,
asympeq:0x224D,
Atilde:0xC3,
atilde:0xE3,
Auml:0xC4,
auml:0xE4,
awconint:0x2233,
awint:0x2A11,
backcong:0x224C,
backepsilon:0x03F6,
backprime:0x2035,
backsim:0x223D,
backsimeq:0x22CD,
Backslash:0x2216,
Barv:0x2AE7,
barvee:0x22BD,
barwed:0x2305,
Barwed:0x2306,
barwedge:0x2305,
bbrk:0x23B5,
bbrktbrk:0x23B6,
bcong:0x224C,
Bcy:0x0411,
bcy:0x0431,
bdquo:0x201E,
becaus:0x2235,
Because:0x2235,
because:0x2235,
bemptyv:0x29B0,
bepsi:0x03F6,
bernou:0x212C,
Bernoullis:0x212C,
Beta:0x0392,
beta:0x03B2,
beth:0x2136,
between:0x226C,
Bfr:0x1D505,
bfr:0x1D51F,
bigcap:0x22C2,
bigcirc:0x25EF,
bigcup:0x22C3,
bigodot:0x2A00,
bigoplus:0x2A01,
bigotimes:0x2A02,
bigsqcup:0x2A06,
bigstar:0x2605,
bigtriangledown:0x25BD,
bigtriangleup:0x25B3,
biguplus:0x2A04,
bigvee:0x22C1,
bigwedge:0x22C0,
bkarow:0x290D,
blacklozenge:0x29EB,
blacksquare:0x25AA,
blacktriangle:0x25B4,
blacktriangledown:0x25BE,
blacktriangleleft:0x25C2,
blacktriangleright:0x25B8,
blank:0x2423,
blk12:0x2592,
blk14:0x2591,
blk34:0x2593,
block:0x2588,
bnot:0x2310,
bNot:0x2AED,
Bopf:0x1D539,
bopf:0x1D553,
bot:0x22A5,
bottom:0x22A5,
bowtie:0x22C8,
boxbox:0x29C9,
boxdl:0x2510,
boxdL:0x2555,
boxDl:0x2556,
boxDL:0x2557,
boxdr:0x250C,
boxdR:0x2552,
boxDr:0x2553,
boxDR:0x2554,
boxh:0x2500,
boxH:0x2550,
boxhd:0x252C,
boxHd:0x2564,
boxhD:0x2565,
boxHD:0x2566,
boxhu:0x2534,
boxHu:0x2567,
boxhU:0x2568,
boxHU:0x2569,
boxminus:0x229F,
boxplus:0x229E,
boxtimes:0x22A0,
boxul:0x2518,
boxuL:0x255B,
boxUl:0x255C,
boxUL:0x255D,
boxur:0x2514,
boxuR:0x2558,
boxUr:0x2559,
boxUR:0x255A,
boxv:0x2502,
boxV:0x2551,
boxvh:0x253C,
boxvH:0x256A,
boxVh:0x256B,
boxVH:0x256C,
boxvl:0x2524,
boxvL:0x2561,
boxVl:0x2562,
boxVL:0x2563,
boxvr:0x251C,
boxvR:0x255E,
boxVr:0x255F,
boxVR:0x2560,
bprime:0x2035,
Breve:0x02D8,
breve:0x02D8,
brvbar:0xA6,
Bscr:0x212C,
bscr:0x1D4B7,
bsemi:0x204F,
bsim:0x223D,
bsime:0x22CD,
bsol:0x5C,
bsolb:0x29C5,
bsolhsub:0x27C8,
bull:0x2022,
bullet:0x2022,
bump:0x224E,
bumpe:0x224F,
bumpE:0x2AAE,
Bumpeq:0x224E,
bumpeq:0x224F,
Cacute:0x0106,
cacute:0x0107,
cap:0x2229,
Cap:0x22D2,
capand:0x2A44,
capbrcup:0x2A49,
capcap:0x2A4B,
capcup:0x2A47,
capdot:0x2A40,
CapitalDifferentialD:0x2145,
caret:0x2041,
caron:0x02C7,
Cayleys:0x212D,
ccaps:0x2A4D,
Ccaron:0x010C,
ccaron:0x010D,
Ccedil:0xC7,
ccedil:0xE7,
Ccirc:0x0108,
ccirc:0x0109,
Cconint:0x2230,
ccups:0x2A4C,
ccupssm:0x2A50,
Cdot:0x010A,
cdot:0x010B,
cedil:0xB8,
Cedilla:0xB8,
cemptyv:0x29B2,
cent:0xA2,
CenterDot:0xB7,
centerdot:0xB7,
Cfr:0x212D,
cfr:0x1D520,
CHcy:0x0427,
chcy:0x0447,
check:0x2713,
checkmark:0x2713,
Chi:0x03A7,
chi:0x03C7,
cir:0x25CB,
circ:0x02C6,
circeq:0x2257,
circlearrowleft:0x21BA,
circlearrowright:0x21BB,
circledast:0x229B,
circledcirc:0x229A,
circleddash:0x229D,
CircleDot:0x2299,
circledR:0xAE,
circledS:0x24C8,
CircleMinus:0x2296,
CirclePlus:0x2295,
CircleTimes:0x2297,
cire:0x2257,
cirE:0x29C3,
cirfnint:0x2A10,
cirmid:0x2AEF,
cirscir:0x29C2,
ClockwiseContourIntegral:0x2232,
CloseCurlyDoubleQuote:0x201D,
CloseCurlyQuote:0x2019,
clubs:0x2663,
clubsuit:0x2663,
colon:0x3A,
Colon:0x2237,
colone:0x2254,
Colone:0x2A74,
coloneq:0x2254,
comma:0x2C,
commat:0x40,
comp:0x2201,
compfn:0x2218,
complement:0x2201,
complexes:0x2102,
cong:0x2245,
congdot:0x2A6D,
Congruent:0x2261,
conint:0x222E,
Conint:0x222F,
ContourIntegral:0x222E,
Copf:0x2102,
copf:0x1D554,
coprod:0x2210,
Coproduct:0x2210,
COPY:0xA9,
copy:0xA9,
copysr:0x2117,
CounterClockwiseContourIntegral:0x2233,
crarr:0x21B5,
cross:0x2717,
Cross:0x2A2F,
Cscr:0x1D49E,
cscr:0x1D4B8,
csub:0x2ACF,
csube:0x2AD1,
csup:0x2AD0,
csupe:0x2AD2,
ctdot:0x22EF,
cudarrl:0x2938,
cudarrr:0x2935,
cuepr:0x22DE,
cuesc:0x22DF,
cularr:0x21B6,
cularrp:0x293D,
cup:0x222A,
Cup:0x22D3,
cupbrcap:0x2A48,
CupCap:0x224D,
cupcap:0x2A46,
cupcup:0x2A4A,
cupdot:0x228D,
cupor:0x2A45,
curarr:0x21B7,
curarrm:0x293C,
curlyeqprec:0x22DE,
curlyeqsucc:0x22DF,
curlyvee:0x22CE,
curlywedge:0x22CF,
curren:0xA4,
curvearrowleft:0x21B6,
curvearrowright:0x21B7,
cuvee:0x22CE,
cuwed:0x22CF,
cwconint:0x2232,
cwint:0x2231,
cylcty:0x232D,
dagger:0x2020,
Dagger:0x2021,
daleth:0x2138,
darr:0x2193,
Darr:0x21A1,
dArr:0x21D3,
dash:0x2010,
dashv:0x22A3,
Dashv:0x2AE4,
dbkarow:0x290F,
dblac:0x02DD,
Dcaron:0x010E,
dcaron:0x010F,
Dcy:0x0414,
dcy:0x0434,
DD:0x2145,
dd:0x2146,
ddagger:0x2021,
ddarr:0x21CA,
DDotrahd:0x2911,
ddotseq:0x2A77,
deg:0xB0,
Del:0x2207,
Delta:0x0394,
delta:0x03B4,
demptyv:0x29B1,
dfisht:0x297F,
Dfr:0x1D507,
dfr:0x1D521,
dHar:0x2965,
dharl:0x21C3,
dharr:0x21C2,
DiacriticalAcute:0xB4,
DiacriticalDot:0x02D9,
DiacriticalDoubleAcute:0x02DD,
DiacriticalGrave:0x60,
DiacriticalTilde:0x02DC,
diam:0x22C4,
Diamond:0x22C4,
diamond:0x22C4,
diamondsuit:0x2666,
diams:0x2666,
die:0xA8,
DifferentialD:0x2146,
digamma:0x03DD,
disin:0x22F2,
div:0xF7,
divide:0xF7,
divideontimes:0x22C7,
divonx:0x22C7,
DJcy:0x0402,
djcy:0x0452,
dlcorn:0x231E,
dlcrop:0x230D,
dollar:0x24,
Dopf:0x1D53B,
dopf:0x1D555,
Dot:0xA8,
dot:0x02D9,
doteq:0x2250,
doteqdot:0x2251,
DotEqual:0x2250,
dotminus:0x2238,
dotplus:0x2214,
dotsquare:0x22A1,
doublebarwedge:0x2306,
DoubleContourIntegral:0x222F,
DoubleDot:0xA8,
DoubleDownArrow:0x21D3,
DoubleLeftArrow:0x21D0,
DoubleLeftRightArrow:0x21D4,
DoubleLeftTee:0x2AE4,
DoubleLongLeftArrow:0x27F8,
DoubleLongLeftRightArrow:0x27FA,
DoubleLongRightArrow:0x27F9,
DoubleRightArrow:0x21D2,
DoubleRightTee:0x22A8,
DoubleUpArrow:0x21D1,
DoubleUpDownArrow:0x21D5,
DoubleVerticalBar:0x2225,
DownArrow:0x2193,
downarrow:0x2193,
Downarrow:0x21D3,
DownArrowBar:0x2913,
DownArrowUpArrow:0x21F5,
downdownarrows:0x21CA,
downharpoonleft:0x21C3,
downharpoonright:0x21C2,
DownLeftRightVector:0x2950,
DownLeftTeeVector:0x295E,
DownLeftVector:0x21BD,
DownLeftVectorBar:0x2956,
DownRightTeeVector:0x295F,
DownRightVector:0x21C1,
DownRightVectorBar:0x2957,
DownTee:0x22A4,
DownTeeArrow:0x21A7,
drbkarow:0x2910,
drcorn:0x231F,
drcrop:0x230C,
Dscr:0x1D49F,
dscr:0x1D4B9,
DScy:0x0405,
dscy:0x0455,
dsol:0x29F6,
Dstrok:0x0110,
dstrok:0x0111,
dtdot:0x22F1,
dtri:0x25BF,
dtrif:0x25BE,
duarr:0x21F5,
duhar:0x296F,
dwangle:0x29A6,
DZcy:0x040F,
dzcy:0x045F,
dzigrarr:0x27FF,
Eacute:0xC9,
eacute:0xE9,
easter:0x2A6E,
Ecaron:0x011A,
ecaron:0x011B,
ecir:0x2256,
Ecirc:0xCA,
ecirc:0xEA,
ecolon:0x2255,
Ecy:0x042D,
ecy:0x044D,
eDDot:0x2A77,
Edot:0x0116,
edot:0x0117,
eDot:0x2251,
ee:0x2147,
efDot:0x2252,
Efr:0x1D508,
efr:0x1D522,
eg:0x2A9A,
Egrave:0xC8,
egrave:0xE8,
egs:0x2A96,
egsdot:0x2A98,
el:0x2A99,
Element:0x2208,
elinters:0x23E7,
ell:0x2113,
els:0x2A95,
elsdot:0x2A97,
Emacr:0x0112,
emacr:0x0113,
empty:0x2205,
emptyset:0x2205,
EmptySmallSquare:0x25FB,
emptyv:0x2205,
EmptyVerySmallSquare:0x25AB,
emsp:0x2003,
emsp13:0x2004,
emsp14:0x2005,
ENG:0x014A,
eng:0x014B,
ensp:0x2002,
Eogon:0x0118,
eogon:0x0119,
Eopf:0x1D53C,
eopf:0x1D556,
epar:0x22D5,
eparsl:0x29E3,
eplus:0x2A71,
epsi:0x03B5,
Epsilon:0x0395,
epsilon:0x03B5,
epsiv:0x03F5,
eqcirc:0x2256,
eqcolon:0x2255,
eqsim:0x2242,
eqslantgtr:0x2A96,
eqslantless:0x2A95,
Equal:0x2A75,
equals:0x3D,
EqualTilde:0x2242,
equest:0x225F,
Equilibrium:0x21CC,
equiv:0x2261,
equivDD:0x2A78,
eqvparsl:0x29E5,
erarr:0x2971,
erDot:0x2253,
escr:0x212F,
Escr:0x2130,
esdot:0x2250,
esim:0x2242,
Esim:0x2A73,
Eta:0x0397,
eta:0x03B7,
ETH:0xD0,
eth:0xF0,
Euml:0xCB,
euml:0xEB,
euro:0x20AC,
excl:0x21,
exist:0x2203,
Exists:0x2203,
expectation:0x2130,
ExponentialE:0x2147,
exponentiale:0x2147,
fallingdotseq:0x2252,
Fcy:0x0424,
fcy:0x0444,
female:0x2640,
ffilig:0xFB03,
fflig:0xFB00,
ffllig:0xFB04,
Ffr:0x1D509,
ffr:0x1D523,
filig:0xFB01,
FilledSmallSquare:0x25FC,
FilledVerySmallSquare:0x25AA,
flat:0x266D,
fllig:0xFB02,
fltns:0x25B1,
fnof:0x0192,
Fopf:0x1D53D,
fopf:0x1D557,
ForAll:0x2200,
forall:0x2200,
fork:0x22D4,
forkv:0x2AD9,
Fouriertrf:0x2131,
fpartint:0x2A0D,
frac12:0xBD,
frac13:0x2153,
frac14:0xBC,
frac15:0x2155,
frac16:0x2159,
frac18:0x215B,
frac23:0x2154,
frac25:0x2156,
frac34:0xBE,
frac35:0x2157,
frac38:0x215C,
frac45:0x2158,
frac56:0x215A,
frac58:0x215D,
frac78:0x215E,
frasl:0x2044,
frown:0x2322,
Fscr:0x2131,
fscr:0x1D4BB,
gacute:0x01F5,
Gamma:0x0393,
gamma:0x03B3,
Gammad:0x03DC,
gammad:0x03DD,
gap:0x2A86,
Gbreve:0x011E,
gbreve:0x011F,
Gcedil:0x0122,
Gcirc:0x011C,
gcirc:0x011D,
Gcy:0x0413,
gcy:0x0433,
Gdot:0x0120,
gdot:0x0121,
ge:0x2265,
gE:0x2267,
gel:0x22DB,
gEl:0x2A8C,
geq:0x2265,
geqq:0x2267,
geqslant:0x2A7E,
ges:0x2A7E,
gescc:0x2AA9,
gesdot:0x2A80,
gesdoto:0x2A82,
gesdotol:0x2A84,
gesles:0x2A94,
Gfr:0x1D50A,
gfr:0x1D524,
gg:0x226B,
Gg:0x22D9,
ggg:0x22D9,
gimel:0x2137,
GJcy:0x0403,
gjcy:0x0453,
gl:0x2277,
gla:0x2AA5,
glE:0x2A92,
glj:0x2AA4,
gnap:0x2A8A,
gnapprox:0x2A8A,
gnE:0x2269,
gne:0x2A88,
gneq:0x2A88,
gneqq:0x2269,
gnsim:0x22E7,
Gopf:0x1D53E,
gopf:0x1D558,
grave:0x60,
GreaterEqual:0x2265,
GreaterEqualLess:0x22DB,
GreaterFullEqual:0x2267,
GreaterGreater:0x2AA2,
GreaterLess:0x2277,
GreaterSlantEqual:0x2A7E,
GreaterTilde:0x2273,
gscr:0x210A,
Gscr:0x1D4A2,
gsim:0x2273,
gsime:0x2A8E,
gsiml:0x2A90,
gt:0x3E,
GT:0x3E,
Gt:0x226B,
gtcc:0x2AA7,
gtcir:0x2A7A,
gtdot:0x22D7,
gtlPar:0x2995,
gtquest:0x2A7C,
gtrapprox:0x2A86,
gtrarr:0x2978,
gtrdot:0x22D7,
gtreqless:0x22DB,
gtreqqless:0x2A8C,
gtrless:0x2277,
gtrsim:0x2273,
Hacek:0x02C7,
hairsp:0x200A,
half:0xBD,
hamilt:0x210B,
HARDcy:0x042A,
hardcy:0x044A,
harr:0x2194,
hArr:0x21D4,
harrcir:0x2948,
harrw:0x21AD,
Hat:0x5E,
hbar:0x210F,
Hcirc:0x0124,
hcirc:0x0125,
hearts:0x2665,
heartsuit:0x2665,
hellip:0x2026,
hercon:0x22B9,
Hfr:0x210C,
hfr:0x1D525,
HilbertSpace:0x210B,
hksearow:0x2925,
hkswarow:0x2926,
hoarr:0x21FF,
homtht:0x223B,
hookleftarrow:0x21A9,
hookrightarrow:0x21AA,
Hopf:0x210D,
hopf:0x1D559,
horbar:0x2015,
HorizontalLine:0x2500,
Hscr:0x210B,
hscr:0x1D4BD,
hslash:0x210F,
Hstrok:0x0126,
hstrok:0x0127,
HumpDownHump:0x224E,
HumpEqual:0x224F,
hybull:0x2043,
hyphen:0x2010,
Iacute:0xCD,
iacute:0xED,
ic:0x2063,
Icirc:0xCE,
icirc:0xEE,
Icy:0x0418,
icy:0x0438,
Idot:0x0130,
IEcy:0x0415,
iecy:0x0435,
iexcl:0xA1,
iff:0x21D4,
Ifr:0x2111,
ifr:0x1D526,
Igrave:0xCC,
igrave:0xEC,
ii:0x2148,
iiiint:0x2A0C,
iiint:0x222D,
iinfin:0x29DC,
iiota:0x2129,
IJlig:0x0132,
ijlig:0x0133,
Im:0x2111,
Imacr:0x012A,
imacr:0x012B,
image:0x2111,
ImaginaryI:0x2148,
imagline:0x2110,
imagpart:0x2111,
imath:0x0131,
imof:0x22B7,
imped:0x01B5,
Implies:0x21D2,
"in":0x2208,
incare:0x2105,
infin:0x221E,
infintie:0x29DD,
inodot:0x0131,
int:0x222B,
Int:0x222C,
intcal:0x22BA,
integers:0x2124,
Integral:0x222B,
intercal:0x22BA,
Intersection:0x22C2,
intlarhk:0x2A17,
intprod:0x2A3C,
InvisibleComma:0x2063,
InvisibleTimes:0x2062,
IOcy:0x0401,
iocy:0x0451,
Iogon:0x012E,
iogon:0x012F,
Iopf:0x1D540,
iopf:0x1D55A,
Iota:0x0399,
iota:0x03B9,
iprod:0x2A3C,
iquest:0xBF,
Iscr:0x2110,
iscr:0x1D4BE,
isin:0x2208,
isindot:0x22F5,
isinE:0x22F9,
isins:0x22F4,
isinsv:0x22F3,
isinv:0x2208,
it:0x2062,
Itilde:0x0128,
itilde:0x0129,
Iukcy:0x0406,
iukcy:0x0456,
Iuml:0xCF,
iuml:0xEF,
Jcirc:0x0134,
jcirc:0x0135,
Jcy:0x0419,
jcy:0x0439,
Jfr:0x1D50D,
jfr:0x1D527,
jmath:0x0237,
Jopf:0x1D541,
jopf:0x1D55B,
Jscr:0x1D4A5,
jscr:0x1D4BF,
Jsercy:0x0408,
jsercy:0x0458,
Jukcy:0x0404,
jukcy:0x0454,
Kappa:0x039A,
kappa:0x03BA,
kappav:0x03F0,
Kcedil:0x0136,
kcedil:0x0137,
Kcy:0x041A,
kcy:0x043A,
Kfr:0x1D50E,
kfr:0x1D528,
kgreen:0x0138,
KHcy:0x0425,
khcy:0x0445,
KJcy:0x040C,
kjcy:0x045C,
Kopf:0x1D542,
kopf:0x1D55C,
Kscr:0x1D4A6,
kscr:0x1D4C0,
lAarr:0x21DA,
Lacute:0x0139,
lacute:0x013A,
laemptyv:0x29B4,
lagran:0x2112,
Lambda:0x039B,
lambda:0x03BB,
lang:0x27E8,
Lang:0x27EA,
langd:0x2991,
langle:0x27E8,
lap:0x2A85,
Laplacetrf:0x2112,
laquo:0xAB,
larr:0x2190,
Larr:0x219E,
lArr:0x21D0,
larrb:0x21E4,
larrbfs:0x291F,
larrfs:0x291D,
larrhk:0x21A9,
larrlp:0x21AB,
larrpl:0x2939,
larrsim:0x2973,
larrtl:0x21A2,
lat:0x2AAB,
latail:0x2919,
lAtail:0x291B,
late:0x2AAD,
lbarr:0x290C,
lBarr:0x290E,
lbbrk:0x2772,
lbrace:0x7B,
lbrack:0x5B,
lbrke:0x298B,
lbrksld:0x298F,
lbrkslu:0x298D,
Lcaron:0x013D,
lcaron:0x013E,
Lcedil:0x013B,
lcedil:0x013C,
lceil:0x2308,
lcub:0x7B,
Lcy:0x041B,
lcy:0x043B,
ldca:0x2936,
ldquo:0x201C,
ldquor:0x201E,
ldrdhar:0x2967,
ldrushar:0x294B,
ldsh:0x21B2,
le:0x2264,
lE:0x2266,
LeftAngleBracket:0x27E8,
LeftArrow:0x2190,
leftarrow:0x2190,
Leftarrow:0x21D0,
LeftArrowBar:0x21E4,
LeftArrowRightArrow:0x21C6,
leftarrowtail:0x21A2,
LeftCeiling:0x2308,
LeftDoubleBracket:0x27E6,
LeftDownTeeVector:0x2961,
LeftDownVector:0x21C3,
LeftDownVectorBar:0x2959,
LeftFloor:0x230A,
leftharpoondown:0x21BD,
leftharpoonup:0x21BC,
leftleftarrows:0x21C7,
LeftRightArrow:0x2194,
leftrightarrow:0x2194,
Leftrightarrow:0x21D4,
leftrightarrows:0x21C6,
leftrightharpoons:0x21CB,
leftrightsquigarrow:0x21AD,
LeftRightVector:0x294E,
LeftTee:0x22A3,
LeftTeeArrow:0x21A4,
LeftTeeVector:0x295A,
leftthreetimes:0x22CB,
LeftTriangle:0x22B2,
LeftTriangleBar:0x29CF,
LeftTriangleEqual:0x22B4,
LeftUpDownVector:0x2951,
LeftUpTeeVector:0x2960,
LeftUpVector:0x21BF,
LeftUpVectorBar:0x2958,
LeftVector:0x21BC,
LeftVectorBar:0x2952,
leg:0x22DA,
lEg:0x2A8B,
leq:0x2264,
leqq:0x2266,
leqslant:0x2A7D,
les:0x2A7D,
lescc:0x2AA8,
lesdot:0x2A7F,
lesdoto:0x2A81,
lesdotor:0x2A83,
lesges:0x2A93,
lessapprox:0x2A85,
lessdot:0x22D6,
lesseqgtr:0x22DA,
lesseqqgtr:0x2A8B,
LessEqualGreater:0x22DA,
LessFullEqual:0x2266,
LessGreater:0x2276,
lessgtr:0x2276,
LessLess:0x2AA1,
lesssim:0x2272,
LessSlantEqual:0x2A7D,
LessTilde:0x2272,
lfisht:0x297C,
lfloor:0x230A,
Lfr:0x1D50F,
lfr:0x1D529,
lg:0x2276,
lgE:0x2A91,
lHar:0x2962,
lhard:0x21BD,
lharu:0x21BC,
lharul:0x296A,
lhblk:0x2584,
LJcy:0x0409,
ljcy:0x0459,
ll:0x226A,
Ll:0x22D8,
llarr:0x21C7,
llcorner:0x231E,
Lleftarrow:0x21DA,
llhard:0x296B,
lltri:0x25FA,
Lmidot:0x013F,
lmidot:0x0140,
lmoust:0x23B0,
lmoustache:0x23B0,
lnap:0x2A89,
lnapprox:0x2A89,
lnE:0x2268,
lne:0x2A87,
lneq:0x2A87,
lneqq:0x2268,
lnsim:0x22E6,
loang:0x27EC,
loarr:0x21FD,
lobrk:0x27E6,
LongLeftArrow:0x27F5,
longleftarrow:0x27F5,
Longleftarrow:0x27F8,
LongLeftRightArrow:0x27F7,
longleftrightarrow:0x27F7,
Longleftrightarrow:0x27FA,
longmapsto:0x27FC,
LongRightArrow:0x27F6,
longrightarrow:0x27F6,
Longrightarrow:0x27F9,
looparrowleft:0x21AB,
looparrowright:0x21AC,
lopar:0x2985,
Lopf:0x1D543,
lopf:0x1D55D,
loplus:0x2A2D,
lotimes:0x2A34,
lowast:0x2217,
lowbar:0x5F,
LowerLeftArrow:0x2199,
LowerRightArrow:0x2198,
loz:0x25CA,
lozenge:0x25CA,
lozf:0x29EB,
lpar:0x28,
lparlt:0x2993,
lrarr:0x21C6,
lrcorner:0x231F,
lrhar:0x21CB,
lrhard:0x296D,
lrm:0x200E,
lrtri:0x22BF,
lsaquo:0x2039,
Lscr:0x2112,
lscr:0x1D4C1,
Lsh:0x21B0,
lsh:0x21B0,
lsim:0x2272,
lsime:0x2A8D,
lsimg:0x2A8F,
lsqb:0x5B,
lsquo:0x2018,
lsquor:0x201A,
Lstrok:0x0141,
lstrok:0x0142,
lt:0x3C,
LT:0x3C,
Lt:0x226A,
ltcc:0x2AA6,
ltcir:0x2A79,
ltdot:0x22D6,
lthree:0x22CB,
ltimes:0x22C9,
ltlarr:0x2976,
ltquest:0x2A7B,
ltri:0x25C3,
ltrie:0x22B4,
ltrif:0x25C2,
ltrPar:0x2996,
lurdshar:0x294A,
luruhar:0x2966,
macr:0xAF,
male:0x2642,
malt:0x2720,
maltese:0x2720,
map:0x21A6,
Map:0x2905,
mapsto:0x21A6,
mapstodown:0x21A7,
mapstoleft:0x21A4,
mapstoup:0x21A5,
marker:0x25AE,
mcomma:0x2A29,
Mcy:0x041C,
mcy:0x043C,
mdash:0x2014,
mDDot:0x223A,
measuredangle:0x2221,
MediumSpace:0x205F,
Mellintrf:0x2133,
Mfr:0x1D510,
mfr:0x1D52A,
mho:0x2127,
micro:0xB5,
mid:0x2223,
midast:0x2A,
midcir:0x2AF0,
middot:0xB7,
minus:0x2212,
minusb:0x229F,
minusd:0x2238,
minusdu:0x2A2A,
MinusPlus:0x2213,
mlcp:0x2ADB,
mldr:0x2026,
mnplus:0x2213,
models:0x22A7,
Mopf:0x1D544,
mopf:0x1D55E,
mp:0x2213,
Mscr:0x2133,
mscr:0x1D4C2,
mstpos:0x223E,
Mu:0x039C,
mu:0x03BC,
multimap:0x22B8,
mumap:0x22B8,
nabla:0x2207,
Nacute:0x0143,
nacute:0x0144,
nap:0x2249,
napos:0x0149,
napprox:0x2249,
natur:0x266E,
natural:0x266E,
naturals:0x2115,
NBSP:0xA0,
nbsp:0xA0,
ncap:0x2A43,
Ncaron:0x0147,
ncaron:0x0148,
Ncedil:0x0145,
ncedil:0x0146,
ncong:0x2247,
ncup:0x2A42,
Ncy:0x041D,
ncy:0x043D,
ndash:0x2013,
ne:0x2260,
nearhk:0x2924,
nearr:0x2197,
neArr:0x21D7,
nearrow:0x2197,
NegativeMediumSpace:0x200B,
NegativeThickSpace:0x200B,
NegativeThinSpace:0x200B,
NegativeVeryThinSpace:0x200B,
nequiv:0x2262,
nesear:0x2928,
NestedGreaterGreater:0x226B,
NestedLessLess:0x226A,
NewLine:0x0A,
nexist:0x2204,
nexists:0x2204,
Nfr:0x1D511,
nfr:0x1D52B,
nge:0x2271,
ngeq:0x2271,
ngsim:0x2275,
ngt:0x226F,
ngtr:0x226F,
nharr:0x21AE,
nhArr:0x21CE,
nhpar:0x2AF2,
ni:0x220B,
nis:0x22FC,
nisd:0x22FA,
niv:0x220B,
NJcy:0x040A,
njcy:0x045A,
nlarr:0x219A,
nlArr:0x21CD,
nldr:0x2025,
nle:0x2270,
nleftarrow:0x219A,
nLeftarrow:0x21CD,
nleftrightarrow:0x21AE,
nLeftrightarrow:0x21CE,
nleq:0x2270,
nless:0x226E,
nlsim:0x2274,
nlt:0x226E,
nltri:0x22EA,
nltrie:0x22EC,
nmid:0x2224,
NoBreak:0x2060,
NonBreakingSpace:0xA0,
Nopf:0x2115,
nopf:0x1D55F,
not:0xAC,
Not:0x2AEC,
NotCongruent:0x2262,
NotCupCap:0x226D,
NotDoubleVerticalBar:0x2226,
NotElement:0x2209,
NotEqual:0x2260,
NotExists:0x2204,
NotGreater:0x226F,
NotGreaterEqual:0x2271,
NotGreaterLess:0x2279,
NotGreaterTilde:0x2275,
notin:0x2209,
notinva:0x2209,
notinvb:0x22F7,
notinvc:0x22F6,
NotLeftTriangle:0x22EA,
NotLeftTriangleEqual:0x22EC,
NotLess:0x226E,
NotLessEqual:0x2270,
NotLessGreater:0x2278,
NotLessTilde:0x2274,
notni:0x220C,
notniva:0x220C,
notnivb:0x22FE,
notnivc:0x22FD,
NotPrecedes:0x2280,
NotPrecedesSlantEqual:0x22E0,
NotReverseElement:0x220C,
NotRightTriangle:0x22EB,
NotRightTriangleEqual:0x22ED,
NotSquareSubsetEqual:0x22E2,
NotSquareSupersetEqual:0x22E3,
NotSubsetEqual:0x2288,
NotSucceeds:0x2281,
NotSucceedsSlantEqual:0x22E1,
NotSupersetEqual:0x2289,
NotTilde:0x2241,
NotTildeEqual:0x2244,
NotTildeFullEqual:0x2247,
NotTildeTilde:0x2249,
NotVerticalBar:0x2224,
npar:0x2226,
nparallel:0x2226,
npolint:0x2A14,
npr:0x2280,
nprcue:0x22E0,
nprec:0x2280,
nrarr:0x219B,
nrArr:0x21CF,
nrightarrow:0x219B,
nRightarrow:0x21CF,
nrtri:0x22EB,
nrtrie:0x22ED,
nsc:0x2281,
nsccue:0x22E1,
Nscr:0x1D4A9,
nscr:0x1D4C3,
nshortmid:0x2224,
nshortparallel:0x2226,
nsim:0x2241,
nsime:0x2244,
nsimeq:0x2244,
nsmid:0x2224,
nspar:0x2226,
nsqsube:0x22E2,
nsqsupe:0x22E3,
nsub:0x2284,
nsube:0x2288,
nsubseteq:0x2288,
nsucc:0x2281,
nsup:0x2285,
nsupe:0x2289,
nsupseteq:0x2289,
ntgl:0x2279,
Ntilde:0xD1,
ntilde:0xF1,
ntlg:0x2278,
ntriangleleft:0x22EA,
ntrianglelefteq:0x22EC,
ntriangleright:0x22EB,
ntrianglerighteq:0x22ED,
Nu:0x039D,
nu:0x03BD,
num:0x23,
numero:0x2116,
numsp:0x2007,
nvdash:0x22AC,
nvDash:0x22AD,
nVdash:0x22AE,
nVDash:0x22AF,
nvHarr:0x2904,
nvinfin:0x29DE,
nvlArr:0x2902,
nvrArr:0x2903,
nwarhk:0x2923,
nwarr:0x2196,
nwArr:0x21D6,
nwarrow:0x2196,
nwnear:0x2927,
Oacute:0xD3,
oacute:0xF3,
oast:0x229B,
ocir:0x229A,
Ocirc:0xD4,
ocirc:0xF4,
Ocy:0x041E,
ocy:0x043E,
odash:0x229D,
Odblac:0x0150,
odblac:0x0151,
odiv:0x2A38,
odot:0x2299,
odsold:0x29BC,
OElig:0x0152,
oelig:0x0153,
ofcir:0x29BF,
Ofr:0x1D512,
ofr:0x1D52C,
ogon:0x02DB,
Ograve:0xD2,
ograve:0xF2,
ogt:0x29C1,
ohbar:0x29B5,
ohm:0x03A9,
oint:0x222E,
olarr:0x21BA,
olcir:0x29BE,
olcross:0x29BB,
oline:0x203E,
olt:0x29C0,
Omacr:0x014C,
omacr:0x014D,
Omega:0x03A9,
omega:0x03C9,
Omicron:0x039F,
omicron:0x03BF,
omid:0x29B6,
ominus:0x2296,
Oopf:0x1D546,
oopf:0x1D560,
opar:0x29B7,
OpenCurlyDoubleQuote:0x201C,
OpenCurlyQuote:0x2018,
operp:0x29B9,
oplus:0x2295,
or:0x2228,
Or:0x2A54,
orarr:0x21BB,
ord:0x2A5D,
order:0x2134,
orderof:0x2134,
ordf:0xAA,
ordm:0xBA,
origof:0x22B6,
oror:0x2A56,
orslope:0x2A57,
orv:0x2A5B,
oS:0x24C8,
oscr:0x2134,
Oscr:0x1D4AA,
Oslash:0xD8,
oslash:0xF8,
osol:0x2298,
Otilde:0xD5,
otilde:0xF5,
otimes:0x2297,
Otimes:0x2A37,
otimesas:0x2A36,
Ouml:0xD6,
ouml:0xF6,
ovbar:0x233D,
OverBar:0x203E,
OverBrace:0x23DE,
OverBracket:0x23B4,
OverParenthesis:0x23DC,
par:0x2225,
para:0xB6,
parallel:0x2225,
parsim:0x2AF3,
parsl:0x2AFD,
part:0x2202,
PartialD:0x2202,
Pcy:0x041F,
pcy:0x043F,
percnt:0x25,
period:0x2E,
permil:0x2030,
perp:0x22A5,
pertenk:0x2031,
Pfr:0x1D513,
pfr:0x1D52D,
Phi:0x03A6,
phi:0x03C6,
phiv:0x03D5,
phmmat:0x2133,
phone:0x260E,
Pi:0x03A0,
pi:0x03C0,
pitchfork:0x22D4,
piv:0x03D6,
planck:0x210F,
planckh:0x210E,
plankv:0x210F,
plus:0x2B,
plusacir:0x2A23,
plusb:0x229E,
pluscir:0x2A22,
plusdo:0x2214,
plusdu:0x2A25,
pluse:0x2A72,
PlusMinus:0xB1,
plusmn:0xB1,
plussim:0x2A26,
plustwo:0x2A27,
pm:0xB1,
Poincareplane:0x210C,
pointint:0x2A15,
Popf:0x2119,
popf:0x1D561,
pound:0xA3,
pr:0x227A,
Pr:0x2ABB,
prap:0x2AB7,
prcue:0x227C,
pre:0x2AAF,
prE:0x2AB3,
prec:0x227A,
precapprox:0x2AB7,
preccurlyeq:0x227C,
Precedes:0x227A,
PrecedesEqual:0x2AAF,
PrecedesSlantEqual:0x227C,
PrecedesTilde:0x227E,
preceq:0x2AAF,
precnapprox:0x2AB9,
precneqq:0x2AB5,
precnsim:0x22E8,
precsim:0x227E,
prime:0x2032,
Prime:0x2033,
primes:0x2119,
prnap:0x2AB9,
prnE:0x2AB5,
prnsim:0x22E8,
prod:0x220F,
Product:0x220F,
profalar:0x232E,
profline:0x2312,
profsurf:0x2313,
prop:0x221D,
Proportion:0x2237,
Proportional:0x221D,
propto:0x221D,
prsim:0x227E,
prurel:0x22B0,
Pscr:0x1D4AB,
pscr:0x1D4C5,
Psi:0x03A8,
psi:0x03C8,
puncsp:0x2008,
Qfr:0x1D514,
qfr:0x1D52E,
qint:0x2A0C,
Qopf:0x211A,
qopf:0x1D562,
qprime:0x2057,
Qscr:0x1D4AC,
qscr:0x1D4C6,
quaternions:0x210D,
quatint:0x2A16,
quest:0x3F,
questeq:0x225F,
quot:0x22,
QUOT:0x22,
rAarr:0x21DB,
Racute:0x0154,
racute:0x0155,
radic:0x221A,
raemptyv:0x29B3,
rang:0x27E9,
Rang:0x27EB,
rangd:0x2992,
range:0x29A5,
rangle:0x27E9,
raquo:0xBB,
rarr:0x2192,
Rarr:0x21A0,
rArr:0x21D2,
rarrap:0x2975,
rarrb:0x21E5,
rarrbfs:0x2920,
rarrc:0x2933,
rarrfs:0x291E,
rarrhk:0x21AA,
rarrlp:0x21AC,
rarrpl:0x2945,
rarrsim:0x2974,
rarrtl:0x21A3,
Rarrtl:0x2916,
rarrw:0x219D,
ratail:0x291A,
rAtail:0x291C,
ratio:0x2236,
rationals:0x211A,
rbarr:0x290D,
rBarr:0x290F,
RBarr:0x2910,
rbbrk:0x2773,
rbrace:0x7D,
rbrack:0x5D,
rbrke:0x298C,
rbrksld:0x298E,
rbrkslu:0x2990,
Rcaron:0x0158,
rcaron:0x0159,
Rcedil:0x0156,
rcedil:0x0157,
rceil:0x2309,
rcub:0x7D,
Rcy:0x0420,
rcy:0x0440,
rdca:0x2937,
rdldhar:0x2969,
rdquo:0x201D,
rdquor:0x201D,
rdsh:0x21B3,
Re:0x211C,
real:0x211C,
realine:0x211B,
realpart:0x211C,
reals:0x211D,
rect:0x25AD,
REG:0xAE,
reg:0xAE,
ReverseElement:0x220B,
ReverseEquilibrium:0x21CB,
ReverseUpEquilibrium:0x296F,
rfisht:0x297D,
rfloor:0x230B,
Rfr:0x211C,
rfr:0x1D52F,
rHar:0x2964,
rhard:0x21C1,
rharu:0x21C0,
rharul:0x296C,
Rho:0x03A1,
rho:0x03C1,
rhov:0x03F1,
RightAngleBracket:0x27E9,
RightArrow:0x2192,
rightarrow:0x2192,
Rightarrow:0x21D2,
RightArrowBar:0x21E5,
RightArrowLeftArrow:0x21C4,
rightarrowtail:0x21A3,
RightCeiling:0x2309,
RightDoubleBracket:0x27E7,
RightDownTeeVector:0x295D,
RightDownVector:0x21C2,
RightDownVectorBar:0x2955,
RightFloor:0x230B,
rightharpoondown:0x21C1,
rightharpoonup:0x21C0,
rightleftarrows:0x21C4,
rightleftharpoons:0x21CC,
rightrightarrows:0x21C9,
rightsquigarrow:0x219D,
RightTee:0x22A2,
RightTeeArrow:0x21A6,
RightTeeVector:0x295B,
rightthreetimes:0x22CC,
RightTriangle:0x22B3,
RightTriangleBar:0x29D0,
RightTriangleEqual:0x22B5,
RightUpDownVector:0x294F,
RightUpTeeVector:0x295C,
RightUpVector:0x21BE,
RightUpVectorBar:0x2954,
RightVector:0x21C0,
RightVectorBar:0x2953,
ring:0x02DA,
risingdotseq:0x2253,
rlarr:0x21C4,
rlhar:0x21CC,
rlm:0x200F,
rmoust:0x23B1,
rmoustache:0x23B1,
rnmid:0x2AEE,
roang:0x27ED,
roarr:0x21FE,
robrk:0x27E7,
ropar:0x2986,
Ropf:0x211D,
ropf:0x1D563,
roplus:0x2A2E,
rotimes:0x2A35,
RoundImplies:0x2970,
rpar:0x29,
rpargt:0x2994,
rppolint:0x2A12,
rrarr:0x21C9,
Rrightarrow:0x21DB,
rsaquo:0x203A,
Rscr:0x211B,
rscr:0x1D4C7,
Rsh:0x21B1,
rsh:0x21B1,
rsqb:0x5D,
rsquo:0x2019,
rsquor:0x2019,
rthree:0x22CC,
rtimes:0x22CA,
rtri:0x25B9,
rtrie:0x22B5,
rtrif:0x25B8,
rtriltri:0x29CE,
RuleDelayed:0x29F4,
ruluhar:0x2968,
rx:0x211E,
Sacute:0x015A,
sacute:0x015B,
sbquo:0x201A,
sc:0x227B,
Sc:0x2ABC,
scap:0x2AB8,
Scaron:0x0160,
scaron:0x0161,
sccue:0x227D,
sce:0x2AB0,
scE:0x2AB4,
Scedil:0x015E,
scedil:0x015F,
Scirc:0x015C,
scirc:0x015D,
scnap:0x2ABA,
scnE:0x2AB6,
scnsim:0x22E9,
scpolint:0x2A13,
scsim:0x227F,
Scy:0x0421,
scy:0x0441,
sdot:0x22C5,
sdotb:0x22A1,
sdote:0x2A66,
searhk:0x2925,
searr:0x2198,
seArr:0x21D8,
searrow:0x2198,
sect:0xA7,
semi:0x3B,
seswar:0x2929,
setminus:0x2216,
setmn:0x2216,
sext:0x2736,
Sfr:0x1D516,
sfr:0x1D530,
sfrown:0x2322,
sharp:0x266F,
SHCHcy:0x0429,
shchcy:0x0449,
SHcy:0x0428,
shcy:0x0448,
ShortDownArrow:0x2193,
ShortLeftArrow:0x2190,
shortmid:0x2223,
shortparallel:0x2225,
ShortRightArrow:0x2192,
ShortUpArrow:0x2191,
shy:0xAD,
Sigma:0x03A3,
sigma:0x03C3,
sigmaf:0x03C2,
sigmav:0x03C2,
sim:0x223C,
simdot:0x2A6A,
sime:0x2243,
simeq:0x2243,
simg:0x2A9E,
simgE:0x2AA0,
siml:0x2A9D,
simlE:0x2A9F,
simne:0x2246,
simplus:0x2A24,
simrarr:0x2972,
slarr:0x2190,
SmallCircle:0x2218,
smallsetminus:0x2216,
smashp:0x2A33,
smeparsl:0x29E4,
smid:0x2223,
smile:0x2323,
smt:0x2AAA,
smte:0x2AAC,
SOFTcy:0x042C,
softcy:0x044C,
sol:0x2F,
solb:0x29C4,
solbar:0x233F,
Sopf:0x1D54A,
sopf:0x1D564,
spades:0x2660,
spadesuit:0x2660,
spar:0x2225,
sqcap:0x2293,
sqcup:0x2294,
Sqrt:0x221A,
sqsub:0x228F,
sqsube:0x2291,
sqsubset:0x228F,
sqsubseteq:0x2291,
sqsup:0x2290,
sqsupe:0x2292,
sqsupset:0x2290,
sqsupseteq:0x2292,
squ:0x25A1,
Square:0x25A1,
square:0x25A1,
SquareIntersection:0x2293,
SquareSubset:0x228F,
SquareSubsetEqual:0x2291,
SquareSuperset:0x2290,
SquareSupersetEqual:0x2292,
SquareUnion:0x2294,
squarf:0x25AA,
squf:0x25AA,
srarr:0x2192,
Sscr:0x1D4AE,
sscr:0x1D4C8,
ssetmn:0x2216,
ssmile:0x2323,
sstarf:0x22C6,
Star:0x22C6,
star:0x2606,
starf:0x2605,
straightepsilon:0x03F5,
straightphi:0x03D5,
strns:0xAF,
sub:0x2282,
Sub:0x22D0,
subdot:0x2ABD,
sube:0x2286,
subE:0x2AC5,
subedot:0x2AC3,
submult:0x2AC1,
subne:0x228A,
subnE:0x2ACB,
subplus:0x2ABF,
subrarr:0x2979,
subset:0x2282,
Subset:0x22D0,
subseteq:0x2286,
subseteqq:0x2AC5,
SubsetEqual:0x2286,
subsetneq:0x228A,
subsetneqq:0x2ACB,
subsim:0x2AC7,
subsub:0x2AD5,
subsup:0x2AD3,
succ:0x227B,
succapprox:0x2AB8,
succcurlyeq:0x227D,
Succeeds:0x227B,
SucceedsEqual:0x2AB0,
SucceedsSlantEqual:0x227D,
SucceedsTilde:0x227F,
succeq:0x2AB0,
succnapprox:0x2ABA,
succneqq:0x2AB6,
succnsim:0x22E9,
succsim:0x227F,
SuchThat:0x220B,
Sum:0x2211,
sum:0x2211,
sung:0x266A,
sup:0x2283,
Sup:0x22D1,
sup1:0xB9,
sup2:0xB2,
sup3:0xB3,
supdot:0x2ABE,
supdsub:0x2AD8,
supe:0x2287,
supE:0x2AC6,
supedot:0x2AC4,
Superset:0x2283,
SupersetEqual:0x2287,
suphsol:0x27C9,
suphsub:0x2AD7,
suplarr:0x297B,
supmult:0x2AC2,
supne:0x228B,
supnE:0x2ACC,
supplus:0x2AC0,
supset:0x2283,
Supset:0x22D1,
supseteq:0x2287,
supseteqq:0x2AC6,
supsetneq:0x228B,
supsetneqq:0x2ACC,
supsim:0x2AC8,
supsub:0x2AD4,
supsup:0x2AD6,
swarhk:0x2926,
swarr:0x2199,
swArr:0x21D9,
swarrow:0x2199,
swnwar:0x292A,
szlig:0xDF,
Tab:0x09,
target:0x2316,
Tau:0x03A4,
tau:0x03C4,
tbrk:0x23B4,
Tcaron:0x0164,
tcaron:0x0165,
Tcedil:0x0162,
tcedil:0x0163,
Tcy:0x0422,
tcy:0x0442,
telrec:0x2315,
Tfr:0x1D517,
tfr:0x1D531,
there4:0x2234,
Therefore:0x2234,
therefore:0x2234,
Theta:0x0398,
theta:0x03B8,
thetasym:0x03D1,
thetav:0x03D1,
thickapprox:0x2248,
thicksim:0x223C,
thinsp:0x2009,
ThinSpace:0x2009,
thkap:0x2248,
thksim:0x223C,
THORN:0xDE,
thorn:0xFE,
tilde:0x02DC,
Tilde:0x223C,
TildeEqual:0x2243,
TildeFullEqual:0x2245,
TildeTilde:0x2248,
times:0xD7,
timesb:0x22A0,
timesbar:0x2A31,
timesd:0x2A30,
tint:0x222D,
toea:0x2928,
top:0x22A4,
topbot:0x2336,
topcir:0x2AF1,
Topf:0x1D54B,
topf:0x1D565,
topfork:0x2ADA,
tosa:0x2929,
tprime:0x2034,
TRADE:0x2122,
trade:0x2122,
triangle:0x25B5,
triangledown:0x25BF,
triangleleft:0x25C3,
trianglelefteq:0x22B4,
triangleq:0x225C,
triangleright:0x25B9,
trianglerighteq:0x22B5,
tridot:0x25EC,
trie:0x225C,
triminus:0x2A3A,
triplus:0x2A39,
trisb:0x29CD,
tritime:0x2A3B,
trpezium:0x23E2,
Tscr:0x1D4AF,
tscr:0x1D4C9,
TScy:0x0426,
tscy:0x0446,
TSHcy:0x040B,
tshcy:0x045B,
Tstrok:0x0166,
tstrok:0x0167,
twixt:0x226C,
twoheadleftarrow:0x219E,
twoheadrightarrow:0x21A0,
Uacute:0xDA,
uacute:0xFA,
uarr:0x2191,
Uarr:0x219F,
uArr:0x21D1,
Uarrocir:0x2949,
Ubrcy:0x040E,
ubrcy:0x045E,
Ubreve:0x016C,
ubreve:0x016D,
Ucirc:0xDB,
ucirc:0xFB,
Ucy:0x0423,
ucy:0x0443,
udarr:0x21C5,
Udblac:0x0170,
udblac:0x0171,
udhar:0x296E,
ufisht:0x297E,
Ufr:0x1D518,
ufr:0x1D532,
Ugrave:0xD9,
ugrave:0xF9,
uHar:0x2963,
uharl:0x21BF,
uharr:0x21BE,
uhblk:0x2580,
ulcorn:0x231C,
ulcorner:0x231C,
ulcrop:0x230F,
ultri:0x25F8,
Umacr:0x016A,
umacr:0x016B,
uml:0xA8,
UnderBar:0x5F,
UnderBrace:0x23DF,
UnderBracket:0x23B5,
UnderParenthesis:0x23DD,
Union:0x22C3,
UnionPlus:0x228E,
Uogon:0x0172,
uogon:0x0173,
Uopf:0x1D54C,
uopf:0x1D566,
UpArrow:0x2191,
uparrow:0x2191,
Uparrow:0x21D1,
UpArrowBar:0x2912,
UpArrowDownArrow:0x21C5,
UpDownArrow:0x2195,
updownarrow:0x2195,
Updownarrow:0x21D5,
UpEquilibrium:0x296E,
upharpoonleft:0x21BF,
upharpoonright:0x21BE,
uplus:0x228E,
UpperLeftArrow:0x2196,
UpperRightArrow:0x2197,
upsi:0x03C5,
Upsi:0x03D2,
upsih:0x03D2,
Upsilon:0x03A5,
upsilon:0x03C5,
UpTee:0x22A5,
UpTeeArrow:0x21A5,
upuparrows:0x21C8,
urcorn:0x231D,
urcorner:0x231D,
urcrop:0x230E,
Uring:0x016E,
uring:0x016F,
urtri:0x25F9,
Uscr:0x1D4B0,
uscr:0x1D4CA,
utdot:0x22F0,
Utilde:0x0168,
utilde:0x0169,
utri:0x25B5,
utrif:0x25B4,
uuarr:0x21C8,
Uuml:0xDC,
uuml:0xFC,
uwangle:0x29A7,
vangrt:0x299C,
varepsilon:0x03F5,
varkappa:0x03F0,
varnothing:0x2205,
varphi:0x03D5,
varpi:0x03D6,
varpropto:0x221D,
varr:0x2195,
vArr:0x21D5,
varrho:0x03F1,
varsigma:0x03C2,
vartheta:0x03D1,
vartriangleleft:0x22B2,
vartriangleright:0x22B3,
vBar:0x2AE8,
Vbar:0x2AEB,
vBarv:0x2AE9,
Vcy:0x0412,
vcy:0x0432,
vdash:0x22A2,
vDash:0x22A8,
Vdash:0x22A9,
VDash:0x22AB,
Vdashl:0x2AE6,
vee:0x2228,
Vee:0x22C1,
veebar:0x22BB,
veeeq:0x225A,
vellip:0x22EE,
verbar:0x7C,
Verbar:0x2016,
vert:0x7C,
Vert:0x2016,
VerticalBar:0x2223,
VerticalLine:0x7C,
VerticalSeparator:0x2758,
VerticalTilde:0x2240,
VeryThinSpace:0x200A,
Vfr:0x1D519,
vfr:0x1D533,
vltri:0x22B2,
Vopf:0x1D54D,
vopf:0x1D567,
vprop:0x221D,
vrtri:0x22B3,
Vscr:0x1D4B1,
vscr:0x1D4CB,
Vvdash:0x22AA,
vzigzag:0x299A,
Wcirc:0x0174,
wcirc:0x0175,
wedbar:0x2A5F,
wedge:0x2227,
Wedge:0x22C0,
wedgeq:0x2259,
weierp:0x2118,
Wfr:0x1D51A,
wfr:0x1D534,
Wopf:0x1D54E,
wopf:0x1D568,
wp:0x2118,
wr:0x2240,
wreath:0x2240,
Wscr:0x1D4B2,
wscr:0x1D4CC,
xcap:0x22C2,
xcirc:0x25EF,
xcup:0x22C3,
xdtri:0x25BD,
Xfr:0x1D51B,
xfr:0x1D535,
xharr:0x27F7,
xhArr:0x27FA,
Xi:0x039E,
xi:0x03BE,
xlarr:0x27F5,
xlArr:0x27F8,
xmap:0x27FC,
xnis:0x22FB,
xodot:0x2A00,
Xopf:0x1D54F,
xopf:0x1D569,
xoplus:0x2A01,
xotime:0x2A02,
xrarr:0x27F6,
xrArr:0x27F9,
Xscr:0x1D4B3,
xscr:0x1D4CD,
xsqcup:0x2A06,
xuplus:0x2A04,
xutri:0x25B3,
xvee:0x22C1,
xwedge:0x22C0,
Yacute:0xDD,
yacute:0xFD,
YAcy:0x042F,
yacy:0x044F,
Ycirc:0x0176,
ycirc:0x0177,
Ycy:0x042B,
ycy:0x044B,
yen:0xA5,
Yfr:0x1D51C,
yfr:0x1D536,
YIcy:0x0407,
yicy:0x0457,
Yopf:0x1D550,
yopf:0x1D56A,
Yscr:0x1D4B4,
yscr:0x1D4CE,
YUcy:0x042E,
yucy:0x044E,
yuml:0xFF,
Yuml:0x0178,
Zacute:0x0179,
zacute:0x017A,
Zcaron:0x017D,
zcaron:0x017E,
Zcy:0x0417,
zcy:0x0437,
Zdot:0x017B,
zdot:0x017C,
zeetrf:0x2128,
ZeroWidthSpace:0x200B,
Zeta:0x0396,
zeta:0x03B6,
Zfr:0x2128,
zfr:0x1D537,
ZHcy:0x0416,
zhcy:0x0436,
zigrarr:0x21DD,
Zopf:0x2124,
zopf:0x1D56B,
Zscr:0x1D4B5,
zscr:0x1D4CF,
zwj:0x200D,
zwnj:0x200C };



/*
   Composition assignments:
      DownBreve   U+0311
      TripleDot   U+20DB
      tdot        U+20DB
      DotDot      U+20DC
      nvgt        U+003E U+20D2
      nvlt        U+003C U+20D2
   Compound assignments:
     acE                      U+223E U+0333
     bne                      U+003D U+20E5
     bnequiv                  U+2261 U+20E5
     caps                     U+2229 U+FE00
     cups                     U+222A U+FE00
     fjlig                    U+0066 U+006A
     gesl                     U+22DB U+FE00
     gvertneqq                U+2269 U+FE00
     gvnE                     U+2269 U+FE00
     lates                    U+2AAD U+FE00
     lesg                     U+22DA U+FE00
     lvertneqq                U+2268 U+FE00
     lvnE                     U+2268 U+FE00
     nang                     U+2220 U+20D2
     napE                     U+2A70 U+0338
     napid                    U+224B U+0338
     nbump                    U+224E U+0338
     nbumpe                   U+224F U+0338
     ncongdot                 U+2A6D U+0338
     nedot                    U+2250 U+0338
     nesim                    U+2242 U+0338
     ngE                      U+2267 U+0338
     ngeqq                    U+2267 U+0338
     ngeqslant                U+2A7E U+0338
     nges                     U+2A7E U+0338
     nGg                      U+22D9 U+0338
     nGt                      U+226B U+20D2
     nGtv                     U+226B U+0338
     nlE                      U+2266 U+0338
     nleqq                    U+2266 U+0338
     nleqslant                U+2A7D U+0338
     nles                     U+2A7D U+0338
     nLl                      U+22D8 U+0338
     nLt                      U+226A U+20D2
     nLtv                     U+226A U+0338
     NotEqualTilde            U+2242 U+0338
     NotGreaterFullEqual      U+2267 U+0338
     NotGreaterGreater        U+226B U+0338
     NotGreaterSlantEqual     U+2A7E U+0338
     NotHumpDownHump          U+224E U+0338
     NotHumpEqual             U+224F U+0338
     notindot                 U+22F5 U+0338
     notinE                   U+22F9 U+0338
     NotLeftTriangleBar       U+29CF U+0338
     NotLessLess              U+226A U+0338
     NotLessSlantEqual        U+2A7D U+0338
     NotNestedGreaterGreater  U+2AA2 U+0338
     NotNestedLessLess        U+2AA1 U+0338
     NotPrecedesEqual         U+2AAF U+0338
     NotRightTriangleBar      U+29D0 U+0338
     NotSquareSubset          U+228F U+0338
     NotSquareSuperset        U+2290 U+0338
     NotSubset                U+2282 U+20D2
     NotSucceedsEqual         U+2AB0 U+0338
     NotSucceedsTilde         U+227F U+0338
     NotSuperset              U+2283 U+20D2
     nparsl                   U+2AFD U+20E5
     npart                    U+2202 U+0338
     npre                     U+2AAF U+0338
     npreceq                  U+2AAF U+0338
     nrarrc                   U+2933 U+0338
     nrarrw                   U+219D U+0338
     nsce                     U+2AB0 U+0338
     nsubE                    U+2AC5 U+0338
     nsubset                  U+2282 U+20D2
     nsubseteqq               U+2AC5 U+0338
     nsucceq                  U+2AB0 U+0338
     nsupE                    U+2AC6 U+0338
     nsupset                  U+2283 U+20D2
     nsupseteqq               U+2AC6 U+0338
     nvap                     U+224D U+20D2
     nvge                     U+2265 U+20D2
     nvle                     U+2264 U+20D2
     nvltrie                  U+22B4 U+20D2
     nvrtrie                  U+22B5 U+20D2
     nvsim                    U+223C U+20D2
     race                     U+223D U+0331
     smtes                    U+2AAC U+FE00
     sqcaps                   U+2293 U+FE00
     sqcups                   U+2294 U+FE00
     ThickSpace               U+205F U+200A
     varsubsetneq             U+228A U+FE00
     varsubsetneqq            U+2ACB U+FE00
     varsupsetneq             U+228B U+FE00
     varsupsetneqq            U+2ACC U+FE00
     vnsub                    U+2282 U+20D2
     vnsup                    U+2283 U+20D2
     vsubne                   U+228A U+FE00
     vsubnE                   U+2ACB U+FE00
     vsupne                   U+228B U+FE00
     vsupnE                   U+2ACC U+FE00
*/


STRLIB.camelCasing  =  function (alter) {
   /**
    Upcase first character, keep inner camelCasing
    @version 2012-08-26 PerfektesChaos@de.wikipedia
    @param   alter  string to be camelCased
    @return  camelCased string
   */
   return  alter.substr(0, 1).toUpperCase()  +  alter.substr(1);
};   // .camelCasing()



STRLIB.capitalize  =  function (alter) {
   /**
    Upcase first character, downcase anything else
    @version 2012-08-26 PerfektesChaos@de.wikipedia
    @param   alter  string to be capitalized
    @return  capitalized string
   */
   return  alter.substr(0, 1).toUpperCase()
           +  alter.substr(1).toLowerCase();
};   // .capitalize()



STRLIB.charEntity  =  function (adjust) {
   /**
    Retrieve character code (UCS) for named HTML4 or numeric entity
    @version 2012-03-09 PerfektesChaos@de.wikipedia
    @param   adjust   string to be examined
    @return  information about character
             <BR><TT>false</TT>   if not resolved
             <BR><TT>number</TT>  UCS code of single character
    @since   JavaScript 1.3   String.charCodeAt()
   */
   // Uses:
   //    .charEntityCode()
   //    .charEntityHTML4()
   var r;
   if (adjust.charCodeAt(1) === 35) {   // '#'
      r  =  this.charEntityCode(adjust);
   } else {
      r  =  this.charEntityHTML4(adjust);
   }
   return  r;
};   // .charEntity()



STRLIB.charEntityAt  =  function (adjust, address, advance) {
   /**
    Retrieve character code of ML entity at position
    @version 2012-03-09 PerfektesChaos@de.wikipedia
    @param   adjust   string to be examined
    @param   address  position in adjust
    @param   advance  true: '&' at address;   false: ';' at address
    @return  Array with entity information,  or <TT>false</TT>
             <BR><TT>[0]</TT> code value
             <BR><TT>[1]</TT> entity position
             <BR><TT>[2]</TT> length of entity
    @since   JavaScript 1.3   String.charCodeAt()
   */
   // Uses:
   //    .charEntity()
   var r  =  false,
       n  =  0,
       i;
   i  =  adjust.charCodeAt(address);
   if (advance) {
      if (i === 38) {   // '&'
         i  =  adjust.indexOf(";",  address + 2);
         if (i > address) {
            n  =  i - address + 1;
            i  =  address;
         }
      }
   } else {
      if (i === 59) {   // ';'
         if (address > 2) {
            i  =  adjust.lastIndexOf("&",  address - 2);
            if (i >= 0) {
               n  =  address - i + 1;
            }
         }
      }
   }
   if (n) {
      if (n < 8) {
         r  =  this.charEntity(adjust.substr(i, n));
      }
      if (r) {
         r  =  [ r, i, n ];
      }
   }
   return  r;
};   // .charEntityAt()



STRLIB.charEntityCode  =  function (adjust) {
   /**
    Retrieve character code (UCS) for numeric ML entity
    @version 2010-03-30 PerfektesChaos@de.wikipedia
    @param   adjust string with character entity like "&#xHH;" or "&#NN;"
             <BR>first two characters are assumed to be '&#'
             <BR>third character may be  'x' or digit
             <BR>last character is assumed to be ';'
    @return  information about character
             <BR><TT>false</TT>   if not resolved
             <BR><TT>number</TT>  UCS code of single character
    @since   JavaScript 1.3   String.charCodeAt()
   */
   var s  =  adjust.substr(2,  adjust.length - 3),
       n;
   if (s.charCodeAt(0) === 120) {   // hex
      n  =  parseInt(s.substr(1), 16);
   } else {   // dec
      n  =  parseInt(s, 10);
   }
   if (isNaN(n)) {   // failure
      n  =  0;
   }
   return  (n > 0  ?  n  :  false);
};   // .charEntityCode()



STRLIB.charEntityHTML4  =  function (adjust) {
   /**
    Retrieve character code (UCS) for named HTML4 (or similar) entity
    @version 2012-03-09 PerfektesChaos@de.wikipedia
    @param   adjust string with character named entity "&xyz;"
             <BR>first character is assumed to be '&'
             <BR>last character is assumed to be ';'
    @return  information about character
             <BR><TT>false</TT>   if not resolved
             <BR><TT>number</TT>  UCS code of single character
    @deprecated 2016-09-18, replaced by charEntityHTML5single
    @see        #charEntityHTML5single
   */
   var r;
   switch (adjust.substr(1,  adjust.length - 2)) {
     /* ML escapes */
case "quot"    : r=  34; break;
case "amp"     : r=  38; break;
case "apos"    : r=  39; break;
case "lt"      : r=  60; break;
case "gt"      : r=  62; break;
case "nbsp"    : r= 160; break;
case "iexcl"   : r= 161; break;
case "cent"    : r= 162; break;
case "pound"   : r= 163; break;
case "curren"  : r= 164; break;
case "yen"     : r= 165; break;
case "brvbar"  : r= 166; break;
case "sect"    : r= 167; break;
case "uml"     : r= 168; break;
case "copy"    : r= 169; break;
case "ordf"    : r= 170; break;
case "laquo"   : r= 171; break;
case "not"     : r= 172; break;
case "shy"     : r= 173; break;
case "reg"     : r= 174; break;
case "macr"    : r= 175; break;
case "deg"     : r= 176; break;
case "plusmn"  : r= 177; break;
case "sup2"    : r= 178; break;
case "sup3"    : r= 179; break;
case "acute"   : r= 180; break;
case "micro"   : r= 181; break;
case "para"    : r= 182; break;
case "middot"  : r= 183; break;
case "cedil"   : r= 184; break;
case "sup1"    : r= 185; break;
case "ordm"    : r= 186; break;
case "raquo"   : r= 187; break;
case "frac14"  : r= 188; break;
case "frac12"  : r= 189; break;
case "frac34"  : r= 190; break;
case "iquest"  : r= 191; break;
case "Agrave"  : r= 192; break;
case "Aacute"  : r= 193; break;
case "Acirc"   : r= 194; break;
case "Atilde"  : r= 195; break;
case "Auml"    : r= 196; break;
case "Aring"   : r= 197; break;
case "AElig"   : r= 198; break;
case "Ccedil"  : r= 199; break;
case "Egrave"  : r= 200; break;
case "Eacute"  : r= 201; break;
case "Ecirc"   : r= 202; break;
case "Euml"    : r= 203; break;
case "Igrave"  : r= 204; break;
case "Iacute"  : r= 205; break;
case "Icirc"   : r= 206; break;
case "Iuml"    : r= 207; break;
case "ETH"     : r= 208; break;
case "Ntilde"  : r= 209; break;
case "Ograve"  : r= 210; break;
case "Oacute"  : r= 211; break;
case "Ocirc"   : r= 212; break;
case "Otilde"  : r= 213; break;
case "Ouml"    : r= 214; break;
case "times"   : r= 215; break;
case "Oslash"  : r= 216; break;
case "Ugrave"  : r= 217; break;
case "Uacute"  : r= 218; break;
case "Ucirc"   : r= 219; break;
case "Uuml"    : r= 220; break;
case "Yacute"  : r= 221; break;
case "THORN"   : r= 222; break;
case "szlig"   : r= 223; break;
case "agrave"  : r= 224; break;
case "aacute"  : r= 225; break;
case "acirc"   : r= 226; break;
case "atilde"  : r= 227; break;
case "auml"    : r= 228; break;
case "aring"   : r= 229; break;
case "aelig"   : r= 230; break;
case "ccedil"  : r= 231; break;
case "egrave"  : r= 232; break;
case "eacute"  : r= 233; break;
case "ecirc"   : r= 234; break;
case "euml"    : r= 235; break;
case "igrave"  : r= 236; break;
case "iacute"  : r= 237; break;
case "icirc"   : r= 238; break;
case "iuml"    : r= 239; break;
case "eth"     : r= 240; break;
case "ntilde"  : r= 241; break;
case "ograve"  : r= 242; break;
case "oacute"  : r= 243; break;
case "ocirc"   : r= 244; break;
case "otilde"  : r= 245; break;
case "ouml"    : r= 246; break;
case "divide"  : r= 247; break;
case "oslash"  : r= 248; break;
case "ugrave"  : r= 249; break;
case "uacute"  : r= 250; break;
case "ucirc"   : r= 251; break;
case "uuml"    : r= 252; break;
case "yacute"  : r= 253; break;
case "thorn"   : r= 254; break;
case "yuml"    : r= 255; break;
case "OElig"   : r= 338; break;
case "oelig"   : r= 339; break;
case "Scaron"  : r= 352; break;
case "scaron"  : r= 353; break;
case "Yuml"    : r= 376; break;
case "fnof"    : r= 402; break;
case "circ"    : r= 710; break;
case "tilde"   : r= 732; break;
case "Alpha"   : r= 913; break;
case "Beta"    : r= 914; break;
case "Gamma"   : r= 915; break;
case "Delta"   : r= 916; break;
case "Epsilon" : r= 917; break;
case "Zeta"    : r= 918; break;
case "Eta"     : r= 919; break;
case "Theta"   : r= 920; break;
case "Iota"    : r= 921; break;
case "Kappa"   : r= 922; break;
case "Lambda"  : r= 923; break;
case "Mu"      : r= 924; break;
case "Nu"      : r= 925; break;
case "Xi"      : r= 926; break;
case "Omicron" : r= 927; break;
case "Pi"      : r= 928; break;
case "Rho"     : r= 929; break;
case "Sigma"   : r= 931; break;
case "Tau"     : r= 932; break;
case "Upsilon" : r= 933; break;
case "Phi"     : r= 934; break;
case "Chi"     : r= 935; break;
case "Psi"     : r= 936; break;
case "Omega"   : r= 937; break;
case "alpha"   : r= 945; break;
case "beta"    : r= 946; break;
case "gamma"   : r= 947; break;
case "delta"   : r= 948; break;
case "epsilon" : r= 949; break;
case "zeta"    : r= 950; break;
case "eta"     : r= 951; break;
case "theta"   : r= 952; break;
case "iota"    : r= 953; break;
case "kappa"   : r= 954; break;
case "lambda"  : r= 955; break;
case "mu"      : r= 956; break;
case "nu"      : r= 957; break;
case "xi"      : r= 958; break;
case "omicron" : r= 959; break;
case "pi"      : r= 960; break;
case "rho"     : r= 961; break;
case "sigmaf"  : r= 962; break;
case "sigma"   : r= 963; break;
case "tau"     : r= 964; break;
case "upsilon" : r= 965; break;
case "phi"     : r= 966; break;
case "chi"     : r= 967; break;
case "psi"     : r= 968; break;
case "omega"   : r= 969; break;
case "thetasym": r= 977; break;
case "upsih"   : r= 978; break;
case "piv"     : r= 982; break;
case "thinsp"  : r=8201; break;
case "zwnj"    : r=8204; break;
case "zwj"     : r=8205; break;
case "lrm"     : r=8206; break;
case "rlm"     : r=8207; break;
case "ensp"    : r=8194; break;
case "emsp"    : r=8195; break;
case "ndash"   : r=8211; break;
case "mdash"   : r=8212; break;
case "lsquo"   : r=8216; break;
case "rsquo"   : r=8217; break;
case "sbquo"   : r=8218; break;
case "ldquo"   : r=8220; break;
case "rdquo"   : r=8221; break;
case "bdquo"   : r=8222; break;
case "dagger"  : r=8224; break;
case "Dagger"  : r=8225; break;
case "bull"    : r=8226; break;
case "hellip"  : r=8230; break;
case "permil"  : r=8240; break;
case "prime"   : r=8242; break;
case "Prime"   : r=8243; break;
case "lsaquo"  : r=8249; break;
case "rsaquo"  : r=8250; break;
case "oline"   : r=8254; break;
case "frasl"   : r=8260; break;
case "euro"    : r=8364; break;
case "image"   : r=8465; break;
case "weierp"  : r=8472; break;
case "real"    : r=8476; break;
case "trade"   : r=8482; break;
case "alefsym" : r=8501; break;
case "larr"    : r=8592; break;
case "uarr"    : r=8593; break;
case "rarr"    : r=8594; break;
case "darr"    : r=8595; break;
case "harr"    : r=8596; break;
case "crarr"   : r=8629; break;
case "lArr"    : r=8656; break;
case "uArr"    : r=8657; break;
case "rArr"    : r=8658; break;
case "dArr"    : r=8659; break;
case "hArr"    : r=8660; break;
case "forall"  : r=8704; break;
case "part"    : r=8706; break;
case "exist"   : r=8707; break;
case "empty"   : r=8709; break;
case "nabla"   : r=8711; break;
case "isin"    : r=8712; break;
case "notin"   : r=8713; break;
case "ni"      : r=8715; break;
case "prod"    : r=8719; break;
case "sum"     : r=8721; break;
case "minus"   : r=8722; break;
case "lowast"  : r=8727; break;
case "radic"   : r=8730; break;
case "prop"    : r=8733; break;
case "infin"   : r=8734; break;
case "ang"     : r=8736; break;
case "and"     : r=8743; break;
case "or"      : r=8744; break;
case "cap"     : r=8745; break;
case "cup"     : r=8746; break;
case "int"     : r=8747; break;
case "there4"  : r=8756; break;
case "sim"     : r=8764; break;
case "cong"    : r=8773; break;
case "asymp"   : r=8776; break;
case "ne"      : r=8800; break;
case "equiv"   : r=8801; break;
case "le"      : r=8804; break;
case "ge"      : r=8805; break;
case "sub"     : r=8834; break;
case "sup"     : r=8835; break;
case "nsub"    : r=8836; break;
case "sube"    : r=8838; break;
case "supe"    : r=8839; break;
case "oplus"   : r=8853; break;
case "otimes"  : r=8855; break;
case "perp"    : r=8869; break;
case "sdot"    : r=8901; break;
case "lceil"   : r=8968; break;
case "rceil"   : r=8969; break;
case "lfloor"  : r=8970; break;
case "rfloor"  : r=8971; break;
case "lang"    : r=9001; break;
case "rang"    : r=9002; break;
case "loz"     : r=9674; break;
case "spades"  : r=9824; break;
case "clubs"   : r=9827; break;
case "hearts"  : r=9829; break;
case "diams"   : r=9830; break;
case "lsqb"    : r=  91; break; //  [
case "rsqb"    : r=  93; break; //  ]
case "lcub"    : r= 123; break; //  {
case "verbar"  : r= 124; break; //  |
case "rcub"    : r= 125; break; //  }
      default :
         r  =  false;
         break;
   }   // switch substr
   return  r;
};   // .charEntityHTML4()



STRLIB.charEntityHTML5single  =  function (adjust) {
   /**
    Retrieve single character code (UCS) for named HTML5 entity
    @version 2016-09-18 PerfektesChaos@de.wikipedia
    @param   adjust string with character named entity "&xyz;"
             <BR>first character is assumed to be '&'
             <BR>last character is assumed to be ';'
    @return  information about character
             <BR><TT>false</TT>   if not resolved
             <BR><TT>number</TT>  UCS code of single character
   */
   // Uses:
   //    >  .charEnt5single
   return STRLIB.charEnt5single[ adjust.substr(1,  adjust.length - 2) ]
          ||   false;
};   // .charEntityHTML5()



STRLIB.deCapitalize  =  function (alter) {
   /**
    Downcase first character; keep inner camelCasing
    @version 2011-04-26 PerfektesChaos@de.wikipedia
    @param   alter  string to be decapitalized
    @return  decapitalized string
   */
   return  alter.substr(0, 1).toLowerCase()  +  alter.substr(1);
};   // .deCapitalize()



STRLIB.decodeOctet  =  function (assembly, address) {
   /**
    Retrieve hexadecimal value of octet similar to parseInt() base 16
    but consider uppercase A-F only
    @version 2010-06-26 PerfektesChaos@de.wikipedia
    @param   assembly  string to be analyzed
    @param   address   index in string
    @return  parsed number 0...15, or -1 if invalid
    @since   JavaScript 1.3   String.charCodeAt()
   */
   var r  =  -1,
       c;
   if (assembly.length  >  address + 1) {
      c  =  assembly.charCodeAt(address);
      if (c > 47  &&  c < 58) {
         r  =  c - 48;
      } else if (c > 64  &&  c < 71) {
         r  =  c - 55;
      }
      if (r >= 0) {
         r  *=  16;
         c   =  assembly.charCodeAt(address + 1);
         if (c > 47  &&  c < 58) {
            r  +=  c - 48;
         } else if (c > 64  &&  c < 71) {
            r  +=  c - 55;
         } else {
            r  =  -1;
         }
      }   // first digit
   }
   return  r;
};   // .decodeOctet()



STRLIB.decodeXML  =  function (alter) {
   /**
    Convert string with XML entities as unescaped string
    @version 2012-12-09 PerfektesChaos@de.wikipedia
    @param   alter  string to be analyzed
    @return  string, may be unchanged
    @since   JavaScript 1.3   String.charCodeAt()   String.fromCharCode()
   */
   var i  =  0,
       l  =  true,
       r  =  alter,
       k, n,
       s;
   do {
      i  =  r.indexOf("&", i);
      l  =  (i >= 0);
      if (l) {
         k  =  r.indexOf(";", i);
         if (k  <  i + 10) {
            n  =  k - i - 1;
            if (n > 1) {
               s  =  r.substr(i + 1,  n);
               if (s.charCodeAt(0)  ===  35) {   // '#'
                  s  =  this.parseIntNumber(s.substr(1), false);
               } else {
                  switch (s) {
                     case "amp" :
                        s  =  38;
                        break;
                     case "apos" :
                        s  =  39;
                        break;
                     case "gt" :
                        s  =  62;
                        break;
                     case "lt" :
                        s  =  60;
                        break;
                     case "quot" :
                        s  =  34;
                        break;
                     default :
                        s  =  false;
                  }   // switch s
               }
               if (s) {
                  r  =  (i  ?  r.substr(0, i)  :  "")
                        +  String.fromCharCode(s)
                        +  r.substr(k + 1);
               }
            }
         }
         i++;
      }
   } while (l);   // do
   return  r;
};   // .decodeXML()



STRLIB.escapeLight  =  function (alter) {
   /**
    Minimal escaping for HTML
    @version 2012-03-07 PerfektesChaos@de.wikipedia
    @param   alter  string to be escaped
    @return  string with escaping
   */
   return  alter.replace(/&/g, "&amp;").replace(/</g, "&lt;");
};   // .escapeLight()



STRLIB.fromCharCode  =  function (apply) {
   /**
    Extended fromCharCode for UCS > 0xFFFF (4 bytes/char)
    @version 2011-10-27 PerfektesChaos@de.wikipedia
    @param   apply  number, UCS
    @return  single character,
             which might have a string length of 2 instead of 1
    @since   JavaScript 1.3   String.fromCharCode()   2 byte chars only
   */
   var c,
       r;
   if (apply > 0xFFFF) {
      c  =  apply - 0x10000;
      r  =  String.fromCharCode( 0xD800  +  (c >> 10),
                                 0xDC00  +  (c & 0x3FF) );
   } else {
      r  =  String.fromCharCode(apply);
   }
   return r;
};   // .fromCharCode()



STRLIB.fromNum  =  function (adjust) {
   /**
    Format number as string
    @version 2012-03-11 PerfektesChaos@de.wikipedia
    @param   adjust  number to be formatted
    @return  adjust as string
   */
   return adjust.toString();
};   // .fromNum()



STRLIB.hexcode  =  function (amount, align, allow) {
   /**
    Retrieve hexadecimal representation
    @version 2011-01-27 PerfektesChaos@de.wikipedia
    @param   amount  number: decimal
    @param   align   left padded number of digits, or false
    @param   allow   true: use lowercase letters
    @return  string with hex number
   */
   var k  =  amount,
       r  =  "",
       s  =  (allow ? "0123456789abcdef" : "0123456789ABCDEF"),
       m;
   while (k > 0) {
      m  =  k % 16;
      r  =  s[m] + r;
      k  =  (k - m)  /  16;
   }   // while  k > 0
   if (align) {
      m  =  align - r.length;
      while (m > 0) {
         r  =  "0" + r;
         m--;
      }   // while  m > 0
   }   // left padding
   return  r;
};   // .hexcode()



STRLIB.isASCII  =  function (ask) {
   /**
    Test for ASCII only characters
    @version 2016-01-13 PerfektesChaos@de.wikipedia
    @param   ask  string to be examined
    @return  <TT>true</TT> iff ask consists of ASCII characters only
   */
   var r  =  true,
       c, i;
   for (i = 0;  i < ask.length;  i++) {
      c  =  ask.charCodeAt(i);
      if (! c  ||  c > 127) {
         r  =  false;
         break;   // for i
      }
   }   // for i
   return  r;
};   // .isASCII()



STRLIB.isBlank  =  function (ask, any) {
   /**
    Test for invisible character
    @version 2012-03-09 PerfektesChaos@de.wikipedia
    @param   ask  character code to be examined
    @param   any  <TT>true</TT>: include zero width and marks
    @return  <TT>true</TT>
             iff ask is any space or other invisible character code
   */
   var r  =  false;
   switch (ask) {
      case     32 : // ' '
      case    160 : // nbsp
      case   5760 : // OGHAM SPACE MARK
      case   8192 : // EN QUAD
      case   8193 : // EM QUAD
      case   8194 : // N-SPACE
      case   8195 : // M-SPACE
      case   8196 : // THREE-PER-EM SPACE
      case   8197 : // FOUR-PER-EM SPACE
      case   8198 : // SIX-PER-EM SPACE
      case   8199 : // FIGURE SPACE
      case   8200 : // PUNCTUATION SPACE
      case   8201 : // thinsp
      case   8202 : // HAIR SPACE (english typography)
      case   8239 : // NARROW NO-BREAK SPACE
      case   8287 : // MEDIUM MATHEMATICAL SPACE
      case  12288 : // IDEOGRAPHIC SPACE
      case  12351 : // IDEOGRAPHIC HALF FILL SPACE
      case 917536 : // TAG SPACE
         r  =  true;
         break;
      case    133 : // NEXT LINE (NEL)
      case   6158 : // MONGOLIAN VOWEL SEPARATOR
      case   8203 : // ZERO WIDTH SPACE
      case   8204 : // zwnj
      case   8205 : // zwj
      case   8206 : // lrm
      case   8207 : // rlm
      case   8232 : // LINE SEPARATOR
      case   8233 : // PARAGRAPH SEPARATOR
      case   8234 : // LEFT-TO-RIGHT EMBEDDING
      case   8235 : // RIGHT-TO-LEFT EMBEDDING
      case   8236 : // POP DIRECTIONAL FORMATTING
      case   8237 : // LEFT-TO-RIGHT OVERRIDE
      case   8238 : // RIGHT-TO-LEFT OVERRIDE
      case   8288 : // WORD JOINER
      case   8289 : // FUNCTION APPLICATION
      case   8290 : // INVISIBLE TIMES
      case   8291 : // INVISIBLE SEPARATOR
      case   8292 : // INVISIBLE PLUS
      case  65279 : // BYTE ORDER MARK
      case 917505 : // LANGUAGE TAG
         if (any) {
            r  =  true;
         }
         break;
   }   // switch ask
   return  r;
};   // .isBlank()



STRLIB.isLetter  =  function (ask) {
   /**
    Test whether a character is a letter (latin based, greek, cyrillic)
    @version 2013-06-25 PerfektesChaos@de.wikipedia
    @param   ask  character code to be examined, or string (first char)
    @return  <TT>true</TT> iff ask is identified as any kind of letter
    @since   JavaScript 1.3   String.charCodeAt()
   */
   // Uses:
   //    .sortChar()
   var n  =  ask,
       t  =  typeof(ask),
       r  =  false,
       x;
   if (t !== "number") {
      if (t === "string") {
         n  =  ask.charCodeAt(0);
      } else {
         n  =  -1;
      }
   }   // typeof
   if (n > 160) {
      x  =  this.sortChar(n, false);
      if (x) {
         t  =  typeof(x);
         if (t === "number") {
            n  =  x;
         } else if (t === "string") {
            n  =  90;
         } else {
            n  =  0;
         }
      } else {
         if (n >= 881  &&  n <= 1023) {   // Greek
            if (n >= 904) {
               r  =  true;
            } else if (n <= 883
                       ||   n === 886
                       ||   n === 887
                       ||   (n >= 891  &&  n <= 893)
                       ||   n === 902) {
               r  =  true;
            }
         } else if (n >= 1024  &&  n <= 1319) {   // Cyrillic
            if (n <= 1153  ||  n >= 1162) {
               r  =  true;
            }
         }
         n  =  128;
      }
   }   // non-ASCII
   if (n <= 122) {   // ASCII
      if (n >= 65) {
         r  =  (n <= 90  ||  n >= 97);
      }
   }
   return  r;
};   // .isLetter()



STRLIB.isWhiteBlank  =  function (ask, any, against) {
   /**
    Test for invisible character or newline
    @version 2012-04-25 PerfektesChaos@de.wikipedia
    @param   ask      character code to be examined
    @param   any      <TT>true</TT>:
                      include zero width and direction marks
    @param   against  <TT>true</TT>:
                      behave like .isBlank()
    @return  <TT>true</TT> iff ask is any whitespace or other invisible
    @see     .isBlank()
   */
   // Uses:
   //    .isBlank()
   var r;
   if (ask === 10  &&  ! against) {
      r  =  true;
   } else {
      r  =  this.isBlank(ask, any);
   }   // switch ask
   return  r;
};   // .isWhiteBlank()



STRLIB.makeString  =  function (apply, amount) {
   /**
    Return string of certain length with repeated character
    @version 2011-04-27 PerfektesChaos@de.wikipedia
    @param   apply   character code to be set
    @param   amount  number of repeated characters apply
    @return  new string
   */
   var s  =  "",
       c  =  String.fromCharCode(apply),
       i;
   for (i = 0;  i < amount;  i++) {
      s  =  s + c;
   }   // for i
   return  s;
};   // .makeString()



STRLIB.parseIntNumber  =  function (apply, assign) {
   /**
    Parse integer number string, but do not return NaN
    @version 2012-12-09 PerfektesChaos@de.wikipedia
    @param  apply     string to be manipulated, or undefined
    @param  assign    number base: 10 or 16; if false detect leading 'x'
    @return  number, 0 if not caught
    @since   JavaScript 1.3   String.charCodeAt()
   */
   var k  =  assign,
       r  =  0,
       s  =  apply;
   if (s) {
      if (! k) {
         k  =  s.charCodeAt(0);
         if (k === 88  ||  k === 120) {   // 'X' 'x'
            k  =  16;
            s  =  s.substr(1);
         } else {
            k  =  10;
         }
      }
      r  =  parseInt(s, k);
      if (isNaN(r)) {
         r  =  0;
      }
   } else {
      r  =  0;
   }
   return  r;
};   // .parseIntNumber()



STRLIB.setChar  =  function (array, apply, address) {
   /**
    Set character or string at certain string position
    @version 2012-02-22 PerfektesChaos@de.wikipedia
    @param   array    string to be manipulated
    @param   apply    character code or string to be set
    @param   address  single character position to be replaced
    @return  modified string
    @since   JavaScript 1.3   String.fromCharCode()
    One day direct array[i] setting might work in a JavaScript String.
   */
   var n  =  array.length,
       r  =  (typeof(apply) === "number"  ?  String.fromCharCode(apply)
                                          :  apply);
                                             // toString() done by concat
   if (! address) {
      r  =  r
            + array.substr(1);
   } else if (address === n) {
      r  =  array.substr(0, address)
            + r;
   } else {
      r  =  array.substr(0, address)
            + r
            + array.substr(address + 1);
   }
   return  r;
};   // .setChar()



STRLIB.setString  =  function (array, address, adjust, apply) {
   /**
    Modify string in certain range
    @version 2012-05-09 PerfektesChaos@de.wikipedia
    @param   array    string to be manipulated
    @param   address  character position to start replacement
    @param   adjust   range specification
                      number  of characters to be removed at address
                      string  (adjust.length is used as number)
    @param   apply    string to replace range
    @return  modified string
    @since   JavaScript 1.3   String.fromCharCode()
   */
   // One day direct array[i] setting might work in a JavaScript String.
   var n  =  false,
       r  =  false,
       t  =  typeof(adjust);
   if (t === "number") {
      n  =  adjust;
   } else if (t === "string") {
      n  =  adjust.length;
   }   // typeof
   if (n !== false) {
      if (address > 0) {
         r  =  array.substr(0, address)  +  apply;
      } else {
         r  =  apply;
      }   // head
      n  +=  address;
      if (n < array.length) {
        r  +=  array.substr(n);
      }   // tail
   }   // typeof
   return  r;
};   // .setString()



STRLIB.sortAppropriate  =  function (adjust) {
   /**
    Retrieve sortable character(s) in particular local environment (hook)
    <BR>(RegExp is not modified)
    @version 2015-03-15 PerfektesChaos@de.wikipedia
    @param   adjust character code of a single character
             <BR> 196 *  Ä
             <BR> 197 *  Å
             <BR> 198 *  Æ               *always*
             <BR> 228 *  ä
             <BR> 229 *  å
             <BR> 230 *  æ               *always*
             <BR> 208 *  Ð
             <BR> 272 *  Dstroke
             <BR> 240 *  ð
             <BR> 273 *  dstroke
             <BR> 568 *  db digraph      *always*
             <BR> 452 *  D with Z caron  *always*
             <BR> 497 *  D with Z        *always*
             <BR> 453 *  D with z caron  *always*
             <BR> 498 *  D with z        *always*
             <BR> 454 *  d with z caron  *always*
             <BR> 499 *  d with z        *always*
             <BR> 455 *  L with J        *always*
             <BR> 456 *  L with j        *always*
             <BR> 457 *  l with j        *always*
             <BR> 458 *  N with J        *always*
             <BR> 459 *  N with j        *always*
             <BR> 460 *  n with j        *always*
             <BR> 214 *  Ö
             <BR> 246 *  ö
             <BR> 338 *  OElig           *always*
             <BR> 339 *  oelig           *always*
             <BR> 546 *  OU              *always*
             <BR> 547 *  ou              *always*
             <BR> 569 *  qp digraph      *always*
             <BR> 223 *  ß               *always*
             <BR>7838 *  capital sharp S *always*
             <BR> 222 *  Þ               *always*
             <BR> 254 *  þ               *always*
             <BR> 220 *  Ü
             <BR> 252 *  ü
    @return  information about sortable character
             <BR><TT>false</TT>   no particular local request
             <BR><TT>true</TT>    remove character from sort key
             <BR><TT>number</TT>  with ASCII code of single character
             <BR><TT>string</TT>  of two ASCII characters,
                                  (first) character case will be kept,
                                  second char (if any) downcase.
    @see     .sortLang
    @see     .sortMode
   */
   var r  =  false;
   if (this.sortLang === undefined) {   // could be undeclared
      this.sortLang  =  false;
   }
   switch (this.sortLang) {
/*
      case "de" :
         r  =  sortLocale(adjust, "de");
         break;   // this.sortLang
 */
      case "dk" :
      case "no" :
      case "sv" :
         switch (adjust) {
            case  196 : // Ä
            case  197 : // Å
            case  198 : // Æ
            case  228 : // ä
            case  229 : // å
            case  230 : // æ
            case  214 : // Ö
            case  246 : // ö
               r  =  adjust;
               break;
            case  220 : // Ü
               r  =   89; // Y
               break;
            case  252 : // ü
               r  =  121; // y
               break;
         }   // switch adjust
         break;   // this.sortLang
   }   // switch this.sortLang
/*
   if (this.sortMode) {
      if (this.sortMode.indexOf("$expand") >= 0) {
         switch (adjust) {
            case  197 : // Å
               r  =  "Aa";
               break;
            case  229 : // å
               r  =  "aa";
               break;
            case  272 : // Dstroke
               r  =  "Dj";
               break;
            case  273 : // dstroke
               r  =  "dj";
               break;
         }   // switch adjust
      }   // $expand
   }   // this.sortMode
 */
   if (! r) {
      switch (adjust) {
         case  198 : // Æ
            r  =  "Ae";
            break;
         case  230 : // æ
            r  =  "ae";
            break;
/*
         case  240 : // ð
         case  273 : // dstroke
            r  =  100; // d
            break;
         case  208 : // Ð
         case  272 : // Dstroke
            r  =   68; // D
            break;
 */
         case  568 : // db digraph
            r  =  "db";
            break;
         case  452 : // D with Z with caron
         case  497 : // D with Z
            r  =  "DZ";
            break;
         case  453 : // D with z with caron
         case  498 : // D with z
            r  =  "Dz";
            break;
         case  454 : // d with z with caron
         case  499 : // d with z
            r  =  "dz";
            break;
         case  455 : // L with J
            r  =  "LJ";
            break;
         case  456 : // L with j
            r  =  "Lj";
            break;
         case  457 : // l with j
            r  =  "lj";
            break;
         case  458 : // N with J
            r  =  "NJ";
            break;
         case  459 : // N with j
            r  =  "Nj";
            break;
         case  460 : // n with j
            r  =  "nj";
            break;
         case  338 : // OElig
            r  =  "Oe";
            break;
         case  339 : // oelig
            r  =  "oe";
            break;
         case  546 : // OU
            r  =  "OU";
            break;
         case  547 : // ou
            r  =  "ou";
            break;
         case  569 : // qp digraph
            r  =  "qp";
            break;
         case  223 : // ß
            r  =  "ss";
            break;
         case 7838 : // CAPITAL SHARP S
            r  =  "SS";
            break;
         case  222 : // Þ
            r  =  "Th";
            break;
         case  254 : // þ
            r  =  "th";
            break;
      }   // switch adjust
   }    // not yet defined
   return r;
};   // .sortAppropriate()



STRLIB.sortChar  =  function (adjust) {
   /**
    Retrieve sortable character(s) for non-ASCII Latin based Unicode
    <BR>(RegExp is not modified)
    @version 2016-07-20 PerfektesChaos@de.wikipedia
    @param   adjust character code of a single character
             <BR>(expecting <TT>adjust</TT> from 160 up)
    @return  information about sortable character
             <BR><TT>false</TT>   if nothing to do
             <BR><TT>true</TT>    remove character from sort key
             <BR><TT>number</TT>  with ASCII code of single character
             <BR><TT>string</TT>  of two ASCII characters,
                                  (first) character case will be kept,
                                  second char (if any) downcase.
             <BR>Only glyphs used in any (European) language considered.
   */
   // Uses:
   //    .sortAppropriate()
   var r  =  false;
   if (adjust >= 160) {   // combining
      if ( (adjust >=   768  &&  adjust <=   879)   ||   // 0300...036F
           (adjust >=  6832  &&  adjust <=  6911)   ||   // 1AB0...1AFF
           (adjust >=  7616  &&  adjust <=  7679)   ||   // 1DC0...1DFF
           (adjust >= 65056  &&  adjust <= 65071)        // FE20...FE2F
         ) {
         r  =  true;
      } else {   // not combining
         switch (adjust) {
            case  160 : // nbsp
            case 8194 : // N-SPACE
            case 8195 : // M-SPACE
            case 8196 : // THREE-PER-EM SPACE
            case 8197 : // FOUR-PER-EM SPACE
            case 8198 : // SIX-PER-EM SPACE
            case 8199 : // FIGURE SPACE
            case 8200 : // PUNCTUATION SPACE
            case 8201 : // thinsp
            case 8202 : // hair space (english typography)
            case 8239 : // NARROW NO-BREAK SPACE
               r  =   32;  // SPC
               break;
            case 8208 : // HYPHEN
            case 8209 : // NON-BREAKING HYPHEN
            case 8722 : // MINUS sign
               r  =   45;  // HYPHEN
               break;
            case  196 : // Ä
               r  =  this.sortAppropriate(adjust);
               if (r) {   break;   }
            case  197 : // Å
               r  =  this.sortAppropriate(adjust);
               if (r) {   break;   }
            case  192 : // À
            case  193 : // Á
            case  194 : // Â
            case  195 : // Ã
            case  256 : // Amacron
            case  260 : // Aogonek
            case  461 : // A with caron
            case  478 : // A with diaeresis and macron
            case  480 : // A with dot above and macron
            case  506 : // A with ring above and acute
            case  512 : // A with double grave
            case  514 : // A with inverted breve
            case  550 : // A with dot above
            case  570 : // A with stroke
            case 7840 : // A with dot below
            case 7842 : // A with hook above
            case 7844 : // A with circumflex and acute
            case 7846 : // A with circumflex and grave
            case 7848 : // A with circumflex and hook above
            case 7850 : // A with circumflex and tilde
            case 7852 : // A with circumflex and dot below
            case 7854 : // A with breve and acute
            case 7856 : // A with breve and grave
            case 7858 : // A with breve and hook above
            case 7860 : // A with breve and tilde
            case 7862 : // A with breve and dot below
               r  =   65;  // A
               break;
            case  198 : // Æ
            case  482 : // AE with macron
            case  508 : // AE with acute
               r  =  this.sortAppropriate(adjust);
               break;
            case  228 : // ä
               r  =  this.sortAppropriate(adjust);
               if (r) {   break;   }
            case  229 : // å
               r  =  this.sortAppropriate(adjust);
               if (r) {   break;   }
            case  224 : // à
            case  225 : // á
            case  226 : // â
            case  227 : // ã
            case  170 : // feminine ordinal indicator
            case  257 : // amacron
            case  261 : // aogonek
            case  462 : // a with caron
            case  479 : // a with diaeresis and macron
            case  481 : // a with dot above and macron
            case  507 : // a with ring above and acute
            case  513 : // a with double grave
            case  515 : // a with inverted breve
            case  551 : // a with dot above
            case 7841 : // a with dot below
            case 7843 : // a with hook above
            case 7845 : // a with circumflex and acute
            case 7847 : // a with circumflex and grave
            case 7849 : // a with circumflex and hook above
            case 7851 : // a with circumflex and tilde
            case 7853 : // a with circumflex and dot below
            case 7855 : // a with breve and acute
            case 7857 : // a with breve and grave
            case 7859 : // a with breve and hook above
            case 7861 : // a with breve and tilde
            case 7863 : // a with breve and dot below
               r  =   97;  // a
               break;
            case  230 : // æ
            case  483 : // ae with macron
            case  509 : // ae with acute
               r  =  this.sortAppropriate(adjust);
               break;
            case  385 : // B with hook
            case  386 : // B with topbar
            case  579 : // B with stroke
               r  =   66;  // B
               break;
            case  384 : // b with stroke
            case  387 : // b with topbar
               r  =   98;  // b
               break;
            case  199 : // Ç
            case  262 : // Cacute
            case  264 : // Ccirc
            case  266 : // Cdot
            case  268 : // Ccaron
            case  391 : // C with hook
            case  571 : // C with stroke
               r  =   67;  // C
               break;
            case  231 : // ç
            case  263 : // cacute
            case  265 : // ccirc
            case  267 : // cdot
            case  269 : // ccaron
            case  392 : // c with hook
            case  572 : // c with stroke
               r  =   99;  // c
               break;
            case  208 : // Ð
            case  272 : // Dstroke
               r  =  this.sortAppropriate(adjust);
               if (r) {   break;   }
            case  270 : // Dcaron
            case  393 : // African D
            case  394 : // D with hook
            case  395 : // D with topbar
               r  =   68;  // D
               break;
            case  240 : // ð
            case  273 : // dstroke
               r  =  this.sortAppropriate(adjust);
               if (r) {   break;   }
            case  271 : // dcaron
            case  396 : // d with topbar
            case  545 : // d with curl
               r  =  100;  // d
               break;
            case  568 : // db digraph
               r  =  this.sortAppropriate(adjust);
               break;
            case  452 : // D with Z with caron
            case  497 : // D with Z
            case  453 : // D with z with caron
            case  498 : // D with z
            case  454 : // d with z with caron
            case  499 : // d with z
               r  =  this.sortAppropriate(adjust);
               break;
            case  200 : // È
            case  201 : // É
            case  202 : // Ê
            case  203 : // Ë
            case  274 : // Emacron
            case  278 : // Edot
            case  280 : // Eogonek
            case  282 : // Ecaron
            case  398 : // reversed E
            case  400 : // open E
            case  516 : // E with double grave
            case  518 : // E with inverted breve
            case  552 : // E with cedilla
            case  582 : // E with stroke
            case 7864 : // E with dot below
            case 7866 : // E with hook above
            case 7868 : // E with tilde
            case 7870 : // E with circumflex and acute
            case 7872 : // E with circumflex and grave
            case 7874 : // E with circumflex and hook above
            case 7876 : // E with circumflex and tilde
            case 7878 : // E with circumflex and dot below
               r  =   69;  // E
               break;
            case  232 : // è
            case  233 : // é
            case  234 : // ê
            case  235 : // ë
            case  275 : // emacron
            case  279 : // edot
            case  281 : // eogonek
            case  283 : // ecaron
            case  477 : // turned e
            case  517 : // e with double grave
            case  519 : // e with inverted breve
            case  553 : // e with cedilla
            case  583 : // e with stroke
            case 7865 : // e with dot below
            case 7867 : // e with hook above
            case 7869 : // e with tilde
            case 7871 : // e with circumflex and acute
            case 7873 : // e with circumflex and grave
            case 7875 : // e with circumflex and hook above
            case 7877 : // e with circumflex and tilde
            case 7879 : // e with circumflex and dot below
               r  =  101;  // e
               break;
            case  401 : // F with hook
               r  =   70;  // F
               break;
            case  402 : // f with hook
               r  =  102;  // f
               break;
            case  284 : // Gcirc
            case  286 : // Gbreve
            case  288 : // Gdot
            case  290 : // Gcedil
            case  403 : // G with hook
            case  484 : // G with stroke
            case  486 : // G with caron
            case  500 : // G with acute
               r  =   71;  // G
               break;
            case  285 : // gcirc
            case  287 : // gbreve
            case  289 : // gdot
            case  291 : // gcedil
            case  485 : // g with stroke
            case  487 : // g with caron
            case  501 : // g with acute
               r  =  103;  // g
               break;
            case  292 : // Hcirc
            case  294 : // Hstroke
            case  542 : // H with caron
               r  =   72;  // H
               break;
            case  293 : // hcirc
            case  295 : // hstroke
            case  543 : // h with caron
               r  =  104;  // h
               break;
            case  204 : // Ì
            case  205 : // Í
            case  206 : // Î
            case  207 : // Ï
            case  298 : // Imacron
            case  302 : // Iogonek
            case  304 : // Idot
            case  407 : // I with stroke
            case  463 : // I with caron
            case  520 : // I with double grave
            case  522 : // I with inverted breve
            case 7880 : // I with hook above
            case 7882 : // I with dot below
               r  =   73;  // I
               break;
            case  236 : // ì
            case  237 : // í
            case  238 : // î
            case  239 : // ï
            case  299 : // imacron
            case  303 : // iogonek
            case  305 : // inodot
            case  464 : // i with caron
            case  521 : // i with double grave
            case  523 : // i with inverted breve
            case 7881 : // i with hook above
            case 7883 : // i with dot below
               r  =  105;  // i
               break;
            case  306 : // IJlig
               r  =  "IJ"; // Dutch: both capital
               break;
            case  307 : // ijlig
               r  =  "ij";
               break;
            case  308 : // Jcirc
            case  584 : // J with stroke
               r  =   74;  // J
               break;
            case  309 : // jcirc
            case  496 : // j with caron
            case  567 : // dotless j
            case  585 : // j with stroke
               r  =  106;  // j
               break;
            case  310 : // Kcedil
            case  408 : // K with hook
            case  488 : // K with caron
               r  =   75;  // K
               break;
            case  311 : // kcedil
            case  409 : // k with hook
            case  489 : // k with caron
               r  =  107;  // k
               break;
            case  315 : // Lcedil
            case  321 : // Lstroke
            case  573 : // L with bar
               r  =   76;  // L
               break;
            case  316 : // lcedil
            case  322 : // lstroke
            case  410 : // l with bar
            case  564 : // l with curl
               r  =  108;  // l
               break;
            case  455 : // L with J
            case  456 : // L with j
            case  457 : // l with j
               r  =  this.sortAppropriate(adjust);
               break;
            // r  =  "ll";
            case  412 : // turned M
               r  =   77;  // M
               break;
            case  209 : // Ñ
            case  323 : // Nacute
            case  325 : // Ncedil
            case  327 : // Ncaron
            case  413 : // N with left hook
            case  504 : // N with grave
            case  544 : // N with long right leg
               r  =   78;  // N
               break;
            case  241 : // ñ
            case  324 : // nacute
            case  326 : // ncedil
            case  328 : // ncaron
            case  414 : // n with long right leg
            case  505 : // n with grave
            case  565 : // n with curl
               r  =  110;  // n
               break;
            case  458 : // N with J
            case  459 : // N with j
            case  460 : // n with j
               r  =  this.sortAppropriate(adjust);
               break;
            case  214 : // Ö
               r  =  this.sortAppropriate(adjust);
               if (r) {   break;   }
            case  210 : // Ò
            case  211 : // Ó
            case  212 : // Ô
            case  213 : // Õ
            case  216 : // Ø
            case  332 : // Omacron
            case  336 : // Odacute
            case  390 : // open O
            case  415 : // O with middle tilde
            case  416 : // O with horn
            case  465 : // O with caron
            case  490 : // O with ogonek
            case  492 : // O with ogonek and macron
            case  510 : // O with stroke and acute
            case  524 : // O with double grave
            case  526 : // O with inverted breve
            case  554 : // O with diaeresis and macron
            case  556 : // O with tilde and macron
            case  558 : // O with dot above
            case  560 : // O with dot above and macron
            case 7884 : // O with dot below
            case 7886 : // O with hook above
            case 7888 : // O with circumflex and acute
            case 7890 : // O with circumflex and grave
            case 7892 : // O with circumflex and hook above
            case 7894 : // O with circumflex and tilde
            case 7896 : // O with circumflex and dot below
            case 7898 : // O with horn and acute
            case 7900 : // O with horn and grave
            case 7902 : // O with horn and hook above
            case 7904 : // O with horn and tilde
            case 7906 : // O with horn and dot below
               r  =   79;  // O
               break;
            case  338 : // OElig
               r  =  this.sortAppropriate(adjust);
               break;
            case  246 : // ö
               r  =  this.sortAppropriate(adjust);
               if (r) {   break;   }
            case  242 : // ò
            case  243 : // ó
            case  244 : // ô
            case  245 : // õ
            case  248 : // ø
            case  333 : // omacron
            case  337 : // odacute
            case  186 : // masculine ordinal indicator
            case  417 : // o with horn
            case  466 : // o with caron
            case  491 : // o with ogonek
            case  493 : // o with ogonek and macron
            case  511 : // o with stroke and acute
            case  525 : // o with double grave
            case  527 : // o with inverted breve
            case  555 : // o with diaeresis and macron
            case  557 : // o with tilde and macron
            case  559 : // o with dot above
            case  561 : // o with dot above and macron
            case 7885 : // o with dot below
            case 7887 : // o with hook above
            case 7889 : // o with circumflex and acute
            case 7891 : // o with circumflex and grave
            case 7893 : // o with circumflex and hook above
            case 7895 : // o with circumflex and tilde
            case 7897 : // o with circumflex and dot below
            case 7899 : // o with horn and acute
            case 7901 : // o with horn and grave
            case 7903 : // o with horn and hook above
            case 7905 : // o with horn and tilde
            case 7907 : // o with horn and dot below
               r  =  111;  // o
               break;
            case  339 : // oelig
            case  546 : // OU
            case  547 : // ou
               r  =  this.sortAppropriate(adjust);
               break;
            case  420 : // P with hook
               r  =   80;  // P
               break;
            case  421 : // p with hook
               r  =  112;  // p
               break;
            case  586 : // Q with hook tail
               r  =   81;  // Q
               break;
            case  587 : // q with hook tail
               r  =  113;  // q
               break;
            case  569 : // qp digraph
               r  =  this.sortAppropriate(adjust);
               break;
            case  344 : // Rcaron
            case  528 : // R with double grave
            case  530 : // R with inverted breve
            case  588 : // R with stroke
               r  =   82;  // R
               break;
            case  345 : // rcaron
            case  529 : // r with double grave
            case  531 : // r with inverted breve
            case  589 : // r with stroke
               r  =  114;  // r
               break;
            case  346 : // Sacute
            case  348 : // Scirc
            case  350 : // Scedil
            case  352 : // Scaron
            case  536 : // S with comma below
               r  =   83;  // S
               break;
            case  347 : // sacute
            case  349 : // scirc
            case  351 : // scedil
            case  353 : // scaron
            case  383 : // long S
            case  537 : // s with comma below
            case  575 : // s with swash tail
               r  =  115;  // s
               break;
            case  223 : // ß
            case 7838 : // capital sharp S
               r  =  this.sortAppropriate(adjust);
               break;
            case  354 : // Tcedil
            case  538 : // T with comma below
            case  428 : // T with hook
            case  430 : // T with retroflex hook
            case  538 : // T with comma below
            case  574 : // T with diagonal stroke
               r  =   84;  // T
               break;
            case  355 : // tcedil
            case  539 : // t with comma below
            case  427 : // t with palatal hook
            case  429 : // t with hook
            case  539 : // t with comma below
            case  566 : // t with curl
               r  =  116;  // t
               break;
            case  222 : // Þ
               r  =  this.sortAppropriate(adjust);
               break;
            case  254 : // þ
               r  =  this.sortAppropriate(adjust);
               break;
            case  220 : // Ü
               r  =  this.sortAppropriate(adjust);
               if (r) {   break;   }
            case  217 : // Ù
            case  218 : // Ú
            case  219 : // Û
            case  362 : // Umacron
            case  364 : // Ubreve
            case  366 : // Uring
            case  368 : // Udacute
            case  370 : // Uogonek
            case  431 : // U with horn
            case  467 : // U with caron
            case  469 : // U with diaeresis and macron
            case  471 : // U with diaeresis and acute
            case  473 : // U with diaeresis and caron
            case  475 : // U with diaeresis and grave
            case  532 : // U with double grave
            case  534 : // U with inverted breve
            case  580 : // U bar
            case 7908 : // U with dot below
            case 7910 : // U with hook above
            case 7912 : // U with horn and acute
            case 7914 : // U with horn and grave
            case 7916 : // U with horn and hook above
            case 7918 : // U with horn and tilde
            case 7920 : // U with horn and dot below
               r  =   85;  // U
               break;
            case  252 : // ü
               r  =  this.sortAppropriate(adjust);
               if (r) {   break;   }
            case  249 : // ù
            case  250 : // ú
            case  251 : // û
            case  363 : // umacron
            case  365 : // ubreve
            case  367 : // uring
            case  369 : // udacute
            case  371 : // uogonek
            case  432 : // u with horn
            case  468 : // u with caron
            case  470 : // u with diaeresis and macron
            case  472 : // u with diaeresis and acute
            case  474 : // u with diaeresis and caron
            case  476 : // u with diaeresis and grave
            case  533 : // u with double grave
            case  535 : // u with inverted breve
            case 7909 : // u with dot below
            case 7911 : // u with hook above
            case 7913 : // u with horn and acute
            case 7915 : // u with horn and grave
            case 7917 : // u with horn and hook above
            case 7919 : // u with horn and tilde
            case 7921 : // u with horn and dot below
               r  =  117;  // u
               break;
            case  434 : // V with hook
            case  581 : // turned V
            case 7932 : // V (middle-welsh)
               r  =   86;  // V
               break;
            case 7933 : // v (middle-welsh)
               r  =  118;  // v
               break;
            case  221 : // Ý
            case  376 : // Yuml
            case  435 : // Y with hook
            case  562 : // Y with macron
            case  590 : // Y with stroke
            case 7922 : // Y with grave
            case 7924 : // Y with dot below
            case 7926 : // Y with hook above
            case 7928 : // Y with tilde
            case 7934 : // Y with loop
               r  =   89;  // Y
               break;
            case  253 : // ý
            case  255 : // ÿ
            case  436 : // y with hook
            case  563 : // y with macron
            case  591 : // y with stroke
            case 7923 : // y with grave
            case 7925 : // y with dot below
            case 7927 : // y with hook above
            case 7929 : // y with tilde
            case 7935 : // y with loop
               r  =  121;  // y
               break;
            case  377 : // Zacute
            case  379 : // Zdot
            case  381 : // Zcaron
            case  437 : // Z with stroke
            case  548 : // Z with hook
               r  =   90;  // Z
               break;
            case  378 : // zacute
            case  380 : // zdot
            case  382 : // zcaron
            case  438 : // z with stroke
            case  549 : // z with hook
            case  576 : // z with swash tail
               r  =  122;  // z
               break;
            case  185 : // sup1
               r  =   49;  // 1
               break;
            case  178 : // sup2
               r  =   50;  // 2
               break;
            case  179 : // sup3
               r  =   51;  // 3
               break;
            case 8210 : // FIGURE DASH
            case 8211 : // ndash
            case 8212 : // mdash
            case 8213 : // HORIZONTAL BAR
            case 8259 : // HYPHEN BULLET
               r  =   45;  // -
               break;
            case  168 : // uml
            case  175 : // macr
            case  180 : // acute
            case  184 : // cedil
            case  710 : // circ
            case  711 : // caron
            case  728 : // breve
            case  730 : // ring
            case  731 : // ogon
            case  732 : // tilde
            case  733 : // dacute
            case  173 : // soft hyphen
            case 8204 : // ZERO WIDTH NON-JOINER
            case 8205 : // ZERO WIDTH JOINER
            case 8206 : // LEFT-TO-RIGHT MARK
            case 8207 : // RIGHT-TO-LEFT MARK
               r  =  true;
               break;
         }   // switch adjust
      }
   } else {   // < 160
      switch (adjust) {
         case   39 : // '
         case   96 : // grave
            r  =  true;
            break;
         case  133 : // NEXT LINE (NEL)
            r  =  32;
            break;
      }   // switch adjust
   }   // adjust
   return  r;
};   // .sortChar()



STRLIB.sortLocale  =  function (adjust, area) {
   /**
    Retrieve sortcode char or string for Unicode
    @version 2012-03-19 PerfektesChaos@de.wikipedia
    @param   adjust  string to be checked
    @param   area    language code,  or false
             <BR><TT>de</TT>  German DIN 31638 (DIN 5007) requests
                              umlaut "Ae" when sorting names of persons,
    @return  sortable string or character
             <BR><TT>false</TT>   no particular local request
             <BR>Replace by two character string
                 for German umlauts or scandinavian "aa" for Aring.
    @see     .sortMode
   */
   var r  =  false;
   if (this.sortMode) {
      switch (area) {
         case "de" :
            if (this.sortMode.indexOf("de-DIN31638") >= 0) {
               switch (adjust) {
                  case  196 : // Ä
                     r  =  "Ae";
                     break;
                  case  228 : // ä
                     r  =  "ae";
                     break;
                  case  214 : // Ö
                     r  =  "Oe";
                     break;
                  case  246 : // ö
                     r  =  "oe";
                     break;
                  case  220 : // Ü
                     r  =  "Ue";
                     break;
                  case  252 : // ü
                     r  =  "ue";
                     break;
               }   // switch adjust
            }   // de-DIN31638
            break;   // area
      }   // switch area
   }   // this.sortMode
   return  r;
};   // .sortLocale()



STRLIB.sortString  =  function (adjust, advanced) {
   /**
    Retrieve sortable string for non-ASCII Latin based Unicode
    <BR>Trailing or multiple whitespace shrinks.
    @version 2012-09-22 PerfektesChaos@de.wikipedia
    @param   adjust    string to be checked or modified
    @param   advanced  optional
             <BR><TT>true</TT>  Replace two character string
                                for German umlauts
                                and scandinavian Aring.
             <BR>German DIN 31638 (DIN 5007) requests umlaut "Ae"
                 when sorting names of persons,
                 and scandinavian languages use the same transscription
                 as well as "aa" for aring.
    @return  information about sortable string
             <BR><TT>false</TT>  if nothing to do, adjust is fine
             <BR><TT>string</TT> changes against adjust
             <BR>Only glyphs used in any (European) language considered.
    @since   JavaScript 1.3   String.charCodeAt()   String.fromCharCode()
   */
   // Uses:
   //    .setChar()
   //    .sortChar()
   var s  =  adjust,
       c,
       i,
       k;
   for (i = s.length - 1;  i >= 0;  i--) {
      c  =  s.charCodeAt(i);
      if (c < 32) {   // control character
         s  =  this.setChar(s, 32, i);   // ' '
      } else if (c >= 128) {   // Non-ASCII
         if (c < 160) {   // win-1252 or something like that
            s  =  this.setChar(s, "?", i);
         } else {   // not a sortable character -- definitively wrong
            k  =  this.sortChar(c, advanced);
            if (k) {   // replace
               switch (typeof(k)) {
                  case "boolean" : // true -- remove
                     s  =    s.substr(0, i)
                           + s.substr(i + 1);
                     break;
                  case "number" :
                     k  =  String.fromCharCode(k);
                     // fall through
                  case "string" : //
                     s  =  this.setChar(s, k, i);
                     break;
               }   // switch typeof
            }   // replace
         }   // cascade c
      }   // ASCII
   }   // for i
   // single heading SPC is kept (i > 0):
   for (i = s.length - 1;  i > 0;  i--) {
      if (s.charCodeAt(i) === 32) {   // trailing SPC
         s  =  s.substr(0, i);   // trim right
      } else {
         break;   // for i
      }
   }   // for i
   for (i = s.length - 1;  i > 0;  i--) {
      if (s.charCodeAt(i) === 32) {   // any SPC
         if (s.charCodeAt(i-1) === 32) {   // SPC before
            s  =   s.substr(0, i)
                  + s.substr(i + 1);
         }
      }
   }   // for i
   return  (s === adjust  ?  false  :  s);
};   // .sortString()



STRLIB.spaced  =  function (adjust, any, allow) {
   /**
    Turn spacing charcodes of any kind into ASCII spaces, and trim
    @version 2015-11-30 PerfektesChaos@de.wikipedia
    @param   adjust  string to be standardized
    @param   any     true: remove also zero width and direction marks
    @param   allow   true: keep entities
    @return  modified string
   //    .isWhiteBlank()
   //    .charEntityAt()
   */
   var r     =  adjust,
       last  =  true,
       e,
       i,
       k;
   for (i = r.length - 1;  i >= 0;  i--) {
      k  =  r.charCodeAt(i);
      if (this.isWhiteBlank(k,  any)) {
         r     =  r.substr(0, i)
                  +  (last ? "" : " ")
                  +  r.substr(i + 1);
         last  =  true;
      } else {
         if (! allow  &&  k === 59) {   // ';'
            e  =  this.charEntityAt(adjust, i, false);
            if (e) {
               if (this.isBlank(e[0], any)) {
                  r     =  r.substr(0,  i - e[2] + 1)
                           +  (last ? "" : " ")
                           +  r.substr(i + 1);
                  last  =  true;
               }
            }
         }
         last  =  false;
      }
   }   // for i
   if (last && r.length) {
      r  =  r.substr(1);
   }
   return r;
};   // .spaced()



STRLIB.substrEnd  =  function (apply, amount, after) {
   /**
    Retrieve last characters from string like Mozilla substr(-n, n)
    @version 2012-04-10 PerfektesChaos@de.wikipedia
    @param   apply   string
    @param   amount  position counted from end
    @param   after   optional: number of chars, if not amount
    @return  string at end
    @since   JavaScript 1.0   String.substr()
    @REMARK  This function has been included for compatibility reasons.
      With ECMA.3, String.slice() with negative start argument will work.
      String.slice() with negative argument wasn't defined in earlier JS.
      String.substr() with negative argument does not go with IE.
   */
   var j  =  apply.length - amount,
       n  =  amount;
   if (j < 0) {
      j  =  0;
      if (typeof(after) === "number") {
         n  =  after;
      }
   }
   return apply.substr(j, n);
};   // .substrEnd()



STRLIB.substrExcept  =  function (apply, amount) {
   /**
    Retrieve all but last characters from string
    @version 2012-04-10 PerfektesChaos@de.wikipedia
    @param   apply   string
    @param   amount  position counted from end
    @return  string until near end
    @see     .substrEnd()
   */
   // This function has been included for compatibility reasons.
   // String.slice(0, -amount)  should work, is permitted by MS JScript.
   var j  =  apply.length - amount;
   if (j < 0) {
      j  =  0;
   }
   return apply.substr(0, j);
};   // .substrExcept()



STRLIB.terminated  =  function (adjust, at) {
   /**
    Return substring terminated by separator, or entirely
    @version 2013-04-18 PerfektesChaos@de.wikipedia
    @param   adjust  string to be extracted
    @param   at      string with separator to be excluded
    @return  modified string, excluding at
   */
   var i  =  adjust.indexOf(at),
       r;
   if (i < 0) {
      r  =  adjust;
   } else {
      r  =  adjust.substr(0, i);
   }
   return r;
};   // .terminated()



STRLIB.trim  =  function (adjust, any, aware, allow) {
   /**
    Remove heading or trailing spacing charcodes of any kind
    @version 2014-09-11 PerfektesChaos@de.wikipedia
    @param   adjust  string to be trimmed
    @param   any     true: remove also zero width and direction marks
    @param   aware   true: remove also trailing line breaks
    @param   allow   true: keep entities
    @return  modified string
   */
   // Uses:
   //    .trimL()
   //    .trimR()
   return  this.trimR( this.trimL(adjust, any, aware, allow),
                       any,  aware );
};   // .trim()



STRLIB.trimL  =  function (adjust, any, aware, allow) {
   /**
    Return string without heading spacing charcodes of any kind
    @version 2014-09-11 PerfektesChaos@de.wikipedia
    @param   adjust  string to be trimmed
    @param   any     true: remove also zero width and direction marks
    @param   aware   true: remove also line breaks
    @param   allow   true: keep entities
    @see     .locateEntities
    @since   JavaScript 1.3   String.charCodeAt()
   */
   // Uses:
   //    .isWhiteBlank()
   //    .charEntityAt()
   // Other approach: find first non-blank char, then substr if not start
   var r  =  adjust,
       i  =  0,
       k  =  true,
       e;
   while (k) {
      k  =  r.charCodeAt(i);
      if (k) {
         if (this.isWhiteBlank(k,  any,  ! aware)) {
            i++;
         } else if (this.locateEntities  &&  ! allow) {
            if (k === 38) {   // '&'
               k  =  false;
               e  =  this.charEntityAt(adjust, i, true);
               if (e) {
                  if (this.isBlank(e[0], any)) {
                     i  +=  e[2];
                     k   =  true;
                  }
               }
            } else {
               break;   // while
            }
         } else {
            break;   // while
         }
      }
   }   // while k
   if (i) {
      r  =  r.substr(i);
   }
   return  r;
};   // .trimL()



STRLIB.trimR  =  function (adjust, any, aware, align, allow) {
   /**
    Return string without trailing spaces charcodes of any kind
    @version 2014-09-11 PerfektesChaos@de.wikipedia
    @param   adjust  string to be trimmed
    @param   any     true: remove also zero width and direction marks
    @param   aware   true: remove also line breaks
    @param   align   true: re-establish line breaks after trimming
    @param   allow   true: keep entities
    @see     .locateEntities
    @since   JavaScript 1.3   String.charCodeAt()
   */
   // Uses:
   //    .isWhiteBlank()
   //    .isBlank()
   var r  =  adjust,
       m  =  0,
       n  =  r.length - 1,
       s  =  "",
       e,
       k;
   while (n > -1) {
      k  =  r.charCodeAt(n);
      if (this.isWhiteBlank(k,  any,  ! aware)) {
         if (align  &&  k === 10) {
            s  =  s + "\n";
         }
         if (n) {
            m  =  n;
            n--;
         } else {
            r  =  "";
            m  =  0;
            break;   // while
         }
      } else if (this.locateEntities  &&  ! allow) {
         if (k === 59) {   // ';'
            e  =  this.charEntityAt(adjust, n, false);
            if (e) {
               if (this.isBlank(e[0], any)) {
                  n  -=  e[2];
                  m   =  n + 1;
                  k   =  false;
               }
            }
         }
         if (k) {
            break;   // while
         }
      } else {
         break;   // while
      }
   }   // while n
   if (m) {
      r  =  r.substr(0, m)  +  s;
   }
   return  r;
};   // .trimR()



STRLIB.uniques  =  function (adjust, against) {
   /**
    Return string with unique sequence of items
    @version 2012-03-19 PerfektesChaos@de.wikipedia
    @param   adjust   string to be reduced, items separated by against
    @param   against  string with character for separation
    @return  string with all items in adjust,
                    separated by <TT>against</TT>
                    (no leading nor trailing <TT>against</TT>)
   */
   var r        =  "",
       swap     =  "",
       words    =  adjust.split(against),
       i,
       single;
   words.sort();
   for (i = 0;  i < words.length;  i++) {
      single  =  words[i];
      if (single !== swap) {
         r     =  r + against + single;
         swap  =  single;
      }
   }   // for i
   if (r.length) {
      r  =  r.substr(1);
   }   // for i
   return  r;
};   // .uniques()



};   // BB()



function first() {
   /**
    Internal initialization
    @version 2018-08-24 PerfektesChaos@de.wikipedia
    @see     .BB
    @see     .VERSION
   */
   "use strict";
   var sign  =  "PerfektesChaos_stringLib",
       obj, rls;
   if ( typeof mediaWiki  !== "object"
        ||   ! mediaWiki ) {   // disconnected
      if ( typeof window  ===  "object" ) {
         window.mw  =  { };
      } else {
         mw  =  { };
      }
   }
   if ( typeof mw  !== "object"   ||   mw !== mediaWiki ) {
      mw  =  mediaWiki;
   }
   if ( typeof mw.libs  !== "object" ) {   // Since MW 1.18; disconnected
      mw.libs  =  { };
   }
   if ( typeof mw.libs[ sign ]  !==  "object"
        ||   ! mw.libs[ sign ] ) {
      mw.libs[ sign ]  =  { };
   }
   obj  =  mw.libs[ sign ];
   BB( obj );
   obj.vsn  =  VERSION;
   if ( typeof mw.loader  ===  "object"   &&
        typeof mw.loader.state  ===  "function" ) {
      rls = { };
      rls[ "user:" + sign ] = "ready";
      mw.loader.state( rls );
   }
   if ( typeof mw.hook  ===  "object"   &&
        typeof mw.hook.fire  ===  "function" ) {
      mw.loader.hook( sign + ".ready" ).fire( obj );
   }
}   // first()



// autoInit onLoad
first();



// Emacs
// Local Variables:
// coding: iso-8859-1-dos
// fill-column: 80
// End:

/// EOF </nowiki> stringLib/d.js