User:PerfektesChaos/js/stringLib/d.js

/// 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; ///   STRLIB.doc  =  "w:en:User:PerfektesChaos/js/stringLib"; ///

if (typeof(STRLIB.locateEntities) !== "boolean") { STRLIB.locateEntities = /**         User option: Expect any HTML entity @version 2012-03-19 PerfektesChaos@de.wikipedia @REMARK true  or false */        false; }  if (STRLIB.sortLang === undefined) { STRLIB.sortLang = /**         User option: Language used for sorting @version 2012-03-19 PerfektesChaos@de.wikipedia @REMARK string or false */        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 false */        //   "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 false  if not resolved number 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 false <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 stringLib/d.js