diff --git a/CHANGELOG.md b/CHANGELOG.md
index 410f04ef2a..9f27f27b9f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+### Release v3.22.2
+### New
+- Hotfix firefox support for MEWconnect [Commit](https://github.com/kvhnuke/etherwallet/commit/644c63da54ded3e74c78a14b0e0dff1c419a0be0)
+
### Release v3.22.1
### New
- Hotfix link and icon for MEWconnect, Add PAX token and contract, and dqr30 token [#2069](https://github.com/kvhnuke/etherwallet/pull/2069)
diff --git a/app/includes/header.tpl b/app/includes/header.tpl
index c9c35f0cfd..b88d860dab 100644
--- a/app/includes/header.tpl
+++ b/app/includes/header.tpl
@@ -98,18 +98,18 @@
@@if (site === 'mew' ) {
- 3.22.1
+ 3.22.2
}
@@if (site === 'cx' ) {
- 3.22.1
+ 3.22.2
}
-
3.22.1
+
3.22.2
{{curLang}}
diff --git a/app/manifest.json b/app/manifest.json
index cdd38c277a..d1f3c3b7e9 100644
--- a/app/manifest.json
+++ b/app/manifest.json
@@ -1,6 +1,6 @@
{
"name": "MyEtherWallet",
- "version": "3.22.1",
+ "version": "3.22.2",
"manifest_version": 2,
"description": "MyEtherWallet Chrome Extension",
"homepage_url": "https://www.myetherwallet.com/",
diff --git a/chrome-extension/contest.html b/chrome-extension/contest.html
index c23f60fa11..5fac9e8a22 100644
--- a/chrome-extension/contest.html
+++ b/chrome-extension/contest.html
@@ -98,13 +98,13 @@
- 3.22.1
+ 3.22.2
-
3.22.1
+
3.22.2
{{curLang}}
diff --git a/chrome-extension/cx-wallet.html b/chrome-extension/cx-wallet.html
index 9d84c986f9..93b1390cdd 100644
--- a/chrome-extension/cx-wallet.html
+++ b/chrome-extension/cx-wallet.html
@@ -83,12 +83,12 @@
- 3.22.1
+ 3.22.2
-
3.22.1
+
3.22.2
{{curLang}}
diff --git a/chrome-extension/helpers.html b/chrome-extension/helpers.html
index c6bdfafdad..ea83e40354 100644
--- a/chrome-extension/helpers.html
+++ b/chrome-extension/helpers.html
@@ -99,13 +99,13 @@
- 3.22.1
+ 3.22.2
-
3.22.1
+
3.22.2
{{curLang}}
diff --git a/chrome-extension/js/etherwallet-master.js b/chrome-extension/js/etherwallet-master.js
index be40c79be5..815bd1895e 100644
--- a/chrome-extension/js/etherwallet-master.js
+++ b/chrome-extension/js/etherwallet-master.js
@@ -15860,7 +15860,6 @@ if (IS_CX) {
window.cxHelpers['similarity'] = similarity;
window.cxHelpers['levenshtein'] = levenshtein;
} else {
- require('webrtc-adapter'); // adapter to ensure a common api for webRTC
var MewConnectEth = require('./staticJS/mewConnectEth');
var MewConnect = require('@myetherwallet/mewconnect-web-client').Initiator;
var u2f = require('./staticJS/u2f-api');
@@ -15967,7 +15966,7 @@ if (IS_CX) {
app.controller('cxDecryptWalletCtrl', ['$scope', '$sce', 'walletService', cxDecryptWalletCtrl]);
}
-},{"./ajaxReq":22,"./bity":23,"./constants/darkListConst":24,"./controllers/CX/addWalletCtrl":25,"./controllers/CX/cxDecryptWalletCtrl":26,"./controllers/CX/mainPopCtrl":27,"./controllers/CX/myWalletsCtrl":28,"./controllers/CX/quickSendCtrl":29,"./controllers/bulkGenCtrl":30,"./controllers/contractsCtrl":31,"./controllers/decryptWalletCtrl":32,"./controllers/domainsaleCtrl":33,"./controllers/ensCtrl":34,"./controllers/footerCtrl":35,"./controllers/helpersCtrl":36,"./controllers/offlineTxCtrl":37,"./controllers/onboardingCtrl":38,"./controllers/sendTxCtrl":39,"./controllers/signMsgCtrl":40,"./controllers/swapCtrl":41,"./controllers/tabsCtrl":42,"./controllers/txStatusCtrl":43,"./controllers/viewCtrl":44,"./controllers/viewWalletCtrl":45,"./controllers/walletBalanceCtrl":46,"./controllers/walletGenCtrl":47,"./customGas.js":48,"./cxFuncs":49,"./directives/QRCodeDrtv":50,"./directives/addressFieldDrtv":51,"./directives/balanceDrtv":53,"./directives/blockiesDrtv":54,"./directives/cxWalletDecryptDrtv":55,"./directives/fileReaderDrtv":56,"./directives/walletDecryptDrtv":58,"./domainsale":59,"./ens":61,"./ethFuncs":70,"./etherUnits":71,"./globalFuncs":72,"./homoglyphs.json":73,"./kyber":74,"./localStoragePolyfill":82,"./myetherwallet":84,"./nodes":92,"./services/globalService":93,"./services/walletService":94,"./solidity/coder":98,"./solidity/utils":109,"./staticJS/customMarked":110,"./staticJS/digitalBitboxEth":111,"./staticJS/digitalBitboxUsb":112,"./staticJS/ledger-eth":113,"./staticJS/ledger3":114,"./staticJS/mewConnectEth":115,"./staticJS/secalotEth":116,"./staticJS/secalotUsb":117,"./staticJS/trezorConnect":118,"./staticJS/u2f-api":119,"./tokenlib":120,"./translations/translate.js":163,"./uiFuncs":167,"./validator":168,"./web3Wallet":169,"@myetherwallet/mewconnect-web-client":179,"angular":188,"angular-animate":182,"angular-sanitize":184,"angular-translate":186,"angular-translate-handler-log":185,"babel-polyfill":208,"bignumber.js":214,"bip39":215,"crypto":597,"detect-browser":604,"ethereumjs-tx":643,"ethereumjs-util":644,"hdkey":665,"levenshtein":683,"punycode":257,"scryptsy":730,"similarity":746,"string-format":765,"unicode/category/Ll":769,"uuid":773,"wallet-address-validator":786,"webrtc-adapter":787,"xss-filters":799}],84:[function(require,module,exports){
+},{"./ajaxReq":22,"./bity":23,"./constants/darkListConst":24,"./controllers/CX/addWalletCtrl":25,"./controllers/CX/cxDecryptWalletCtrl":26,"./controllers/CX/mainPopCtrl":27,"./controllers/CX/myWalletsCtrl":28,"./controllers/CX/quickSendCtrl":29,"./controllers/bulkGenCtrl":30,"./controllers/contractsCtrl":31,"./controllers/decryptWalletCtrl":32,"./controllers/domainsaleCtrl":33,"./controllers/ensCtrl":34,"./controllers/footerCtrl":35,"./controllers/helpersCtrl":36,"./controllers/offlineTxCtrl":37,"./controllers/onboardingCtrl":38,"./controllers/sendTxCtrl":39,"./controllers/signMsgCtrl":40,"./controllers/swapCtrl":41,"./controllers/tabsCtrl":42,"./controllers/txStatusCtrl":43,"./controllers/viewCtrl":44,"./controllers/viewWalletCtrl":45,"./controllers/walletBalanceCtrl":46,"./controllers/walletGenCtrl":47,"./customGas.js":48,"./cxFuncs":49,"./directives/QRCodeDrtv":50,"./directives/addressFieldDrtv":51,"./directives/balanceDrtv":53,"./directives/blockiesDrtv":54,"./directives/cxWalletDecryptDrtv":55,"./directives/fileReaderDrtv":56,"./directives/walletDecryptDrtv":58,"./domainsale":59,"./ens":61,"./ethFuncs":70,"./etherUnits":71,"./globalFuncs":72,"./homoglyphs.json":73,"./kyber":74,"./localStoragePolyfill":82,"./myetherwallet":84,"./nodes":92,"./services/globalService":93,"./services/walletService":94,"./solidity/coder":98,"./solidity/utils":109,"./staticJS/customMarked":110,"./staticJS/digitalBitboxEth":111,"./staticJS/digitalBitboxUsb":112,"./staticJS/ledger-eth":113,"./staticJS/ledger3":114,"./staticJS/mewConnectEth":115,"./staticJS/secalotEth":116,"./staticJS/secalotUsb":117,"./staticJS/trezorConnect":118,"./staticJS/u2f-api":119,"./tokenlib":120,"./translations/translate.js":163,"./uiFuncs":167,"./validator":168,"./web3Wallet":169,"@myetherwallet/mewconnect-web-client":179,"angular":188,"angular-animate":182,"angular-sanitize":184,"angular-translate":186,"angular-translate-handler-log":185,"babel-polyfill":208,"bignumber.js":214,"bip39":215,"crypto":597,"detect-browser":604,"ethereumjs-tx":643,"ethereumjs-util":644,"hdkey":665,"levenshtein":683,"punycode":257,"scryptsy":729,"similarity":744,"string-format":763,"unicode/category/Ll":767,"uuid":771,"wallet-address-validator":784,"xss-filters":785}],84:[function(require,module,exports){
(function (Buffer){
'use strict';
@@ -19164,7 +19163,7 @@ module.exports = {
isJson: isJson
};
-},{"bignumber.js":214,"ethereumjs-util":644,"utf8":771}],110:[function(require,module,exports){
+},{"bignumber.js":214,"ethereumjs-util":644,"utf8":769}],110:[function(require,module,exports){
'use strict';
var marked = require('marked');
@@ -31663,7 +31662,7 @@ var MewConnectCrypto = function () {
module.exports = MewConnectCrypto;
}).call(this,require("buffer").Buffer)
-},{"buffer":256,"crypto":597,"eccrypto/browser":611,"ethereumjs-util":644,"logging":684,"secp256k1":732}],173:[function(require,module,exports){
+},{"buffer":256,"crypto":597,"eccrypto/browser":611,"ethereumjs-util":644,"logging":684,"secp256k1":730}],173:[function(require,module,exports){
'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
@@ -32461,7 +32460,7 @@ var MewConnectInitiator = function (_MewConnectCommon) {
module.exports = MewConnectInitiator;
-},{"./MewConnectCommon":171,"./MewConnectCrypto":172,"logging":684,"simple-peer":747,"socket.io-client":751}],174:[function(require,module,exports){
+},{"./MewConnectCommon":171,"./MewConnectCrypto":172,"logging":684,"simple-peer":745,"socket.io-client":749}],174:[function(require,module,exports){
'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
@@ -33490,7 +33489,7 @@ var MewConnectReceiver = function (_MewConnectCommon) {
module.exports = MewConnectReceiver;
-},{"./MewConnectCommon":171,"./MewConnectCrypto":172,"logging":684,"simple-peer":747,"socket.io-client":751}],176:[function(require,module,exports){
+},{"./MewConnectCommon":171,"./MewConnectCrypto":172,"logging":684,"simple-peer":745,"socket.io-client":749}],176:[function(require,module,exports){
'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
@@ -78570,7 +78569,7 @@ Entity.prototype.encode = function encode(data, enc, /* internal */reporter) {
return this._getEncoder(enc).encode(data, reporter);
};
-},{"../asn1":190,"inherits":671,"vm":778}],192:[function(require,module,exports){
+},{"../asn1":190,"inherits":671,"vm":776}],192:[function(require,module,exports){
'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
@@ -82006,7 +82005,7 @@ module.exports = function base(ALPHABET) {
};
};
-},{"safe-buffer":729}],212:[function(require,module,exports){
+},{"safe-buffer":728}],212:[function(require,module,exports){
"use strict";
/*
@@ -85096,7 +85095,7 @@ module.exports = {
}
};
-},{"./wordlists/chinese_simplified.json":216,"./wordlists/chinese_traditional.json":217,"./wordlists/english.json":218,"./wordlists/french.json":219,"./wordlists/italian.json":220,"./wordlists/japanese.json":221,"./wordlists/korean.json":222,"./wordlists/spanish.json":223,"create-hash":593,"pbkdf2":698,"randombytes":711,"safe-buffer":729,"unorm":770}],216:[function(require,module,exports){
+},{"./wordlists/chinese_simplified.json":216,"./wordlists/chinese_traditional.json":217,"./wordlists/english.json":218,"./wordlists/french.json":219,"./wordlists/italian.json":220,"./wordlists/japanese.json":221,"./wordlists/korean.json":222,"./wordlists/spanish.json":223,"create-hash":593,"pbkdf2":698,"randombytes":711,"safe-buffer":728,"unorm":768}],216:[function(require,module,exports){
module.exports=[
"的",
"一",
@@ -101629,7 +101628,7 @@ module.exports = {
encode: encode
};
-},{"safe-buffer":729}],225:[function(require,module,exports){
+},{"safe-buffer":728}],225:[function(require,module,exports){
(function (global){
'use strict';
@@ -105381,7 +105380,7 @@ AES.prototype.scrub = function () {
module.exports.AES = AES;
-},{"safe-buffer":729}],230:[function(require,module,exports){
+},{"safe-buffer":728}],230:[function(require,module,exports){
'use strict';
var aes = require('./aes');
@@ -105502,7 +105501,7 @@ StreamCipher.prototype.setAAD = function setAAD(buf) {
module.exports = StreamCipher;
-},{"./aes":229,"./ghash":234,"./incr32":235,"buffer-xor":261,"cipher-base":262,"inherits":671,"safe-buffer":729}],231:[function(require,module,exports){
+},{"./aes":229,"./ghash":234,"./incr32":235,"buffer-xor":261,"cipher-base":262,"inherits":671,"safe-buffer":728}],231:[function(require,module,exports){
'use strict';
var ciphers = require('./encrypter');
@@ -105647,7 +105646,7 @@ function createDecipher(suite, password) {
exports.createDecipher = createDecipher;
exports.createDecipheriv = createDecipheriv;
-},{"./aes":229,"./authCipher":230,"./modes":242,"./streamCipher":245,"cipher-base":262,"evp_bytestokey":647,"inherits":671,"safe-buffer":729}],233:[function(require,module,exports){
+},{"./aes":229,"./authCipher":230,"./modes":242,"./streamCipher":245,"cipher-base":262,"evp_bytestokey":647,"inherits":671,"safe-buffer":728}],233:[function(require,module,exports){
'use strict';
var MODES = require('./modes');
@@ -105765,7 +105764,7 @@ function createCipher(suite, password) {
exports.createCipheriv = createCipheriv;
exports.createCipher = createCipher;
-},{"./aes":229,"./authCipher":230,"./modes":242,"./streamCipher":245,"cipher-base":262,"evp_bytestokey":647,"inherits":671,"safe-buffer":729}],234:[function(require,module,exports){
+},{"./aes":229,"./authCipher":230,"./modes":242,"./streamCipher":245,"cipher-base":262,"evp_bytestokey":647,"inherits":671,"safe-buffer":728}],234:[function(require,module,exports){
'use strict';
var Buffer = require('safe-buffer').Buffer;
@@ -105853,7 +105852,7 @@ GHASH.prototype.final = function (abl, bl) {
module.exports = GHASH;
-},{"safe-buffer":729}],235:[function(require,module,exports){
+},{"safe-buffer":728}],235:[function(require,module,exports){
"use strict";
function incr32(iv) {
@@ -105930,7 +105929,7 @@ exports.encrypt = function (self, data, decrypt) {
return out;
};
-},{"buffer-xor":261,"safe-buffer":729}],238:[function(require,module,exports){
+},{"buffer-xor":261,"safe-buffer":728}],238:[function(require,module,exports){
'use strict';
var Buffer = require('safe-buffer').Buffer;
@@ -105976,7 +105975,7 @@ exports.encrypt = function (self, chunk, decrypt) {
return out;
};
-},{"safe-buffer":729}],239:[function(require,module,exports){
+},{"safe-buffer":728}],239:[function(require,module,exports){
'use strict';
var Buffer = require('safe-buffer').Buffer;
@@ -106002,7 +106001,7 @@ exports.encrypt = function (self, chunk, decrypt) {
return out;
};
-},{"safe-buffer":729}],240:[function(require,module,exports){
+},{"safe-buffer":728}],240:[function(require,module,exports){
'use strict';
var xor = require('buffer-xor');
@@ -106033,7 +106032,7 @@ exports.encrypt = function (self, chunk) {
return xor(chunk, pad);
};
-},{"../incr32":235,"buffer-xor":261,"safe-buffer":729}],241:[function(require,module,exports){
+},{"../incr32":235,"buffer-xor":261,"safe-buffer":728}],241:[function(require,module,exports){
"use strict";
exports.encrypt = function (self, block) {
@@ -106312,7 +106311,7 @@ StreamCipher.prototype._final = function () {
module.exports = StreamCipher;
-},{"./aes":229,"cipher-base":262,"inherits":671,"safe-buffer":729}],246:[function(require,module,exports){
+},{"./aes":229,"cipher-base":262,"inherits":671,"safe-buffer":728}],246:[function(require,module,exports){
'use strict';
var DES = require('browserify-des');
@@ -106437,7 +106436,7 @@ DES.prototype._final = function () {
return Buffer.from(this._des.final());
};
-},{"cipher-base":262,"des.js":598,"inherits":671,"safe-buffer":729}],248:[function(require,module,exports){
+},{"cipher-base":262,"des.js":598,"inherits":671,"safe-buffer":728}],248:[function(require,module,exports){
'use strict';
exports['des-ecb'] = {
@@ -106776,7 +106775,7 @@ module.exports = {
};
}).call(this,require("buffer").Buffer)
-},{"./algorithms.json":251,"./sign":254,"./verify":255,"buffer":256,"create-hash":593,"inherits":671,"stream":764}],254:[function(require,module,exports){
+},{"./algorithms.json":251,"./sign":254,"./verify":255,"buffer":256,"create-hash":593,"inherits":671,"stream":762}],254:[function(require,module,exports){
(function (Buffer){
'use strict';
@@ -109528,7 +109527,7 @@ function simpleEnd(buf) {
return buf && buf.length ? this.write(buf) : '';
}
-},{"safe-buffer":729}],259:[function(require,module,exports){
+},{"safe-buffer":728}],259:[function(require,module,exports){
(function (setImmediate,clearImmediate){
"use strict";
@@ -109823,7 +109822,7 @@ CipherBase.prototype._toString = function (value, enc, fin) {
module.exports = CipherBase;
-},{"inherits":671,"safe-buffer":729,"stream":764,"string_decoder":258}],263:[function(require,module,exports){
+},{"inherits":671,"safe-buffer":728,"stream":762,"string_decoder":258}],263:[function(require,module,exports){
(function (Buffer){
'use strict';
@@ -117817,7 +117816,7 @@ module.exports = function createHash(alg) {
return new Hash(sha(alg));
};
-},{"cipher-base":262,"inherits":671,"md5.js":686,"ripemd160":726,"sha.js":739}],594:[function(require,module,exports){
+},{"cipher-base":262,"inherits":671,"md5.js":686,"ripemd160":726,"sha.js":737}],594:[function(require,module,exports){
'use strict';
var MD5 = require('md5.js');
@@ -117891,7 +117890,7 @@ module.exports = function createHmac(alg, key) {
return new Hmac(alg, key);
};
-},{"./legacy":596,"cipher-base":262,"create-hash/md5":594,"inherits":671,"ripemd160":726,"safe-buffer":729,"sha.js":739}],596:[function(require,module,exports){
+},{"./legacy":596,"cipher-base":262,"create-hash/md5":594,"inherits":671,"ripemd160":726,"safe-buffer":728,"sha.js":737}],596:[function(require,module,exports){
'use strict';
var inherits = require('inherits');
@@ -117940,7 +117939,7 @@ Hmac.prototype._final = function () {
};
module.exports = Hmac;
-},{"cipher-base":262,"inherits":671,"safe-buffer":729}],597:[function(require,module,exports){
+},{"cipher-base":262,"inherits":671,"safe-buffer":728}],597:[function(require,module,exports){
'use strict';
exports.randomBytes = exports.rng = exports.pseudoRandomBytes = exports.prng = require('randombytes');
@@ -122072,52 +122071,37 @@ utils.intFromLE = intFromLE;
},{"bn.js":226,"minimalistic-assert":688,"minimalistic-crypto-utils":689}],627:[function(require,module,exports){
module.exports={
- "_from": "elliptic@^6.0.2",
- "_id": "elliptic@6.4.1",
- "_inBundle": false,
- "_integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==",
- "_location": "/elliptic",
- "_phantomChildren": {},
- "_requested": {
- "type": "range",
- "registry": true,
- "raw": "elliptic@^6.0.2",
- "name": "elliptic",
- "escapedName": "elliptic",
- "rawSpec": "^6.0.2",
- "saveSpec": null,
- "fetchSpec": "^6.0.2"
- },
- "_requiredBy": [
- "/browserify-sign",
- "/create-ecdh",
- "/eccrypto",
- "/eccrypto/secp256k1",
- "/secp256k1"
+ "name": "elliptic",
+ "version": "6.4.1",
+ "description": "EC cryptography",
+ "main": "lib/elliptic.js",
+ "files": [
+ "lib"
],
- "_resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz",
- "_shasum": "c2d0b7776911b86722c632c3c06c60f2f819939a",
- "_spec": "elliptic@^6.0.2",
- "_where": "/Users/yelpadillo/workspace/mew/etherwallet/node_modules/eccrypto",
- "author": {
- "name": "Fedor Indutny",
- "email": "fedor@indutny.com"
+ "scripts": {
+ "jscs": "jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js",
+ "jshint": "jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js",
+ "lint": "npm run jscs && npm run jshint",
+ "unit": "istanbul test _mocha --reporter=spec test/index.js",
+ "test": "npm run lint && npm run unit",
+ "version": "grunt dist && git add dist/"
},
+ "repository": {
+ "type": "git",
+ "url": "git@github.com:indutny/elliptic"
+ },
+ "keywords": [
+ "EC",
+ "Elliptic",
+ "curve",
+ "Cryptography"
+ ],
+ "author": "Fedor Indutny ",
+ "license": "MIT",
"bugs": {
"url": "https://github.com/indutny/elliptic/issues"
},
- "bundleDependencies": false,
- "dependencies": {
- "bn.js": "^4.4.0",
- "brorand": "^1.0.1",
- "hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.0",
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.0"
- },
- "deprecated": false,
- "description": "EC cryptography",
+ "homepage": "https://github.com/indutny/elliptic",
"devDependencies": {
"brfs": "^1.4.3",
"coveralls": "^2.11.3",
@@ -122134,34 +122118,20 @@ module.exports={
"jshint": "^2.6.0",
"mocha": "^2.1.0"
},
- "files": [
- "lib"
- ],
- "homepage": "https://github.com/indutny/elliptic",
- "keywords": [
- "EC",
- "Elliptic",
- "curve",
- "Cryptography"
- ],
- "license": "MIT",
- "main": "lib/elliptic.js",
- "name": "elliptic",
- "repository": {
- "type": "git",
- "url": "git+ssh://git@github.com/indutny/elliptic.git"
- },
- "scripts": {
- "jscs": "jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js",
- "jshint": "jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js",
- "lint": "npm run jscs && npm run jshint",
- "test": "npm run lint && npm run unit",
- "unit": "istanbul test _mocha --reporter=spec test/index.js",
- "version": "grunt dist && git add dist/"
- },
- "version": "6.4.1"
-}
+ "dependencies": {
+ "bn.js": "^4.4.0",
+ "brorand": "^1.0.1",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.0"
+ }
+,"_resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz"
+,"_integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ=="
+,"_from": "elliptic@6.4.1"
+}
},{}],628:[function(require,module,exports){
'use strict';
@@ -124036,7 +124006,7 @@ Polling.prototype.uri = function () {
return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path + query;
};
-},{"../transport":630,"component-inherit":266,"debug":637,"engine.io-parser":639,"parseqs":696,"xmlhttprequest-ssl":636,"yeast":800}],635:[function(require,module,exports){
+},{"../transport":630,"component-inherit":266,"debug":637,"engine.io-parser":639,"parseqs":696,"xmlhttprequest-ssl":636,"yeast":786}],635:[function(require,module,exports){
(function (global){
'use strict';
@@ -124327,7 +124297,7 @@ WS.prototype.check = function () {
};
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"../transport":630,"component-inherit":266,"debug":637,"engine.io-parser":639,"parseqs":696,"ws":228,"yeast":800}],636:[function(require,module,exports){
+},{"../transport":630,"component-inherit":266,"debug":637,"engine.io-parser":639,"parseqs":696,"ws":228,"yeast":786}],636:[function(require,module,exports){
(function (global){
'use strict';
@@ -126952,7 +126922,7 @@ exports.defineProperties = function (self, fields, data) {
}
};
-},{"assert":204,"bn.js":226,"create-hash":593,"ethjs-util":645,"keccak":676,"rlp":727,"safe-buffer":729,"secp256k1":732}],645:[function(require,module,exports){
+},{"assert":204,"bn.js":226,"create-hash":593,"ethjs-util":645,"keccak":676,"rlp":727,"safe-buffer":728,"secp256k1":730}],645:[function(require,module,exports){
(function (Buffer){
'use strict';
@@ -127178,7 +127148,7 @@ module.exports = {
};
}).call(this,require("buffer").Buffer)
-},{"buffer":256,"is-hex-prefixed":673,"strip-hex-prefix":767}],646:[function(require,module,exports){
+},{"buffer":256,"is-hex-prefixed":673,"strip-hex-prefix":765}],646:[function(require,module,exports){
'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
@@ -127502,7 +127472,7 @@ function EVP_BytesToKey(password, salt, keyBits, ivLen) {
module.exports = EVP_BytesToKey;
-},{"md5.js":686,"safe-buffer":729}],648:[function(require,module,exports){
+},{"md5.js":686,"safe-buffer":728}],648:[function(require,module,exports){
'use strict';
// originally pulled out of simple-peer
@@ -127711,7 +127681,7 @@ HashBase.prototype._digest = function () {
module.exports = HashBase;
-},{"inherits":671,"safe-buffer":729,"stream":764}],653:[function(require,module,exports){
+},{"inherits":671,"safe-buffer":728,"stream":762}],653:[function(require,module,exports){
'use strict';
var hash = exports;
@@ -128921,7 +128891,7 @@ HDKey.HARDENED_OFFSET = HARDENED_OFFSET;
module.exports = HDKey;
}).call(this,require("buffer").Buffer)
-},{"assert":204,"buffer":256,"coinstring":263,"crypto":597,"secp256k1":732}],666:[function(require,module,exports){
+},{"assert":204,"buffer":256,"coinstring":263,"crypto":597,"secp256k1":730}],666:[function(require,module,exports){
'use strict';
var hash = require('hash.js');
@@ -129774,7 +129744,7 @@ module.exports = function (KeccakState) {
return Keccak;
};
-},{"inherits":671,"safe-buffer":729,"stream":764}],679:[function(require,module,exports){
+},{"inherits":671,"safe-buffer":728,"stream":762}],679:[function(require,module,exports){
'use strict';
var Buffer = require('safe-buffer').Buffer;
@@ -129852,7 +129822,7 @@ module.exports = function (KeccakState) {
return Shake;
};
-},{"inherits":671,"safe-buffer":729,"stream":764}],680:[function(require,module,exports){
+},{"inherits":671,"safe-buffer":728,"stream":762}],680:[function(require,module,exports){
'use strict';
var P1600_ROUND_CONSTANTS = [1, 0, 32898, 0, 32906, 2147483648, 2147516416, 2147483648, 32907, 0, 2147483649, 0, 2147516545, 2147483648, 32777, 2147483648, 138, 0, 136, 0, 2147516425, 0, 2147483658, 0, 2147516555, 0, 139, 2147483648, 32905, 2147483648, 32771, 2147483648, 32770, 2147483648, 128, 2147483648, 32778, 0, 2147483658, 2147483648, 2147516545, 2147483648, 32896, 2147483648, 2147483649, 0, 2147516424, 2147483648];
@@ -130111,7 +130081,7 @@ Keccak.prototype.copy = function (dest) {
module.exports = Keccak;
-},{"./keccak-state-unroll":680,"safe-buffer":729}],682:[function(require,module,exports){
+},{"./keccak-state-unroll":680,"safe-buffer":728}],682:[function(require,module,exports){
/* eslint-disable no-nested-ternary */
'use strict';
@@ -132550,7 +132520,7 @@ module.exports = function (password, salt, iterations, keylen, digest, callback)
};
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"./default-encoding":700,"./precondition":701,"./sync":702,"_process":704,"safe-buffer":729}],700:[function(require,module,exports){
+},{"./default-encoding":700,"./precondition":701,"./sync":702,"_process":704,"safe-buffer":728}],700:[function(require,module,exports){
(function (process){
'use strict';
@@ -132708,7 +132678,7 @@ function pbkdf2(password, salt, iterations, keylen, digest) {
module.exports = pbkdf2;
-},{"./default-encoding":700,"./precondition":701,"create-hash/md5":594,"ripemd160":726,"safe-buffer":729,"sha.js":739}],703:[function(require,module,exports){
+},{"./default-encoding":700,"./precondition":701,"create-hash/md5":594,"ripemd160":726,"safe-buffer":728,"sha.js":737}],703:[function(require,module,exports){
(function (process){
'use strict';
@@ -133261,7 +133231,7 @@ function randomBytes(size, cb) {
}
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"_process":704,"safe-buffer":729}],712:[function(require,module,exports){
+},{"_process":704,"safe-buffer":728}],712:[function(require,module,exports){
(function (process,global){
'use strict';
@@ -133375,7 +133345,7 @@ function randomFillSync(buf, offset, size) {
}
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"_process":704,"randombytes":711,"safe-buffer":729}],713:[function(require,module,exports){
+},{"_process":704,"randombytes":711,"safe-buffer":728}],713:[function(require,module,exports){
'use strict';
module.exports = require('./lib/_stream_duplex.js');
@@ -134585,7 +134555,7 @@ function indexOf(xs, x) {
}
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"./_stream_duplex":714,"./internal/streams/BufferList":719,"./internal/streams/destroy":720,"./internal/streams/stream":721,"_process":704,"core-util-is":591,"events":646,"inherits":671,"isarray":674,"process-nextick-args":703,"safe-buffer":729,"string_decoder/":766,"util":228}],717:[function(require,module,exports){
+},{"./_stream_duplex":714,"./internal/streams/BufferList":719,"./internal/streams/destroy":720,"./internal/streams/stream":721,"_process":704,"core-util-is":591,"events":646,"inherits":671,"isarray":674,"process-nextick-args":703,"safe-buffer":728,"string_decoder/":764,"util":228}],717:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
@@ -135492,7 +135462,7 @@ Writable.prototype._destroy = function (err, cb) {
};
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("timers").setImmediate)
-},{"./_stream_duplex":714,"./internal/streams/destroy":720,"./internal/streams/stream":721,"_process":704,"core-util-is":591,"inherits":671,"process-nextick-args":703,"safe-buffer":729,"timers":259,"util-deprecate":772}],719:[function(require,module,exports){
+},{"./_stream_duplex":714,"./internal/streams/destroy":720,"./internal/streams/stream":721,"_process":704,"core-util-is":591,"inherits":671,"process-nextick-args":703,"safe-buffer":728,"timers":259,"util-deprecate":770}],719:[function(require,module,exports){
'use strict';
function _classCallCheck(instance, Constructor) {
@@ -135577,7 +135547,7 @@ if (util && util.inspect && util.inspect.custom) {
};
}
-},{"safe-buffer":729,"util":228}],720:[function(require,module,exports){
+},{"safe-buffer":728,"util":228}],720:[function(require,module,exports){
'use strict';
/**/
@@ -136061,13213 +136031,8117 @@ function toBuffer(v) {
return v;
}
-},{"assert":204,"safe-buffer":729}],728:[function(require,module,exports){
-/*
- * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree.
- */
-/* eslint-env node */
+},{"assert":204,"safe-buffer":728}],728:[function(require,module,exports){
'use strict';
-var SDPUtils = require('sdp');
+/* eslint-disable node/no-deprecated-api */
+var buffer = require('buffer');
+var Buffer = buffer.Buffer;
-function fixStatsType(stat) {
- return {
- inboundrtp: 'inbound-rtp',
- outboundrtp: 'outbound-rtp',
- candidatepair: 'candidate-pair',
- localcandidate: 'local-candidate',
- remotecandidate: 'remote-candidate'
- }[stat.type] || stat.type;
+// alternative to using Object.keys for old browsers
+function copyProps(src, dst) {
+ for (var key in src) {
+ dst[key] = src[key];
+ }
+}
+if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
+ module.exports = buffer;
+} else {
+ // Copy properties from require('buffer')
+ copyProps(buffer, exports);
+ exports.Buffer = SafeBuffer;
}
-function writeMediaSection(transceiver, caps, type, stream, dtlsRole) {
- var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);
-
- // Map ICE parameters (ufrag, pwd) to SDP.
- sdp += SDPUtils.writeIceParameters(transceiver.iceGatherer.getLocalParameters());
-
- // Map DTLS parameters to SDP.
- sdp += SDPUtils.writeDtlsParameters(transceiver.dtlsTransport.getLocalParameters(), type === 'offer' ? 'actpass' : dtlsRole || 'active');
-
- sdp += 'a=mid:' + transceiver.mid + '\r\n';
+function SafeBuffer(arg, encodingOrOffset, length) {
+ return Buffer(arg, encodingOrOffset, length);
+}
- if (transceiver.rtpSender && transceiver.rtpReceiver) {
- sdp += 'a=sendrecv\r\n';
- } else if (transceiver.rtpSender) {
- sdp += 'a=sendonly\r\n';
- } else if (transceiver.rtpReceiver) {
- sdp += 'a=recvonly\r\n';
- } else {
- sdp += 'a=inactive\r\n';
- }
-
- if (transceiver.rtpSender) {
- var trackId = transceiver.rtpSender._initialTrackId || transceiver.rtpSender.track.id;
- transceiver.rtpSender._initialTrackId = trackId;
- // spec.
- var msid = 'msid:' + (stream ? stream.id : '-') + ' ' + trackId + '\r\n';
- sdp += 'a=' + msid;
- // for Chrome. Legacy should no longer be required.
- sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc + ' ' + msid;
-
- // RTX
- if (transceiver.sendEncodingParameters[0].rtx) {
- sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc + ' ' + msid;
- sdp += 'a=ssrc-group:FID ' + transceiver.sendEncodingParameters[0].ssrc + ' ' + transceiver.sendEncodingParameters[0].rtx.ssrc + '\r\n';
- }
- }
- // FIXME: this should be written by writeRtpDescription.
- sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc + ' cname:' + SDPUtils.localCName + '\r\n';
- if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {
- sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc + ' cname:' + SDPUtils.localCName + '\r\n';
- }
- return sdp;
-}
-
-// Edge does not like
-// 1) stun: filtered after 14393 unless ?transport=udp is present
-// 2) turn: that does not have all of turn:host:port?transport=udp
-// 3) turn: with ipv6 addresses
-// 4) turn: occurring muliple times
-function filterIceServers(iceServers, edgeVersion) {
- var hasTurn = false;
- iceServers = JSON.parse(JSON.stringify(iceServers));
- return iceServers.filter(function (server) {
- if (server && (server.urls || server.url)) {
- var urls = server.urls || server.url;
- if (server.url && !server.urls) {
- console.warn('RTCIceServer.url is deprecated! Use urls instead.');
- }
- var isString = typeof urls === 'string';
- if (isString) {
- urls = [urls];
- }
- urls = urls.filter(function (url) {
- var validTurn = url.indexOf('turn:') === 0 && url.indexOf('transport=udp') !== -1 && url.indexOf('turn:[') === -1 && !hasTurn;
+// Copy static methods from Buffer
+copyProps(Buffer, SafeBuffer);
- if (validTurn) {
- hasTurn = true;
- return true;
- }
- return url.indexOf('stun:') === 0 && edgeVersion >= 14393 && url.indexOf('?transport=udp') === -1;
- });
+SafeBuffer.from = function (arg, encodingOrOffset, length) {
+ if (typeof arg === 'number') {
+ throw new TypeError('Argument must not be a number');
+ }
+ return Buffer(arg, encodingOrOffset, length);
+};
- delete server.url;
- server.urls = isString ? urls[0] : urls;
- return !!urls.length;
+SafeBuffer.alloc = function (size, fill, encoding) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number');
+ }
+ var buf = Buffer(size);
+ if (fill !== undefined) {
+ if (typeof encoding === 'string') {
+ buf.fill(fill, encoding);
+ } else {
+ buf.fill(fill);
}
- });
-}
+ } else {
+ buf.fill(0);
+ }
+ return buf;
+};
-// Determines the intersection of local and remote capabilities.
-function getCommonCapabilities(localCapabilities, remoteCapabilities) {
- var commonCapabilities = {
- codecs: [],
- headerExtensions: [],
- fecMechanisms: []
- };
+SafeBuffer.allocUnsafe = function (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number');
+ }
+ return Buffer(size);
+};
- var findCodecByPayloadType = function findCodecByPayloadType(pt, codecs) {
- pt = parseInt(pt, 10);
- for (var i = 0; i < codecs.length; i++) {
- if (codecs[i].payloadType === pt || codecs[i].preferredPayloadType === pt) {
- return codecs[i];
- }
- }
- };
+SafeBuffer.allocUnsafeSlow = function (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number');
+ }
+ return buffer.SlowBuffer(size);
+};
- var rtxCapabilityMatches = function rtxCapabilityMatches(lRtx, rRtx, lCodecs, rCodecs) {
- var lCodec = findCodecByPayloadType(lRtx.parameters.apt, lCodecs);
- var rCodec = findCodecByPayloadType(rRtx.parameters.apt, rCodecs);
- return lCodec && rCodec && lCodec.name.toLowerCase() === rCodec.name.toLowerCase();
- };
+},{"buffer":256}],729:[function(require,module,exports){
+(function (Buffer){
+'use strict';
- localCapabilities.codecs.forEach(function (lCodec) {
- for (var i = 0; i < remoteCapabilities.codecs.length; i++) {
- var rCodec = remoteCapabilities.codecs[i];
- if (lCodec.name.toLowerCase() === rCodec.name.toLowerCase() && lCodec.clockRate === rCodec.clockRate) {
- if (lCodec.name.toLowerCase() === 'rtx' && lCodec.parameters && rCodec.parameters.apt) {
- // for RTX we need to find the local rtx that has a apt
- // which points to the same local codec as the remote one.
- if (!rtxCapabilityMatches(lCodec, rCodec, localCapabilities.codecs, remoteCapabilities.codecs)) {
- continue;
- }
- }
- rCodec = JSON.parse(JSON.stringify(rCodec)); // deepcopy
- // number of channels is the highest common number of channels
- rCodec.numChannels = Math.min(lCodec.numChannels, rCodec.numChannels);
- // push rCodec so we reply with offerer payload type
- commonCapabilities.codecs.push(rCodec);
+var crypto = require('crypto');
+/* eslint-disable camelcase */
- // determine common feedback mechanisms
- rCodec.rtcpFeedback = rCodec.rtcpFeedback.filter(function (fb) {
- for (var j = 0; j < lCodec.rtcpFeedback.length; j++) {
- if (lCodec.rtcpFeedback[j].type === fb.type && lCodec.rtcpFeedback[j].parameter === fb.parameter) {
- return true;
- }
- }
- return false;
- });
- // FIXME: also need to determine .parameters
- // see https://github.com/openpeer/ortc/issues/569
- break;
- }
- }
- });
+var MAX_VALUE = 0x7fffffff;
- localCapabilities.headerExtensions.forEach(function (lHeaderExtension) {
- for (var i = 0; i < remoteCapabilities.headerExtensions.length; i++) {
- var rHeaderExtension = remoteCapabilities.headerExtensions[i];
- if (lHeaderExtension.uri === rHeaderExtension.uri) {
- commonCapabilities.headerExtensions.push(rHeaderExtension);
- break;
- }
- }
- });
+// N = Cpu cost, r = Memory cost, p = parallelization cost
+function scrypt(key, salt, N, r, p, dkLen, progressCallback) {
+ if (N === 0 || (N & N - 1) !== 0) throw Error('N must be > 0 and a power of 2');
- // FIXME: fecMechanisms
- return commonCapabilities;
-}
+ if (N > MAX_VALUE / 128 / r) throw Error('Parameter N is too large');
+ if (r > MAX_VALUE / 128 / p) throw Error('Parameter r is too large');
-// is action=setLocalDescription with type allowed in signalingState
-function isActionAllowedInSignalingState(action, type, signalingState) {
- return {
- offer: {
- setLocalDescription: ['stable', 'have-local-offer'],
- setRemoteDescription: ['stable', 'have-remote-offer']
- },
- answer: {
- setLocalDescription: ['have-remote-offer', 'have-local-pranswer'],
- setRemoteDescription: ['have-local-offer', 'have-remote-pranswer']
- }
- }[type][action].indexOf(signalingState) !== -1;
-}
+ var XY = new Buffer(256 * r);
+ var V = new Buffer(128 * r * N);
-function maybeAddCandidate(iceTransport, candidate) {
- // Edge's internal representation adds some fields therefore
- // not all fieldѕ are taken into account.
- var alreadyAdded = iceTransport.getRemoteCandidates().find(function (remoteCandidate) {
- return candidate.foundation === remoteCandidate.foundation && candidate.ip === remoteCandidate.ip && candidate.port === remoteCandidate.port && candidate.priority === remoteCandidate.priority && candidate.protocol === remoteCandidate.protocol && candidate.type === remoteCandidate.type;
- });
- if (!alreadyAdded) {
- iceTransport.addRemoteCandidate(candidate);
- }
- return !alreadyAdded;
-}
-
-function makeError(name, description) {
- var e = new Error(description);
- e.name = name;
- // legacy error codes from https://heycam.github.io/webidl/#idl-DOMException-error-names
- e.code = {
- NotSupportedError: 9,
- InvalidStateError: 11,
- InvalidAccessError: 15,
- TypeError: undefined,
- OperationError: undefined
- }[name];
- return e;
-}
-
-module.exports = function (window, edgeVersion) {
- // https://w3c.github.io/mediacapture-main/#mediastream
- // Helper function to add the track to the stream and
- // dispatch the event ourselves.
- function addTrackToStreamAndFireEvent(track, stream) {
- stream.addTrack(track);
- stream.dispatchEvent(new window.MediaStreamTrackEvent('addtrack', { track: track }));
- }
-
- function removeTrackFromStreamAndFireEvent(track, stream) {
- stream.removeTrack(track);
- stream.dispatchEvent(new window.MediaStreamTrackEvent('removetrack', { track: track }));
- }
-
- function fireAddTrack(pc, track, receiver, streams) {
- var trackEvent = new Event('track');
- trackEvent.track = track;
- trackEvent.receiver = receiver;
- trackEvent.transceiver = { receiver: receiver };
- trackEvent.streams = streams;
- window.setTimeout(function () {
- pc._dispatchEvent('track', trackEvent);
- });
- }
+ // pseudo global
+ var B32 = new Int32Array(16); // salsa20_8
+ var x = new Int32Array(16); // salsa20_8
+ var _X = new Buffer(64); // blockmix_salsa8
- var RTCPeerConnection = function RTCPeerConnection(config) {
- var pc = this;
+ // pseudo global
+ var B = crypto.pbkdf2Sync(key, salt, 1, p * 128 * r, 'sha256');
- var _eventTarget = document.createDocumentFragment();
- ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(function (method) {
- pc[method] = _eventTarget[method].bind(_eventTarget);
- });
+ var tickCallback;
+ if (progressCallback) {
+ var totalOps = p * N * 2;
+ var currentOp = 0;
- this.canTrickleIceCandidates = null;
+ tickCallback = function tickCallback() {
+ ++currentOp;
- this.needNegotiation = false;
+ // send progress notifications once every 1,000 ops
+ if (currentOp % 1000 === 0) {
+ progressCallback({
+ current: currentOp,
+ total: totalOps,
+ percent: currentOp / totalOps * 100.0
+ });
+ }
+ };
+ }
- this.localStreams = [];
- this.remoteStreams = [];
+ for (var i = 0; i < p; i++) {
+ smix(B, i * 128 * r, r, N, V, XY);
+ }
- this._localDescription = null;
- this._remoteDescription = null;
+ return crypto.pbkdf2Sync(key, B, 1, dkLen, 'sha256');
- this.signalingState = 'stable';
- this.iceConnectionState = 'new';
- this.connectionState = 'new';
- this.iceGatheringState = 'new';
+ // all of these functions are actually moved to the top
+ // due to function hoisting
- config = JSON.parse(JSON.stringify(config || {}));
+ function smix(B, Bi, r, N, V, XY) {
+ var Xi = 0;
+ var Yi = 128 * r;
+ var i;
- this.usingBundle = config.bundlePolicy === 'max-bundle';
- if (config.rtcpMuxPolicy === 'negotiate') {
- throw makeError('NotSupportedError', 'rtcpMuxPolicy \'negotiate\' is not supported');
- } else if (!config.rtcpMuxPolicy) {
- config.rtcpMuxPolicy = 'require';
- }
+ B.copy(XY, Xi, Bi, Bi + Yi);
- switch (config.iceTransportPolicy) {
- case 'all':
- case 'relay':
- break;
- default:
- config.iceTransportPolicy = 'all';
- break;
- }
+ for (i = 0; i < N; i++) {
+ XY.copy(V, i * Yi, Xi, Xi + Yi);
+ blockmix_salsa8(XY, Xi, Yi, r);
- switch (config.bundlePolicy) {
- case 'balanced':
- case 'max-compat':
- case 'max-bundle':
- break;
- default:
- config.bundlePolicy = 'balanced';
- break;
+ if (tickCallback) tickCallback();
}
- config.iceServers = filterIceServers(config.iceServers || [], edgeVersion);
+ for (i = 0; i < N; i++) {
+ var offset = Xi + (2 * r - 1) * 64;
+ var j = XY.readUInt32LE(offset) & N - 1;
+ blockxor(V, j * Yi, XY, Xi, Yi);
+ blockmix_salsa8(XY, Xi, Yi, r);
- this._iceGatherers = [];
- if (config.iceCandidatePoolSize) {
- for (var i = config.iceCandidatePoolSize; i > 0; i--) {
- this._iceGatherers.push(new window.RTCIceGatherer({
- iceServers: config.iceServers,
- gatherPolicy: config.iceTransportPolicy
- }));
- }
- } else {
- config.iceCandidatePoolSize = 0;
+ if (tickCallback) tickCallback();
}
- this._config = config;
-
- // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ...
- // everything that is needed to describe a SDP m-line.
- this.transceivers = [];
-
- this._sdpSessionId = SDPUtils.generateSessionId();
- this._sdpSessionVersion = 0;
+ XY.copy(B, Bi, Xi, Xi + Yi);
+ }
- this._dtlsRole = undefined; // role for a=setup to use in answers.
+ function blockmix_salsa8(BY, Bi, Yi, r) {
+ var i;
- this._isClosed = false;
- };
+ arraycopy(BY, Bi + (2 * r - 1) * 64, _X, 0, 64);
- Object.defineProperty(RTCPeerConnection.prototype, 'localDescription', {
- configurable: true,
- get: function get() {
- return this._localDescription;
- }
- });
- Object.defineProperty(RTCPeerConnection.prototype, 'remoteDescription', {
- configurable: true,
- get: function get() {
- return this._remoteDescription;
+ for (i = 0; i < 2 * r; i++) {
+ blockxor(BY, i * 64, _X, 0, 64);
+ salsa20_8(_X);
+ arraycopy(_X, 0, BY, Yi + i * 64, 64);
}
- });
- // set up event handlers on prototype
- RTCPeerConnection.prototype.onicecandidate = null;
- RTCPeerConnection.prototype.onaddstream = null;
- RTCPeerConnection.prototype.ontrack = null;
- RTCPeerConnection.prototype.onremovestream = null;
- RTCPeerConnection.prototype.onsignalingstatechange = null;
- RTCPeerConnection.prototype.oniceconnectionstatechange = null;
- RTCPeerConnection.prototype.onconnectionstatechange = null;
- RTCPeerConnection.prototype.onicegatheringstatechange = null;
- RTCPeerConnection.prototype.onnegotiationneeded = null;
- RTCPeerConnection.prototype.ondatachannel = null;
-
- RTCPeerConnection.prototype._dispatchEvent = function (name, event) {
- if (this._isClosed) {
- return;
+ for (i = 0; i < r; i++) {
+ arraycopy(BY, Yi + i * 2 * 64, BY, Bi + i * 64, 64);
}
- this.dispatchEvent(event);
- if (typeof this['on' + name] === 'function') {
- this['on' + name](event);
+
+ for (i = 0; i < r; i++) {
+ arraycopy(BY, Yi + (i * 2 + 1) * 64, BY, Bi + (i + r) * 64, 64);
}
- };
+ }
- RTCPeerConnection.prototype._emitGatheringStateChange = function () {
- var event = new Event('icegatheringstatechange');
- this._dispatchEvent('icegatheringstatechange', event);
- };
+ function R(a, b) {
+ return a << b | a >>> 32 - b;
+ }
- RTCPeerConnection.prototype.getConfiguration = function () {
- return this._config;
- };
+ function salsa20_8(B) {
+ var i;
- RTCPeerConnection.prototype.getLocalStreams = function () {
- return this.localStreams;
- };
+ for (i = 0; i < 16; i++) {
+ B32[i] = (B[i * 4 + 0] & 0xff) << 0;
+ B32[i] |= (B[i * 4 + 1] & 0xff) << 8;
+ B32[i] |= (B[i * 4 + 2] & 0xff) << 16;
+ B32[i] |= (B[i * 4 + 3] & 0xff) << 24;
+ // B32[i] = B.readUInt32LE(i*4) <--- this is signficantly slower even in Node.js
+ }
- RTCPeerConnection.prototype.getRemoteStreams = function () {
- return this.remoteStreams;
- };
+ arraycopy(B32, 0, x, 0, 16);
- // internal helper to create a transceiver object.
- // (which is not yet the same as the WebRTC 1.0 transceiver)
- RTCPeerConnection.prototype._createTransceiver = function (kind, doNotAdd) {
- var hasBundleTransport = this.transceivers.length > 0;
- var transceiver = {
- track: null,
- iceGatherer: null,
- iceTransport: null,
- dtlsTransport: null,
- localCapabilities: null,
- remoteCapabilities: null,
- rtpSender: null,
- rtpReceiver: null,
- kind: kind,
- mid: null,
- sendEncodingParameters: null,
- recvEncodingParameters: null,
- stream: null,
- associatedRemoteMediaStreams: [],
- wantReceive: true
- };
- if (this.usingBundle && hasBundleTransport) {
- transceiver.iceTransport = this.transceivers[0].iceTransport;
- transceiver.dtlsTransport = this.transceivers[0].dtlsTransport;
- } else {
- var transports = this._createIceAndDtlsTransports();
- transceiver.iceTransport = transports.iceTransport;
- transceiver.dtlsTransport = transports.dtlsTransport;
- }
- if (!doNotAdd) {
- this.transceivers.push(transceiver);
+ for (i = 8; i > 0; i -= 2) {
+ x[4] ^= R(x[0] + x[12], 7);
+ x[8] ^= R(x[4] + x[0], 9);
+ x[12] ^= R(x[8] + x[4], 13);
+ x[0] ^= R(x[12] + x[8], 18);
+ x[9] ^= R(x[5] + x[1], 7);
+ x[13] ^= R(x[9] + x[5], 9);
+ x[1] ^= R(x[13] + x[9], 13);
+ x[5] ^= R(x[1] + x[13], 18);
+ x[14] ^= R(x[10] + x[6], 7);
+ x[2] ^= R(x[14] + x[10], 9);
+ x[6] ^= R(x[2] + x[14], 13);
+ x[10] ^= R(x[6] + x[2], 18);
+ x[3] ^= R(x[15] + x[11], 7);
+ x[7] ^= R(x[3] + x[15], 9);
+ x[11] ^= R(x[7] + x[3], 13);
+ x[15] ^= R(x[11] + x[7], 18);
+ x[1] ^= R(x[0] + x[3], 7);
+ x[2] ^= R(x[1] + x[0], 9);
+ x[3] ^= R(x[2] + x[1], 13);
+ x[0] ^= R(x[3] + x[2], 18);
+ x[6] ^= R(x[5] + x[4], 7);
+ x[7] ^= R(x[6] + x[5], 9);
+ x[4] ^= R(x[7] + x[6], 13);
+ x[5] ^= R(x[4] + x[7], 18);
+ x[11] ^= R(x[10] + x[9], 7);
+ x[8] ^= R(x[11] + x[10], 9);
+ x[9] ^= R(x[8] + x[11], 13);
+ x[10] ^= R(x[9] + x[8], 18);
+ x[12] ^= R(x[15] + x[14], 7);
+ x[13] ^= R(x[12] + x[15], 9);
+ x[14] ^= R(x[13] + x[12], 13);
+ x[15] ^= R(x[14] + x[13], 18);
}
- return transceiver;
- };
- RTCPeerConnection.prototype.addTrack = function (track, stream) {
- if (this._isClosed) {
- throw makeError('InvalidStateError', 'Attempted to call addTrack on a closed peerconnection.');
+ for (i = 0; i < 16; ++i) {
+ B32[i] = x[i] + B32[i];
+ }for (i = 0; i < 16; i++) {
+ var bi = i * 4;
+ B[bi + 0] = B32[i] >> 0 & 0xff;
+ B[bi + 1] = B32[i] >> 8 & 0xff;
+ B[bi + 2] = B32[i] >> 16 & 0xff;
+ B[bi + 3] = B32[i] >> 24 & 0xff;
+ // B.writeInt32LE(B32[i], i*4) //<--- this is signficantly slower even in Node.js
}
+ }
- var alreadyExists = this.transceivers.find(function (s) {
- return s.track === track;
- });
-
- if (alreadyExists) {
- throw makeError('InvalidAccessError', 'Track already exists.');
+ // naive approach... going back to loop unrolling may yield additional performance
+ function blockxor(S, Si, D, Di, len) {
+ for (var i = 0; i < len; i++) {
+ D[Di + i] ^= S[Si + i];
}
+ }
+}
- var transceiver;
- for (var i = 0; i < this.transceivers.length; i++) {
- if (!this.transceivers[i].track && this.transceivers[i].kind === track.kind) {
- transceiver = this.transceivers[i];
- }
- }
- if (!transceiver) {
- transceiver = this._createTransceiver(track.kind);
+function arraycopy(src, srcPos, dest, destPos, length) {
+ if (Buffer.isBuffer(src) && Buffer.isBuffer(dest)) {
+ src.copy(dest, destPos, srcPos, srcPos + length);
+ } else {
+ while (length--) {
+ dest[destPos++] = src[srcPos++];
}
+ }
+}
- this._maybeFireNegotiationNeeded();
+module.exports = scrypt;
- if (this.localStreams.indexOf(stream) === -1) {
- this.localStreams.push(stream);
- }
+}).call(this,require("buffer").Buffer)
+},{"buffer":256,"crypto":597}],730:[function(require,module,exports){
+'use strict';
- transceiver.track = track;
- transceiver.stream = stream;
- transceiver.rtpSender = new window.RTCRtpSender(track, transceiver.dtlsTransport);
- return transceiver.rtpSender;
- };
+module.exports = require('./lib')(require('./lib/elliptic'));
- RTCPeerConnection.prototype.addStream = function (stream) {
- var pc = this;
- if (edgeVersion >= 15025) {
- stream.getTracks().forEach(function (track) {
- pc.addTrack(track, stream);
- });
- } else {
- // Clone is necessary for local demos mostly, attaching directly
- // to two different senders does not work (build 10547).
- // Fixed in 15025 (or earlier)
- var clonedStream = stream.clone();
- stream.getTracks().forEach(function (track, idx) {
- var clonedTrack = clonedStream.getTracks()[idx];
- track.addEventListener('enabled', function (event) {
- clonedTrack.enabled = event.enabled;
- });
- });
- clonedStream.getTracks().forEach(function (track) {
- pc.addTrack(track, clonedStream);
- });
- }
- };
+},{"./lib":734,"./lib/elliptic":733}],731:[function(require,module,exports){
+(function (Buffer){
+'use strict';
- RTCPeerConnection.prototype.removeTrack = function (sender) {
- if (this._isClosed) {
- throw makeError('InvalidStateError', 'Attempted to call removeTrack on a closed peerconnection.');
- }
+var toString = Object.prototype.toString;
- if (!(sender instanceof window.RTCRtpSender)) {
- throw new TypeError('Argument 1 of RTCPeerConnection.removeTrack ' + 'does not implement interface RTCRtpSender.');
- }
+// TypeError
+exports.isArray = function (value, message) {
+ if (!Array.isArray(value)) throw TypeError(message);
+};
- var transceiver = this.transceivers.find(function (t) {
- return t.rtpSender === sender;
- });
+exports.isBoolean = function (value, message) {
+ if (toString.call(value) !== '[object Boolean]') throw TypeError(message);
+};
- if (!transceiver) {
- throw makeError('InvalidAccessError', 'Sender was not created by this connection.');
- }
- var stream = transceiver.stream;
+exports.isBuffer = function (value, message) {
+ if (!Buffer.isBuffer(value)) throw TypeError(message);
+};
- transceiver.rtpSender.stop();
- transceiver.rtpSender = null;
- transceiver.track = null;
- transceiver.stream = null;
+exports.isFunction = function (value, message) {
+ if (toString.call(value) !== '[object Function]') throw TypeError(message);
+};
- // remove the stream from the set of local streams
- var localStreams = this.transceivers.map(function (t) {
- return t.stream;
- });
- if (localStreams.indexOf(stream) === -1 && this.localStreams.indexOf(stream) > -1) {
- this.localStreams.splice(this.localStreams.indexOf(stream), 1);
- }
+exports.isNumber = function (value, message) {
+ if (toString.call(value) !== '[object Number]') throw TypeError(message);
+};
- this._maybeFireNegotiationNeeded();
- };
+exports.isObject = function (value, message) {
+ if (toString.call(value) !== '[object Object]') throw TypeError(message);
+};
- RTCPeerConnection.prototype.removeStream = function (stream) {
- var pc = this;
- stream.getTracks().forEach(function (track) {
- var sender = pc.getSenders().find(function (s) {
- return s.track === track;
- });
- if (sender) {
- pc.removeTrack(sender);
- }
- });
- };
+// RangeError
+exports.isBufferLength = function (buffer, length, message) {
+ if (buffer.length !== length) throw RangeError(message);
+};
- RTCPeerConnection.prototype.getSenders = function () {
- return this.transceivers.filter(function (transceiver) {
- return !!transceiver.rtpSender;
- }).map(function (transceiver) {
- return transceiver.rtpSender;
- });
- };
+exports.isBufferLength2 = function (buffer, length1, length2, message) {
+ if (buffer.length !== length1 && buffer.length !== length2) throw RangeError(message);
+};
- RTCPeerConnection.prototype.getReceivers = function () {
- return this.transceivers.filter(function (transceiver) {
- return !!transceiver.rtpReceiver;
- }).map(function (transceiver) {
- return transceiver.rtpReceiver;
- });
- };
+exports.isLengthGTZero = function (value, message) {
+ if (value.length === 0) throw RangeError(message);
+};
- RTCPeerConnection.prototype._createIceGatherer = function (sdpMLineIndex, usingBundle) {
- var pc = this;
- if (usingBundle && sdpMLineIndex > 0) {
- return this.transceivers[0].iceGatherer;
- } else if (this._iceGatherers.length) {
- return this._iceGatherers.shift();
- }
- var iceGatherer = new window.RTCIceGatherer({
- iceServers: this._config.iceServers,
- gatherPolicy: this._config.iceTransportPolicy
- });
- Object.defineProperty(iceGatherer, 'state', { value: 'new', writable: true });
+exports.isNumberInInterval = function (number, x, y, message) {
+ if (number <= x || number >= y) throw RangeError(message);
+};
- this.transceivers[sdpMLineIndex].bufferedCandidateEvents = [];
- this.transceivers[sdpMLineIndex].bufferCandidates = function (event) {
- var end = !event.candidate || Object.keys(event.candidate).length === 0;
- // polyfill since RTCIceGatherer.state is not implemented in
- // Edge 10547 yet.
- iceGatherer.state = end ? 'completed' : 'gathering';
- if (pc.transceivers[sdpMLineIndex].bufferedCandidateEvents !== null) {
- pc.transceivers[sdpMLineIndex].bufferedCandidateEvents.push(event);
- }
- };
- iceGatherer.addEventListener('localcandidate', this.transceivers[sdpMLineIndex].bufferCandidates);
- return iceGatherer;
- };
+}).call(this,{"isBuffer":require("../../is-buffer/index.js")})
+},{"../../is-buffer/index.js":672}],732:[function(require,module,exports){
+'use strict';
- // start gathering from an RTCIceGatherer.
- RTCPeerConnection.prototype._gather = function (mid, sdpMLineIndex) {
- var pc = this;
- var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;
- if (iceGatherer.onlocalcandidate) {
- return;
- }
- var bufferedCandidateEvents = this.transceivers[sdpMLineIndex].bufferedCandidateEvents;
- this.transceivers[sdpMLineIndex].bufferedCandidateEvents = null;
- iceGatherer.removeEventListener('localcandidate', this.transceivers[sdpMLineIndex].bufferCandidates);
- iceGatherer.onlocalcandidate = function (evt) {
- if (pc.usingBundle && sdpMLineIndex > 0) {
- // if we know that we use bundle we can drop candidates with
- // ѕdpMLineIndex > 0. If we don't do this then our state gets
- // confused since we dispose the extra ice gatherer.
- return;
- }
- var event = new Event('icecandidate');
- event.candidate = { sdpMid: mid, sdpMLineIndex: sdpMLineIndex };
+var Buffer = require('safe-buffer').Buffer;
+var bip66 = require('bip66');
- var cand = evt.candidate;
- // Edge emits an empty object for RTCIceCandidateComplete‥
- var end = !cand || Object.keys(cand).length === 0;
- if (end) {
- // polyfill since RTCIceGatherer.state is not implemented in
- // Edge 10547 yet.
- if (iceGatherer.state === 'new' || iceGatherer.state === 'gathering') {
- iceGatherer.state = 'completed';
- }
- } else {
- if (iceGatherer.state === 'new') {
- iceGatherer.state = 'gathering';
- }
- // RTCIceCandidate doesn't have a component, needs to be added
- cand.component = 1;
- // also the usernameFragment. TODO: update SDP to take both variants.
- cand.ufrag = iceGatherer.getLocalParameters().usernameFragment;
+var EC_PRIVKEY_EXPORT_DER_COMPRESSED = Buffer.from([
+// begin
+0x30, 0x81, 0xd3, 0x02, 0x01, 0x01, 0x04, 0x20,
+// private key
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+// middle
+0xa0, 0x81, 0x85, 0x30, 0x81, 0x82, 0x02, 0x01, 0x01, 0x30, 0x2c, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xcE, 0x3d, 0x01, 0x01, 0x02, 0x21, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfE, 0xff, 0xff, 0xfc, 0x2f, 0x30, 0x06, 0x04, 0x01, 0x00, 0x04, 0x01, 0x07, 0x04, 0x21, 0x02, 0x79, 0xbE, 0x66, 0x7E, 0xf9, 0xdc, 0xbb, 0xac, 0x55, 0xa0, 0x62, 0x95, 0xcE, 0x87, 0x0b, 0x07, 0x02, 0x9b, 0xfc, 0xdb, 0x2d, 0xcE, 0x28, 0xd9, 0x59, 0xf2, 0x81, 0x5b, 0x16, 0xf8, 0x17, 0x98, 0x02, 0x21, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfE, 0xba, 0xaE, 0xdc, 0xE6, 0xaf, 0x48, 0xa0, 0x3b, 0xbf, 0xd2, 0x5E, 0x8c, 0xd0, 0x36, 0x41, 0x41, 0x02, 0x01, 0x01, 0xa1, 0x24, 0x03, 0x22, 0x00,
+// public key
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
- var serializedCandidate = SDPUtils.writeCandidate(cand);
- event.candidate = Object.assign(event.candidate, SDPUtils.parseCandidate(serializedCandidate));
+var EC_PRIVKEY_EXPORT_DER_UNCOMPRESSED = Buffer.from([
+// begin
+0x30, 0x82, 0x01, 0x13, 0x02, 0x01, 0x01, 0x04, 0x20,
+// private key
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+// middle
+0xa0, 0x81, 0xa5, 0x30, 0x81, 0xa2, 0x02, 0x01, 0x01, 0x30, 0x2c, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xcE, 0x3d, 0x01, 0x01, 0x02, 0x21, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfE, 0xff, 0xff, 0xfc, 0x2f, 0x30, 0x06, 0x04, 0x01, 0x00, 0x04, 0x01, 0x07, 0x04, 0x41, 0x04, 0x79, 0xbE, 0x66, 0x7E, 0xf9, 0xdc, 0xbb, 0xac, 0x55, 0xa0, 0x62, 0x95, 0xcE, 0x87, 0x0b, 0x07, 0x02, 0x9b, 0xfc, 0xdb, 0x2d, 0xcE, 0x28, 0xd9, 0x59, 0xf2, 0x81, 0x5b, 0x16, 0xf8, 0x17, 0x98, 0x48, 0x3a, 0xda, 0x77, 0x26, 0xa3, 0xc4, 0x65, 0x5d, 0xa4, 0xfb, 0xfc, 0x0E, 0x11, 0x08, 0xa8, 0xfd, 0x17, 0xb4, 0x48, 0xa6, 0x85, 0x54, 0x19, 0x9c, 0x47, 0xd0, 0x8f, 0xfb, 0x10, 0xd4, 0xb8, 0x02, 0x21, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfE, 0xba, 0xaE, 0xdc, 0xE6, 0xaf, 0x48, 0xa0, 0x3b, 0xbf, 0xd2, 0x5E, 0x8c, 0xd0, 0x36, 0x41, 0x41, 0x02, 0x01, 0x01, 0xa1, 0x44, 0x03, 0x42, 0x00,
+// public key
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
- event.candidate.candidate = serializedCandidate;
- event.candidate.toJSON = function () {
- return {
- candidate: event.candidate.candidate,
- sdpMid: event.candidate.sdpMid,
- sdpMLineIndex: event.candidate.sdpMLineIndex,
- usernameFragment: event.candidate.usernameFragment
- };
- };
- }
+exports.privateKeyExport = function (privateKey, publicKey, compressed) {
+ var result = Buffer.from(compressed ? EC_PRIVKEY_EXPORT_DER_COMPRESSED : EC_PRIVKEY_EXPORT_DER_UNCOMPRESSED);
+ privateKey.copy(result, compressed ? 8 : 9);
+ publicKey.copy(result, compressed ? 181 : 214);
+ return result;
+};
- // update local description.
- var sections = SDPUtils.getMediaSections(pc._localDescription.sdp);
- if (!end) {
- sections[event.candidate.sdpMLineIndex] += 'a=' + event.candidate.candidate + '\r\n';
- } else {
- sections[event.candidate.sdpMLineIndex] += 'a=end-of-candidates\r\n';
- }
- pc._localDescription.sdp = SDPUtils.getDescription(pc._localDescription.sdp) + sections.join('');
- var complete = pc.transceivers.every(function (transceiver) {
- return transceiver.iceGatherer && transceiver.iceGatherer.state === 'completed';
- });
+exports.privateKeyImport = function (privateKey) {
+ var length = privateKey.length;
- if (pc.iceGatheringState !== 'gathering') {
- pc.iceGatheringState = 'gathering';
- pc._emitGatheringStateChange();
- }
+ // sequence header
+ var index = 0;
+ if (length < index + 1 || privateKey[index] !== 0x30) return;
+ index += 1;
- // Emit candidate. Also emit null candidate when all gatherers are
- // complete.
- if (!end) {
- pc._dispatchEvent('icecandidate', event);
- }
- if (complete) {
- pc._dispatchEvent('icecandidate', new Event('icecandidate'));
- pc.iceGatheringState = 'complete';
- pc._emitGatheringStateChange();
- }
- };
+ // sequence length constructor
+ if (length < index + 1 || !(privateKey[index] & 0x80)) return;
- // emit already gathered candidates.
- window.setTimeout(function () {
- bufferedCandidateEvents.forEach(function (e) {
- iceGatherer.onlocalcandidate(e);
- });
- }, 0);
- };
+ var lenb = privateKey[index] & 0x7f;
+ index += 1;
+ if (lenb < 1 || lenb > 2) return;
+ if (length < index + lenb) return;
- // Create ICE transport and DTLS transport.
- RTCPeerConnection.prototype._createIceAndDtlsTransports = function () {
- var pc = this;
- var iceTransport = new window.RTCIceTransport(null);
- iceTransport.onicestatechange = function () {
- pc._updateIceConnectionState();
- pc._updateConnectionState();
- };
+ // sequence length
+ var len = privateKey[index + lenb - 1] | (lenb > 1 ? privateKey[index + lenb - 2] << 8 : 0);
+ index += lenb;
+ if (length < index + len) return;
- var dtlsTransport = new window.RTCDtlsTransport(iceTransport);
- dtlsTransport.ondtlsstatechange = function () {
- pc._updateConnectionState();
- };
- dtlsTransport.onerror = function () {
- // onerror does not set state to failed by itself.
- Object.defineProperty(dtlsTransport, 'state', { value: 'failed', writable: true });
- pc._updateConnectionState();
- };
+ // sequence element 0: version number (=1)
+ if (length < index + 3 || privateKey[index] !== 0x02 || privateKey[index + 1] !== 0x01 || privateKey[index + 2] !== 0x01) {
+ return;
+ }
+ index += 3;
- return {
- iceTransport: iceTransport,
- dtlsTransport: dtlsTransport
- };
- };
+ // sequence element 1: octet string, up to 32 bytes
+ if (length < index + 2 || privateKey[index] !== 0x04 || privateKey[index + 1] > 0x20 || length < index + 2 + privateKey[index + 1]) {
+ return;
+ }
- // Destroy ICE gatherer, ICE transport and DTLS transport.
- // Without triggering the callbacks.
- RTCPeerConnection.prototype._disposeIceAndDtlsTransports = function (sdpMLineIndex) {
- var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;
- if (iceGatherer) {
- delete iceGatherer.onlocalcandidate;
- delete this.transceivers[sdpMLineIndex].iceGatherer;
- }
- var iceTransport = this.transceivers[sdpMLineIndex].iceTransport;
- if (iceTransport) {
- delete iceTransport.onicestatechange;
- delete this.transceivers[sdpMLineIndex].iceTransport;
- }
- var dtlsTransport = this.transceivers[sdpMLineIndex].dtlsTransport;
- if (dtlsTransport) {
- delete dtlsTransport.ondtlsstatechange;
- delete dtlsTransport.onerror;
- delete this.transceivers[sdpMLineIndex].dtlsTransport;
- }
- };
+ return privateKey.slice(index + 2, index + 2 + privateKey[index + 1]);
+};
- // Start the RTP Sender and Receiver for a transceiver.
- RTCPeerConnection.prototype._transceive = function (transceiver, send, recv) {
- var params = getCommonCapabilities(transceiver.localCapabilities, transceiver.remoteCapabilities);
- if (send && transceiver.rtpSender) {
- params.encodings = transceiver.sendEncodingParameters;
- params.rtcp = {
- cname: SDPUtils.localCName,
- compound: transceiver.rtcpParameters.compound
- };
- if (transceiver.recvEncodingParameters.length) {
- params.rtcp.ssrc = transceiver.recvEncodingParameters[0].ssrc;
- }
- transceiver.rtpSender.send(params);
- }
- if (recv && transceiver.rtpReceiver && params.codecs.length > 0) {
- // remove RTX field in Edge 14942
- if (transceiver.kind === 'video' && transceiver.recvEncodingParameters && edgeVersion < 15019) {
- transceiver.recvEncodingParameters.forEach(function (p) {
- delete p.rtx;
- });
- }
- if (transceiver.recvEncodingParameters.length) {
- params.encodings = transceiver.recvEncodingParameters;
- } else {
- params.encodings = [{}];
- }
- params.rtcp = {
- compound: transceiver.rtcpParameters.compound
- };
- if (transceiver.rtcpParameters.cname) {
- params.rtcp.cname = transceiver.rtcpParameters.cname;
- }
- if (transceiver.sendEncodingParameters.length) {
- params.rtcp.ssrc = transceiver.sendEncodingParameters[0].ssrc;
- }
- transceiver.rtpReceiver.receive(params);
- }
- };
+exports.signatureExport = function (sigObj) {
+ var r = Buffer.concat([Buffer.from([0]), sigObj.r]);
+ for (var lenR = 33, posR = 0; lenR > 1 && r[posR] === 0x00 && !(r[posR + 1] & 0x80); --lenR, ++posR) {}
- RTCPeerConnection.prototype.setLocalDescription = function (description) {
- var pc = this;
+ var s = Buffer.concat([Buffer.from([0]), sigObj.s]);
+ for (var lenS = 33, posS = 0; lenS > 1 && s[posS] === 0x00 && !(s[posS + 1] & 0x80); --lenS, ++posS) {}
- // Note: pranswer is not supported.
- if (['offer', 'answer'].indexOf(description.type) === -1) {
- return Promise.reject(makeError('TypeError', 'Unsupported type "' + description.type + '"'));
- }
+ return bip66.encode(r.slice(posR), s.slice(posS));
+};
- if (!isActionAllowedInSignalingState('setLocalDescription', description.type, pc.signalingState) || pc._isClosed) {
- return Promise.reject(makeError('InvalidStateError', 'Can not set local ' + description.type + ' in state ' + pc.signalingState));
- }
+exports.signatureImport = function (sig) {
+ var r = Buffer.alloc(32, 0);
+ var s = Buffer.alloc(32, 0);
- var sections;
- var sessionpart;
- if (description.type === 'offer') {
- // VERY limited support for SDP munging. Limited to:
- // * changing the order of codecs
- sections = SDPUtils.splitSections(description.sdp);
- sessionpart = sections.shift();
- sections.forEach(function (mediaSection, sdpMLineIndex) {
- var caps = SDPUtils.parseRtpParameters(mediaSection);
- pc.transceivers[sdpMLineIndex].localCapabilities = caps;
- });
+ try {
+ var sigObj = bip66.decode(sig);
+ if (sigObj.r.length === 33 && sigObj.r[0] === 0x00) sigObj.r = sigObj.r.slice(1);
+ if (sigObj.r.length > 32) throw new Error('R length is too long');
+ if (sigObj.s.length === 33 && sigObj.s[0] === 0x00) sigObj.s = sigObj.s.slice(1);
+ if (sigObj.s.length > 32) throw new Error('S length is too long');
+ } catch (err) {
+ return;
+ }
- pc.transceivers.forEach(function (transceiver, sdpMLineIndex) {
- pc._gather(transceiver.mid, sdpMLineIndex);
- });
- } else if (description.type === 'answer') {
- sections = SDPUtils.splitSections(pc._remoteDescription.sdp);
- sessionpart = sections.shift();
- var isIceLite = SDPUtils.matchPrefix(sessionpart, 'a=ice-lite').length > 0;
- sections.forEach(function (mediaSection, sdpMLineIndex) {
- var transceiver = pc.transceivers[sdpMLineIndex];
- var iceGatherer = transceiver.iceGatherer;
- var iceTransport = transceiver.iceTransport;
- var dtlsTransport = transceiver.dtlsTransport;
- var localCapabilities = transceiver.localCapabilities;
- var remoteCapabilities = transceiver.remoteCapabilities;
-
- // treat bundle-only as not-rejected.
- var rejected = SDPUtils.isRejected(mediaSection) && SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;
-
- if (!rejected && !transceiver.rejected) {
- var remoteIceParameters = SDPUtils.getIceParameters(mediaSection, sessionpart);
- var remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection, sessionpart);
- if (isIceLite) {
- remoteDtlsParameters.role = 'server';
- }
+ sigObj.r.copy(r, 32 - sigObj.r.length);
+ sigObj.s.copy(s, 32 - sigObj.s.length);
- if (!pc.usingBundle || sdpMLineIndex === 0) {
- pc._gather(transceiver.mid, sdpMLineIndex);
- if (iceTransport.state === 'new') {
- iceTransport.start(iceGatherer, remoteIceParameters, isIceLite ? 'controlling' : 'controlled');
- }
- if (dtlsTransport.state === 'new') {
- dtlsTransport.start(remoteDtlsParameters);
- }
- }
+ return { r: r, s: s };
+};
- // Calculate intersection of capabilities.
- var params = getCommonCapabilities(localCapabilities, remoteCapabilities);
+exports.signatureImportLax = function (sig) {
+ var r = Buffer.alloc(32, 0);
+ var s = Buffer.alloc(32, 0);
- // Start the RTCRtpSender. The RTCRtpReceiver for this
- // transceiver has already been started in setRemoteDescription.
- pc._transceive(transceiver, params.codecs.length > 0, false);
- }
- });
- }
+ var length = sig.length;
+ var index = 0;
- pc._localDescription = {
- type: description.type,
- sdp: description.sdp
- };
- if (description.type === 'offer') {
- pc._updateSignalingState('have-local-offer');
- } else {
- pc._updateSignalingState('stable');
- }
+ // sequence tag byte
+ if (sig[index++] !== 0x30) return;
- return Promise.resolve();
- };
+ // sequence length byte
+ var lenbyte = sig[index++];
+ if (lenbyte & 0x80) {
+ index += lenbyte - 0x80;
+ if (index > length) return;
+ }
- RTCPeerConnection.prototype.setRemoteDescription = function (description) {
- var pc = this;
+ // sequence tag byte for r
+ if (sig[index++] !== 0x02) return;
- // Note: pranswer is not supported.
- if (['offer', 'answer'].indexOf(description.type) === -1) {
- return Promise.reject(makeError('TypeError', 'Unsupported type "' + description.type + '"'));
+ // length for r
+ var rlen = sig[index++];
+ if (rlen & 0x80) {
+ lenbyte = rlen - 0x80;
+ if (index + lenbyte > length) return;
+ for (; lenbyte > 0 && sig[index] === 0x00; index += 1, lenbyte -= 1) {}
+ for (rlen = 0; lenbyte > 0; index += 1, lenbyte -= 1) {
+ rlen = (rlen << 8) + sig[index];
}
+ }
+ if (rlen > length - index) return;
+ var rindex = index;
+ index += rlen;
- if (!isActionAllowedInSignalingState('setRemoteDescription', description.type, pc.signalingState) || pc._isClosed) {
- return Promise.reject(makeError('InvalidStateError', 'Can not set remote ' + description.type + ' in state ' + pc.signalingState));
+ // sequence tag byte for s
+ if (sig[index++] !== 0x02) return;
+
+ // length for s
+ var slen = sig[index++];
+ if (slen & 0x80) {
+ lenbyte = slen - 0x80;
+ if (index + lenbyte > length) return;
+ for (; lenbyte > 0 && sig[index] === 0x00; index += 1, lenbyte -= 1) {}
+ for (slen = 0; lenbyte > 0; index += 1, lenbyte -= 1) {
+ slen = (slen << 8) + sig[index];
}
+ }
+ if (slen > length - index) return;
+ var sindex = index;
+ index += slen;
- var streams = {};
- pc.remoteStreams.forEach(function (stream) {
- streams[stream.id] = stream;
- });
- var receiverList = [];
- var sections = SDPUtils.splitSections(description.sdp);
- var sessionpart = sections.shift();
- var isIceLite = SDPUtils.matchPrefix(sessionpart, 'a=ice-lite').length > 0;
- var usingBundle = SDPUtils.matchPrefix(sessionpart, 'a=group:BUNDLE ').length > 0;
- pc.usingBundle = usingBundle;
- var iceOptions = SDPUtils.matchPrefix(sessionpart, 'a=ice-options:')[0];
- if (iceOptions) {
- pc.canTrickleIceCandidates = iceOptions.substr(14).split(' ').indexOf('trickle') >= 0;
- } else {
- pc.canTrickleIceCandidates = false;
- }
-
- sections.forEach(function (mediaSection, sdpMLineIndex) {
- var lines = SDPUtils.splitLines(mediaSection);
- var kind = SDPUtils.getKind(mediaSection);
- // treat bundle-only as not-rejected.
- var rejected = SDPUtils.isRejected(mediaSection) && SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;
- var protocol = lines[0].substr(2).split(' ')[2];
-
- var direction = SDPUtils.getDirection(mediaSection, sessionpart);
- var remoteMsid = SDPUtils.parseMsid(mediaSection);
-
- var mid = SDPUtils.getMid(mediaSection) || SDPUtils.generateIdentifier();
-
- // Reject datachannels which are not implemented yet.
- if (rejected || kind === 'application' && (protocol === 'DTLS/SCTP' || protocol === 'UDP/DTLS/SCTP')) {
- // TODO: this is dangerous in the case where a non-rejected m-line
- // becomes rejected.
- pc.transceivers[sdpMLineIndex] = {
- mid: mid,
- kind: kind,
- protocol: protocol,
- rejected: true
- };
- return;
- }
+ // ignore leading zeros in r
+ for (; rlen > 0 && sig[rindex] === 0x00; rlen -= 1, rindex += 1) {}
+ // copy r value
+ if (rlen > 32) return;
+ var rvalue = sig.slice(rindex, rindex + rlen);
+ rvalue.copy(r, 32 - rvalue.length);
- if (!rejected && pc.transceivers[sdpMLineIndex] && pc.transceivers[sdpMLineIndex].rejected) {
- // recycle a rejected transceiver.
- pc.transceivers[sdpMLineIndex] = pc._createTransceiver(kind, true);
- }
+ // ignore leading zeros in s
+ for (; slen > 0 && sig[sindex] === 0x00; slen -= 1, sindex += 1) {}
+ // copy s value
+ if (slen > 32) return;
+ var svalue = sig.slice(sindex, sindex + slen);
+ svalue.copy(s, 32 - svalue.length);
- var transceiver;
- var iceGatherer;
- var iceTransport;
- var dtlsTransport;
- var rtpReceiver;
- var sendEncodingParameters;
- var recvEncodingParameters;
- var localCapabilities;
+ return { r: r, s: s };
+};
- var track;
- // FIXME: ensure the mediaSection has rtcp-mux set.
- var remoteCapabilities = SDPUtils.parseRtpParameters(mediaSection);
- var remoteIceParameters;
- var remoteDtlsParameters;
- if (!rejected) {
- remoteIceParameters = SDPUtils.getIceParameters(mediaSection, sessionpart);
- remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection, sessionpart);
- remoteDtlsParameters.role = 'client';
- }
- recvEncodingParameters = SDPUtils.parseRtpEncodingParameters(mediaSection);
+},{"bip66":224,"safe-buffer":728}],733:[function(require,module,exports){
+'use strict';
- var rtcpParameters = SDPUtils.parseRtcpParameters(mediaSection);
+var Buffer = require('safe-buffer').Buffer;
+var createHash = require('create-hash');
+var BN = require('bn.js');
+var EC = require('elliptic').ec;
- var isComplete = SDPUtils.matchPrefix(mediaSection, 'a=end-of-candidates', sessionpart).length > 0;
- var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:').map(function (cand) {
- return SDPUtils.parseCandidate(cand);
- }).filter(function (cand) {
- return cand.component === 1;
- });
+var messages = require('../messages.json');
- // Check if we can use BUNDLE and dispose transports.
- if ((description.type === 'offer' || description.type === 'answer') && !rejected && usingBundle && sdpMLineIndex > 0 && pc.transceivers[sdpMLineIndex]) {
- pc._disposeIceAndDtlsTransports(sdpMLineIndex);
- pc.transceivers[sdpMLineIndex].iceGatherer = pc.transceivers[0].iceGatherer;
- pc.transceivers[sdpMLineIndex].iceTransport = pc.transceivers[0].iceTransport;
- pc.transceivers[sdpMLineIndex].dtlsTransport = pc.transceivers[0].dtlsTransport;
- if (pc.transceivers[sdpMLineIndex].rtpSender) {
- pc.transceivers[sdpMLineIndex].rtpSender.setTransport(pc.transceivers[0].dtlsTransport);
- }
- if (pc.transceivers[sdpMLineIndex].rtpReceiver) {
- pc.transceivers[sdpMLineIndex].rtpReceiver.setTransport(pc.transceivers[0].dtlsTransport);
- }
- }
- if (description.type === 'offer' && !rejected) {
- transceiver = pc.transceivers[sdpMLineIndex] || pc._createTransceiver(kind);
- transceiver.mid = mid;
+var ec = new EC('secp256k1');
+var ecparams = ec.curve;
- if (!transceiver.iceGatherer) {
- transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex, usingBundle);
- }
+function loadCompressedPublicKey(first, xBuffer) {
+ var x = new BN(xBuffer);
- if (cands.length && transceiver.iceTransport.state === 'new') {
- if (isComplete && (!usingBundle || sdpMLineIndex === 0)) {
- transceiver.iceTransport.setRemoteCandidates(cands);
- } else {
- cands.forEach(function (candidate) {
- maybeAddCandidate(transceiver.iceTransport, candidate);
- });
- }
- }
+ // overflow
+ if (x.cmp(ecparams.p) >= 0) return null;
+ x = x.toRed(ecparams.red);
- localCapabilities = window.RTCRtpReceiver.getCapabilities(kind);
+ // compute corresponding Y
+ var y = x.redSqr().redIMul(x).redIAdd(ecparams.b).redSqrt();
+ if (first === 0x03 !== y.isOdd()) y = y.redNeg();
- // filter RTX until additional stuff needed for RTX is implemented
- // in adapter.js
- if (edgeVersion < 15019) {
- localCapabilities.codecs = localCapabilities.codecs.filter(function (codec) {
- return codec.name !== 'rtx';
- });
- }
+ return ec.keyPair({ pub: { x: x, y: y } });
+}
- sendEncodingParameters = transceiver.sendEncodingParameters || [{
- ssrc: (2 * sdpMLineIndex + 2) * 1001
- }];
-
- // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams
- var isNewTrack = false;
- if (direction === 'sendrecv' || direction === 'sendonly') {
- isNewTrack = !transceiver.rtpReceiver;
- rtpReceiver = transceiver.rtpReceiver || new window.RTCRtpReceiver(transceiver.dtlsTransport, kind);
-
- if (isNewTrack) {
- var stream;
- track = rtpReceiver.track;
- // FIXME: does not work with Plan B.
- if (remoteMsid && remoteMsid.stream === '-') {
- // no-op. a stream id of '-' means: no associated stream.
- } else if (remoteMsid) {
- if (!streams[remoteMsid.stream]) {
- streams[remoteMsid.stream] = new window.MediaStream();
- Object.defineProperty(streams[remoteMsid.stream], 'id', {
- get: function get() {
- return remoteMsid.stream;
- }
- });
- }
- Object.defineProperty(track, 'id', {
- get: function get() {
- return remoteMsid.track;
- }
- });
- stream = streams[remoteMsid.stream];
- } else {
- if (!streams.default) {
- streams.default = new window.MediaStream();
- }
- stream = streams.default;
- }
- if (stream) {
- addTrackToStreamAndFireEvent(track, stream);
- transceiver.associatedRemoteMediaStreams.push(stream);
- }
- receiverList.push([track, rtpReceiver, stream]);
- }
- } else if (transceiver.rtpReceiver && transceiver.rtpReceiver.track) {
- transceiver.associatedRemoteMediaStreams.forEach(function (s) {
- var nativeTrack = s.getTracks().find(function (t) {
- return t.id === transceiver.rtpReceiver.track.id;
- });
- if (nativeTrack) {
- removeTrackFromStreamAndFireEvent(nativeTrack, s);
- }
- });
- transceiver.associatedRemoteMediaStreams = [];
- }
-
- transceiver.localCapabilities = localCapabilities;
- transceiver.remoteCapabilities = remoteCapabilities;
- transceiver.rtpReceiver = rtpReceiver;
- transceiver.rtcpParameters = rtcpParameters;
- transceiver.sendEncodingParameters = sendEncodingParameters;
- transceiver.recvEncodingParameters = recvEncodingParameters;
-
- // Start the RTCRtpReceiver now. The RTPSender is started in
- // setLocalDescription.
- pc._transceive(pc.transceivers[sdpMLineIndex], false, isNewTrack);
- } else if (description.type === 'answer' && !rejected) {
- transceiver = pc.transceivers[sdpMLineIndex];
- iceGatherer = transceiver.iceGatherer;
- iceTransport = transceiver.iceTransport;
- dtlsTransport = transceiver.dtlsTransport;
- rtpReceiver = transceiver.rtpReceiver;
- sendEncodingParameters = transceiver.sendEncodingParameters;
- localCapabilities = transceiver.localCapabilities;
-
- pc.transceivers[sdpMLineIndex].recvEncodingParameters = recvEncodingParameters;
- pc.transceivers[sdpMLineIndex].remoteCapabilities = remoteCapabilities;
- pc.transceivers[sdpMLineIndex].rtcpParameters = rtcpParameters;
-
- if (cands.length && iceTransport.state === 'new') {
- if ((isIceLite || isComplete) && (!usingBundle || sdpMLineIndex === 0)) {
- iceTransport.setRemoteCandidates(cands);
- } else {
- cands.forEach(function (candidate) {
- maybeAddCandidate(transceiver.iceTransport, candidate);
- });
- }
- }
+function loadUncompressedPublicKey(first, xBuffer, yBuffer) {
+ var x = new BN(xBuffer);
+ var y = new BN(yBuffer);
- if (!usingBundle || sdpMLineIndex === 0) {
- if (iceTransport.state === 'new') {
- iceTransport.start(iceGatherer, remoteIceParameters, 'controlling');
- }
- if (dtlsTransport.state === 'new') {
- dtlsTransport.start(remoteDtlsParameters);
- }
- }
+ // overflow
+ if (x.cmp(ecparams.p) >= 0 || y.cmp(ecparams.p) >= 0) return null;
- // If the offer contained RTX but the answer did not,
- // remove RTX from sendEncodingParameters.
- var commonCapabilities = getCommonCapabilities(transceiver.localCapabilities, transceiver.remoteCapabilities);
+ x = x.toRed(ecparams.red);
+ y = y.toRed(ecparams.red);
- var hasRtx = commonCapabilities.codecs.filter(function (c) {
- return c.name.toLowerCase() === 'rtx';
- }).length;
- if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {
- delete transceiver.sendEncodingParameters[0].rtx;
- }
+ // is odd flag
+ if ((first === 0x06 || first === 0x07) && y.isOdd() !== (first === 0x07)) return null;
- pc._transceive(transceiver, direction === 'sendrecv' || direction === 'recvonly', direction === 'sendrecv' || direction === 'sendonly');
+ // x*x*x + b = y*y
+ var x3 = x.redSqr().redIMul(x);
+ if (!y.redSqr().redISub(x3.redIAdd(ecparams.b)).isZero()) return null;
- // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams
- if (rtpReceiver && (direction === 'sendrecv' || direction === 'sendonly')) {
- track = rtpReceiver.track;
- if (remoteMsid) {
- if (!streams[remoteMsid.stream]) {
- streams[remoteMsid.stream] = new window.MediaStream();
- }
- addTrackToStreamAndFireEvent(track, streams[remoteMsid.stream]);
- receiverList.push([track, rtpReceiver, streams[remoteMsid.stream]]);
- } else {
- if (!streams.default) {
- streams.default = new window.MediaStream();
- }
- addTrackToStreamAndFireEvent(track, streams.default);
- receiverList.push([track, rtpReceiver, streams.default]);
- }
- } else {
- // FIXME: actually the receiver should be created later.
- delete transceiver.rtpReceiver;
- }
- }
- });
+ return ec.keyPair({ pub: { x: x, y: y } });
+}
- if (pc._dtlsRole === undefined) {
- pc._dtlsRole = description.type === 'offer' ? 'active' : 'passive';
- }
+function loadPublicKey(publicKey) {
+ var first = publicKey[0];
+ switch (first) {
+ case 0x02:
+ case 0x03:
+ if (publicKey.length !== 33) return null;
+ return loadCompressedPublicKey(first, publicKey.slice(1, 33));
+ case 0x04:
+ case 0x06:
+ case 0x07:
+ if (publicKey.length !== 65) return null;
+ return loadUncompressedPublicKey(first, publicKey.slice(1, 33), publicKey.slice(33, 65));
+ default:
+ return null;
+ }
+}
- pc._remoteDescription = {
- type: description.type,
- sdp: description.sdp
- };
- if (description.type === 'offer') {
- pc._updateSignalingState('have-remote-offer');
- } else {
- pc._updateSignalingState('stable');
- }
- Object.keys(streams).forEach(function (sid) {
- var stream = streams[sid];
- if (stream.getTracks().length) {
- if (pc.remoteStreams.indexOf(stream) === -1) {
- pc.remoteStreams.push(stream);
- var event = new Event('addstream');
- event.stream = stream;
- window.setTimeout(function () {
- pc._dispatchEvent('addstream', event);
- });
- }
+exports.privateKeyVerify = function (privateKey) {
+ var bn = new BN(privateKey);
+ return bn.cmp(ecparams.n) < 0 && !bn.isZero();
+};
- receiverList.forEach(function (item) {
- var track = item[0];
- var receiver = item[1];
- if (stream.id !== item[2].id) {
- return;
- }
- fireAddTrack(pc, track, receiver, [stream]);
- });
- }
- });
- receiverList.forEach(function (item) {
- if (item[2]) {
- return;
- }
- fireAddTrack(pc, item[0], item[1], []);
- });
+exports.privateKeyExport = function (privateKey, compressed) {
+ var d = new BN(privateKey);
+ if (d.cmp(ecparams.n) >= 0 || d.isZero()) throw new Error(messages.EC_PRIVATE_KEY_EXPORT_DER_FAIL);
- // check whether addIceCandidate({}) was called within four seconds after
- // setRemoteDescription.
- window.setTimeout(function () {
- if (!(pc && pc.transceivers)) {
- return;
- }
- pc.transceivers.forEach(function (transceiver) {
- if (transceiver.iceTransport && transceiver.iceTransport.state === 'new' && transceiver.iceTransport.getRemoteCandidates().length > 0) {
- console.warn('Timeout for addRemoteCandidate. Consider sending ' + 'an end-of-candidates notification');
- transceiver.iceTransport.addRemoteCandidate({});
- }
- });
- }, 4000);
+ return Buffer.from(ec.keyFromPrivate(privateKey).getPublic(compressed, true));
+};
- return Promise.resolve();
- };
+exports.privateKeyNegate = function (privateKey) {
+ var bn = new BN(privateKey);
+ return bn.isZero() ? Buffer.alloc(32) : ecparams.n.sub(bn).umod(ecparams.n).toArrayLike(Buffer, 'be', 32);
+};
- RTCPeerConnection.prototype.close = function () {
- this.transceivers.forEach(function (transceiver) {
- /* not yet
- if (transceiver.iceGatherer) {
- transceiver.iceGatherer.close();
- }
- */
- if (transceiver.iceTransport) {
- transceiver.iceTransport.stop();
- }
- if (transceiver.dtlsTransport) {
- transceiver.dtlsTransport.stop();
- }
- if (transceiver.rtpSender) {
- transceiver.rtpSender.stop();
- }
- if (transceiver.rtpReceiver) {
- transceiver.rtpReceiver.stop();
- }
- });
- // FIXME: clean up tracks, local streams, remote streams, etc
- this._isClosed = true;
- this._updateSignalingState('closed');
- };
+exports.privateKeyModInverse = function (privateKey) {
+ var bn = new BN(privateKey);
+ if (bn.cmp(ecparams.n) >= 0 || bn.isZero()) throw new Error(messages.EC_PRIVATE_KEY_RANGE_INVALID);
- // Update the signaling state.
- RTCPeerConnection.prototype._updateSignalingState = function (newState) {
- this.signalingState = newState;
- var event = new Event('signalingstatechange');
- this._dispatchEvent('signalingstatechange', event);
- };
+ return bn.invm(ecparams.n).toArrayLike(Buffer, 'be', 32);
+};
- // Determine whether to fire the negotiationneeded event.
- RTCPeerConnection.prototype._maybeFireNegotiationNeeded = function () {
- var pc = this;
- if (this.signalingState !== 'stable' || this.needNegotiation === true) {
- return;
- }
- this.needNegotiation = true;
- window.setTimeout(function () {
- if (pc.needNegotiation) {
- pc.needNegotiation = false;
- var event = new Event('negotiationneeded');
- pc._dispatchEvent('negotiationneeded', event);
- }
- }, 0);
- };
+exports.privateKeyTweakAdd = function (privateKey, tweak) {
+ var bn = new BN(tweak);
+ if (bn.cmp(ecparams.n) >= 0) throw new Error(messages.EC_PRIVATE_KEY_TWEAK_ADD_FAIL);
- // Update the ice connection state.
- RTCPeerConnection.prototype._updateIceConnectionState = function () {
- var newState;
- var states = {
- 'new': 0,
- closed: 0,
- checking: 0,
- connected: 0,
- completed: 0,
- disconnected: 0,
- failed: 0
- };
- this.transceivers.forEach(function (transceiver) {
- states[transceiver.iceTransport.state]++;
- });
+ bn.iadd(new BN(privateKey));
+ if (bn.cmp(ecparams.n) >= 0) bn.isub(ecparams.n);
+ if (bn.isZero()) throw new Error(messages.EC_PRIVATE_KEY_TWEAK_ADD_FAIL);
- newState = 'new';
- if (states.failed > 0) {
- newState = 'failed';
- } else if (states.checking > 0) {
- newState = 'checking';
- } else if (states.disconnected > 0) {
- newState = 'disconnected';
- } else if (states.new > 0) {
- newState = 'new';
- } else if (states.connected > 0) {
- newState = 'connected';
- } else if (states.completed > 0) {
- newState = 'completed';
- }
-
- if (newState !== this.iceConnectionState) {
- this.iceConnectionState = newState;
- var event = new Event('iceconnectionstatechange');
- this._dispatchEvent('iceconnectionstatechange', event);
- }
- };
-
- // Update the connection state.
- RTCPeerConnection.prototype._updateConnectionState = function () {
- var newState;
- var states = {
- 'new': 0,
- closed: 0,
- connecting: 0,
- connected: 0,
- completed: 0,
- disconnected: 0,
- failed: 0
- };
- this.transceivers.forEach(function (transceiver) {
- states[transceiver.iceTransport.state]++;
- states[transceiver.dtlsTransport.state]++;
- });
- // ICETransport.completed and connected are the same for this purpose.
- states.connected += states.completed;
-
- newState = 'new';
- if (states.failed > 0) {
- newState = 'failed';
- } else if (states.connecting > 0) {
- newState = 'connecting';
- } else if (states.disconnected > 0) {
- newState = 'disconnected';
- } else if (states.new > 0) {
- newState = 'new';
- } else if (states.connected > 0) {
- newState = 'connected';
- }
-
- if (newState !== this.connectionState) {
- this.connectionState = newState;
- var event = new Event('connectionstatechange');
- this._dispatchEvent('connectionstatechange', event);
- }
- };
-
- RTCPeerConnection.prototype.createOffer = function () {
- var pc = this;
-
- if (pc._isClosed) {
- return Promise.reject(makeError('InvalidStateError', 'Can not call createOffer after close'));
- }
-
- var numAudioTracks = pc.transceivers.filter(function (t) {
- return t.kind === 'audio';
- }).length;
- var numVideoTracks = pc.transceivers.filter(function (t) {
- return t.kind === 'video';
- }).length;
-
- // Determine number of audio and video tracks we need to send/recv.
- var offerOptions = arguments[0];
- if (offerOptions) {
- // Reject Chrome legacy constraints.
- if (offerOptions.mandatory || offerOptions.optional) {
- throw new TypeError('Legacy mandatory/optional constraints not supported.');
- }
- if (offerOptions.offerToReceiveAudio !== undefined) {
- if (offerOptions.offerToReceiveAudio === true) {
- numAudioTracks = 1;
- } else if (offerOptions.offerToReceiveAudio === false) {
- numAudioTracks = 0;
- } else {
- numAudioTracks = offerOptions.offerToReceiveAudio;
- }
- }
- if (offerOptions.offerToReceiveVideo !== undefined) {
- if (offerOptions.offerToReceiveVideo === true) {
- numVideoTracks = 1;
- } else if (offerOptions.offerToReceiveVideo === false) {
- numVideoTracks = 0;
- } else {
- numVideoTracks = offerOptions.offerToReceiveVideo;
- }
- }
- }
+ return bn.toArrayLike(Buffer, 'be', 32);
+};
- pc.transceivers.forEach(function (transceiver) {
- if (transceiver.kind === 'audio') {
- numAudioTracks--;
- if (numAudioTracks < 0) {
- transceiver.wantReceive = false;
- }
- } else if (transceiver.kind === 'video') {
- numVideoTracks--;
- if (numVideoTracks < 0) {
- transceiver.wantReceive = false;
- }
- }
- });
+exports.privateKeyTweakMul = function (privateKey, tweak) {
+ var bn = new BN(tweak);
+ if (bn.cmp(ecparams.n) >= 0 || bn.isZero()) throw new Error(messages.EC_PRIVATE_KEY_TWEAK_MUL_FAIL);
- // Create M-lines for recvonly streams.
- while (numAudioTracks > 0 || numVideoTracks > 0) {
- if (numAudioTracks > 0) {
- pc._createTransceiver('audio');
- numAudioTracks--;
- }
- if (numVideoTracks > 0) {
- pc._createTransceiver('video');
- numVideoTracks--;
- }
- }
+ bn.imul(new BN(privateKey));
+ if (bn.cmp(ecparams.n)) bn = bn.umod(ecparams.n);
- var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId, pc._sdpSessionVersion++);
- pc.transceivers.forEach(function (transceiver, sdpMLineIndex) {
- // For each track, create an ice gatherer, ice transport,
- // dtls transport, potentially rtpsender and rtpreceiver.
- var track = transceiver.track;
- var kind = transceiver.kind;
- var mid = transceiver.mid || SDPUtils.generateIdentifier();
- transceiver.mid = mid;
+ return bn.toArrayLike(Buffer, 'be', 32);
+};
- if (!transceiver.iceGatherer) {
- transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex, pc.usingBundle);
- }
+exports.publicKeyCreate = function (privateKey, compressed) {
+ var d = new BN(privateKey);
+ if (d.cmp(ecparams.n) >= 0 || d.isZero()) throw new Error(messages.EC_PUBLIC_KEY_CREATE_FAIL);
- var localCapabilities = window.RTCRtpSender.getCapabilities(kind);
- // filter RTX until additional stuff needed for RTX is implemented
- // in adapter.js
- if (edgeVersion < 15019) {
- localCapabilities.codecs = localCapabilities.codecs.filter(function (codec) {
- return codec.name !== 'rtx';
- });
- }
- localCapabilities.codecs.forEach(function (codec) {
- // work around https://bugs.chromium.org/p/webrtc/issues/detail?id=6552
- // by adding level-asymmetry-allowed=1
- if (codec.name === 'H264' && codec.parameters['level-asymmetry-allowed'] === undefined) {
- codec.parameters['level-asymmetry-allowed'] = '1';
- }
+ return Buffer.from(ec.keyFromPrivate(privateKey).getPublic(compressed, true));
+};
- // for subsequent offers, we might have to re-use the payload
- // type of the last offer.
- if (transceiver.remoteCapabilities && transceiver.remoteCapabilities.codecs) {
- transceiver.remoteCapabilities.codecs.forEach(function (remoteCodec) {
- if (codec.name.toLowerCase() === remoteCodec.name.toLowerCase() && codec.clockRate === remoteCodec.clockRate) {
- codec.preferredPayloadType = remoteCodec.payloadType;
- }
- });
- }
- });
- localCapabilities.headerExtensions.forEach(function (hdrExt) {
- var remoteExtensions = transceiver.remoteCapabilities && transceiver.remoteCapabilities.headerExtensions || [];
- remoteExtensions.forEach(function (rHdrExt) {
- if (hdrExt.uri === rHdrExt.uri) {
- hdrExt.id = rHdrExt.id;
- }
- });
- });
+exports.publicKeyConvert = function (publicKey, compressed) {
+ var pair = loadPublicKey(publicKey);
+ if (pair === null) throw new Error(messages.EC_PUBLIC_KEY_PARSE_FAIL);
- // generate an ssrc now, to be used later in rtpSender.send
- var sendEncodingParameters = transceiver.sendEncodingParameters || [{
- ssrc: (2 * sdpMLineIndex + 1) * 1001
- }];
- if (track) {
- // add RTX
- if (edgeVersion >= 15019 && kind === 'video' && !sendEncodingParameters[0].rtx) {
- sendEncodingParameters[0].rtx = {
- ssrc: sendEncodingParameters[0].ssrc + 1
- };
- }
- }
+ return Buffer.from(pair.getPublic(compressed, true));
+};
- if (transceiver.wantReceive) {
- transceiver.rtpReceiver = new window.RTCRtpReceiver(transceiver.dtlsTransport, kind);
- }
+exports.publicKeyVerify = function (publicKey) {
+ return loadPublicKey(publicKey) !== null;
+};
- transceiver.localCapabilities = localCapabilities;
- transceiver.sendEncodingParameters = sendEncodingParameters;
- });
+exports.publicKeyTweakAdd = function (publicKey, tweak, compressed) {
+ var pair = loadPublicKey(publicKey);
+ if (pair === null) throw new Error(messages.EC_PUBLIC_KEY_PARSE_FAIL);
- // always offer BUNDLE and dispose on return if not supported.
- if (pc._config.bundlePolicy !== 'max-compat') {
- sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function (t) {
- return t.mid;
- }).join(' ') + '\r\n';
- }
- sdp += 'a=ice-options:trickle\r\n';
+ tweak = new BN(tweak);
+ if (tweak.cmp(ecparams.n) >= 0) throw new Error(messages.EC_PUBLIC_KEY_TWEAK_ADD_FAIL);
- pc.transceivers.forEach(function (transceiver, sdpMLineIndex) {
- sdp += writeMediaSection(transceiver, transceiver.localCapabilities, 'offer', transceiver.stream, pc._dtlsRole);
- sdp += 'a=rtcp-rsize\r\n';
+ return Buffer.from(ecparams.g.mul(tweak).add(pair.pub).encode(true, compressed));
+};
- if (transceiver.iceGatherer && pc.iceGatheringState !== 'new' && (sdpMLineIndex === 0 || !pc.usingBundle)) {
- transceiver.iceGatherer.getLocalCandidates().forEach(function (cand) {
- cand.component = 1;
- sdp += 'a=' + SDPUtils.writeCandidate(cand) + '\r\n';
- });
+exports.publicKeyTweakMul = function (publicKey, tweak, compressed) {
+ var pair = loadPublicKey(publicKey);
+ if (pair === null) throw new Error(messages.EC_PUBLIC_KEY_PARSE_FAIL);
- if (transceiver.iceGatherer.state === 'completed') {
- sdp += 'a=end-of-candidates\r\n';
- }
- }
- });
+ tweak = new BN(tweak);
+ if (tweak.cmp(ecparams.n) >= 0 || tweak.isZero()) throw new Error(messages.EC_PUBLIC_KEY_TWEAK_MUL_FAIL);
- var desc = new window.RTCSessionDescription({
- type: 'offer',
- sdp: sdp
- });
- return Promise.resolve(desc);
- };
+ return Buffer.from(pair.pub.mul(tweak).encode(true, compressed));
+};
- RTCPeerConnection.prototype.createAnswer = function () {
- var pc = this;
+exports.publicKeyCombine = function (publicKeys, compressed) {
+ var pairs = new Array(publicKeys.length);
+ for (var i = 0; i < publicKeys.length; ++i) {
+ pairs[i] = loadPublicKey(publicKeys[i]);
+ if (pairs[i] === null) throw new Error(messages.EC_PUBLIC_KEY_PARSE_FAIL);
+ }
- if (pc._isClosed) {
- return Promise.reject(makeError('InvalidStateError', 'Can not call createAnswer after close'));
- }
+ var point = pairs[0].pub;
+ for (var j = 1; j < pairs.length; ++j) {
+ point = point.add(pairs[j].pub);
+ }if (point.isInfinity()) throw new Error(messages.EC_PUBLIC_KEY_COMBINE_FAIL);
- if (!(pc.signalingState === 'have-remote-offer' || pc.signalingState === 'have-local-pranswer')) {
- return Promise.reject(makeError('InvalidStateError', 'Can not call createAnswer in signalingState ' + pc.signalingState));
- }
+ return Buffer.from(point.encode(true, compressed));
+};
- var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId, pc._sdpSessionVersion++);
- if (pc.usingBundle) {
- sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function (t) {
- return t.mid;
- }).join(' ') + '\r\n';
- }
- sdp += 'a=ice-options:trickle\r\n';
+exports.signatureNormalize = function (signature) {
+ var r = new BN(signature.slice(0, 32));
+ var s = new BN(signature.slice(32, 64));
+ if (r.cmp(ecparams.n) >= 0 || s.cmp(ecparams.n) >= 0) throw new Error(messages.ECDSA_SIGNATURE_PARSE_FAIL);
- var mediaSectionsInOffer = SDPUtils.getMediaSections(pc._remoteDescription.sdp).length;
- pc.transceivers.forEach(function (transceiver, sdpMLineIndex) {
- if (sdpMLineIndex + 1 > mediaSectionsInOffer) {
- return;
- }
- if (transceiver.rejected) {
- if (transceiver.kind === 'application') {
- if (transceiver.protocol === 'DTLS/SCTP') {
- // legacy fmt
- sdp += 'm=application 0 DTLS/SCTP 5000\r\n';
- } else {
- sdp += 'm=application 0 ' + transceiver.protocol + ' webrtc-datachannel\r\n';
- }
- } else if (transceiver.kind === 'audio') {
- sdp += 'm=audio 0 UDP/TLS/RTP/SAVPF 0\r\n' + 'a=rtpmap:0 PCMU/8000\r\n';
- } else if (transceiver.kind === 'video') {
- sdp += 'm=video 0 UDP/TLS/RTP/SAVPF 120\r\n' + 'a=rtpmap:120 VP8/90000\r\n';
- }
- sdp += 'c=IN IP4 0.0.0.0\r\n' + 'a=inactive\r\n' + 'a=mid:' + transceiver.mid + '\r\n';
- return;
- }
+ var result = Buffer.from(signature);
+ if (s.cmp(ec.nh) === 1) ecparams.n.sub(s).toArrayLike(Buffer, 'be', 32).copy(result, 32);
- // FIXME: look at direction.
- if (transceiver.stream) {
- var localTrack;
- if (transceiver.kind === 'audio') {
- localTrack = transceiver.stream.getAudioTracks()[0];
- } else if (transceiver.kind === 'video') {
- localTrack = transceiver.stream.getVideoTracks()[0];
- }
- if (localTrack) {
- // add RTX
- if (edgeVersion >= 15019 && transceiver.kind === 'video' && !transceiver.sendEncodingParameters[0].rtx) {
- transceiver.sendEncodingParameters[0].rtx = {
- ssrc: transceiver.sendEncodingParameters[0].ssrc + 1
- };
- }
- }
- }
+ return result;
+};
- // Calculate intersection of capabilities.
- var commonCapabilities = getCommonCapabilities(transceiver.localCapabilities, transceiver.remoteCapabilities);
+exports.signatureExport = function (signature) {
+ var r = signature.slice(0, 32);
+ var s = signature.slice(32, 64);
+ if (new BN(r).cmp(ecparams.n) >= 0 || new BN(s).cmp(ecparams.n) >= 0) throw new Error(messages.ECDSA_SIGNATURE_PARSE_FAIL);
- var hasRtx = commonCapabilities.codecs.filter(function (c) {
- return c.name.toLowerCase() === 'rtx';
- }).length;
- if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {
- delete transceiver.sendEncodingParameters[0].rtx;
- }
+ return { r: r, s: s };
+};
- sdp += writeMediaSection(transceiver, commonCapabilities, 'answer', transceiver.stream, pc._dtlsRole);
- if (transceiver.rtcpParameters && transceiver.rtcpParameters.reducedSize) {
- sdp += 'a=rtcp-rsize\r\n';
- }
- });
+exports.signatureImport = function (sigObj) {
+ var r = new BN(sigObj.r);
+ if (r.cmp(ecparams.n) >= 0) r = new BN(0);
- var desc = new window.RTCSessionDescription({
- type: 'answer',
- sdp: sdp
- });
- return Promise.resolve(desc);
- };
+ var s = new BN(sigObj.s);
+ if (s.cmp(ecparams.n) >= 0) s = new BN(0);
- RTCPeerConnection.prototype.addIceCandidate = function (candidate) {
- var pc = this;
- var sections;
- if (candidate && !(candidate.sdpMLineIndex !== undefined || candidate.sdpMid)) {
- return Promise.reject(new TypeError('sdpMLineIndex or sdpMid required'));
- }
+ return Buffer.concat([r.toArrayLike(Buffer, 'be', 32), s.toArrayLike(Buffer, 'be', 32)]);
+};
- // TODO: needs to go into ops queue.
- return new Promise(function (resolve, reject) {
- if (!pc._remoteDescription) {
- return reject(makeError('InvalidStateError', 'Can not add ICE candidate without a remote description'));
- } else if (!candidate || candidate.candidate === '') {
- for (var j = 0; j < pc.transceivers.length; j++) {
- if (pc.transceivers[j].rejected) {
- continue;
- }
- pc.transceivers[j].iceTransport.addRemoteCandidate({});
- sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);
- sections[j] += 'a=end-of-candidates\r\n';
- pc._remoteDescription.sdp = SDPUtils.getDescription(pc._remoteDescription.sdp) + sections.join('');
- if (pc.usingBundle) {
- break;
- }
- }
- } else {
- var sdpMLineIndex = candidate.sdpMLineIndex;
- if (candidate.sdpMid) {
- for (var i = 0; i < pc.transceivers.length; i++) {
- if (pc.transceivers[i].mid === candidate.sdpMid) {
- sdpMLineIndex = i;
- break;
- }
- }
- }
- var transceiver = pc.transceivers[sdpMLineIndex];
- if (transceiver) {
- if (transceiver.rejected) {
- return resolve();
- }
- var cand = Object.keys(candidate.candidate).length > 0 ? SDPUtils.parseCandidate(candidate.candidate) : {};
- // Ignore Chrome's invalid candidates since Edge does not like them.
- if (cand.protocol === 'tcp' && (cand.port === 0 || cand.port === 9)) {
- return resolve();
- }
- // Ignore RTCP candidates, we assume RTCP-MUX.
- if (cand.component && cand.component !== 1) {
- return resolve();
- }
- // when using bundle, avoid adding candidates to the wrong
- // ice transport. And avoid adding candidates added in the SDP.
- if (sdpMLineIndex === 0 || sdpMLineIndex > 0 && transceiver.iceTransport !== pc.transceivers[0].iceTransport) {
- if (!maybeAddCandidate(transceiver.iceTransport, cand)) {
- return reject(makeError('OperationError', 'Can not add ICE candidate'));
- }
- }
+exports.sign = function (message, privateKey, noncefn, data) {
+ if (typeof noncefn === 'function') {
+ var getNonce = noncefn;
+ noncefn = function noncefn(counter) {
+ var nonce = getNonce(message, privateKey, null, data, counter);
+ if (!Buffer.isBuffer(nonce) || nonce.length !== 32) throw new Error(messages.ECDSA_SIGN_FAIL);
- // update the remoteDescription.
- var candidateString = candidate.candidate.trim();
- if (candidateString.indexOf('a=') === 0) {
- candidateString = candidateString.substr(2);
- }
- sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);
- sections[sdpMLineIndex] += 'a=' + (cand.type ? candidateString : 'end-of-candidates') + '\r\n';
- pc._remoteDescription.sdp = SDPUtils.getDescription(pc._remoteDescription.sdp) + sections.join('');
- } else {
- return reject(makeError('OperationError', 'Can not add ICE candidate'));
- }
- }
- resolve();
- });
- };
+ return new BN(nonce);
+ };
+ }
- RTCPeerConnection.prototype.getStats = function (selector) {
- if (selector && selector instanceof window.MediaStreamTrack) {
- var senderOrReceiver = null;
- this.transceivers.forEach(function (transceiver) {
- if (transceiver.rtpSender && transceiver.rtpSender.track === selector) {
- senderOrReceiver = transceiver.rtpSender;
- } else if (transceiver.rtpReceiver && transceiver.rtpReceiver.track === selector) {
- senderOrReceiver = transceiver.rtpReceiver;
- }
- });
- if (!senderOrReceiver) {
- throw makeError('InvalidAccessError', 'Invalid selector.');
- }
- return senderOrReceiver.getStats();
- }
+ var d = new BN(privateKey);
+ if (d.cmp(ecparams.n) >= 0 || d.isZero()) throw new Error(messages.ECDSA_SIGN_FAIL);
- var promises = [];
- this.transceivers.forEach(function (transceiver) {
- ['rtpSender', 'rtpReceiver', 'iceGatherer', 'iceTransport', 'dtlsTransport'].forEach(function (method) {
- if (transceiver[method]) {
- promises.push(transceiver[method].getStats());
- }
- });
- });
- return Promise.all(promises).then(function (allStats) {
- var results = new Map();
- allStats.forEach(function (stats) {
- stats.forEach(function (stat) {
- results.set(stat.id, stat);
- });
- });
- return results;
- });
+ var result = ec.sign(message, privateKey, { canonical: true, k: noncefn, pers: data });
+ return {
+ signature: Buffer.concat([result.r.toArrayLike(Buffer, 'be', 32), result.s.toArrayLike(Buffer, 'be', 32)]),
+ recovery: result.recoveryParam
};
+};
- // fix low-level stat names and return Map instead of object.
- var ortcObjects = ['RTCRtpSender', 'RTCRtpReceiver', 'RTCIceGatherer', 'RTCIceTransport', 'RTCDtlsTransport'];
- ortcObjects.forEach(function (ortcObjectName) {
- var obj = window[ortcObjectName];
- if (obj && obj.prototype && obj.prototype.getStats) {
- var nativeGetstats = obj.prototype.getStats;
- obj.prototype.getStats = function () {
- return nativeGetstats.apply(this).then(function (nativeStats) {
- var mapStats = new Map();
- Object.keys(nativeStats).forEach(function (id) {
- nativeStats[id].type = fixStatsType(nativeStats[id]);
- mapStats.set(id, nativeStats[id]);
- });
- return mapStats;
- });
- };
- }
- });
-
- // legacy callback shims. Should be moved to adapter.js some days.
- var methods = ['createOffer', 'createAnswer'];
- methods.forEach(function (method) {
- var nativeMethod = RTCPeerConnection.prototype[method];
- RTCPeerConnection.prototype[method] = function () {
- var args = arguments;
- if (typeof args[0] === 'function' || typeof args[1] === 'function') {
- // legacy
- return nativeMethod.apply(this, [arguments[2]]).then(function (description) {
- if (typeof args[0] === 'function') {
- args[0].apply(null, [description]);
- }
- }, function (error) {
- if (typeof args[1] === 'function') {
- args[1].apply(null, [error]);
- }
- });
- }
- return nativeMethod.apply(this, arguments);
- };
- });
+exports.verify = function (message, signature, publicKey) {
+ var sigObj = { r: signature.slice(0, 32), s: signature.slice(32, 64) };
- methods = ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'];
- methods.forEach(function (method) {
- var nativeMethod = RTCPeerConnection.prototype[method];
- RTCPeerConnection.prototype[method] = function () {
- var args = arguments;
- if (typeof args[1] === 'function' || typeof args[2] === 'function') {
- // legacy
- return nativeMethod.apply(this, arguments).then(function () {
- if (typeof args[1] === 'function') {
- args[1].apply(null);
- }
- }, function (error) {
- if (typeof args[2] === 'function') {
- args[2].apply(null, [error]);
- }
- });
- }
- return nativeMethod.apply(this, arguments);
- };
- });
+ var sigr = new BN(sigObj.r);
+ var sigs = new BN(sigObj.s);
+ if (sigr.cmp(ecparams.n) >= 0 || sigs.cmp(ecparams.n) >= 0) throw new Error(messages.ECDSA_SIGNATURE_PARSE_FAIL);
+ if (sigs.cmp(ec.nh) === 1 || sigr.isZero() || sigs.isZero()) return false;
- // getStats is special. It doesn't have a spec legacy method yet we support
- // getStats(something, cb) without error callbacks.
- ['getStats'].forEach(function (method) {
- var nativeMethod = RTCPeerConnection.prototype[method];
- RTCPeerConnection.prototype[method] = function () {
- var args = arguments;
- if (typeof args[1] === 'function') {
- return nativeMethod.apply(this, arguments).then(function () {
- if (typeof args[1] === 'function') {
- args[1].apply(null);
- }
- });
- }
- return nativeMethod.apply(this, arguments);
- };
- });
+ var pair = loadPublicKey(publicKey);
+ if (pair === null) throw new Error(messages.EC_PUBLIC_KEY_PARSE_FAIL);
- return RTCPeerConnection;
+ return ec.verify(message, sigObj, { x: pair.pub.x, y: pair.pub.y });
};
-},{"sdp":731}],729:[function(require,module,exports){
-'use strict';
-
-/* eslint-disable node/no-deprecated-api */
-var buffer = require('buffer');
-var Buffer = buffer.Buffer;
-
-// alternative to using Object.keys for old browsers
-function copyProps(src, dst) {
- for (var key in src) {
- dst[key] = src[key];
- }
-}
-if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
- module.exports = buffer;
-} else {
- // Copy properties from require('buffer')
- copyProps(buffer, exports);
- exports.Buffer = SafeBuffer;
-}
+exports.recover = function (message, signature, recovery, compressed) {
+ var sigObj = { r: signature.slice(0, 32), s: signature.slice(32, 64) };
-function SafeBuffer(arg, encodingOrOffset, length) {
- return Buffer(arg, encodingOrOffset, length);
-}
+ var sigr = new BN(sigObj.r);
+ var sigs = new BN(sigObj.s);
+ if (sigr.cmp(ecparams.n) >= 0 || sigs.cmp(ecparams.n) >= 0) throw new Error(messages.ECDSA_SIGNATURE_PARSE_FAIL);
-// Copy static methods from Buffer
-copyProps(Buffer, SafeBuffer);
+ try {
+ if (sigr.isZero() || sigs.isZero()) throw new Error();
-SafeBuffer.from = function (arg, encodingOrOffset, length) {
- if (typeof arg === 'number') {
- throw new TypeError('Argument must not be a number');
+ var point = ec.recoverPubKey(message, sigObj, recovery);
+ return Buffer.from(point.encode(true, compressed));
+ } catch (err) {
+ throw new Error(messages.ECDSA_RECOVER_FAIL);
}
- return Buffer(arg, encodingOrOffset, length);
};
-SafeBuffer.alloc = function (size, fill, encoding) {
- if (typeof size !== 'number') {
- throw new TypeError('Argument must be a number');
- }
- var buf = Buffer(size);
- if (fill !== undefined) {
- if (typeof encoding === 'string') {
- buf.fill(fill, encoding);
- } else {
- buf.fill(fill);
- }
- } else {
- buf.fill(0);
- }
- return buf;
+exports.ecdh = function (publicKey, privateKey) {
+ var shared = exports.ecdhUnsafe(publicKey, privateKey, true);
+ return createHash('sha256').update(shared).digest();
};
-SafeBuffer.allocUnsafe = function (size) {
- if (typeof size !== 'number') {
- throw new TypeError('Argument must be a number');
- }
- return Buffer(size);
-};
+exports.ecdhUnsafe = function (publicKey, privateKey, compressed) {
+ var pair = loadPublicKey(publicKey);
+ if (pair === null) throw new Error(messages.EC_PUBLIC_KEY_PARSE_FAIL);
-SafeBuffer.allocUnsafeSlow = function (size) {
- if (typeof size !== 'number') {
- throw new TypeError('Argument must be a number');
- }
- return buffer.SlowBuffer(size);
+ var scalar = new BN(privateKey);
+ if (scalar.cmp(ecparams.n) >= 0 || scalar.isZero()) throw new Error(messages.ECDH_FAIL);
+
+ return Buffer.from(pair.pub.mul(scalar).encode(true, compressed));
};
-},{"buffer":256}],730:[function(require,module,exports){
-(function (Buffer){
+},{"../messages.json":735,"bn.js":226,"create-hash":593,"elliptic":612,"safe-buffer":728}],734:[function(require,module,exports){
'use strict';
-var crypto = require('crypto');
-/* eslint-disable camelcase */
-
-var MAX_VALUE = 0x7fffffff;
+var assert = require('./assert');
+var der = require('./der');
+var messages = require('./messages.json');
-// N = Cpu cost, r = Memory cost, p = parallelization cost
-function scrypt(key, salt, N, r, p, dkLen, progressCallback) {
- if (N === 0 || (N & N - 1) !== 0) throw Error('N must be > 0 and a power of 2');
+function initCompressedValue(value, defaultValue) {
+ if (value === undefined) return defaultValue;
- if (N > MAX_VALUE / 128 / r) throw Error('Parameter N is too large');
- if (r > MAX_VALUE / 128 / p) throw Error('Parameter r is too large');
+ assert.isBoolean(value, messages.COMPRESSED_TYPE_INVALID);
+ return value;
+}
- var XY = new Buffer(256 * r);
- var V = new Buffer(128 * r * N);
+module.exports = function (secp256k1) {
+ return {
+ privateKeyVerify: function privateKeyVerify(privateKey) {
+ assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
+ return privateKey.length === 32 && secp256k1.privateKeyVerify(privateKey);
+ },
- // pseudo global
- var B32 = new Int32Array(16); // salsa20_8
- var x = new Int32Array(16); // salsa20_8
- var _X = new Buffer(64); // blockmix_salsa8
+ privateKeyExport: function privateKeyExport(privateKey, compressed) {
+ assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
+ assert.isBufferLength(privateKey, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID);
- // pseudo global
- var B = crypto.pbkdf2Sync(key, salt, 1, p * 128 * r, 'sha256');
+ compressed = initCompressedValue(compressed, true);
+ var publicKey = secp256k1.privateKeyExport(privateKey, compressed);
- var tickCallback;
- if (progressCallback) {
- var totalOps = p * N * 2;
- var currentOp = 0;
+ return der.privateKeyExport(privateKey, publicKey, compressed);
+ },
- tickCallback = function tickCallback() {
- ++currentOp;
+ privateKeyImport: function privateKeyImport(privateKey) {
+ assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
- // send progress notifications once every 1,000 ops
- if (currentOp % 1000 === 0) {
- progressCallback({
- current: currentOp,
- total: totalOps,
- percent: currentOp / totalOps * 100.0
- });
- }
- };
- }
+ privateKey = der.privateKeyImport(privateKey);
+ if (privateKey && privateKey.length === 32 && secp256k1.privateKeyVerify(privateKey)) return privateKey;
- for (var i = 0; i < p; i++) {
- smix(B, i * 128 * r, r, N, V, XY);
- }
+ throw new Error(messages.EC_PRIVATE_KEY_IMPORT_DER_FAIL);
+ },
- return crypto.pbkdf2Sync(key, B, 1, dkLen, 'sha256');
+ privateKeyNegate: function privateKeyNegate(privateKey) {
+ assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
+ assert.isBufferLength(privateKey, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID);
- // all of these functions are actually moved to the top
- // due to function hoisting
+ return secp256k1.privateKeyNegate(privateKey);
+ },
- function smix(B, Bi, r, N, V, XY) {
- var Xi = 0;
- var Yi = 128 * r;
- var i;
+ privateKeyModInverse: function privateKeyModInverse(privateKey) {
+ assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
+ assert.isBufferLength(privateKey, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID);
- B.copy(XY, Xi, Bi, Bi + Yi);
+ return secp256k1.privateKeyModInverse(privateKey);
+ },
- for (i = 0; i < N; i++) {
- XY.copy(V, i * Yi, Xi, Xi + Yi);
- blockmix_salsa8(XY, Xi, Yi, r);
+ privateKeyTweakAdd: function privateKeyTweakAdd(privateKey, tweak) {
+ assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
+ assert.isBufferLength(privateKey, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID);
- if (tickCallback) tickCallback();
- }
+ assert.isBuffer(tweak, messages.TWEAK_TYPE_INVALID);
+ assert.isBufferLength(tweak, 32, messages.TWEAK_LENGTH_INVALID);
- for (i = 0; i < N; i++) {
- var offset = Xi + (2 * r - 1) * 64;
- var j = XY.readUInt32LE(offset) & N - 1;
- blockxor(V, j * Yi, XY, Xi, Yi);
- blockmix_salsa8(XY, Xi, Yi, r);
+ return secp256k1.privateKeyTweakAdd(privateKey, tweak);
+ },
- if (tickCallback) tickCallback();
- }
+ privateKeyTweakMul: function privateKeyTweakMul(privateKey, tweak) {
+ assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
+ assert.isBufferLength(privateKey, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID);
- XY.copy(B, Bi, Xi, Xi + Yi);
- }
+ assert.isBuffer(tweak, messages.TWEAK_TYPE_INVALID);
+ assert.isBufferLength(tweak, 32, messages.TWEAK_LENGTH_INVALID);
- function blockmix_salsa8(BY, Bi, Yi, r) {
- var i;
+ return secp256k1.privateKeyTweakMul(privateKey, tweak);
+ },
- arraycopy(BY, Bi + (2 * r - 1) * 64, _X, 0, 64);
+ publicKeyCreate: function publicKeyCreate(privateKey, compressed) {
+ assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
+ assert.isBufferLength(privateKey, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID);
- for (i = 0; i < 2 * r; i++) {
- blockxor(BY, i * 64, _X, 0, 64);
- salsa20_8(_X);
- arraycopy(_X, 0, BY, Yi + i * 64, 64);
- }
+ compressed = initCompressedValue(compressed, true);
- for (i = 0; i < r; i++) {
- arraycopy(BY, Yi + i * 2 * 64, BY, Bi + i * 64, 64);
- }
+ return secp256k1.publicKeyCreate(privateKey, compressed);
+ },
- for (i = 0; i < r; i++) {
- arraycopy(BY, Yi + (i * 2 + 1) * 64, BY, Bi + (i + r) * 64, 64);
- }
- }
+ publicKeyConvert: function publicKeyConvert(publicKey, compressed) {
+ assert.isBuffer(publicKey, messages.EC_PUBLIC_KEY_TYPE_INVALID);
+ assert.isBufferLength2(publicKey, 33, 65, messages.EC_PUBLIC_KEY_LENGTH_INVALID);
- function R(a, b) {
- return a << b | a >>> 32 - b;
- }
+ compressed = initCompressedValue(compressed, true);
- function salsa20_8(B) {
- var i;
+ return secp256k1.publicKeyConvert(publicKey, compressed);
+ },
- for (i = 0; i < 16; i++) {
- B32[i] = (B[i * 4 + 0] & 0xff) << 0;
- B32[i] |= (B[i * 4 + 1] & 0xff) << 8;
- B32[i] |= (B[i * 4 + 2] & 0xff) << 16;
- B32[i] |= (B[i * 4 + 3] & 0xff) << 24;
- // B32[i] = B.readUInt32LE(i*4) <--- this is signficantly slower even in Node.js
- }
+ publicKeyVerify: function publicKeyVerify(publicKey) {
+ assert.isBuffer(publicKey, messages.EC_PUBLIC_KEY_TYPE_INVALID);
+ return secp256k1.publicKeyVerify(publicKey);
+ },
- arraycopy(B32, 0, x, 0, 16);
+ publicKeyTweakAdd: function publicKeyTweakAdd(publicKey, tweak, compressed) {
+ assert.isBuffer(publicKey, messages.EC_PUBLIC_KEY_TYPE_INVALID);
+ assert.isBufferLength2(publicKey, 33, 65, messages.EC_PUBLIC_KEY_LENGTH_INVALID);
- for (i = 8; i > 0; i -= 2) {
- x[4] ^= R(x[0] + x[12], 7);
- x[8] ^= R(x[4] + x[0], 9);
- x[12] ^= R(x[8] + x[4], 13);
- x[0] ^= R(x[12] + x[8], 18);
- x[9] ^= R(x[5] + x[1], 7);
- x[13] ^= R(x[9] + x[5], 9);
- x[1] ^= R(x[13] + x[9], 13);
- x[5] ^= R(x[1] + x[13], 18);
- x[14] ^= R(x[10] + x[6], 7);
- x[2] ^= R(x[14] + x[10], 9);
- x[6] ^= R(x[2] + x[14], 13);
- x[10] ^= R(x[6] + x[2], 18);
- x[3] ^= R(x[15] + x[11], 7);
- x[7] ^= R(x[3] + x[15], 9);
- x[11] ^= R(x[7] + x[3], 13);
- x[15] ^= R(x[11] + x[7], 18);
- x[1] ^= R(x[0] + x[3], 7);
- x[2] ^= R(x[1] + x[0], 9);
- x[3] ^= R(x[2] + x[1], 13);
- x[0] ^= R(x[3] + x[2], 18);
- x[6] ^= R(x[5] + x[4], 7);
- x[7] ^= R(x[6] + x[5], 9);
- x[4] ^= R(x[7] + x[6], 13);
- x[5] ^= R(x[4] + x[7], 18);
- x[11] ^= R(x[10] + x[9], 7);
- x[8] ^= R(x[11] + x[10], 9);
- x[9] ^= R(x[8] + x[11], 13);
- x[10] ^= R(x[9] + x[8], 18);
- x[12] ^= R(x[15] + x[14], 7);
- x[13] ^= R(x[12] + x[15], 9);
- x[14] ^= R(x[13] + x[12], 13);
- x[15] ^= R(x[14] + x[13], 18);
- }
+ assert.isBuffer(tweak, messages.TWEAK_TYPE_INVALID);
+ assert.isBufferLength(tweak, 32, messages.TWEAK_LENGTH_INVALID);
- for (i = 0; i < 16; ++i) {
- B32[i] = x[i] + B32[i];
- }for (i = 0; i < 16; i++) {
- var bi = i * 4;
- B[bi + 0] = B32[i] >> 0 & 0xff;
- B[bi + 1] = B32[i] >> 8 & 0xff;
- B[bi + 2] = B32[i] >> 16 & 0xff;
- B[bi + 3] = B32[i] >> 24 & 0xff;
- // B.writeInt32LE(B32[i], i*4) //<--- this is signficantly slower even in Node.js
- }
- }
+ compressed = initCompressedValue(compressed, true);
- // naive approach... going back to loop unrolling may yield additional performance
- function blockxor(S, Si, D, Di, len) {
- for (var i = 0; i < len; i++) {
- D[Di + i] ^= S[Si + i];
- }
- }
-}
+ return secp256k1.publicKeyTweakAdd(publicKey, tweak, compressed);
+ },
-function arraycopy(src, srcPos, dest, destPos, length) {
- if (Buffer.isBuffer(src) && Buffer.isBuffer(dest)) {
- src.copy(dest, destPos, srcPos, srcPos + length);
- } else {
- while (length--) {
- dest[destPos++] = src[srcPos++];
- }
- }
-}
+ publicKeyTweakMul: function publicKeyTweakMul(publicKey, tweak, compressed) {
+ assert.isBuffer(publicKey, messages.EC_PUBLIC_KEY_TYPE_INVALID);
+ assert.isBufferLength2(publicKey, 33, 65, messages.EC_PUBLIC_KEY_LENGTH_INVALID);
-module.exports = scrypt;
+ assert.isBuffer(tweak, messages.TWEAK_TYPE_INVALID);
+ assert.isBufferLength(tweak, 32, messages.TWEAK_LENGTH_INVALID);
-}).call(this,require("buffer").Buffer)
-},{"buffer":256,"crypto":597}],731:[function(require,module,exports){
-/* eslint-env node */
-'use strict';
+ compressed = initCompressedValue(compressed, true);
-// SDP helpers.
+ return secp256k1.publicKeyTweakMul(publicKey, tweak, compressed);
+ },
-var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+ publicKeyCombine: function publicKeyCombine(publicKeys, compressed) {
+ assert.isArray(publicKeys, messages.EC_PUBLIC_KEYS_TYPE_INVALID);
+ assert.isLengthGTZero(publicKeys, messages.EC_PUBLIC_KEYS_LENGTH_INVALID);
+ for (var i = 0; i < publicKeys.length; ++i) {
+ assert.isBuffer(publicKeys[i], messages.EC_PUBLIC_KEY_TYPE_INVALID);
+ assert.isBufferLength2(publicKeys[i], 33, 65, messages.EC_PUBLIC_KEY_LENGTH_INVALID);
+ }
-var SDPUtils = {};
+ compressed = initCompressedValue(compressed, true);
-// Generate an alphanumeric identifier for cname or mids.
-// TODO: use UUIDs instead? https://gist.github.com/jed/982883
-SDPUtils.generateIdentifier = function () {
- return Math.random().toString(36).substr(2, 10);
-};
+ return secp256k1.publicKeyCombine(publicKeys, compressed);
+ },
-// The RTCP CNAME used by all peerconnections from the same JS.
-SDPUtils.localCName = SDPUtils.generateIdentifier();
+ signatureNormalize: function signatureNormalize(signature) {
+ assert.isBuffer(signature, messages.ECDSA_SIGNATURE_TYPE_INVALID);
+ assert.isBufferLength(signature, 64, messages.ECDSA_SIGNATURE_LENGTH_INVALID);
-// Splits SDP into lines, dealing with both CRLF and LF.
-SDPUtils.splitLines = function (blob) {
- return blob.trim().split('\n').map(function (line) {
- return line.trim();
- });
-};
-// Splits SDP into sessionpart and mediasections. Ensures CRLF.
-SDPUtils.splitSections = function (blob) {
- var parts = blob.split('\nm=');
- return parts.map(function (part, index) {
- return (index > 0 ? 'm=' + part : part).trim() + '\r\n';
- });
-};
+ return secp256k1.signatureNormalize(signature);
+ },
-// returns the session description.
-SDPUtils.getDescription = function (blob) {
- var sections = SDPUtils.splitSections(blob);
- return sections && sections[0];
-};
+ signatureExport: function signatureExport(signature) {
+ assert.isBuffer(signature, messages.ECDSA_SIGNATURE_TYPE_INVALID);
+ assert.isBufferLength(signature, 64, messages.ECDSA_SIGNATURE_LENGTH_INVALID);
-// returns the individual media sections.
-SDPUtils.getMediaSections = function (blob) {
- var sections = SDPUtils.splitSections(blob);
- sections.shift();
- return sections;
-};
+ var sigObj = secp256k1.signatureExport(signature);
+ return der.signatureExport(sigObj);
+ },
-// Returns lines that start with a certain prefix.
-SDPUtils.matchPrefix = function (blob, prefix) {
- return SDPUtils.splitLines(blob).filter(function (line) {
- return line.indexOf(prefix) === 0;
- });
-};
+ signatureImport: function signatureImport(sig) {
+ assert.isBuffer(sig, messages.ECDSA_SIGNATURE_TYPE_INVALID);
+ assert.isLengthGTZero(sig, messages.ECDSA_SIGNATURE_LENGTH_INVALID);
-// Parses an ICE candidate line. Sample input:
-// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8
-// rport 55996"
-SDPUtils.parseCandidate = function (line) {
- var parts;
- // Parse both variants.
- if (line.indexOf('a=candidate:') === 0) {
- parts = line.substring(12).split(' ');
- } else {
- parts = line.substring(10).split(' ');
- }
+ var sigObj = der.signatureImport(sig);
+ if (sigObj) return secp256k1.signatureImport(sigObj);
- var candidate = {
- foundation: parts[0],
- component: parseInt(parts[1], 10),
- protocol: parts[2].toLowerCase(),
- priority: parseInt(parts[3], 10),
- ip: parts[4],
- address: parts[4], // address is an alias for ip.
- port: parseInt(parts[5], 10),
- // skip parts[6] == 'typ'
- type: parts[7]
- };
+ throw new Error(messages.ECDSA_SIGNATURE_PARSE_DER_FAIL);
+ },
- for (var i = 8; i < parts.length; i += 2) {
- switch (parts[i]) {
- case 'raddr':
- candidate.relatedAddress = parts[i + 1];
- break;
- case 'rport':
- candidate.relatedPort = parseInt(parts[i + 1], 10);
- break;
- case 'tcptype':
- candidate.tcpType = parts[i + 1];
- break;
- case 'ufrag':
- candidate.ufrag = parts[i + 1]; // for backward compability.
- candidate.usernameFragment = parts[i + 1];
- break;
- default:
- // extension handling, in particular ufrag
- candidate[parts[i]] = parts[i + 1];
- break;
- }
- }
- return candidate;
-};
+ signatureImportLax: function signatureImportLax(sig) {
+ assert.isBuffer(sig, messages.ECDSA_SIGNATURE_TYPE_INVALID);
+ assert.isLengthGTZero(sig, messages.ECDSA_SIGNATURE_LENGTH_INVALID);
-// Translates a candidate object into SDP candidate attribute.
-SDPUtils.writeCandidate = function (candidate) {
- var sdp = [];
- sdp.push(candidate.foundation);
- sdp.push(candidate.component);
- sdp.push(candidate.protocol.toUpperCase());
- sdp.push(candidate.priority);
- sdp.push(candidate.address || candidate.ip);
- sdp.push(candidate.port);
+ var sigObj = der.signatureImportLax(sig);
+ if (sigObj) return secp256k1.signatureImport(sigObj);
- var type = candidate.type;
- sdp.push('typ');
- sdp.push(type);
- if (type !== 'host' && candidate.relatedAddress && candidate.relatedPort) {
- sdp.push('raddr');
- sdp.push(candidate.relatedAddress);
- sdp.push('rport');
- sdp.push(candidate.relatedPort);
- }
- if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {
- sdp.push('tcptype');
- sdp.push(candidate.tcpType);
- }
- if (candidate.usernameFragment || candidate.ufrag) {
- sdp.push('ufrag');
- sdp.push(candidate.usernameFragment || candidate.ufrag);
- }
- return 'candidate:' + sdp.join(' ');
-};
+ throw new Error(messages.ECDSA_SIGNATURE_PARSE_DER_FAIL);
+ },
-// Parses an ice-options line, returns an array of option tags.
-// a=ice-options:foo bar
-SDPUtils.parseIceOptions = function (line) {
- return line.substr(14).split(' ');
-};
+ sign: function sign(message, privateKey, options) {
+ assert.isBuffer(message, messages.MSG32_TYPE_INVALID);
+ assert.isBufferLength(message, 32, messages.MSG32_LENGTH_INVALID);
-// Parses an rtpmap line, returns RTCRtpCoddecParameters. Sample input:
-// a=rtpmap:111 opus/48000/2
-SDPUtils.parseRtpMap = function (line) {
- var parts = line.substr(9).split(' ');
- var parsed = {
- payloadType: parseInt(parts.shift(), 10) // was: id
- };
+ assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
+ assert.isBufferLength(privateKey, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID);
- parts = parts[0].split('/');
+ var data = null;
+ var noncefn = null;
+ if (options !== undefined) {
+ assert.isObject(options, messages.OPTIONS_TYPE_INVALID);
- parsed.name = parts[0];
- parsed.clockRate = parseInt(parts[1], 10); // was: clockrate
- parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;
- // legacy alias, got renamed back to channels in ORTC.
- parsed.numChannels = parsed.channels;
- return parsed;
-};
+ if (options.data !== undefined) {
+ assert.isBuffer(options.data, messages.OPTIONS_DATA_TYPE_INVALID);
+ assert.isBufferLength(options.data, 32, messages.OPTIONS_DATA_LENGTH_INVALID);
+ data = options.data;
+ }
-// Generate an a=rtpmap line from RTCRtpCodecCapability or
-// RTCRtpCodecParameters.
-SDPUtils.writeRtpMap = function (codec) {
- var pt = codec.payloadType;
- if (codec.preferredPayloadType !== undefined) {
- pt = codec.preferredPayloadType;
- }
- var channels = codec.channels || codec.numChannels || 1;
- return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate + (channels !== 1 ? '/' + channels : '') + '\r\n';
-};
+ if (options.noncefn !== undefined) {
+ assert.isFunction(options.noncefn, messages.OPTIONS_NONCEFN_TYPE_INVALID);
+ noncefn = options.noncefn;
+ }
+ }
-// Parses an a=extmap line (headerextension from RFC 5285). Sample input:
-// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
-// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset
-SDPUtils.parseExtmap = function (line) {
- var parts = line.substr(9).split(' ');
- return {
- id: parseInt(parts[0], 10),
- direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',
- uri: parts[1]
- };
-};
+ return secp256k1.sign(message, privateKey, noncefn, data);
+ },
-// Generates a=extmap line from RTCRtpHeaderExtensionParameters or
-// RTCRtpHeaderExtension.
-SDPUtils.writeExtmap = function (headerExtension) {
- return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) + (headerExtension.direction && headerExtension.direction !== 'sendrecv' ? '/' + headerExtension.direction : '') + ' ' + headerExtension.uri + '\r\n';
-};
+ verify: function verify(message, signature, publicKey) {
+ assert.isBuffer(message, messages.MSG32_TYPE_INVALID);
+ assert.isBufferLength(message, 32, messages.MSG32_LENGTH_INVALID);
-// Parses an ftmp line, returns dictionary. Sample input:
-// a=fmtp:96 vbr=on;cng=on
-// Also deals with vbr=on; cng=on
-SDPUtils.parseFmtp = function (line) {
- var parsed = {};
- var kv;
- var parts = line.substr(line.indexOf(' ') + 1).split(';');
- for (var j = 0; j < parts.length; j++) {
- kv = parts[j].trim().split('=');
- parsed[kv[0].trim()] = kv[1];
- }
- return parsed;
-};
+ assert.isBuffer(signature, messages.ECDSA_SIGNATURE_TYPE_INVALID);
+ assert.isBufferLength(signature, 64, messages.ECDSA_SIGNATURE_LENGTH_INVALID);
-// Generates an a=ftmp line from RTCRtpCodecCapability or RTCRtpCodecParameters.
-SDPUtils.writeFmtp = function (codec) {
- var line = '';
- var pt = codec.payloadType;
- if (codec.preferredPayloadType !== undefined) {
- pt = codec.preferredPayloadType;
- }
- if (codec.parameters && Object.keys(codec.parameters).length) {
- var params = [];
- Object.keys(codec.parameters).forEach(function (param) {
- if (codec.parameters[param]) {
- params.push(param + '=' + codec.parameters[param]);
- } else {
- params.push(param);
- }
- });
- line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\r\n';
- }
- return line;
-};
+ assert.isBuffer(publicKey, messages.EC_PUBLIC_KEY_TYPE_INVALID);
+ assert.isBufferLength2(publicKey, 33, 65, messages.EC_PUBLIC_KEY_LENGTH_INVALID);
-// Parses an rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:
-// a=rtcp-fb:98 nack rpsi
-SDPUtils.parseRtcpFb = function (line) {
- var parts = line.substr(line.indexOf(' ') + 1).split(' ');
- return {
- type: parts.shift(),
- parameter: parts.join(' ')
- };
-};
-// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.
-SDPUtils.writeRtcpFb = function (codec) {
- var lines = '';
- var pt = codec.payloadType;
- if (codec.preferredPayloadType !== undefined) {
- pt = codec.preferredPayloadType;
- }
- if (codec.rtcpFeedback && codec.rtcpFeedback.length) {
- // FIXME: special handling for trr-int?
- codec.rtcpFeedback.forEach(function (fb) {
- lines += 'a=rtcp-fb:' + pt + ' ' + fb.type + (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') + '\r\n';
- });
- }
- return lines;
-};
+ return secp256k1.verify(message, signature, publicKey);
+ },
-// Parses an RFC 5576 ssrc media attribute. Sample input:
-// a=ssrc:3735928559 cname:something
-SDPUtils.parseSsrcMedia = function (line) {
- var sp = line.indexOf(' ');
- var parts = {
- ssrc: parseInt(line.substr(7, sp - 7), 10)
- };
- var colon = line.indexOf(':', sp);
- if (colon > -1) {
- parts.attribute = line.substr(sp + 1, colon - sp - 1);
- parts.value = line.substr(colon + 1);
- } else {
- parts.attribute = line.substr(sp + 1);
- }
- return parts;
-};
+ recover: function recover(message, signature, recovery, compressed) {
+ assert.isBuffer(message, messages.MSG32_TYPE_INVALID);
+ assert.isBufferLength(message, 32, messages.MSG32_LENGTH_INVALID);
-SDPUtils.parseSsrcGroup = function (line) {
- var parts = line.substr(13).split(' ');
- return {
- semantics: parts.shift(),
- ssrcs: parts.map(function (ssrc) {
- return parseInt(ssrc, 10);
- })
- };
-};
+ assert.isBuffer(signature, messages.ECDSA_SIGNATURE_TYPE_INVALID);
+ assert.isBufferLength(signature, 64, messages.ECDSA_SIGNATURE_LENGTH_INVALID);
-// Extracts the MID (RFC 5888) from a media section.
-// returns the MID or undefined if no mid line was found.
-SDPUtils.getMid = function (mediaSection) {
- var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];
- if (mid) {
- return mid.substr(6);
- }
-};
+ assert.isNumber(recovery, messages.RECOVERY_ID_TYPE_INVALID);
+ assert.isNumberInInterval(recovery, -1, 4, messages.RECOVERY_ID_VALUE_INVALID);
-SDPUtils.parseFingerprint = function (line) {
- var parts = line.substr(14).split(' ');
- return {
- algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.
- value: parts[1]
- };
-};
+ compressed = initCompressedValue(compressed, true);
-// Extracts DTLS parameters from SDP media section or sessionpart.
-// FIXME: for consistency with other functions this should only
-// get the fingerprint line as input. See also getIceParameters.
-SDPUtils.getDtlsParameters = function (mediaSection, sessionpart) {
- var lines = SDPUtils.matchPrefix(mediaSection + sessionpart, 'a=fingerprint:');
- // Note: a=setup line is ignored since we use the 'auto' role.
- // Note2: 'algorithm' is not case sensitive except in Edge.
- return {
- role: 'auto',
- fingerprints: lines.map(SDPUtils.parseFingerprint)
- };
-};
+ return secp256k1.recover(message, signature, recovery, compressed);
+ },
-// Serializes DTLS parameters to SDP.
-SDPUtils.writeDtlsParameters = function (params, setupType) {
- var sdp = 'a=setup:' + setupType + '\r\n';
- params.fingerprints.forEach(function (fp) {
- sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\r\n';
- });
- return sdp;
-};
-// Parses ICE information from SDP media section or sessionpart.
-// FIXME: for consistency with other functions this should only
-// get the ice-ufrag and ice-pwd lines as input.
-SDPUtils.getIceParameters = function (mediaSection, sessionpart) {
- var lines = SDPUtils.splitLines(mediaSection);
- // Search in session part, too.
- lines = lines.concat(SDPUtils.splitLines(sessionpart));
- var iceParameters = {
- usernameFragment: lines.filter(function (line) {
- return line.indexOf('a=ice-ufrag:') === 0;
- })[0].substr(12),
- password: lines.filter(function (line) {
- return line.indexOf('a=ice-pwd:') === 0;
- })[0].substr(10)
- };
- return iceParameters;
-};
-
-// Serializes ICE parameters to SDP.
-SDPUtils.writeIceParameters = function (params) {
- return 'a=ice-ufrag:' + params.usernameFragment + '\r\n' + 'a=ice-pwd:' + params.password + '\r\n';
-};
-
-// Parses the SDP media section and returns RTCRtpParameters.
-SDPUtils.parseRtpParameters = function (mediaSection) {
- var description = {
- codecs: [],
- headerExtensions: [],
- fecMechanisms: [],
- rtcp: []
- };
- var lines = SDPUtils.splitLines(mediaSection);
- var mline = lines[0].split(' ');
- for (var i = 3; i < mline.length; i++) {
- // find all codecs from mline[3..]
- var pt = mline[i];
- var rtpmapline = SDPUtils.matchPrefix(mediaSection, 'a=rtpmap:' + pt + ' ')[0];
- if (rtpmapline) {
- var codec = SDPUtils.parseRtpMap(rtpmapline);
- var fmtps = SDPUtils.matchPrefix(mediaSection, 'a=fmtp:' + pt + ' ');
- // Only the first a=fmtp: is considered.
- codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};
- codec.rtcpFeedback = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:' + pt + ' ').map(SDPUtils.parseRtcpFb);
- description.codecs.push(codec);
- // parse FEC mechanisms from rtpmap lines.
- switch (codec.name.toUpperCase()) {
- case 'RED':
- case 'ULPFEC':
- description.fecMechanisms.push(codec.name.toUpperCase());
- break;
- default:
- // only RED and ULPFEC are recognized as FEC mechanisms.
- break;
- }
- }
- }
- SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(function (line) {
- description.headerExtensions.push(SDPUtils.parseExtmap(line));
- });
- // FIXME: parse rtcp.
- return description;
-};
-
-// Generates parts of the SDP media section describing the capabilities /
-// parameters.
-SDPUtils.writeRtpDescription = function (kind, caps) {
- var sdp = '';
-
- // Build the mline.
- sdp += 'm=' + kind + ' ';
- sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.
- sdp += ' UDP/TLS/RTP/SAVPF ';
- sdp += caps.codecs.map(function (codec) {
- if (codec.preferredPayloadType !== undefined) {
- return codec.preferredPayloadType;
- }
- return codec.payloadType;
- }).join(' ') + '\r\n';
-
- sdp += 'c=IN IP4 0.0.0.0\r\n';
- sdp += 'a=rtcp:9 IN IP4 0.0.0.0\r\n';
-
- // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.
- caps.codecs.forEach(function (codec) {
- sdp += SDPUtils.writeRtpMap(codec);
- sdp += SDPUtils.writeFmtp(codec);
- sdp += SDPUtils.writeRtcpFb(codec);
- });
- var maxptime = 0;
- caps.codecs.forEach(function (codec) {
- if (codec.maxptime > maxptime) {
- maxptime = codec.maxptime;
- }
- });
- if (maxptime > 0) {
- sdp += 'a=maxptime:' + maxptime + '\r\n';
- }
- sdp += 'a=rtcp-mux\r\n';
+ ecdh: function ecdh(publicKey, privateKey) {
+ assert.isBuffer(publicKey, messages.EC_PUBLIC_KEY_TYPE_INVALID);
+ assert.isBufferLength2(publicKey, 33, 65, messages.EC_PUBLIC_KEY_LENGTH_INVALID);
- if (caps.headerExtensions) {
- caps.headerExtensions.forEach(function (extension) {
- sdp += SDPUtils.writeExtmap(extension);
- });
- }
- // FIXME: write fecMechanisms.
- return sdp;
-};
+ assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
+ assert.isBufferLength(privateKey, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID);
-// Parses the SDP media section and returns an array of
-// RTCRtpEncodingParameters.
-SDPUtils.parseRtpEncodingParameters = function (mediaSection) {
- var encodingParameters = [];
- var description = SDPUtils.parseRtpParameters(mediaSection);
- var hasRed = description.fecMechanisms.indexOf('RED') !== -1;
- var hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;
+ return secp256k1.ecdh(publicKey, privateKey);
+ },
- // filter a=ssrc:... cname:, ignore PlanB-msid
- var ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:').map(function (line) {
- return SDPUtils.parseSsrcMedia(line);
- }).filter(function (parts) {
- return parts.attribute === 'cname';
- });
- var primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;
- var secondarySsrc;
+ ecdhUnsafe: function ecdhUnsafe(publicKey, privateKey, compressed) {
+ assert.isBuffer(publicKey, messages.EC_PUBLIC_KEY_TYPE_INVALID);
+ assert.isBufferLength2(publicKey, 33, 65, messages.EC_PUBLIC_KEY_LENGTH_INVALID);
- var flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID').map(function (line) {
- var parts = line.substr(17).split(' ');
- return parts.map(function (part) {
- return parseInt(part, 10);
- });
- });
- if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {
- secondarySsrc = flows[0][1];
- }
+ assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
+ assert.isBufferLength(privateKey, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID);
- description.codecs.forEach(function (codec) {
- if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {
- var encParam = {
- ssrc: primarySsrc,
- codecPayloadType: parseInt(codec.parameters.apt, 10)
- };
- if (primarySsrc && secondarySsrc) {
- encParam.rtx = { ssrc: secondarySsrc };
- }
- encodingParameters.push(encParam);
- if (hasRed) {
- encParam = JSON.parse(JSON.stringify(encParam));
- encParam.fec = {
- ssrc: primarySsrc,
- mechanism: hasUlpfec ? 'red+ulpfec' : 'red'
- };
- encodingParameters.push(encParam);
- }
- }
- });
- if (encodingParameters.length === 0 && primarySsrc) {
- encodingParameters.push({
- ssrc: primarySsrc
- });
- }
+ compressed = initCompressedValue(compressed, true);
- // we support both b=AS and b=TIAS but interpret AS as TIAS.
- var bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');
- if (bandwidth.length) {
- if (bandwidth[0].indexOf('b=TIAS:') === 0) {
- bandwidth = parseInt(bandwidth[0].substr(7), 10);
- } else if (bandwidth[0].indexOf('b=AS:') === 0) {
- // use formula from JSEP to convert b=AS to TIAS value.
- bandwidth = parseInt(bandwidth[0].substr(5), 10) * 1000 * 0.95 - 50 * 40 * 8;
- } else {
- bandwidth = undefined;
+ return secp256k1.ecdhUnsafe(publicKey, privateKey, compressed);
}
- encodingParameters.forEach(function (params) {
- params.maxBitrate = bandwidth;
- });
- }
- return encodingParameters;
+ };
};
-// parses http://draft.ortc.org/#rtcrtcpparameters*
-SDPUtils.parseRtcpParameters = function (mediaSection) {
- var rtcpParameters = {};
-
- // Gets the first SSRC. Note tha with RTX there might be multiple
- // SSRCs.
- var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:').map(function (line) {
- return SDPUtils.parseSsrcMedia(line);
- }).filter(function (obj) {
- return obj.attribute === 'cname';
- })[0];
- if (remoteSsrc) {
- rtcpParameters.cname = remoteSsrc.value;
- rtcpParameters.ssrc = remoteSsrc.ssrc;
- }
+},{"./assert":731,"./der":732,"./messages.json":735}],735:[function(require,module,exports){
+module.exports={
+ "COMPRESSED_TYPE_INVALID": "compressed should be a boolean",
+ "EC_PRIVATE_KEY_TYPE_INVALID": "private key should be a Buffer",
+ "EC_PRIVATE_KEY_LENGTH_INVALID": "private key length is invalid",
+ "EC_PRIVATE_KEY_RANGE_INVALID": "private key range is invalid",
+ "EC_PRIVATE_KEY_TWEAK_ADD_FAIL": "tweak out of range or resulting private key is invalid",
+ "EC_PRIVATE_KEY_TWEAK_MUL_FAIL": "tweak out of range",
+ "EC_PRIVATE_KEY_EXPORT_DER_FAIL": "couldn't export to DER format",
+ "EC_PRIVATE_KEY_IMPORT_DER_FAIL": "couldn't import from DER format",
+ "EC_PUBLIC_KEYS_TYPE_INVALID": "public keys should be an Array",
+ "EC_PUBLIC_KEYS_LENGTH_INVALID": "public keys Array should have at least 1 element",
+ "EC_PUBLIC_KEY_TYPE_INVALID": "public key should be a Buffer",
+ "EC_PUBLIC_KEY_LENGTH_INVALID": "public key length is invalid",
+ "EC_PUBLIC_KEY_PARSE_FAIL": "the public key could not be parsed or is invalid",
+ "EC_PUBLIC_KEY_CREATE_FAIL": "private was invalid, try again",
+ "EC_PUBLIC_KEY_TWEAK_ADD_FAIL": "tweak out of range or resulting public key is invalid",
+ "EC_PUBLIC_KEY_TWEAK_MUL_FAIL": "tweak out of range",
+ "EC_PUBLIC_KEY_COMBINE_FAIL": "the sum of the public keys is not valid",
+ "ECDH_FAIL": "scalar was invalid (zero or overflow)",
+ "ECDSA_SIGNATURE_TYPE_INVALID": "signature should be a Buffer",
+ "ECDSA_SIGNATURE_LENGTH_INVALID": "signature length is invalid",
+ "ECDSA_SIGNATURE_PARSE_FAIL": "couldn't parse signature",
+ "ECDSA_SIGNATURE_PARSE_DER_FAIL": "couldn't parse DER signature",
+ "ECDSA_SIGNATURE_SERIALIZE_DER_FAIL": "couldn't serialize signature to DER format",
+ "ECDSA_SIGN_FAIL": "nonce generation function failed or private key is invalid",
+ "ECDSA_RECOVER_FAIL": "couldn't recover public key from signature",
+ "MSG32_TYPE_INVALID": "message should be a Buffer",
+ "MSG32_LENGTH_INVALID": "message length is invalid",
+ "OPTIONS_TYPE_INVALID": "options should be an Object",
+ "OPTIONS_DATA_TYPE_INVALID": "options.data should be a Buffer",
+ "OPTIONS_DATA_LENGTH_INVALID": "options.data length is invalid",
+ "OPTIONS_NONCEFN_TYPE_INVALID": "options.noncefn should be a Function",
+ "RECOVERY_ID_TYPE_INVALID": "recovery should be a Number",
+ "RECOVERY_ID_VALUE_INVALID": "recovery should have value between -1 and 4",
+ "TWEAK_TYPE_INVALID": "tweak should be a Buffer",
+ "TWEAK_LENGTH_INVALID": "tweak length is invalid"
+}
- // Edge uses the compound attribute instead of reducedSize
- // compound is !reducedSize
- var rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');
- rtcpParameters.reducedSize = rsize.length > 0;
- rtcpParameters.compound = rsize.length === 0;
+},{}],736:[function(require,module,exports){
+'use strict';
- // parses the rtcp-mux attrіbute.
- // Note that Edge does not support unmuxed RTCP.
- var mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');
- rtcpParameters.mux = mux.length > 0;
+var Buffer = require('safe-buffer').Buffer;
- return rtcpParameters;
-};
+// prototype class for hash functions
+function Hash(blockSize, finalSize) {
+ this._block = Buffer.alloc(blockSize);
+ this._finalSize = finalSize;
+ this._blockSize = blockSize;
+ this._len = 0;
+}
-// parses either a=msid: or a=ssrc:... msid lines and returns
-// the id of the MediaStream and MediaStreamTrack.
-SDPUtils.parseMsid = function (mediaSection) {
- var parts;
- var spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');
- if (spec.length === 1) {
- parts = spec[0].substr(7).split(' ');
- return { stream: parts[0], track: parts[1] };
- }
- var planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:').map(function (line) {
- return SDPUtils.parseSsrcMedia(line);
- }).filter(function (msidParts) {
- return msidParts.attribute === 'msid';
- });
- if (planB.length > 0) {
- parts = planB[0].value.split(' ');
- return { stream: parts[0], track: parts[1] };
- }
-};
-
-// Generate a session ID for SDP.
-// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1
-// recommends using a cryptographically random +ve 64-bit value
-// but right now this should be acceptable and within the right range
-SDPUtils.generateSessionId = function () {
- return Math.random().toString().substr(2, 21);
-};
-
-// Write boilder plate for start of SDP
-// sessId argument is optional - if not supplied it will
-// be generated randomly
-// sessVersion is optional and defaults to 2
-// sessUser is optional and defaults to 'thisisadapterortc'
-SDPUtils.writeSessionBoilerplate = function (sessId, sessVer, sessUser) {
- var sessionId;
- var version = sessVer !== undefined ? sessVer : 2;
- if (sessId) {
- sessionId = sessId;
- } else {
- sessionId = SDPUtils.generateSessionId();
+Hash.prototype.update = function (data, enc) {
+ if (typeof data === 'string') {
+ enc = enc || 'utf8';
+ data = Buffer.from(data, enc);
}
- var user = sessUser || 'thisisadapterortc';
- // FIXME: sess-id should be an NTP timestamp.
- return 'v=0\r\n' + 'o=' + user + ' ' + sessionId + ' ' + version + ' IN IP4 127.0.0.1\r\n' + 's=-\r\n' + 't=0 0\r\n';
-};
-SDPUtils.writeMediaSection = function (transceiver, caps, type, stream) {
- var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);
-
- // Map ICE parameters (ufrag, pwd) to SDP.
- sdp += SDPUtils.writeIceParameters(transceiver.iceGatherer.getLocalParameters());
-
- // Map DTLS parameters to SDP.
- sdp += SDPUtils.writeDtlsParameters(transceiver.dtlsTransport.getLocalParameters(), type === 'offer' ? 'actpass' : 'active');
+ var block = this._block;
+ var blockSize = this._blockSize;
+ var length = data.length;
+ var accum = this._len;
- sdp += 'a=mid:' + transceiver.mid + '\r\n';
+ for (var offset = 0; offset < length;) {
+ var assigned = accum % blockSize;
+ var remainder = Math.min(length - offset, blockSize - assigned);
- if (transceiver.direction) {
- sdp += 'a=' + transceiver.direction + '\r\n';
- } else if (transceiver.rtpSender && transceiver.rtpReceiver) {
- sdp += 'a=sendrecv\r\n';
- } else if (transceiver.rtpSender) {
- sdp += 'a=sendonly\r\n';
- } else if (transceiver.rtpReceiver) {
- sdp += 'a=recvonly\r\n';
- } else {
- sdp += 'a=inactive\r\n';
- }
+ for (var i = 0; i < remainder; i++) {
+ block[assigned + i] = data[offset + i];
+ }
- if (transceiver.rtpSender) {
- // spec.
- var msid = 'msid:' + stream.id + ' ' + transceiver.rtpSender.track.id + '\r\n';
- sdp += 'a=' + msid;
+ accum += remainder;
+ offset += remainder;
- // for Chrome.
- sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc + ' ' + msid;
- if (transceiver.sendEncodingParameters[0].rtx) {
- sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc + ' ' + msid;
- sdp += 'a=ssrc-group:FID ' + transceiver.sendEncodingParameters[0].ssrc + ' ' + transceiver.sendEncodingParameters[0].rtx.ssrc + '\r\n';
+ if (accum % blockSize === 0) {
+ this._update(block);
}
}
- // FIXME: this should be written by writeRtpDescription.
- sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc + ' cname:' + SDPUtils.localCName + '\r\n';
- if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {
- sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc + ' cname:' + SDPUtils.localCName + '\r\n';
- }
- return sdp;
-};
-// Gets the direction from the mediaSection or the sessionpart.
-SDPUtils.getDirection = function (mediaSection, sessionpart) {
- // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.
- var lines = SDPUtils.splitLines(mediaSection);
- for (var i = 0; i < lines.length; i++) {
- switch (lines[i]) {
- case 'a=sendrecv':
- case 'a=sendonly':
- case 'a=recvonly':
- case 'a=inactive':
- return lines[i].substr(2);
- default:
- // FIXME: What should happen here?
- }
- }
- if (sessionpart) {
- return SDPUtils.getDirection(sessionpart);
- }
- return 'sendrecv';
-};
-
-SDPUtils.getKind = function (mediaSection) {
- var lines = SDPUtils.splitLines(mediaSection);
- var mline = lines[0].split(' ');
- return mline[0].substr(2);
+ this._len += length;
+ return this;
};
-SDPUtils.isRejected = function (mediaSection) {
- return mediaSection.split(' ', 2)[1] === '0';
-};
+Hash.prototype.digest = function (enc) {
+ var rem = this._len % this._blockSize;
-SDPUtils.parseMLine = function (mediaSection) {
- var lines = SDPUtils.splitLines(mediaSection);
- var parts = lines[0].substr(2).split(' ');
- return {
- kind: parts[0],
- port: parseInt(parts[1], 10),
- protocol: parts[2],
- fmt: parts.slice(3).join(' ')
- };
-};
+ this._block[rem] = 0x80;
-SDPUtils.parseOLine = function (mediaSection) {
- var line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];
- var parts = line.substr(2).split(' ');
- return {
- username: parts[0],
- sessionId: parts[1],
- sessionVersion: parseInt(parts[2], 10),
- netType: parts[3],
- addressType: parts[4],
- address: parts[5]
- };
-};
+ // zero (rem + 1) trailing bits, where (rem + 1) is the smallest
+ // non-negative solution to the equation (length + 1 + (rem + 1)) === finalSize mod blockSize
+ this._block.fill(0, rem + 1);
-// a very naive interpretation of a valid SDP.
-SDPUtils.isValidSDP = function (blob) {
- if (typeof blob !== 'string' || blob.length === 0) {
- return false;
- }
- var lines = SDPUtils.splitLines(blob);
- for (var i = 0; i < lines.length; i++) {
- if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {
- return false;
- }
- // TODO: check the modifier a bit more.
+ if (rem >= this._finalSize) {
+ this._update(this._block);
+ this._block.fill(0);
}
- return true;
-};
-// Expose public methods.
-if ((typeof module === 'undefined' ? 'undefined' : _typeof(module)) === 'object') {
- module.exports = SDPUtils;
-}
-
-},{}],732:[function(require,module,exports){
-'use strict';
-
-module.exports = require('./lib')(require('./lib/elliptic'));
+ var bits = this._len * 8;
-},{"./lib":736,"./lib/elliptic":735}],733:[function(require,module,exports){
-(function (Buffer){
-'use strict';
+ // uint32
+ if (bits <= 0xffffffff) {
+ this._block.writeUInt32BE(bits, this._blockSize - 4);
-var toString = Object.prototype.toString;
+ // uint64
+ } else {
+ var lowBits = (bits & 0xffffffff) >>> 0;
+ var highBits = (bits - lowBits) / 0x100000000;
-// TypeError
-exports.isArray = function (value, message) {
- if (!Array.isArray(value)) throw TypeError(message);
-};
+ this._block.writeUInt32BE(highBits, this._blockSize - 8);
+ this._block.writeUInt32BE(lowBits, this._blockSize - 4);
+ }
-exports.isBoolean = function (value, message) {
- if (toString.call(value) !== '[object Boolean]') throw TypeError(message);
-};
+ this._update(this._block);
+ var hash = this._hash();
-exports.isBuffer = function (value, message) {
- if (!Buffer.isBuffer(value)) throw TypeError(message);
+ return enc ? hash.toString(enc) : hash;
};
-exports.isFunction = function (value, message) {
- if (toString.call(value) !== '[object Function]') throw TypeError(message);
+Hash.prototype._update = function () {
+ throw new Error('_update must be implemented by subclass');
};
-exports.isNumber = function (value, message) {
- if (toString.call(value) !== '[object Number]') throw TypeError(message);
-};
+module.exports = Hash;
-exports.isObject = function (value, message) {
- if (toString.call(value) !== '[object Object]') throw TypeError(message);
-};
+},{"safe-buffer":728}],737:[function(require,module,exports){
+'use strict';
-// RangeError
-exports.isBufferLength = function (buffer, length, message) {
- if (buffer.length !== length) throw RangeError(message);
-};
+var _exports = module.exports = function SHA(algorithm) {
+ algorithm = algorithm.toLowerCase();
-exports.isBufferLength2 = function (buffer, length1, length2, message) {
- if (buffer.length !== length1 && buffer.length !== length2) throw RangeError(message);
-};
+ var Algorithm = _exports[algorithm];
+ if (!Algorithm) throw new Error(algorithm + ' is not supported (we accept pull requests)');
-exports.isLengthGTZero = function (value, message) {
- if (value.length === 0) throw RangeError(message);
+ return new Algorithm();
};
-exports.isNumberInInterval = function (number, x, y, message) {
- if (number <= x || number >= y) throw RangeError(message);
-};
+_exports.sha = require('./sha');
+_exports.sha1 = require('./sha1');
+_exports.sha224 = require('./sha224');
+_exports.sha256 = require('./sha256');
+_exports.sha384 = require('./sha384');
+_exports.sha512 = require('./sha512');
-}).call(this,{"isBuffer":require("../../is-buffer/index.js")})
-},{"../../is-buffer/index.js":672}],734:[function(require,module,exports){
+},{"./sha":738,"./sha1":739,"./sha224":740,"./sha256":741,"./sha384":742,"./sha512":743}],738:[function(require,module,exports){
'use strict';
+/*
+ * A JavaScript implementation of the Secure Hash Algorithm, SHA-0, as defined
+ * in FIPS PUB 180-1
+ * This source code is derived from sha1.js of the same repository.
+ * The difference between SHA-0 and SHA-1 is just a bitwise rotate left
+ * operation was added.
+ */
+
+var inherits = require('inherits');
+var Hash = require('./hash');
var Buffer = require('safe-buffer').Buffer;
-var bip66 = require('bip66');
-var EC_PRIVKEY_EXPORT_DER_COMPRESSED = Buffer.from([
-// begin
-0x30, 0x81, 0xd3, 0x02, 0x01, 0x01, 0x04, 0x20,
-// private key
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-// middle
-0xa0, 0x81, 0x85, 0x30, 0x81, 0x82, 0x02, 0x01, 0x01, 0x30, 0x2c, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xcE, 0x3d, 0x01, 0x01, 0x02, 0x21, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfE, 0xff, 0xff, 0xfc, 0x2f, 0x30, 0x06, 0x04, 0x01, 0x00, 0x04, 0x01, 0x07, 0x04, 0x21, 0x02, 0x79, 0xbE, 0x66, 0x7E, 0xf9, 0xdc, 0xbb, 0xac, 0x55, 0xa0, 0x62, 0x95, 0xcE, 0x87, 0x0b, 0x07, 0x02, 0x9b, 0xfc, 0xdb, 0x2d, 0xcE, 0x28, 0xd9, 0x59, 0xf2, 0x81, 0x5b, 0x16, 0xf8, 0x17, 0x98, 0x02, 0x21, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfE, 0xba, 0xaE, 0xdc, 0xE6, 0xaf, 0x48, 0xa0, 0x3b, 0xbf, 0xd2, 0x5E, 0x8c, 0xd0, 0x36, 0x41, 0x41, 0x02, 0x01, 0x01, 0xa1, 0x24, 0x03, 0x22, 0x00,
-// public key
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
+var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc | 0, 0xca62c1d6 | 0];
-var EC_PRIVKEY_EXPORT_DER_UNCOMPRESSED = Buffer.from([
-// begin
-0x30, 0x82, 0x01, 0x13, 0x02, 0x01, 0x01, 0x04, 0x20,
-// private key
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-// middle
-0xa0, 0x81, 0xa5, 0x30, 0x81, 0xa2, 0x02, 0x01, 0x01, 0x30, 0x2c, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xcE, 0x3d, 0x01, 0x01, 0x02, 0x21, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfE, 0xff, 0xff, 0xfc, 0x2f, 0x30, 0x06, 0x04, 0x01, 0x00, 0x04, 0x01, 0x07, 0x04, 0x41, 0x04, 0x79, 0xbE, 0x66, 0x7E, 0xf9, 0xdc, 0xbb, 0xac, 0x55, 0xa0, 0x62, 0x95, 0xcE, 0x87, 0x0b, 0x07, 0x02, 0x9b, 0xfc, 0xdb, 0x2d, 0xcE, 0x28, 0xd9, 0x59, 0xf2, 0x81, 0x5b, 0x16, 0xf8, 0x17, 0x98, 0x48, 0x3a, 0xda, 0x77, 0x26, 0xa3, 0xc4, 0x65, 0x5d, 0xa4, 0xfb, 0xfc, 0x0E, 0x11, 0x08, 0xa8, 0xfd, 0x17, 0xb4, 0x48, 0xa6, 0x85, 0x54, 0x19, 0x9c, 0x47, 0xd0, 0x8f, 0xfb, 0x10, 0xd4, 0xb8, 0x02, 0x21, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfE, 0xba, 0xaE, 0xdc, 0xE6, 0xaf, 0x48, 0xa0, 0x3b, 0xbf, 0xd2, 0x5E, 0x8c, 0xd0, 0x36, 0x41, 0x41, 0x02, 0x01, 0x01, 0xa1, 0x44, 0x03, 0x42, 0x00,
-// public key
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
+var W = new Array(80);
-exports.privateKeyExport = function (privateKey, publicKey, compressed) {
- var result = Buffer.from(compressed ? EC_PRIVKEY_EXPORT_DER_COMPRESSED : EC_PRIVKEY_EXPORT_DER_UNCOMPRESSED);
- privateKey.copy(result, compressed ? 8 : 9);
- publicKey.copy(result, compressed ? 181 : 214);
- return result;
+function Sha() {
+ this.init();
+ this._w = W;
+
+ Hash.call(this, 64, 56);
+}
+
+inherits(Sha, Hash);
+
+Sha.prototype.init = function () {
+ this._a = 0x67452301;
+ this._b = 0xefcdab89;
+ this._c = 0x98badcfe;
+ this._d = 0x10325476;
+ this._e = 0xc3d2e1f0;
+
+ return this;
};
-exports.privateKeyImport = function (privateKey) {
- var length = privateKey.length;
+function rotl5(num) {
+ return num << 5 | num >>> 27;
+}
- // sequence header
- var index = 0;
- if (length < index + 1 || privateKey[index] !== 0x30) return;
- index += 1;
+function rotl30(num) {
+ return num << 30 | num >>> 2;
+}
- // sequence length constructor
- if (length < index + 1 || !(privateKey[index] & 0x80)) return;
+function ft(s, b, c, d) {
+ if (s === 0) return b & c | ~b & d;
+ if (s === 2) return b & c | b & d | c & d;
+ return b ^ c ^ d;
+}
- var lenb = privateKey[index] & 0x7f;
- index += 1;
- if (lenb < 1 || lenb > 2) return;
- if (length < index + lenb) return;
+Sha.prototype._update = function (M) {
+ var W = this._w;
- // sequence length
- var len = privateKey[index + lenb - 1] | (lenb > 1 ? privateKey[index + lenb - 2] << 8 : 0);
- index += lenb;
- if (length < index + len) return;
+ var a = this._a | 0;
+ var b = this._b | 0;
+ var c = this._c | 0;
+ var d = this._d | 0;
+ var e = this._e | 0;
- // sequence element 0: version number (=1)
- if (length < index + 3 || privateKey[index] !== 0x02 || privateKey[index + 1] !== 0x01 || privateKey[index + 2] !== 0x01) {
- return;
- }
- index += 3;
+ for (var i = 0; i < 16; ++i) {
+ W[i] = M.readInt32BE(i * 4);
+ }for (; i < 80; ++i) {
+ W[i] = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];
+ }for (var j = 0; j < 80; ++j) {
+ var s = ~~(j / 20);
+ var t = rotl5(a) + ft(s, b, c, d) + e + W[j] + K[s] | 0;
- // sequence element 1: octet string, up to 32 bytes
- if (length < index + 2 || privateKey[index] !== 0x04 || privateKey[index + 1] > 0x20 || length < index + 2 + privateKey[index + 1]) {
- return;
+ e = d;
+ d = c;
+ c = rotl30(b);
+ b = a;
+ a = t;
}
- return privateKey.slice(index + 2, index + 2 + privateKey[index + 1]);
+ this._a = a + this._a | 0;
+ this._b = b + this._b | 0;
+ this._c = c + this._c | 0;
+ this._d = d + this._d | 0;
+ this._e = e + this._e | 0;
};
-exports.signatureExport = function (sigObj) {
- var r = Buffer.concat([Buffer.from([0]), sigObj.r]);
- for (var lenR = 33, posR = 0; lenR > 1 && r[posR] === 0x00 && !(r[posR + 1] & 0x80); --lenR, ++posR) {}
+Sha.prototype._hash = function () {
+ var H = Buffer.allocUnsafe(20);
- var s = Buffer.concat([Buffer.from([0]), sigObj.s]);
- for (var lenS = 33, posS = 0; lenS > 1 && s[posS] === 0x00 && !(s[posS + 1] & 0x80); --lenS, ++posS) {}
+ H.writeInt32BE(this._a | 0, 0);
+ H.writeInt32BE(this._b | 0, 4);
+ H.writeInt32BE(this._c | 0, 8);
+ H.writeInt32BE(this._d | 0, 12);
+ H.writeInt32BE(this._e | 0, 16);
- return bip66.encode(r.slice(posR), s.slice(posS));
+ return H;
};
-exports.signatureImport = function (sig) {
- var r = Buffer.alloc(32, 0);
- var s = Buffer.alloc(32, 0);
+module.exports = Sha;
- try {
- var sigObj = bip66.decode(sig);
- if (sigObj.r.length === 33 && sigObj.r[0] === 0x00) sigObj.r = sigObj.r.slice(1);
- if (sigObj.r.length > 32) throw new Error('R length is too long');
- if (sigObj.s.length === 33 && sigObj.s[0] === 0x00) sigObj.s = sigObj.s.slice(1);
- if (sigObj.s.length > 32) throw new Error('S length is too long');
- } catch (err) {
- return;
- }
+},{"./hash":736,"inherits":671,"safe-buffer":728}],739:[function(require,module,exports){
+'use strict';
- sigObj.r.copy(r, 32 - sigObj.r.length);
- sigObj.s.copy(s, 32 - sigObj.s.length);
+/*
+ * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
+ * in FIPS PUB 180-1
+ * Version 2.1a Copyright Paul Johnston 2000 - 2002.
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ * Distributed under the BSD License
+ * See http://pajhome.org.uk/crypt/md5 for details.
+ */
- return { r: r, s: s };
-};
+var inherits = require('inherits');
+var Hash = require('./hash');
+var Buffer = require('safe-buffer').Buffer;
-exports.signatureImportLax = function (sig) {
- var r = Buffer.alloc(32, 0);
- var s = Buffer.alloc(32, 0);
+var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc | 0, 0xca62c1d6 | 0];
- var length = sig.length;
- var index = 0;
+var W = new Array(80);
- // sequence tag byte
- if (sig[index++] !== 0x30) return;
+function Sha1() {
+ this.init();
+ this._w = W;
- // sequence length byte
- var lenbyte = sig[index++];
- if (lenbyte & 0x80) {
- index += lenbyte - 0x80;
- if (index > length) return;
- }
+ Hash.call(this, 64, 56);
+}
- // sequence tag byte for r
- if (sig[index++] !== 0x02) return;
+inherits(Sha1, Hash);
- // length for r
- var rlen = sig[index++];
- if (rlen & 0x80) {
- lenbyte = rlen - 0x80;
- if (index + lenbyte > length) return;
- for (; lenbyte > 0 && sig[index] === 0x00; index += 1, lenbyte -= 1) {}
- for (rlen = 0; lenbyte > 0; index += 1, lenbyte -= 1) {
- rlen = (rlen << 8) + sig[index];
- }
- }
- if (rlen > length - index) return;
- var rindex = index;
- index += rlen;
+Sha1.prototype.init = function () {
+ this._a = 0x67452301;
+ this._b = 0xefcdab89;
+ this._c = 0x98badcfe;
+ this._d = 0x10325476;
+ this._e = 0xc3d2e1f0;
- // sequence tag byte for s
- if (sig[index++] !== 0x02) return;
+ return this;
+};
- // length for s
- var slen = sig[index++];
- if (slen & 0x80) {
- lenbyte = slen - 0x80;
- if (index + lenbyte > length) return;
- for (; lenbyte > 0 && sig[index] === 0x00; index += 1, lenbyte -= 1) {}
- for (slen = 0; lenbyte > 0; index += 1, lenbyte -= 1) {
- slen = (slen << 8) + sig[index];
- }
- }
- if (slen > length - index) return;
- var sindex = index;
- index += slen;
+function rotl1(num) {
+ return num << 1 | num >>> 31;
+}
- // ignore leading zeros in r
- for (; rlen > 0 && sig[rindex] === 0x00; rlen -= 1, rindex += 1) {}
- // copy r value
- if (rlen > 32) return;
- var rvalue = sig.slice(rindex, rindex + rlen);
- rvalue.copy(r, 32 - rvalue.length);
+function rotl5(num) {
+ return num << 5 | num >>> 27;
+}
- // ignore leading zeros in s
- for (; slen > 0 && sig[sindex] === 0x00; slen -= 1, sindex += 1) {}
- // copy s value
- if (slen > 32) return;
- var svalue = sig.slice(sindex, sindex + slen);
- svalue.copy(s, 32 - svalue.length);
+function rotl30(num) {
+ return num << 30 | num >>> 2;
+}
- return { r: r, s: s };
-};
+function ft(s, b, c, d) {
+ if (s === 0) return b & c | ~b & d;
+ if (s === 2) return b & c | b & d | c & d;
+ return b ^ c ^ d;
+}
-},{"bip66":224,"safe-buffer":729}],735:[function(require,module,exports){
-'use strict';
+Sha1.prototype._update = function (M) {
+ var W = this._w;
-var Buffer = require('safe-buffer').Buffer;
-var createHash = require('create-hash');
-var BN = require('bn.js');
-var EC = require('elliptic').ec;
+ var a = this._a | 0;
+ var b = this._b | 0;
+ var c = this._c | 0;
+ var d = this._d | 0;
+ var e = this._e | 0;
-var messages = require('../messages.json');
+ for (var i = 0; i < 16; ++i) {
+ W[i] = M.readInt32BE(i * 4);
+ }for (; i < 80; ++i) {
+ W[i] = rotl1(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]);
+ }for (var j = 0; j < 80; ++j) {
+ var s = ~~(j / 20);
+ var t = rotl5(a) + ft(s, b, c, d) + e + W[j] + K[s] | 0;
-var ec = new EC('secp256k1');
-var ecparams = ec.curve;
+ e = d;
+ d = c;
+ c = rotl30(b);
+ b = a;
+ a = t;
+ }
-function loadCompressedPublicKey(first, xBuffer) {
- var x = new BN(xBuffer);
+ this._a = a + this._a | 0;
+ this._b = b + this._b | 0;
+ this._c = c + this._c | 0;
+ this._d = d + this._d | 0;
+ this._e = e + this._e | 0;
+};
- // overflow
- if (x.cmp(ecparams.p) >= 0) return null;
- x = x.toRed(ecparams.red);
+Sha1.prototype._hash = function () {
+ var H = Buffer.allocUnsafe(20);
- // compute corresponding Y
- var y = x.redSqr().redIMul(x).redIAdd(ecparams.b).redSqrt();
- if (first === 0x03 !== y.isOdd()) y = y.redNeg();
+ H.writeInt32BE(this._a | 0, 0);
+ H.writeInt32BE(this._b | 0, 4);
+ H.writeInt32BE(this._c | 0, 8);
+ H.writeInt32BE(this._d | 0, 12);
+ H.writeInt32BE(this._e | 0, 16);
- return ec.keyPair({ pub: { x: x, y: y } });
-}
+ return H;
+};
-function loadUncompressedPublicKey(first, xBuffer, yBuffer) {
- var x = new BN(xBuffer);
- var y = new BN(yBuffer);
+module.exports = Sha1;
- // overflow
- if (x.cmp(ecparams.p) >= 0 || y.cmp(ecparams.p) >= 0) return null;
+},{"./hash":736,"inherits":671,"safe-buffer":728}],740:[function(require,module,exports){
+'use strict';
- x = x.toRed(ecparams.red);
- y = y.toRed(ecparams.red);
+/**
+ * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined
+ * in FIPS 180-2
+ * Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009.
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ *
+ */
- // is odd flag
- if ((first === 0x06 || first === 0x07) && y.isOdd() !== (first === 0x07)) return null;
+var inherits = require('inherits');
+var Sha256 = require('./sha256');
+var Hash = require('./hash');
+var Buffer = require('safe-buffer').Buffer;
- // x*x*x + b = y*y
- var x3 = x.redSqr().redIMul(x);
- if (!y.redSqr().redISub(x3.redIAdd(ecparams.b)).isZero()) return null;
+var W = new Array(64);
- return ec.keyPair({ pub: { x: x, y: y } });
-}
+function Sha224() {
+ this.init();
-function loadPublicKey(publicKey) {
- var first = publicKey[0];
- switch (first) {
- case 0x02:
- case 0x03:
- if (publicKey.length !== 33) return null;
- return loadCompressedPublicKey(first, publicKey.slice(1, 33));
- case 0x04:
- case 0x06:
- case 0x07:
- if (publicKey.length !== 65) return null;
- return loadUncompressedPublicKey(first, publicKey.slice(1, 33), publicKey.slice(33, 65));
- default:
- return null;
- }
+ this._w = W; // new Array(64)
+
+ Hash.call(this, 64, 56);
}
-exports.privateKeyVerify = function (privateKey) {
- var bn = new BN(privateKey);
- return bn.cmp(ecparams.n) < 0 && !bn.isZero();
-};
+inherits(Sha224, Sha256);
-exports.privateKeyExport = function (privateKey, compressed) {
- var d = new BN(privateKey);
- if (d.cmp(ecparams.n) >= 0 || d.isZero()) throw new Error(messages.EC_PRIVATE_KEY_EXPORT_DER_FAIL);
+Sha224.prototype.init = function () {
+ this._a = 0xc1059ed8;
+ this._b = 0x367cd507;
+ this._c = 0x3070dd17;
+ this._d = 0xf70e5939;
+ this._e = 0xffc00b31;
+ this._f = 0x68581511;
+ this._g = 0x64f98fa7;
+ this._h = 0xbefa4fa4;
- return Buffer.from(ec.keyFromPrivate(privateKey).getPublic(compressed, true));
+ return this;
};
-exports.privateKeyNegate = function (privateKey) {
- var bn = new BN(privateKey);
- return bn.isZero() ? Buffer.alloc(32) : ecparams.n.sub(bn).umod(ecparams.n).toArrayLike(Buffer, 'be', 32);
-};
+Sha224.prototype._hash = function () {
+ var H = Buffer.allocUnsafe(28);
-exports.privateKeyModInverse = function (privateKey) {
- var bn = new BN(privateKey);
- if (bn.cmp(ecparams.n) >= 0 || bn.isZero()) throw new Error(messages.EC_PRIVATE_KEY_RANGE_INVALID);
+ H.writeInt32BE(this._a, 0);
+ H.writeInt32BE(this._b, 4);
+ H.writeInt32BE(this._c, 8);
+ H.writeInt32BE(this._d, 12);
+ H.writeInt32BE(this._e, 16);
+ H.writeInt32BE(this._f, 20);
+ H.writeInt32BE(this._g, 24);
- return bn.invm(ecparams.n).toArrayLike(Buffer, 'be', 32);
+ return H;
};
-exports.privateKeyTweakAdd = function (privateKey, tweak) {
- var bn = new BN(tweak);
- if (bn.cmp(ecparams.n) >= 0) throw new Error(messages.EC_PRIVATE_KEY_TWEAK_ADD_FAIL);
+module.exports = Sha224;
- bn.iadd(new BN(privateKey));
- if (bn.cmp(ecparams.n) >= 0) bn.isub(ecparams.n);
- if (bn.isZero()) throw new Error(messages.EC_PRIVATE_KEY_TWEAK_ADD_FAIL);
+},{"./hash":736,"./sha256":741,"inherits":671,"safe-buffer":728}],741:[function(require,module,exports){
+'use strict';
- return bn.toArrayLike(Buffer, 'be', 32);
-};
+/**
+ * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined
+ * in FIPS 180-2
+ * Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009.
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ *
+ */
-exports.privateKeyTweakMul = function (privateKey, tweak) {
- var bn = new BN(tweak);
- if (bn.cmp(ecparams.n) >= 0 || bn.isZero()) throw new Error(messages.EC_PRIVATE_KEY_TWEAK_MUL_FAIL);
+var inherits = require('inherits');
+var Hash = require('./hash');
+var Buffer = require('safe-buffer').Buffer;
- bn.imul(new BN(privateKey));
- if (bn.cmp(ecparams.n)) bn = bn.umod(ecparams.n);
+var K = [0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2];
- return bn.toArrayLike(Buffer, 'be', 32);
-};
+var W = new Array(64);
-exports.publicKeyCreate = function (privateKey, compressed) {
- var d = new BN(privateKey);
- if (d.cmp(ecparams.n) >= 0 || d.isZero()) throw new Error(messages.EC_PUBLIC_KEY_CREATE_FAIL);
-
- return Buffer.from(ec.keyFromPrivate(privateKey).getPublic(compressed, true));
-};
-
-exports.publicKeyConvert = function (publicKey, compressed) {
- var pair = loadPublicKey(publicKey);
- if (pair === null) throw new Error(messages.EC_PUBLIC_KEY_PARSE_FAIL);
+function Sha256() {
+ this.init();
- return Buffer.from(pair.getPublic(compressed, true));
-};
+ this._w = W; // new Array(64)
-exports.publicKeyVerify = function (publicKey) {
- return loadPublicKey(publicKey) !== null;
-};
+ Hash.call(this, 64, 56);
+}
-exports.publicKeyTweakAdd = function (publicKey, tweak, compressed) {
- var pair = loadPublicKey(publicKey);
- if (pair === null) throw new Error(messages.EC_PUBLIC_KEY_PARSE_FAIL);
+inherits(Sha256, Hash);
- tweak = new BN(tweak);
- if (tweak.cmp(ecparams.n) >= 0) throw new Error(messages.EC_PUBLIC_KEY_TWEAK_ADD_FAIL);
+Sha256.prototype.init = function () {
+ this._a = 0x6a09e667;
+ this._b = 0xbb67ae85;
+ this._c = 0x3c6ef372;
+ this._d = 0xa54ff53a;
+ this._e = 0x510e527f;
+ this._f = 0x9b05688c;
+ this._g = 0x1f83d9ab;
+ this._h = 0x5be0cd19;
- return Buffer.from(ecparams.g.mul(tweak).add(pair.pub).encode(true, compressed));
+ return this;
};
-exports.publicKeyTweakMul = function (publicKey, tweak, compressed) {
- var pair = loadPublicKey(publicKey);
- if (pair === null) throw new Error(messages.EC_PUBLIC_KEY_PARSE_FAIL);
+function ch(x, y, z) {
+ return z ^ x & (y ^ z);
+}
- tweak = new BN(tweak);
- if (tweak.cmp(ecparams.n) >= 0 || tweak.isZero()) throw new Error(messages.EC_PUBLIC_KEY_TWEAK_MUL_FAIL);
+function maj(x, y, z) {
+ return x & y | z & (x | y);
+}
- return Buffer.from(pair.pub.mul(tweak).encode(true, compressed));
-};
+function sigma0(x) {
+ return (x >>> 2 | x << 30) ^ (x >>> 13 | x << 19) ^ (x >>> 22 | x << 10);
+}
-exports.publicKeyCombine = function (publicKeys, compressed) {
- var pairs = new Array(publicKeys.length);
- for (var i = 0; i < publicKeys.length; ++i) {
- pairs[i] = loadPublicKey(publicKeys[i]);
- if (pairs[i] === null) throw new Error(messages.EC_PUBLIC_KEY_PARSE_FAIL);
- }
+function sigma1(x) {
+ return (x >>> 6 | x << 26) ^ (x >>> 11 | x << 21) ^ (x >>> 25 | x << 7);
+}
- var point = pairs[0].pub;
- for (var j = 1; j < pairs.length; ++j) {
- point = point.add(pairs[j].pub);
- }if (point.isInfinity()) throw new Error(messages.EC_PUBLIC_KEY_COMBINE_FAIL);
+function gamma0(x) {
+ return (x >>> 7 | x << 25) ^ (x >>> 18 | x << 14) ^ x >>> 3;
+}
- return Buffer.from(point.encode(true, compressed));
-};
+function gamma1(x) {
+ return (x >>> 17 | x << 15) ^ (x >>> 19 | x << 13) ^ x >>> 10;
+}
-exports.signatureNormalize = function (signature) {
- var r = new BN(signature.slice(0, 32));
- var s = new BN(signature.slice(32, 64));
- if (r.cmp(ecparams.n) >= 0 || s.cmp(ecparams.n) >= 0) throw new Error(messages.ECDSA_SIGNATURE_PARSE_FAIL);
+Sha256.prototype._update = function (M) {
+ var W = this._w;
- var result = Buffer.from(signature);
- if (s.cmp(ec.nh) === 1) ecparams.n.sub(s).toArrayLike(Buffer, 'be', 32).copy(result, 32);
+ var a = this._a | 0;
+ var b = this._b | 0;
+ var c = this._c | 0;
+ var d = this._d | 0;
+ var e = this._e | 0;
+ var f = this._f | 0;
+ var g = this._g | 0;
+ var h = this._h | 0;
- return result;
-};
+ for (var i = 0; i < 16; ++i) {
+ W[i] = M.readInt32BE(i * 4);
+ }for (; i < 64; ++i) {
+ W[i] = gamma1(W[i - 2]) + W[i - 7] + gamma0(W[i - 15]) + W[i - 16] | 0;
+ }for (var j = 0; j < 64; ++j) {
+ var T1 = h + sigma1(e) + ch(e, f, g) + K[j] + W[j] | 0;
+ var T2 = sigma0(a) + maj(a, b, c) | 0;
-exports.signatureExport = function (signature) {
- var r = signature.slice(0, 32);
- var s = signature.slice(32, 64);
- if (new BN(r).cmp(ecparams.n) >= 0 || new BN(s).cmp(ecparams.n) >= 0) throw new Error(messages.ECDSA_SIGNATURE_PARSE_FAIL);
+ h = g;
+ g = f;
+ f = e;
+ e = d + T1 | 0;
+ d = c;
+ c = b;
+ b = a;
+ a = T1 + T2 | 0;
+ }
- return { r: r, s: s };
+ this._a = a + this._a | 0;
+ this._b = b + this._b | 0;
+ this._c = c + this._c | 0;
+ this._d = d + this._d | 0;
+ this._e = e + this._e | 0;
+ this._f = f + this._f | 0;
+ this._g = g + this._g | 0;
+ this._h = h + this._h | 0;
};
-exports.signatureImport = function (sigObj) {
- var r = new BN(sigObj.r);
- if (r.cmp(ecparams.n) >= 0) r = new BN(0);
+Sha256.prototype._hash = function () {
+ var H = Buffer.allocUnsafe(32);
- var s = new BN(sigObj.s);
- if (s.cmp(ecparams.n) >= 0) s = new BN(0);
+ H.writeInt32BE(this._a, 0);
+ H.writeInt32BE(this._b, 4);
+ H.writeInt32BE(this._c, 8);
+ H.writeInt32BE(this._d, 12);
+ H.writeInt32BE(this._e, 16);
+ H.writeInt32BE(this._f, 20);
+ H.writeInt32BE(this._g, 24);
+ H.writeInt32BE(this._h, 28);
- return Buffer.concat([r.toArrayLike(Buffer, 'be', 32), s.toArrayLike(Buffer, 'be', 32)]);
+ return H;
};
-exports.sign = function (message, privateKey, noncefn, data) {
- if (typeof noncefn === 'function') {
- var getNonce = noncefn;
- noncefn = function noncefn(counter) {
- var nonce = getNonce(message, privateKey, null, data, counter);
- if (!Buffer.isBuffer(nonce) || nonce.length !== 32) throw new Error(messages.ECDSA_SIGN_FAIL);
+module.exports = Sha256;
- return new BN(nonce);
- };
- }
+},{"./hash":736,"inherits":671,"safe-buffer":728}],742:[function(require,module,exports){
+'use strict';
- var d = new BN(privateKey);
- if (d.cmp(ecparams.n) >= 0 || d.isZero()) throw new Error(messages.ECDSA_SIGN_FAIL);
+var inherits = require('inherits');
+var SHA512 = require('./sha512');
+var Hash = require('./hash');
+var Buffer = require('safe-buffer').Buffer;
- var result = ec.sign(message, privateKey, { canonical: true, k: noncefn, pers: data });
- return {
- signature: Buffer.concat([result.r.toArrayLike(Buffer, 'be', 32), result.s.toArrayLike(Buffer, 'be', 32)]),
- recovery: result.recoveryParam
- };
-};
+var W = new Array(160);
-exports.verify = function (message, signature, publicKey) {
- var sigObj = { r: signature.slice(0, 32), s: signature.slice(32, 64) };
+function Sha384() {
+ this.init();
+ this._w = W;
- var sigr = new BN(sigObj.r);
- var sigs = new BN(sigObj.s);
- if (sigr.cmp(ecparams.n) >= 0 || sigs.cmp(ecparams.n) >= 0) throw new Error(messages.ECDSA_SIGNATURE_PARSE_FAIL);
- if (sigs.cmp(ec.nh) === 1 || sigr.isZero() || sigs.isZero()) return false;
+ Hash.call(this, 128, 112);
+}
- var pair = loadPublicKey(publicKey);
- if (pair === null) throw new Error(messages.EC_PUBLIC_KEY_PARSE_FAIL);
+inherits(Sha384, SHA512);
- return ec.verify(message, sigObj, { x: pair.pub.x, y: pair.pub.y });
-};
+Sha384.prototype.init = function () {
+ this._ah = 0xcbbb9d5d;
+ this._bh = 0x629a292a;
+ this._ch = 0x9159015a;
+ this._dh = 0x152fecd8;
+ this._eh = 0x67332667;
+ this._fh = 0x8eb44a87;
+ this._gh = 0xdb0c2e0d;
+ this._hh = 0x47b5481d;
-exports.recover = function (message, signature, recovery, compressed) {
- var sigObj = { r: signature.slice(0, 32), s: signature.slice(32, 64) };
+ this._al = 0xc1059ed8;
+ this._bl = 0x367cd507;
+ this._cl = 0x3070dd17;
+ this._dl = 0xf70e5939;
+ this._el = 0xffc00b31;
+ this._fl = 0x68581511;
+ this._gl = 0x64f98fa7;
+ this._hl = 0xbefa4fa4;
- var sigr = new BN(sigObj.r);
- var sigs = new BN(sigObj.s);
- if (sigr.cmp(ecparams.n) >= 0 || sigs.cmp(ecparams.n) >= 0) throw new Error(messages.ECDSA_SIGNATURE_PARSE_FAIL);
+ return this;
+};
- try {
- if (sigr.isZero() || sigs.isZero()) throw new Error();
+Sha384.prototype._hash = function () {
+ var H = Buffer.allocUnsafe(48);
- var point = ec.recoverPubKey(message, sigObj, recovery);
- return Buffer.from(point.encode(true, compressed));
- } catch (err) {
- throw new Error(messages.ECDSA_RECOVER_FAIL);
+ function writeInt64BE(h, l, offset) {
+ H.writeInt32BE(h, offset);
+ H.writeInt32BE(l, offset + 4);
}
-};
-exports.ecdh = function (publicKey, privateKey) {
- var shared = exports.ecdhUnsafe(publicKey, privateKey, true);
- return createHash('sha256').update(shared).digest();
+ writeInt64BE(this._ah, this._al, 0);
+ writeInt64BE(this._bh, this._bl, 8);
+ writeInt64BE(this._ch, this._cl, 16);
+ writeInt64BE(this._dh, this._dl, 24);
+ writeInt64BE(this._eh, this._el, 32);
+ writeInt64BE(this._fh, this._fl, 40);
+
+ return H;
};
-exports.ecdhUnsafe = function (publicKey, privateKey, compressed) {
- var pair = loadPublicKey(publicKey);
- if (pair === null) throw new Error(messages.EC_PUBLIC_KEY_PARSE_FAIL);
+module.exports = Sha384;
- var scalar = new BN(privateKey);
- if (scalar.cmp(ecparams.n) >= 0 || scalar.isZero()) throw new Error(messages.ECDH_FAIL);
+},{"./hash":736,"./sha512":743,"inherits":671,"safe-buffer":728}],743:[function(require,module,exports){
+'use strict';
- return Buffer.from(pair.pub.mul(scalar).encode(true, compressed));
-};
+var inherits = require('inherits');
+var Hash = require('./hash');
+var Buffer = require('safe-buffer').Buffer;
-},{"../messages.json":737,"bn.js":226,"create-hash":593,"elliptic":612,"safe-buffer":729}],736:[function(require,module,exports){
-'use strict';
+var K = [0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817];
-var assert = require('./assert');
-var der = require('./der');
-var messages = require('./messages.json');
+var W = new Array(160);
-function initCompressedValue(value, defaultValue) {
- if (value === undefined) return defaultValue;
+function Sha512() {
+ this.init();
+ this._w = W;
- assert.isBoolean(value, messages.COMPRESSED_TYPE_INVALID);
- return value;
+ Hash.call(this, 128, 112);
}
-module.exports = function (secp256k1) {
- return {
- privateKeyVerify: function privateKeyVerify(privateKey) {
- assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
- return privateKey.length === 32 && secp256k1.privateKeyVerify(privateKey);
- },
+inherits(Sha512, Hash);
- privateKeyExport: function privateKeyExport(privateKey, compressed) {
- assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
- assert.isBufferLength(privateKey, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID);
+Sha512.prototype.init = function () {
+ this._ah = 0x6a09e667;
+ this._bh = 0xbb67ae85;
+ this._ch = 0x3c6ef372;
+ this._dh = 0xa54ff53a;
+ this._eh = 0x510e527f;
+ this._fh = 0x9b05688c;
+ this._gh = 0x1f83d9ab;
+ this._hh = 0x5be0cd19;
- compressed = initCompressedValue(compressed, true);
- var publicKey = secp256k1.privateKeyExport(privateKey, compressed);
+ this._al = 0xf3bcc908;
+ this._bl = 0x84caa73b;
+ this._cl = 0xfe94f82b;
+ this._dl = 0x5f1d36f1;
+ this._el = 0xade682d1;
+ this._fl = 0x2b3e6c1f;
+ this._gl = 0xfb41bd6b;
+ this._hl = 0x137e2179;
- return der.privateKeyExport(privateKey, publicKey, compressed);
- },
+ return this;
+};
- privateKeyImport: function privateKeyImport(privateKey) {
- assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
+function Ch(x, y, z) {
+ return z ^ x & (y ^ z);
+}
- privateKey = der.privateKeyImport(privateKey);
- if (privateKey && privateKey.length === 32 && secp256k1.privateKeyVerify(privateKey)) return privateKey;
+function maj(x, y, z) {
+ return x & y | z & (x | y);
+}
- throw new Error(messages.EC_PRIVATE_KEY_IMPORT_DER_FAIL);
- },
+function sigma0(x, xl) {
+ return (x >>> 28 | xl << 4) ^ (xl >>> 2 | x << 30) ^ (xl >>> 7 | x << 25);
+}
- privateKeyNegate: function privateKeyNegate(privateKey) {
- assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
- assert.isBufferLength(privateKey, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID);
+function sigma1(x, xl) {
+ return (x >>> 14 | xl << 18) ^ (x >>> 18 | xl << 14) ^ (xl >>> 9 | x << 23);
+}
- return secp256k1.privateKeyNegate(privateKey);
- },
+function Gamma0(x, xl) {
+ return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ x >>> 7;
+}
- privateKeyModInverse: function privateKeyModInverse(privateKey) {
- assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
- assert.isBufferLength(privateKey, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID);
+function Gamma0l(x, xl) {
+ return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ (x >>> 7 | xl << 25);
+}
- return secp256k1.privateKeyModInverse(privateKey);
- },
+function Gamma1(x, xl) {
+ return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ x >>> 6;
+}
- privateKeyTweakAdd: function privateKeyTweakAdd(privateKey, tweak) {
- assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
- assert.isBufferLength(privateKey, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID);
+function Gamma1l(x, xl) {
+ return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ (x >>> 6 | xl << 26);
+}
- assert.isBuffer(tweak, messages.TWEAK_TYPE_INVALID);
- assert.isBufferLength(tweak, 32, messages.TWEAK_LENGTH_INVALID);
+function getCarry(a, b) {
+ return a >>> 0 < b >>> 0 ? 1 : 0;
+}
- return secp256k1.privateKeyTweakAdd(privateKey, tweak);
- },
+Sha512.prototype._update = function (M) {
+ var W = this._w;
- privateKeyTweakMul: function privateKeyTweakMul(privateKey, tweak) {
- assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
- assert.isBufferLength(privateKey, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID);
+ var ah = this._ah | 0;
+ var bh = this._bh | 0;
+ var ch = this._ch | 0;
+ var dh = this._dh | 0;
+ var eh = this._eh | 0;
+ var fh = this._fh | 0;
+ var gh = this._gh | 0;
+ var hh = this._hh | 0;
- assert.isBuffer(tweak, messages.TWEAK_TYPE_INVALID);
- assert.isBufferLength(tweak, 32, messages.TWEAK_LENGTH_INVALID);
+ var al = this._al | 0;
+ var bl = this._bl | 0;
+ var cl = this._cl | 0;
+ var dl = this._dl | 0;
+ var el = this._el | 0;
+ var fl = this._fl | 0;
+ var gl = this._gl | 0;
+ var hl = this._hl | 0;
- return secp256k1.privateKeyTweakMul(privateKey, tweak);
- },
+ for (var i = 0; i < 32; i += 2) {
+ W[i] = M.readInt32BE(i * 4);
+ W[i + 1] = M.readInt32BE(i * 4 + 4);
+ }
+ for (; i < 160; i += 2) {
+ var xh = W[i - 15 * 2];
+ var xl = W[i - 15 * 2 + 1];
+ var gamma0 = Gamma0(xh, xl);
+ var gamma0l = Gamma0l(xl, xh);
- publicKeyCreate: function publicKeyCreate(privateKey, compressed) {
- assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
- assert.isBufferLength(privateKey, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID);
+ xh = W[i - 2 * 2];
+ xl = W[i - 2 * 2 + 1];
+ var gamma1 = Gamma1(xh, xl);
+ var gamma1l = Gamma1l(xl, xh);
- compressed = initCompressedValue(compressed, true);
+ // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]
+ var Wi7h = W[i - 7 * 2];
+ var Wi7l = W[i - 7 * 2 + 1];
- return secp256k1.publicKeyCreate(privateKey, compressed);
- },
+ var Wi16h = W[i - 16 * 2];
+ var Wi16l = W[i - 16 * 2 + 1];
- publicKeyConvert: function publicKeyConvert(publicKey, compressed) {
- assert.isBuffer(publicKey, messages.EC_PUBLIC_KEY_TYPE_INVALID);
- assert.isBufferLength2(publicKey, 33, 65, messages.EC_PUBLIC_KEY_LENGTH_INVALID);
+ var Wil = gamma0l + Wi7l | 0;
+ var Wih = gamma0 + Wi7h + getCarry(Wil, gamma0l) | 0;
+ Wil = Wil + gamma1l | 0;
+ Wih = Wih + gamma1 + getCarry(Wil, gamma1l) | 0;
+ Wil = Wil + Wi16l | 0;
+ Wih = Wih + Wi16h + getCarry(Wil, Wi16l) | 0;
- compressed = initCompressedValue(compressed, true);
+ W[i] = Wih;
+ W[i + 1] = Wil;
+ }
- return secp256k1.publicKeyConvert(publicKey, compressed);
- },
+ for (var j = 0; j < 160; j += 2) {
+ Wih = W[j];
+ Wil = W[j + 1];
- publicKeyVerify: function publicKeyVerify(publicKey) {
- assert.isBuffer(publicKey, messages.EC_PUBLIC_KEY_TYPE_INVALID);
- return secp256k1.publicKeyVerify(publicKey);
- },
+ var majh = maj(ah, bh, ch);
+ var majl = maj(al, bl, cl);
- publicKeyTweakAdd: function publicKeyTweakAdd(publicKey, tweak, compressed) {
- assert.isBuffer(publicKey, messages.EC_PUBLIC_KEY_TYPE_INVALID);
- assert.isBufferLength2(publicKey, 33, 65, messages.EC_PUBLIC_KEY_LENGTH_INVALID);
+ var sigma0h = sigma0(ah, al);
+ var sigma0l = sigma0(al, ah);
+ var sigma1h = sigma1(eh, el);
+ var sigma1l = sigma1(el, eh);
- assert.isBuffer(tweak, messages.TWEAK_TYPE_INVALID);
- assert.isBufferLength(tweak, 32, messages.TWEAK_LENGTH_INVALID);
+ // t1 = h + sigma1 + ch + K[j] + W[j]
+ var Kih = K[j];
+ var Kil = K[j + 1];
- compressed = initCompressedValue(compressed, true);
+ var chh = Ch(eh, fh, gh);
+ var chl = Ch(el, fl, gl);
- return secp256k1.publicKeyTweakAdd(publicKey, tweak, compressed);
- },
+ var t1l = hl + sigma1l | 0;
+ var t1h = hh + sigma1h + getCarry(t1l, hl) | 0;
+ t1l = t1l + chl | 0;
+ t1h = t1h + chh + getCarry(t1l, chl) | 0;
+ t1l = t1l + Kil | 0;
+ t1h = t1h + Kih + getCarry(t1l, Kil) | 0;
+ t1l = t1l + Wil | 0;
+ t1h = t1h + Wih + getCarry(t1l, Wil) | 0;
- publicKeyTweakMul: function publicKeyTweakMul(publicKey, tweak, compressed) {
- assert.isBuffer(publicKey, messages.EC_PUBLIC_KEY_TYPE_INVALID);
- assert.isBufferLength2(publicKey, 33, 65, messages.EC_PUBLIC_KEY_LENGTH_INVALID);
+ // t2 = sigma0 + maj
+ var t2l = sigma0l + majl | 0;
+ var t2h = sigma0h + majh + getCarry(t2l, sigma0l) | 0;
- assert.isBuffer(tweak, messages.TWEAK_TYPE_INVALID);
- assert.isBufferLength(tweak, 32, messages.TWEAK_LENGTH_INVALID);
+ hh = gh;
+ hl = gl;
+ gh = fh;
+ gl = fl;
+ fh = eh;
+ fl = el;
+ el = dl + t1l | 0;
+ eh = dh + t1h + getCarry(el, dl) | 0;
+ dh = ch;
+ dl = cl;
+ ch = bh;
+ cl = bl;
+ bh = ah;
+ bl = al;
+ al = t1l + t2l | 0;
+ ah = t1h + t2h + getCarry(al, t1l) | 0;
+ }
- compressed = initCompressedValue(compressed, true);
+ this._al = this._al + al | 0;
+ this._bl = this._bl + bl | 0;
+ this._cl = this._cl + cl | 0;
+ this._dl = this._dl + dl | 0;
+ this._el = this._el + el | 0;
+ this._fl = this._fl + fl | 0;
+ this._gl = this._gl + gl | 0;
+ this._hl = this._hl + hl | 0;
- return secp256k1.publicKeyTweakMul(publicKey, tweak, compressed);
- },
+ this._ah = this._ah + ah + getCarry(this._al, al) | 0;
+ this._bh = this._bh + bh + getCarry(this._bl, bl) | 0;
+ this._ch = this._ch + ch + getCarry(this._cl, cl) | 0;
+ this._dh = this._dh + dh + getCarry(this._dl, dl) | 0;
+ this._eh = this._eh + eh + getCarry(this._el, el) | 0;
+ this._fh = this._fh + fh + getCarry(this._fl, fl) | 0;
+ this._gh = this._gh + gh + getCarry(this._gl, gl) | 0;
+ this._hh = this._hh + hh + getCarry(this._hl, hl) | 0;
+};
- publicKeyCombine: function publicKeyCombine(publicKeys, compressed) {
- assert.isArray(publicKeys, messages.EC_PUBLIC_KEYS_TYPE_INVALID);
- assert.isLengthGTZero(publicKeys, messages.EC_PUBLIC_KEYS_LENGTH_INVALID);
- for (var i = 0; i < publicKeys.length; ++i) {
- assert.isBuffer(publicKeys[i], messages.EC_PUBLIC_KEY_TYPE_INVALID);
- assert.isBufferLength2(publicKeys[i], 33, 65, messages.EC_PUBLIC_KEY_LENGTH_INVALID);
- }
+Sha512.prototype._hash = function () {
+ var H = Buffer.allocUnsafe(64);
- compressed = initCompressedValue(compressed, true);
+ function writeInt64BE(h, l, offset) {
+ H.writeInt32BE(h, offset);
+ H.writeInt32BE(l, offset + 4);
+ }
- return secp256k1.publicKeyCombine(publicKeys, compressed);
- },
+ writeInt64BE(this._ah, this._al, 0);
+ writeInt64BE(this._bh, this._bl, 8);
+ writeInt64BE(this._ch, this._cl, 16);
+ writeInt64BE(this._dh, this._dl, 24);
+ writeInt64BE(this._eh, this._el, 32);
+ writeInt64BE(this._fh, this._fl, 40);
+ writeInt64BE(this._gh, this._gl, 48);
+ writeInt64BE(this._hh, this._hl, 56);
- signatureNormalize: function signatureNormalize(signature) {
- assert.isBuffer(signature, messages.ECDSA_SIGNATURE_TYPE_INVALID);
- assert.isBufferLength(signature, 64, messages.ECDSA_SIGNATURE_LENGTH_INVALID);
+ return H;
+};
- return secp256k1.signatureNormalize(signature);
- },
+module.exports = Sha512;
- signatureExport: function signatureExport(signature) {
- assert.isBuffer(signature, messages.ECDSA_SIGNATURE_TYPE_INVALID);
- assert.isBufferLength(signature, 64, messages.ECDSA_SIGNATURE_LENGTH_INVALID);
+},{"./hash":736,"inherits":671,"safe-buffer":728}],744:[function(require,module,exports){
+"use strict";
- var sigObj = secp256k1.signatureExport(signature);
- return der.signatureExport(sigObj);
- },
+var distance = require("leven");
- signatureImport: function signatureImport(sig) {
- assert.isBuffer(sig, messages.ECDSA_SIGNATURE_TYPE_INVALID);
- assert.isLengthGTZero(sig, messages.ECDSA_SIGNATURE_LENGTH_INVALID);
+module.exports = function (a, b) {
+ if (!a || !b || !a.length || !b.length) return 0;
+ if (a === b) return 1;
+ var d = distance(a.toLowerCase(), b.toLowerCase());
+ var longest = Math.max(a.length, b.length);
+ return (longest - d) / longest;
+};
- var sigObj = der.signatureImport(sig);
- if (sigObj) return secp256k1.signatureImport(sigObj);
+},{"leven":682}],745:[function(require,module,exports){
+(function (Buffer){
+'use strict';
- throw new Error(messages.ECDSA_SIGNATURE_PARSE_DER_FAIL);
- },
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
- signatureImportLax: function signatureImportLax(sig) {
- assert.isBuffer(sig, messages.ECDSA_SIGNATURE_TYPE_INVALID);
- assert.isLengthGTZero(sig, messages.ECDSA_SIGNATURE_LENGTH_INVALID);
+module.exports = Peer;
- var sigObj = der.signatureImportLax(sig);
- if (sigObj) return secp256k1.signatureImport(sigObj);
+var debug = require('debug')('simple-peer');
+var getBrowserRTC = require('get-browser-rtc');
+var inherits = require('inherits');
+var randombytes = require('randombytes');
+var stream = require('readable-stream');
- throw new Error(messages.ECDSA_SIGNATURE_PARSE_DER_FAIL);
- },
+var MAX_BUFFERED_AMOUNT = 64 * 1024;
- sign: function sign(message, privateKey, options) {
- assert.isBuffer(message, messages.MSG32_TYPE_INVALID);
- assert.isBufferLength(message, 32, messages.MSG32_LENGTH_INVALID);
+inherits(Peer, stream.Duplex);
- assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
- assert.isBufferLength(privateKey, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID);
+/**
+ * WebRTC peer connection. Same API as node core `net.Socket`, plus a few extra methods.
+ * Duplex stream.
+ * @param {Object} opts
+ */
+function Peer(opts) {
+ var self = this;
+ if (!(self instanceof Peer)) return new Peer(opts);
- var data = null;
- var noncefn = null;
- if (options !== undefined) {
- assert.isObject(options, messages.OPTIONS_TYPE_INVALID);
+ self._id = randombytes(4).toString('hex').slice(0, 7);
+ self._debug('new peer %o', opts);
- if (options.data !== undefined) {
- assert.isBuffer(options.data, messages.OPTIONS_DATA_TYPE_INVALID);
- assert.isBufferLength(options.data, 32, messages.OPTIONS_DATA_LENGTH_INVALID);
- data = options.data;
- }
+ opts = Object.assign({
+ allowHalfOpen: false
+ }, opts);
- if (options.noncefn !== undefined) {
- assert.isFunction(options.noncefn, messages.OPTIONS_NONCEFN_TYPE_INVALID);
- noncefn = options.noncefn;
- }
- }
+ stream.Duplex.call(self, opts);
- return secp256k1.sign(message, privateKey, noncefn, data);
- },
+ self.channelName = opts.initiator ? opts.channelName || randombytes(20).toString('hex') : null;
- verify: function verify(message, signature, publicKey) {
- assert.isBuffer(message, messages.MSG32_TYPE_INVALID);
- assert.isBufferLength(message, 32, messages.MSG32_LENGTH_INVALID);
+ // Needed by _transformConstraints, so set this early
+ self._isChromium = typeof window !== 'undefined' && !!window.webkitRTCPeerConnection;
- assert.isBuffer(signature, messages.ECDSA_SIGNATURE_TYPE_INVALID);
- assert.isBufferLength(signature, 64, messages.ECDSA_SIGNATURE_LENGTH_INVALID);
+ self.initiator = opts.initiator || false;
+ self.channelConfig = opts.channelConfig || Peer.channelConfig;
+ self.config = opts.config || Peer.config;
+ self.constraints = self._transformConstraints(opts.constraints || Peer.constraints);
+ self.offerConstraints = self._transformConstraints(opts.offerConstraints || {});
+ self.answerConstraints = self._transformConstraints(opts.answerConstraints || {});
+ self.sdpTransform = opts.sdpTransform || function (sdp) {
+ return sdp;
+ };
+ self.streams = opts.streams || (opts.stream ? [opts.stream] : []); // support old "stream" option
+ self.trickle = opts.trickle !== undefined ? opts.trickle : true;
- assert.isBuffer(publicKey, messages.EC_PUBLIC_KEY_TYPE_INVALID);
- assert.isBufferLength2(publicKey, 33, 65, messages.EC_PUBLIC_KEY_LENGTH_INVALID);
+ self.destroyed = false;
+ self.connected = false;
- return secp256k1.verify(message, signature, publicKey);
- },
+ self.remoteAddress = undefined;
+ self.remoteFamily = undefined;
+ self.remotePort = undefined;
+ self.localAddress = undefined;
+ self.localPort = undefined;
- recover: function recover(message, signature, recovery, compressed) {
- assert.isBuffer(message, messages.MSG32_TYPE_INVALID);
- assert.isBufferLength(message, 32, messages.MSG32_LENGTH_INVALID);
+ self._wrtc = opts.wrtc && _typeof(opts.wrtc) === 'object' ? opts.wrtc : getBrowserRTC();
- assert.isBuffer(signature, messages.ECDSA_SIGNATURE_TYPE_INVALID);
- assert.isBufferLength(signature, 64, messages.ECDSA_SIGNATURE_LENGTH_INVALID);
+ if (!self._wrtc) {
+ if (typeof window === 'undefined') {
+ throw makeError('No WebRTC support: Specify `opts.wrtc` option in this environment', 'ERR_WEBRTC_SUPPORT');
+ } else {
+ throw makeError('No WebRTC support: Not a supported browser', 'ERR_WEBRTC_SUPPORT');
+ }
+ }
- assert.isNumber(recovery, messages.RECOVERY_ID_TYPE_INVALID);
- assert.isNumberInInterval(recovery, -1, 4, messages.RECOVERY_ID_VALUE_INVALID);
+ self._pcReady = false;
+ self._channelReady = false;
+ self._iceComplete = false; // ice candidate trickle done (got null candidate)
+ self._channel = null;
+ self._pendingCandidates = [];
- compressed = initCompressedValue(compressed, true);
+ self._isNegotiating = false; // is this peer waiting for negotiation to complete?
+ self._batchedNegotiation = false; // batch synchronous negotiations
+ self._queuedNegotiation = false; // is there a queued negotiation request?
+ self._sendersAwaitingStable = [];
+ self._senderMap = new WeakMap();
- return secp256k1.recover(message, signature, recovery, compressed);
- },
+ self._remoteTracks = [];
+ self._remoteStreams = [];
- ecdh: function ecdh(publicKey, privateKey) {
- assert.isBuffer(publicKey, messages.EC_PUBLIC_KEY_TYPE_INVALID);
- assert.isBufferLength2(publicKey, 33, 65, messages.EC_PUBLIC_KEY_LENGTH_INVALID);
+ self._chunk = null;
+ self._cb = null;
+ self._interval = null;
- assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
- assert.isBufferLength(privateKey, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID);
+ self._pc = new self._wrtc.RTCPeerConnection(self.config, self.constraints);
- return secp256k1.ecdh(publicKey, privateKey);
- },
+ // We prefer feature detection whenever possible, but sometimes that's not
+ // possible for certain implementations.
+ self._isReactNativeWebrtc = typeof self._pc._peerConnectionId === 'number';
- ecdhUnsafe: function ecdhUnsafe(publicKey, privateKey, compressed) {
- assert.isBuffer(publicKey, messages.EC_PUBLIC_KEY_TYPE_INVALID);
- assert.isBufferLength2(publicKey, 33, 65, messages.EC_PUBLIC_KEY_LENGTH_INVALID);
+ self._pc.oniceconnectionstatechange = function () {
+ self._onIceStateChange();
+ };
+ self._pc.onicegatheringstatechange = function () {
+ self._onIceStateChange();
+ };
+ self._pc.onsignalingstatechange = function () {
+ self._onSignalingStateChange();
+ };
+ self._pc.onicecandidate = function (event) {
+ self._onIceCandidate(event);
+ };
- assert.isBuffer(privateKey, messages.EC_PRIVATE_KEY_TYPE_INVALID);
- assert.isBufferLength(privateKey, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID);
+ // Other spec events, unused by this implementation:
+ // - onconnectionstatechange
+ // - onicecandidateerror
+ // - onfingerprintfailure
+ // - onnegotiationneeded
- compressed = initCompressedValue(compressed, true);
+ if (self.initiator) {
+ self._setupData({
+ channel: self._pc.createDataChannel(self.channelName, self.channelConfig)
+ });
+ } else {
+ self._pc.ondatachannel = function (event) {
+ self._setupData(event);
+ };
+ }
- return secp256k1.ecdhUnsafe(publicKey, privateKey, compressed);
+ if ('addTrack' in self._pc) {
+ if (self.streams) {
+ self.streams.forEach(function (stream) {
+ self.addStream(stream);
+ });
}
- };
-};
+ self._pc.ontrack = function (event) {
+ self._onTrack(event);
+ };
+ }
-},{"./assert":733,"./der":734,"./messages.json":737}],737:[function(require,module,exports){
-module.exports={
- "COMPRESSED_TYPE_INVALID": "compressed should be a boolean",
- "EC_PRIVATE_KEY_TYPE_INVALID": "private key should be a Buffer",
- "EC_PRIVATE_KEY_LENGTH_INVALID": "private key length is invalid",
- "EC_PRIVATE_KEY_RANGE_INVALID": "private key range is invalid",
- "EC_PRIVATE_KEY_TWEAK_ADD_FAIL": "tweak out of range or resulting private key is invalid",
- "EC_PRIVATE_KEY_TWEAK_MUL_FAIL": "tweak out of range",
- "EC_PRIVATE_KEY_EXPORT_DER_FAIL": "couldn't export to DER format",
- "EC_PRIVATE_KEY_IMPORT_DER_FAIL": "couldn't import from DER format",
- "EC_PUBLIC_KEYS_TYPE_INVALID": "public keys should be an Array",
- "EC_PUBLIC_KEYS_LENGTH_INVALID": "public keys Array should have at least 1 element",
- "EC_PUBLIC_KEY_TYPE_INVALID": "public key should be a Buffer",
- "EC_PUBLIC_KEY_LENGTH_INVALID": "public key length is invalid",
- "EC_PUBLIC_KEY_PARSE_FAIL": "the public key could not be parsed or is invalid",
- "EC_PUBLIC_KEY_CREATE_FAIL": "private was invalid, try again",
- "EC_PUBLIC_KEY_TWEAK_ADD_FAIL": "tweak out of range or resulting public key is invalid",
- "EC_PUBLIC_KEY_TWEAK_MUL_FAIL": "tweak out of range",
- "EC_PUBLIC_KEY_COMBINE_FAIL": "the sum of the public keys is not valid",
- "ECDH_FAIL": "scalar was invalid (zero or overflow)",
- "ECDSA_SIGNATURE_TYPE_INVALID": "signature should be a Buffer",
- "ECDSA_SIGNATURE_LENGTH_INVALID": "signature length is invalid",
- "ECDSA_SIGNATURE_PARSE_FAIL": "couldn't parse signature",
- "ECDSA_SIGNATURE_PARSE_DER_FAIL": "couldn't parse DER signature",
- "ECDSA_SIGNATURE_SERIALIZE_DER_FAIL": "couldn't serialize signature to DER format",
- "ECDSA_SIGN_FAIL": "nonce generation function failed or private key is invalid",
- "ECDSA_RECOVER_FAIL": "couldn't recover public key from signature",
- "MSG32_TYPE_INVALID": "message should be a Buffer",
- "MSG32_LENGTH_INVALID": "message length is invalid",
- "OPTIONS_TYPE_INVALID": "options should be an Object",
- "OPTIONS_DATA_TYPE_INVALID": "options.data should be a Buffer",
- "OPTIONS_DATA_LENGTH_INVALID": "options.data length is invalid",
- "OPTIONS_NONCEFN_TYPE_INVALID": "options.noncefn should be a Function",
- "RECOVERY_ID_TYPE_INVALID": "recovery should be a Number",
- "RECOVERY_ID_VALUE_INVALID": "recovery should have value between -1 and 4",
- "TWEAK_TYPE_INVALID": "tweak should be a Buffer",
- "TWEAK_LENGTH_INVALID": "tweak length is invalid"
+ if (self.initiator) {
+ self._needsNegotiation();
+ }
+
+ self._onFinishBound = function () {
+ self._onFinish();
+ };
+ self.once('finish', self._onFinishBound);
}
-},{}],738:[function(require,module,exports){
-'use strict';
+Peer.WEBRTC_SUPPORT = !!getBrowserRTC();
-var Buffer = require('safe-buffer').Buffer;
+/**
+ * Expose config, constraints, and data channel config for overriding all Peer
+ * instances. Otherwise, just set opts.config, opts.constraints, or opts.channelConfig
+ * when constructing a Peer.
+ */
+Peer.config = {
+ iceServers: [{
+ urls: 'stun:stun.l.google.com:19302'
+ }, {
+ urls: 'stun:global.stun.twilio.com:3478?transport=udp'
+ }]
+};
+Peer.constraints = {};
+Peer.channelConfig = {};
-// prototype class for hash functions
-function Hash(blockSize, finalSize) {
- this._block = Buffer.alloc(blockSize);
- this._finalSize = finalSize;
- this._blockSize = blockSize;
- this._len = 0;
-}
+Object.defineProperty(Peer.prototype, 'bufferSize', {
+ get: function get() {
+ var self = this;
+ return self._channel && self._channel.bufferedAmount || 0;
+ }
+});
-Hash.prototype.update = function (data, enc) {
+Peer.prototype.address = function () {
+ var self = this;
+ return { port: self.localPort, family: 'IPv4', address: self.localAddress };
+};
+
+Peer.prototype.signal = function (data) {
+ var self = this;
+ if (self.destroyed) throw makeError('cannot signal after peer is destroyed', 'ERR_SIGNALING');
if (typeof data === 'string') {
- enc = enc || 'utf8';
- data = Buffer.from(data, enc);
+ try {
+ data = JSON.parse(data);
+ } catch (err) {
+ data = {};
+ }
}
+ self._debug('signal()');
- var block = this._block;
- var blockSize = this._blockSize;
- var length = data.length;
- var accum = this._len;
-
- for (var offset = 0; offset < length;) {
- var assigned = accum % blockSize;
- var remainder = Math.min(length - offset, blockSize - assigned);
+ if (data.renegotiate) {
+ self._debug('got request to renegotiate');
+ self._needsNegotiation();
+ }
+ if (data.candidate) {
+ if (self._pc.remoteDescription && self._pc.remoteDescription.type) self._addIceCandidate(data.candidate);else self._pendingCandidates.push(data.candidate);
+ }
+ if (data.sdp) {
+ self._pc.setRemoteDescription(new self._wrtc.RTCSessionDescription(data), function () {
+ if (self.destroyed) return;
- for (var i = 0; i < remainder; i++) {
- block[assigned + i] = data[offset + i];
- }
+ self._pendingCandidates.forEach(function (candidate) {
+ self._addIceCandidate(candidate);
+ });
+ self._pendingCandidates = [];
- accum += remainder;
- offset += remainder;
+ if (self._pc.remoteDescription.type === 'offer') self._createAnswer();
+ }, function (err) {
+ self.destroy(makeError(err, 'ERR_SET_REMOTE_DESCRIPTION'));
+ });
+ }
+ if (!data.sdp && !data.candidate && !data.renegotiate) {
+ self.destroy(makeError('signal() called with invalid signal data', 'ERR_SIGNALING'));
+ }
+};
- if (accum % blockSize === 0) {
- this._update(block);
- }
+Peer.prototype._addIceCandidate = function (candidate) {
+ var self = this;
+ try {
+ self._pc.addIceCandidate(new self._wrtc.RTCIceCandidate(candidate), noop, function (err) {
+ self.destroy(makeError(err, 'ERR_ADD_ICE_CANDIDATE'));
+ });
+ } catch (err) {
+ self.destroy(makeError('error adding candidate: ' + err.message, 'ERR_ADD_ICE_CANDIDATE'));
}
+};
- this._len += length;
- return this;
+/**
+ * Send text/binary data to the remote peer.
+ * @param {ArrayBufferView|ArrayBuffer|Buffer|string|Blob} chunk
+ */
+Peer.prototype.send = function (chunk) {
+ var self = this;
+ self._channel.send(chunk);
};
-Hash.prototype.digest = function (enc) {
- var rem = this._len % this._blockSize;
+/**
+ * Add a MediaStream to the connection.
+ * @param {MediaStream} stream
+ */
+Peer.prototype.addStream = function (stream) {
+ var self = this;
- this._block[rem] = 0x80;
+ self._debug('addStream()');
- // zero (rem + 1) trailing bits, where (rem + 1) is the smallest
- // non-negative solution to the equation (length + 1 + (rem + 1)) === finalSize mod blockSize
- this._block.fill(0, rem + 1);
+ stream.getTracks().forEach(function (track) {
+ self.addTrack(track, stream);
+ });
+};
- if (rem >= this._finalSize) {
- this._update(this._block);
- this._block.fill(0);
- }
+/**
+ * Add a MediaStreamTrack to the connection.
+ * @param {MediaStreamTrack} track
+ * @param {MediaStream} stream
+ */
+Peer.prototype.addTrack = function (track, stream) {
+ var self = this;
- var bits = this._len * 8;
+ self._debug('addTrack()');
- // uint32
- if (bits <= 0xffffffff) {
- this._block.writeUInt32BE(bits, this._blockSize - 4);
+ var sender = self._pc.addTrack(track, stream);
+ var submap = self._senderMap.get(track) || new WeakMap(); // nested WeakMaps map [track, stream] to sender
+ submap.set(stream, sender);
+ self._senderMap.set(track, submap);
+ self._needsNegotiation();
+};
- // uint64
- } else {
- var lowBits = (bits & 0xffffffff) >>> 0;
- var highBits = (bits - lowBits) / 0x100000000;
+/**
+ * Remove a MediaStreamTrack from the connection.
+ * @param {MediaStreamTrack} track
+ * @param {MediaStream} stream
+ */
+Peer.prototype.removeTrack = function (track, stream) {
+ var self = this;
- this._block.writeUInt32BE(highBits, this._blockSize - 8);
- this._block.writeUInt32BE(lowBits, this._blockSize - 4);
+ self._debug('removeSender()');
+
+ var submap = self._senderMap.get(track);
+ var sender = submap ? submap.get(stream) : null;
+ if (!sender) {
+ self.destroy(new Error('Cannot remove track that was never added.'));
+ }
+ try {
+ self._pc.removeTrack(sender);
+ } catch (err) {
+ if (err.name === 'NS_ERROR_UNEXPECTED') {
+ self._sendersAwaitingStable.push(sender); // HACK: Firefox must wait until (signalingState === stable) https://bugzilla.mozilla.org/show_bug.cgi?id=1133874
+ } else {
+ self.destroy(err);
+ }
}
+};
- this._update(this._block);
- var hash = this._hash();
+/**
+ * Remove a MediaStream from the connection.
+ * @param {MediaStream} stream
+ */
+Peer.prototype.removeStream = function (stream) {
+ var self = this;
- return enc ? hash.toString(enc) : hash;
-};
+ self._debug('removeSenders()');
-Hash.prototype._update = function () {
- throw new Error('_update must be implemented by subclass');
+ stream.getTracks().forEach(function (track) {
+ self.removeTrack(track, stream);
+ });
};
-module.exports = Hash;
-
-},{"safe-buffer":729}],739:[function(require,module,exports){
-'use strict';
+Peer.prototype._needsNegotiation = function () {
+ var self = this;
-var _exports = module.exports = function SHA(algorithm) {
- algorithm = algorithm.toLowerCase();
+ self._debug('_needsNegotiation');
+ if (self._batchedNegotiation) return; // batch synchronous renegotiations
+ self._batchedNegotiation = true;
+ setTimeout(function () {
+ self._batchedNegotiation = false;
+ self._debug('starting batched negotiation');
+ self.negotiate();
+ }, 0);
+};
- var Algorithm = _exports[algorithm];
- if (!Algorithm) throw new Error(algorithm + ' is not supported (we accept pull requests)');
+Peer.prototype.negotiate = function () {
+ var self = this;
- return new Algorithm();
+ if (self.initiator) {
+ if (self._isNegotiating) {
+ self._queuedNegotiation = true;
+ self._debug('already negotiating, queueing');
+ } else {
+ self._debug('start negotiation');
+ self._createOffer();
+ }
+ } else {
+ self._debug('requesting negotiation from initiator');
+ self.emit('signal', { // request initiator to renegotiate
+ renegotiate: true
+ });
+ }
+ self._isNegotiating = true;
};
-_exports.sha = require('./sha');
-_exports.sha1 = require('./sha1');
-_exports.sha224 = require('./sha224');
-_exports.sha256 = require('./sha256');
-_exports.sha384 = require('./sha384');
-_exports.sha512 = require('./sha512');
+// TODO: Delete this method once readable-stream is updated to contain a default
+// implementation of destroy() that automatically calls _destroy()
+// See: https://github.com/nodejs/readable-stream/issues/283
+Peer.prototype.destroy = function (err) {
+ var self = this;
+ self._destroy(err, function () {});
+};
-},{"./sha":740,"./sha1":741,"./sha224":742,"./sha256":743,"./sha384":744,"./sha512":745}],740:[function(require,module,exports){
-'use strict';
+Peer.prototype._destroy = function (err, cb) {
+ var self = this;
+ if (self.destroyed) return;
-/*
- * A JavaScript implementation of the Secure Hash Algorithm, SHA-0, as defined
- * in FIPS PUB 180-1
- * This source code is derived from sha1.js of the same repository.
- * The difference between SHA-0 and SHA-1 is just a bitwise rotate left
- * operation was added.
- */
+ self._debug('destroy (error: %s)', err && (err.message || err));
-var inherits = require('inherits');
-var Hash = require('./hash');
-var Buffer = require('safe-buffer').Buffer;
+ self.readable = self.writable = false;
-var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc | 0, 0xca62c1d6 | 0];
+ if (!self._readableState.ended) self.push(null);
+ if (!self._writableState.finished) self.end();
-var W = new Array(80);
+ self.destroyed = true;
+ self.connected = false;
+ self._pcReady = false;
+ self._channelReady = false;
+ self._remoteTracks = null;
+ self._remoteStreams = null;
+ self._senderMap = null;
-function Sha() {
- this.init();
- this._w = W;
+ clearInterval(self._interval);
+ self._interval = null;
+ self._chunk = null;
+ self._cb = null;
- Hash.call(this, 64, 56);
-}
+ if (self._onFinishBound) self.removeListener('finish', self._onFinishBound);
+ self._onFinishBound = null;
-inherits(Sha, Hash);
+ if (self._channel) {
+ try {
+ self._channel.close();
+ } catch (err) {}
-Sha.prototype.init = function () {
- this._a = 0x67452301;
- this._b = 0xefcdab89;
- this._c = 0x98badcfe;
- this._d = 0x10325476;
- this._e = 0xc3d2e1f0;
+ self._channel.onmessage = null;
+ self._channel.onopen = null;
+ self._channel.onclose = null;
+ self._channel.onerror = null;
+ }
+ if (self._pc) {
+ try {
+ self._pc.close();
+ } catch (err) {}
- return this;
+ self._pc.oniceconnectionstatechange = null;
+ self._pc.onicegatheringstatechange = null;
+ self._pc.onsignalingstatechange = null;
+ self._pc.onicecandidate = null;
+ if ('addTrack' in self._pc) {
+ self._pc.ontrack = null;
+ }
+ self._pc.ondatachannel = null;
+ }
+ self._pc = null;
+ self._channel = null;
+
+ if (err) self.emit('error', err);
+ self.emit('close');
+ cb();
};
-function rotl5(num) {
- return num << 5 | num >>> 27;
-}
+Peer.prototype._setupData = function (event) {
+ var self = this;
+ if (!event.channel) {
+ // In some situations `pc.createDataChannel()` returns `undefined` (in wrtc),
+ // which is invalid behavior. Handle it gracefully.
+ // See: https://github.com/feross/simple-peer/issues/163
+ return self.destroy(makeError('Data channel event is missing `channel` property', 'ERR_DATA_CHANNEL'));
+ }
-function rotl30(num) {
- return num << 30 | num >>> 2;
-}
+ self._channel = event.channel;
+ self._channel.binaryType = 'arraybuffer';
-function ft(s, b, c, d) {
- if (s === 0) return b & c | ~b & d;
- if (s === 2) return b & c | b & d | c & d;
- return b ^ c ^ d;
-}
+ if (typeof self._channel.bufferedAmountLowThreshold === 'number') {
+ self._channel.bufferedAmountLowThreshold = MAX_BUFFERED_AMOUNT;
+ }
-Sha.prototype._update = function (M) {
- var W = this._w;
+ self.channelName = self._channel.label;
- var a = this._a | 0;
- var b = this._b | 0;
- var c = this._c | 0;
- var d = this._d | 0;
- var e = this._e | 0;
+ self._channel.onmessage = function (event) {
+ self._onChannelMessage(event);
+ };
+ self._channel.onbufferedamountlow = function () {
+ self._onChannelBufferedAmountLow();
+ };
+ self._channel.onopen = function () {
+ self._onChannelOpen();
+ };
+ self._channel.onclose = function () {
+ self._onChannelClose();
+ };
+ self._channel.onerror = function (err) {
+ self.destroy(makeError(err, 'ERR_DATA_CHANNEL'));
+ };
+};
- for (var i = 0; i < 16; ++i) {
- W[i] = M.readInt32BE(i * 4);
- }for (; i < 80; ++i) {
- W[i] = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];
- }for (var j = 0; j < 80; ++j) {
- var s = ~~(j / 20);
- var t = rotl5(a) + ft(s, b, c, d) + e + W[j] + K[s] | 0;
+Peer.prototype._read = function () {};
- e = d;
- d = c;
- c = rotl30(b);
- b = a;
- a = t;
- }
+Peer.prototype._write = function (chunk, encoding, cb) {
+ var self = this;
+ if (self.destroyed) return cb(makeError('cannot write after peer is destroyed', 'ERR_DATA_CHANNEL'));
- this._a = a + this._a | 0;
- this._b = b + this._b | 0;
- this._c = c + this._c | 0;
- this._d = d + this._d | 0;
- this._e = e + this._e | 0;
+ if (self.connected) {
+ try {
+ self.send(chunk);
+ } catch (err) {
+ return self.destroy(makeError(err, 'ERR_DATA_CHANNEL'));
+ }
+ if (self._channel.bufferedAmount > MAX_BUFFERED_AMOUNT) {
+ self._debug('start backpressure: bufferedAmount %d', self._channel.bufferedAmount);
+ self._cb = cb;
+ } else {
+ cb(null);
+ }
+ } else {
+ self._debug('write before connect');
+ self._chunk = chunk;
+ self._cb = cb;
+ }
};
-Sha.prototype._hash = function () {
- var H = Buffer.allocUnsafe(20);
+// When stream finishes writing, close socket. Half open connections are not
+// supported.
+Peer.prototype._onFinish = function () {
+ var self = this;
+ if (self.destroyed) return;
- H.writeInt32BE(this._a | 0, 0);
- H.writeInt32BE(this._b | 0, 4);
- H.writeInt32BE(this._c | 0, 8);
- H.writeInt32BE(this._d | 0, 12);
- H.writeInt32BE(this._e | 0, 16);
+ if (self.connected) {
+ destroySoon();
+ } else {
+ self.once('connect', destroySoon);
+ }
- return H;
+ // Wait a bit before destroying so the socket flushes.
+ // TODO: is there a more reliable way to accomplish this?
+ function destroySoon() {
+ setTimeout(function () {
+ self.destroy();
+ }, 1000);
+ }
};
-module.exports = Sha;
-
-},{"./hash":738,"inherits":671,"safe-buffer":729}],741:[function(require,module,exports){
-'use strict';
+Peer.prototype._createOffer = function () {
+ var self = this;
+ if (self.destroyed) return;
-/*
- * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
- * in FIPS PUB 180-1
- * Version 2.1a Copyright Paul Johnston 2000 - 2002.
- * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
- * Distributed under the BSD License
- * See http://pajhome.org.uk/crypt/md5 for details.
- */
+ self._pc.createOffer(function (offer) {
+ if (self.destroyed) return;
+ offer.sdp = self.sdpTransform(offer.sdp);
+ self._pc.setLocalDescription(offer, onSuccess, onError);
-var inherits = require('inherits');
-var Hash = require('./hash');
-var Buffer = require('safe-buffer').Buffer;
+ function onSuccess() {
+ self._debug('createOffer success');
+ if (self.destroyed) return;
+ if (self.trickle || self._iceComplete) sendOffer();else self.once('_iceComplete', sendOffer); // wait for candidates
+ }
-var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc | 0, 0xca62c1d6 | 0];
+ function onError(err) {
+ self.destroy(makeError(err, 'ERR_SET_LOCAL_DESCRIPTION'));
+ }
-var W = new Array(80);
+ function sendOffer() {
+ var signal = self._pc.localDescription || offer;
+ self._debug('signal');
+ self.emit('signal', {
+ type: signal.type,
+ sdp: signal.sdp
+ });
+ }
+ }, function (err) {
+ self.destroy(makeError(err, 'ERR_CREATE_OFFER'));
+ }, self.offerConstraints);
+};
-function Sha1() {
- this.init();
- this._w = W;
+Peer.prototype._createAnswer = function () {
+ var self = this;
+ if (self.destroyed) return;
- Hash.call(this, 64, 56);
-}
+ self._pc.createAnswer(function (answer) {
+ if (self.destroyed) return;
+ answer.sdp = self.sdpTransform(answer.sdp);
+ self._pc.setLocalDescription(answer, onSuccess, onError);
-inherits(Sha1, Hash);
+ function onSuccess() {
+ if (self.destroyed) return;
+ if (self.trickle || self._iceComplete) sendAnswer();else self.once('_iceComplete', sendAnswer);
+ }
-Sha1.prototype.init = function () {
- this._a = 0x67452301;
- this._b = 0xefcdab89;
- this._c = 0x98badcfe;
- this._d = 0x10325476;
- this._e = 0xc3d2e1f0;
+ function onError(err) {
+ self.destroy(makeError(err, 'ERR_SET_LOCAL_DESCRIPTION'));
+ }
- return this;
+ function sendAnswer() {
+ var signal = self._pc.localDescription || answer;
+ self._debug('signal');
+ self.emit('signal', {
+ type: signal.type,
+ sdp: signal.sdp
+ });
+ }
+ }, function (err) {
+ self.destroy(makeError(err, 'ERR_CREATE_ANSWER'));
+ }, self.answerConstraints);
};
-function rotl1(num) {
- return num << 1 | num >>> 31;
-}
+Peer.prototype._onIceStateChange = function () {
+ var self = this;
+ if (self.destroyed) return;
+ var iceConnectionState = self._pc.iceConnectionState;
+ var iceGatheringState = self._pc.iceGatheringState;
-function rotl5(num) {
- return num << 5 | num >>> 27;
-}
+ self._debug('iceStateChange (connection: %s) (gathering: %s)', iceConnectionState, iceGatheringState);
+ self.emit('iceStateChange', iceConnectionState, iceGatheringState);
-function rotl30(num) {
- return num << 30 | num >>> 2;
-}
+ if (iceConnectionState === 'connected' || iceConnectionState === 'completed') {
+ self._pcReady = true;
+ self._maybeReady();
+ }
+ if (iceConnectionState === 'failed') {
+ self.destroy(makeError('Ice connection failed.', 'ERR_ICE_CONNECTION_FAILURE'));
+ }
+ if (iceConnectionState === 'closed') {
+ self.destroy(new Error('Ice connection closed.'));
+ }
+};
-function ft(s, b, c, d) {
- if (s === 0) return b & c | ~b & d;
- if (s === 2) return b & c | b & d | c & d;
- return b ^ c ^ d;
-}
+Peer.prototype.getStats = function (cb) {
+ var self = this;
-Sha1.prototype._update = function (M) {
- var W = this._w;
+ // Promise-based getStats() (standard)
+ if (self._pc.getStats.length === 0) {
+ self._pc.getStats().then(function (res) {
+ var reports = [];
+ res.forEach(function (report) {
+ reports.push(report);
+ });
+ cb(null, reports);
+ }, function (err) {
+ cb(err);
+ });
- var a = this._a | 0;
- var b = this._b | 0;
- var c = this._c | 0;
- var d = this._d | 0;
- var e = this._e | 0;
+ // Two-parameter callback-based getStats() (deprecated, former standard)
+ } else if (self._isReactNativeWebrtc) {
+ self._pc.getStats(null, function (res) {
+ var reports = [];
+ res.forEach(function (report) {
+ reports.push(report);
+ });
+ cb(null, reports);
+ }, function (err) {
+ cb(err);
+ });
- for (var i = 0; i < 16; ++i) {
- W[i] = M.readInt32BE(i * 4);
- }for (; i < 80; ++i) {
- W[i] = rotl1(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]);
- }for (var j = 0; j < 80; ++j) {
- var s = ~~(j / 20);
- var t = rotl5(a) + ft(s, b, c, d) + e + W[j] + K[s] | 0;
+ // Single-parameter callback-based getStats() (non-standard)
+ } else if (self._pc.getStats.length > 0) {
+ self._pc.getStats(function (res) {
+ // If we destroy connection in `connect` callback this code might happen to run when actual connection is already closed
+ if (self.destroyed) return;
- e = d;
- d = c;
- c = rotl30(b);
- b = a;
- a = t;
- }
+ var reports = [];
+ res.result().forEach(function (result) {
+ var report = {};
+ result.names().forEach(function (name) {
+ report[name] = result.stat(name);
+ });
+ report.id = result.id;
+ report.type = result.type;
+ report.timestamp = result.timestamp;
+ reports.push(report);
+ });
+ cb(null, reports);
+ }, function (err) {
+ cb(err);
+ });
- this._a = a + this._a | 0;
- this._b = b + this._b | 0;
- this._c = c + this._c | 0;
- this._d = d + this._d | 0;
- this._e = e + this._e | 0;
+ // Unknown browser, skip getStats() since it's anyone's guess which style of
+ // getStats() they implement.
+ } else {
+ cb(null, []);
+ }
};
-Sha1.prototype._hash = function () {
- var H = Buffer.allocUnsafe(20);
+Peer.prototype._maybeReady = function () {
+ var self = this;
+ self._debug('maybeReady pc %s channel %s', self._pcReady, self._channelReady);
+ if (self.connected || self._connecting || !self._pcReady || !self._channelReady) return;
- H.writeInt32BE(this._a | 0, 0);
- H.writeInt32BE(this._b | 0, 4);
- H.writeInt32BE(this._c | 0, 8);
- H.writeInt32BE(this._d | 0, 12);
- H.writeInt32BE(this._e | 0, 16);
+ self._connecting = true;
- return H;
-};
+ // HACK: We can't rely on order here, for details see https://github.com/js-platform/node-webrtc/issues/339
+ function findCandidatePair() {
+ if (self.destroyed) return;
-module.exports = Sha1;
+ self.getStats(function (err, items) {
+ if (self.destroyed) return;
-},{"./hash":738,"inherits":671,"safe-buffer":729}],742:[function(require,module,exports){
-'use strict';
+ // Treat getStats error as non-fatal. It's not essential.
+ if (err) items = [];
-/**
- * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined
- * in FIPS 180-2
- * Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009.
- * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
- *
- */
+ var remoteCandidates = {};
+ var localCandidates = {};
+ var candidatePairs = {};
+ var foundSelectedCandidatePair = false;
-var inherits = require('inherits');
-var Sha256 = require('./sha256');
-var Hash = require('./hash');
-var Buffer = require('safe-buffer').Buffer;
+ items.forEach(function (item) {
+ // TODO: Once all browsers support the hyphenated stats report types, remove
+ // the non-hypenated ones
+ if (item.type === 'remotecandidate' || item.type === 'remote-candidate') {
+ remoteCandidates[item.id] = item;
+ }
+ if (item.type === 'localcandidate' || item.type === 'local-candidate') {
+ localCandidates[item.id] = item;
+ }
+ if (item.type === 'candidatepair' || item.type === 'candidate-pair') {
+ candidatePairs[item.id] = item;
+ }
+ });
-var W = new Array(64);
+ items.forEach(function (item) {
+ // Spec-compliant
+ if (item.type === 'transport' && item.selectedCandidatePairId) {
+ setSelectedCandidatePair(candidatePairs[item.selectedCandidatePairId]);
+ }
-function Sha224() {
- this.init();
+ // Old implementations
+ if (item.type === 'googCandidatePair' && item.googActiveConnection === 'true' || (item.type === 'candidatepair' || item.type === 'candidate-pair') && item.selected) {
+ setSelectedCandidatePair(item);
+ }
+ });
- this._w = W; // new Array(64)
+ function setSelectedCandidatePair(selectedCandidatePair) {
+ foundSelectedCandidatePair = true;
- Hash.call(this, 64, 56);
-}
+ var local = localCandidates[selectedCandidatePair.localCandidateId];
-inherits(Sha224, Sha256);
+ if (local && local.ip) {
+ // Spec
+ self.localAddress = local.ip;
+ self.localPort = Number(local.port);
+ } else if (local && local.ipAddress) {
+ // Firefox
+ self.localAddress = local.ipAddress;
+ self.localPort = Number(local.portNumber);
+ } else if (typeof selectedCandidatePair.googLocalAddress === 'string') {
+ // TODO: remove this once Chrome 58 is released
+ local = selectedCandidatePair.googLocalAddress.split(':');
+ self.localAddress = local[0];
+ self.localPort = Number(local[1]);
+ }
-Sha224.prototype.init = function () {
- this._a = 0xc1059ed8;
- this._b = 0x367cd507;
- this._c = 0x3070dd17;
- this._d = 0xf70e5939;
- this._e = 0xffc00b31;
- this._f = 0x68581511;
- this._g = 0x64f98fa7;
- this._h = 0xbefa4fa4;
+ var remote = remoteCandidates[selectedCandidatePair.remoteCandidateId];
- return this;
-};
+ if (remote && remote.ip) {
+ // Spec
+ self.remoteAddress = remote.ip;
+ self.remotePort = Number(remote.port);
+ } else if (remote && remote.ipAddress) {
+ // Firefox
+ self.remoteAddress = remote.ipAddress;
+ self.remotePort = Number(remote.portNumber);
+ } else if (typeof selectedCandidatePair.googRemoteAddress === 'string') {
+ // TODO: remove this once Chrome 58 is released
+ remote = selectedCandidatePair.googRemoteAddress.split(':');
+ self.remoteAddress = remote[0];
+ self.remotePort = Number(remote[1]);
+ }
+ self.remoteFamily = 'IPv4';
-Sha224.prototype._hash = function () {
- var H = Buffer.allocUnsafe(28);
+ self._debug('connect local: %s:%s remote: %s:%s', self.localAddress, self.localPort, self.remoteAddress, self.remotePort);
+ }
- H.writeInt32BE(this._a, 0);
- H.writeInt32BE(this._b, 4);
- H.writeInt32BE(this._c, 8);
- H.writeInt32BE(this._d, 12);
- H.writeInt32BE(this._e, 16);
- H.writeInt32BE(this._f, 20);
- H.writeInt32BE(this._g, 24);
+ // Ignore candidate pair selection in browsers like Safari 11 that do not have any local or remote candidates
+ // But wait until at least 1 candidate pair is available
+ if (!foundSelectedCandidatePair && (!Object.keys(candidatePairs).length || Object.keys(localCandidates).length)) {
+ setTimeout(findCandidatePair, 100);
+ return;
+ } else {
+ self._connecting = false;
+ self.connected = true;
+ }
- return H;
-};
+ if (self._chunk) {
+ try {
+ self.send(self._chunk);
+ } catch (err) {
+ return self.destroy(makeError(err, 'ERR_DATA_CHANNEL'));
+ }
+ self._chunk = null;
+ self._debug('sent chunk from "write before connect"');
-module.exports = Sha224;
+ var cb = self._cb;
+ self._cb = null;
+ cb(null);
+ }
-},{"./hash":738,"./sha256":743,"inherits":671,"safe-buffer":729}],743:[function(require,module,exports){
-'use strict';
+ // If `bufferedAmountLowThreshold` and 'onbufferedamountlow' are unsupported,
+ // fallback to using setInterval to implement backpressure.
+ if (typeof self._channel.bufferedAmountLowThreshold !== 'number') {
+ self._interval = setInterval(function () {
+ self._onInterval();
+ }, 150);
+ if (self._interval.unref) self._interval.unref();
+ }
-/**
- * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined
- * in FIPS 180-2
- * Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009.
- * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
- *
- */
+ self._debug('connect');
+ self.emit('connect');
+ });
+ }
+ findCandidatePair();
+};
-var inherits = require('inherits');
-var Hash = require('./hash');
-var Buffer = require('safe-buffer').Buffer;
+Peer.prototype._onInterval = function () {
+ var self = this;
+ if (!self._cb || !self._channel || self._channel.bufferedAmount > MAX_BUFFERED_AMOUNT) {
+ return;
+ }
+ self._onChannelBufferedAmountLow();
+};
-var K = [0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2];
+Peer.prototype._onSignalingStateChange = function () {
+ var self = this;
+ if (self.destroyed) return;
-var W = new Array(64);
-
-function Sha256() {
- this.init();
-
- this._w = W; // new Array(64)
+ if (self._pc.signalingState === 'stable') {
+ self._isNegotiating = false;
- Hash.call(this, 64, 56);
-}
+ // HACK: Firefox doesn't yet support removing tracks when signalingState !== 'stable'
+ self._debug('flushing sender queue', self._sendersAwaitingStable);
+ self._sendersAwaitingStable.forEach(function (sender) {
+ self.removeTrack(sender);
+ self._queuedNegotiation = true;
+ });
+ self._sendersAwaitingStable = [];
-inherits(Sha256, Hash);
+ if (self._queuedNegotiation) {
+ self._debug('flushing negotiation queue');
+ self._queuedNegotiation = false;
+ self._needsNegotiation(); // negotiate again
+ }
-Sha256.prototype.init = function () {
- this._a = 0x6a09e667;
- this._b = 0xbb67ae85;
- this._c = 0x3c6ef372;
- this._d = 0xa54ff53a;
- this._e = 0x510e527f;
- this._f = 0x9b05688c;
- this._g = 0x1f83d9ab;
- this._h = 0x5be0cd19;
+ self._debug('negotiate');
+ self.emit('negotiate');
+ }
- return this;
+ self._debug('signalingStateChange %s', self._pc.signalingState);
+ self.emit('signalingStateChange', self._pc.signalingState);
};
-function ch(x, y, z) {
- return z ^ x & (y ^ z);
-}
+Peer.prototype._onIceCandidate = function (event) {
+ var self = this;
+ if (self.destroyed) return;
+ if (event.candidate && self.trickle) {
+ self.emit('signal', {
+ candidate: {
+ candidate: event.candidate.candidate,
+ sdpMLineIndex: event.candidate.sdpMLineIndex,
+ sdpMid: event.candidate.sdpMid
+ }
+ });
+ } else if (!event.candidate) {
+ self._iceComplete = true;
+ self.emit('_iceComplete');
+ }
+};
-function maj(x, y, z) {
- return x & y | z & (x | y);
-}
+Peer.prototype._onChannelMessage = function (event) {
+ var self = this;
+ if (self.destroyed) return;
+ var data = event.data;
+ if (data instanceof ArrayBuffer) data = Buffer.from(data);
+ self.push(data);
+};
-function sigma0(x) {
- return (x >>> 2 | x << 30) ^ (x >>> 13 | x << 19) ^ (x >>> 22 | x << 10);
-}
+Peer.prototype._onChannelBufferedAmountLow = function () {
+ var self = this;
+ if (self.destroyed || !self._cb) return;
+ self._debug('ending backpressure: bufferedAmount %d', self._channel.bufferedAmount);
+ var cb = self._cb;
+ self._cb = null;
+ cb(null);
+};
-function sigma1(x) {
- return (x >>> 6 | x << 26) ^ (x >>> 11 | x << 21) ^ (x >>> 25 | x << 7);
-}
+Peer.prototype._onChannelOpen = function () {
+ var self = this;
+ if (self.connected || self.destroyed) return;
+ self._debug('on channel open');
+ self._channelReady = true;
+ self._maybeReady();
+};
-function gamma0(x) {
- return (x >>> 7 | x << 25) ^ (x >>> 18 | x << 14) ^ x >>> 3;
-}
+Peer.prototype._onChannelClose = function () {
+ var self = this;
+ if (self.destroyed) return;
+ self._debug('on channel close');
+ self.destroy();
+};
-function gamma1(x) {
- return (x >>> 17 | x << 15) ^ (x >>> 19 | x << 13) ^ x >>> 10;
-}
+Peer.prototype._onTrack = function (event) {
+ var self = this;
+ if (self.destroyed) return;
-Sha256.prototype._update = function (M) {
- var W = this._w;
+ event.streams.forEach(function (eventStream) {
+ self._debug('on track');
+ self.emit('track', event.track, eventStream);
- var a = this._a | 0;
- var b = this._b | 0;
- var c = this._c | 0;
- var d = this._d | 0;
- var e = this._e | 0;
- var f = this._f | 0;
- var g = this._g | 0;
- var h = this._h | 0;
+ self._remoteTracks.push({
+ track: event.track,
+ stream: eventStream
+ });
- for (var i = 0; i < 16; ++i) {
- W[i] = M.readInt32BE(i * 4);
- }for (; i < 64; ++i) {
- W[i] = gamma1(W[i - 2]) + W[i - 7] + gamma0(W[i - 15]) + W[i - 16] | 0;
- }for (var j = 0; j < 64; ++j) {
- var T1 = h + sigma1(e) + ch(e, f, g) + K[j] + W[j] | 0;
- var T2 = sigma0(a) + maj(a, b, c) | 0;
+ if (self._remoteStreams.some(function (remoteStream) {
+ return remoteStream.id === eventStream.id;
+ })) return; // Only fire one 'stream' event, even though there may be multiple tracks per stream
- h = g;
- g = f;
- f = e;
- e = d + T1 | 0;
- d = c;
- c = b;
- b = a;
- a = T1 + T2 | 0;
- }
+ self._remoteStreams.push(eventStream);
+ setTimeout(function () {
+ self.emit('stream', eventStream); // ensure all tracks have been added
+ }, 0);
+ });
+};
- this._a = a + this._a | 0;
- this._b = b + this._b | 0;
- this._c = c + this._c | 0;
- this._d = d + this._d | 0;
- this._e = e + this._e | 0;
- this._f = f + this._f | 0;
- this._g = g + this._g | 0;
- this._h = h + this._h | 0;
+Peer.prototype._debug = function () {
+ var self = this;
+ var args = [].slice.call(arguments);
+ args[0] = '[' + self._id + '] ' + args[0];
+ debug.apply(null, args);
};
-Sha256.prototype._hash = function () {
- var H = Buffer.allocUnsafe(32);
+// Transform constraints objects into the new format (unless Chromium)
+// TODO: This can be removed when Chromium supports the new format
+Peer.prototype._transformConstraints = function (constraints) {
+ var self = this;
- H.writeInt32BE(this._a, 0);
- H.writeInt32BE(this._b, 4);
- H.writeInt32BE(this._c, 8);
- H.writeInt32BE(this._d, 12);
- H.writeInt32BE(this._e, 16);
- H.writeInt32BE(this._f, 20);
- H.writeInt32BE(this._g, 24);
- H.writeInt32BE(this._h, 28);
+ if (Object.keys(constraints).length === 0) {
+ return constraints;
+ }
- return H;
-};
+ if ((constraints.mandatory || constraints.optional) && !self._isChromium) {
+ // convert to new format
-module.exports = Sha256;
+ // Merge mandatory and optional objects, prioritizing mandatory
+ var newConstraints = Object.assign({}, constraints.optional, constraints.mandatory);
-},{"./hash":738,"inherits":671,"safe-buffer":729}],744:[function(require,module,exports){
-'use strict';
+ // fix casing
+ if (newConstraints.OfferToReceiveVideo !== undefined) {
+ newConstraints.offerToReceiveVideo = newConstraints.OfferToReceiveVideo;
+ delete newConstraints['OfferToReceiveVideo'];
+ }
-var inherits = require('inherits');
-var SHA512 = require('./sha512');
-var Hash = require('./hash');
-var Buffer = require('safe-buffer').Buffer;
+ if (newConstraints.OfferToReceiveAudio !== undefined) {
+ newConstraints.offerToReceiveAudio = newConstraints.OfferToReceiveAudio;
+ delete newConstraints['OfferToReceiveAudio'];
+ }
-var W = new Array(160);
+ return newConstraints;
+ } else if (!constraints.mandatory && !constraints.optional && self._isChromium) {
+ // convert to old format
-function Sha384() {
- this.init();
- this._w = W;
+ // fix casing
+ if (constraints.offerToReceiveVideo !== undefined) {
+ constraints.OfferToReceiveVideo = constraints.offerToReceiveVideo;
+ delete constraints['offerToReceiveVideo'];
+ }
- Hash.call(this, 128, 112);
-}
+ if (constraints.offerToReceiveAudio !== undefined) {
+ constraints.OfferToReceiveAudio = constraints.offerToReceiveAudio;
+ delete constraints['offerToReceiveAudio'];
+ }
-inherits(Sha384, SHA512);
+ return {
+ mandatory: constraints // NOTE: All constraints are upgraded to mandatory
+ };
+ }
-Sha384.prototype.init = function () {
- this._ah = 0xcbbb9d5d;
- this._bh = 0x629a292a;
- this._ch = 0x9159015a;
- this._dh = 0x152fecd8;
- this._eh = 0x67332667;
- this._fh = 0x8eb44a87;
- this._gh = 0xdb0c2e0d;
- this._hh = 0x47b5481d;
+ return constraints;
+};
- this._al = 0xc1059ed8;
- this._bl = 0x367cd507;
- this._cl = 0x3070dd17;
- this._dl = 0xf70e5939;
- this._el = 0xffc00b31;
- this._fl = 0x68581511;
- this._gl = 0x64f98fa7;
- this._hl = 0xbefa4fa4;
+function makeError(message, code) {
+ var err = new Error(message);
+ err.code = code;
+ return err;
+}
- return this;
-};
+function noop() {}
-Sha384.prototype._hash = function () {
- var H = Buffer.allocUnsafe(48);
+}).call(this,require("buffer").Buffer)
+},{"buffer":256,"debug":746,"get-browser-rtc":648,"inherits":671,"randombytes":711,"readable-stream":723}],746:[function(require,module,exports){
+(function (process){
+"use strict";
- function writeInt64BE(h, l, offset) {
- H.writeInt32BE(h, offset);
- H.writeInt32BE(l, offset + 4);
- }
+var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
- writeInt64BE(this._ah, this._al, 0);
- writeInt64BE(this._bh, this._bl, 8);
- writeInt64BE(this._ch, this._cl, 16);
- writeInt64BE(this._dh, this._dl, 24);
- writeInt64BE(this._eh, this._el, 32);
- writeInt64BE(this._fh, this._fl, 40);
+function _typeof(obj) {
+ if (typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol") {
+ _typeof = function _typeof(obj) {
+ return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
+ };
+ } else {
+ _typeof = function _typeof(obj) {
+ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj);
+ };
+ }return _typeof(obj);
+}
- return H;
-};
+/* eslint-env browser */
-module.exports = Sha384;
+/**
+ * This is the web browser implementation of `debug()`.
+ */
+exports.log = log;
+exports.formatArgs = formatArgs;
+exports.save = save;
+exports.load = load;
+exports.useColors = useColors;
+exports.storage = localstorage();
+/**
+ * Colors.
+ */
-},{"./hash":738,"./sha512":745,"inherits":671,"safe-buffer":729}],745:[function(require,module,exports){
-'use strict';
+exports.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'];
+/**
+ * Currently only WebKit-based Web Inspectors, Firefox >= v31,
+ * and the Firebug extension (any Firefox version) are known
+ * to support "%c" CSS customizations.
+ *
+ * TODO: add a `localStorage` variable to explicitly enable/disable colors
+ */
+// eslint-disable-next-line complexity
-var inherits = require('inherits');
-var Hash = require('./hash');
-var Buffer = require('safe-buffer').Buffer;
+function useColors() {
+ // NB: In an Electron preload script, document will be defined but not fully
+ // initialized. Since we know we're in Chrome, we'll just detect this case
+ // explicitly
+ if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
+ return true;
+ } // Internet Explorer and Edge do not support colors.
-var K = [0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817];
-var W = new Array(160);
+ if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
+ return false;
+ } // Is webkit? http://stackoverflow.com/a/16459606/376773
+ // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
-function Sha512() {
- this.init();
- this._w = W;
- Hash.call(this, 128, 112);
+ return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773
+ typeof window !== 'undefined' && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31?
+ // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
+ typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker
+ typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/);
}
+/**
+ * Colorize log arguments if enabled.
+ *
+ * @api public
+ */
-inherits(Sha512, Hash);
+function formatArgs(args) {
+ args[0] = (this.useColors ? '%c' : '') + this.namespace + (this.useColors ? ' %c' : ' ') + args[0] + (this.useColors ? '%c ' : ' ') + '+' + module.exports.humanize(this.diff);
-Sha512.prototype.init = function () {
- this._ah = 0x6a09e667;
- this._bh = 0xbb67ae85;
- this._ch = 0x3c6ef372;
- this._dh = 0xa54ff53a;
- this._eh = 0x510e527f;
- this._fh = 0x9b05688c;
- this._gh = 0x1f83d9ab;
- this._hh = 0x5be0cd19;
+ if (!this.useColors) {
+ return;
+ }
- this._al = 0xf3bcc908;
- this._bl = 0x84caa73b;
- this._cl = 0xfe94f82b;
- this._dl = 0x5f1d36f1;
- this._el = 0xade682d1;
- this._fl = 0x2b3e6c1f;
- this._gl = 0xfb41bd6b;
- this._hl = 0x137e2179;
+ var c = 'color: ' + this.color;
+ args.splice(1, 0, c, 'color: inherit'); // The final "%c" is somewhat tricky, because there could be other
+ // arguments passed either before or after the %c, so we need to
+ // figure out the correct index to insert the CSS into
- return this;
-};
+ var index = 0;
+ var lastC = 0;
+ args[0].replace(/%[a-zA-Z%]/g, function (match) {
+ if (match === '%%') {
+ return;
+ }
-function Ch(x, y, z) {
- return z ^ x & (y ^ z);
-}
+ index++;
-function maj(x, y, z) {
- return x & y | z & (x | y);
+ if (match === '%c') {
+ // We only are interested in the *last* %c
+ // (the user may have provided their own)
+ lastC = index;
+ }
+ });
+ args.splice(lastC, 0, c);
}
+/**
+ * Invokes `console.log()` when available.
+ * No-op when `console.log` is not a "function".
+ *
+ * @api public
+ */
-function sigma0(x, xl) {
- return (x >>> 28 | xl << 4) ^ (xl >>> 2 | x << 30) ^ (xl >>> 7 | x << 25);
-}
+function log() {
+ var _console;
-function sigma1(x, xl) {
- return (x >>> 14 | xl << 18) ^ (x >>> 18 | xl << 14) ^ (xl >>> 9 | x << 23);
+ // This hackery is required for IE8/9, where
+ // the `console.log` function doesn't have 'apply'
+ return (typeof console === "undefined" ? "undefined" : _typeof(console)) === 'object' && console.log && (_console = console).log.apply(_console, arguments);
}
+/**
+ * Save `namespaces`.
+ *
+ * @param {String} namespaces
+ * @api private
+ */
-function Gamma0(x, xl) {
- return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ x >>> 7;
+function save(namespaces) {
+ try {
+ if (namespaces) {
+ exports.storage.setItem('debug', namespaces);
+ } else {
+ exports.storage.removeItem('debug');
+ }
+ } catch (error) {// Swallow
+ // XXX (@Qix-) should we be logging these?
+ }
}
+/**
+ * Load `namespaces`.
+ *
+ * @return {String} returns the previously persisted debug modes
+ * @api private
+ */
-function Gamma0l(x, xl) {
- return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ (x >>> 7 | xl << 25);
-}
+function load() {
+ var r;
-function Gamma1(x, xl) {
- return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ x >>> 6;
-}
+ try {
+ r = exports.storage.getItem('debug');
+ } catch (error) {} // Swallow
+ // XXX (@Qix-) should we be logging these?
+ // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
-function Gamma1l(x, xl) {
- return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ (x >>> 6 | xl << 26);
-}
-function getCarry(a, b) {
- return a >>> 0 < b >>> 0 ? 1 : 0;
-}
+ if (!r && typeof process !== 'undefined' && 'env' in process) {
+ r = process.env.DEBUG;
+ }
-Sha512.prototype._update = function (M) {
- var W = this._w;
+ return r;
+}
+/**
+ * Localstorage attempts to return the localstorage.
+ *
+ * This is necessary because safari throws
+ * when a user disables cookies/localstorage
+ * and you attempt to access it.
+ *
+ * @return {LocalStorage}
+ * @api private
+ */
- var ah = this._ah | 0;
- var bh = this._bh | 0;
- var ch = this._ch | 0;
- var dh = this._dh | 0;
- var eh = this._eh | 0;
- var fh = this._fh | 0;
- var gh = this._gh | 0;
- var hh = this._hh | 0;
+function localstorage() {
+ try {
+ // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
+ // The Browser also has localStorage in the global context.
+ return localStorage;
+ } catch (error) {// Swallow
+ // XXX (@Qix-) should we be logging these?
+ }
+}
- var al = this._al | 0;
- var bl = this._bl | 0;
- var cl = this._cl | 0;
- var dl = this._dl | 0;
- var el = this._el | 0;
- var fl = this._fl | 0;
- var gl = this._gl | 0;
- var hl = this._hl | 0;
+module.exports = require('./common')(exports);
+var formatters = module.exports.formatters;
+/**
+ * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
+ */
- for (var i = 0; i < 32; i += 2) {
- W[i] = M.readInt32BE(i * 4);
- W[i + 1] = M.readInt32BE(i * 4 + 4);
+formatters.j = function (v) {
+ try {
+ return JSON.stringify(v);
+ } catch (error) {
+ return '[UnexpectedJSONParseError]: ' + error.message;
}
- for (; i < 160; i += 2) {
- var xh = W[i - 15 * 2];
- var xl = W[i - 15 * 2 + 1];
- var gamma0 = Gamma0(xh, xl);
- var gamma0l = Gamma0l(xl, xh);
+};
- xh = W[i - 2 * 2];
- xl = W[i - 2 * 2 + 1];
- var gamma1 = Gamma1(xh, xl);
- var gamma1l = Gamma1l(xl, xh);
+}).call(this,require('_process'))
+},{"./common":747,"_process":704}],747:[function(require,module,exports){
+"use strict";
- // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]
- var Wi7h = W[i - 7 * 2];
- var Wi7l = W[i - 7 * 2 + 1];
+/**
+ * This is the common logic for both the Node.js and web browser
+ * implementations of `debug()`.
+ */
- var Wi16h = W[i - 16 * 2];
- var Wi16l = W[i - 16 * 2 + 1];
-
- var Wil = gamma0l + Wi7l | 0;
- var Wih = gamma0 + Wi7h + getCarry(Wil, gamma0l) | 0;
- Wil = Wil + gamma1l | 0;
- Wih = Wih + gamma1 + getCarry(Wil, gamma1l) | 0;
- Wil = Wil + Wi16l | 0;
- Wih = Wih + Wi16h + getCarry(Wil, Wi16l) | 0;
-
- W[i] = Wih;
- W[i + 1] = Wil;
- }
-
- for (var j = 0; j < 160; j += 2) {
- Wih = W[j];
- Wil = W[j + 1];
-
- var majh = maj(ah, bh, ch);
- var majl = maj(al, bl, cl);
+function setup(env) {
+ createDebug.debug = createDebug;
+ createDebug.default = createDebug;
+ createDebug.coerce = coerce;
+ createDebug.disable = disable;
+ createDebug.enable = enable;
+ createDebug.enabled = enabled;
+ createDebug.humanize = require('ms');
+ Object.keys(env).forEach(function (key) {
+ createDebug[key] = env[key];
+ });
+ /**
+ * Active `debug` instances.
+ */
- var sigma0h = sigma0(ah, al);
- var sigma0l = sigma0(al, ah);
- var sigma1h = sigma1(eh, el);
- var sigma1l = sigma1(el, eh);
+ createDebug.instances = [];
+ /**
+ * The currently active debug mode names, and names to skip.
+ */
- // t1 = h + sigma1 + ch + K[j] + W[j]
- var Kih = K[j];
- var Kil = K[j + 1];
+ createDebug.names = [];
+ createDebug.skips = [];
+ /**
+ * Map of special "%n" handling functions, for the debug "format" argument.
+ *
+ * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
+ */
- var chh = Ch(eh, fh, gh);
- var chl = Ch(el, fl, gl);
+ createDebug.formatters = {};
+ /**
+ * Selects a color for a debug namespace
+ * @param {String} namespace The namespace string for the for the debug instance to be colored
+ * @return {Number|String} An ANSI color code for the given namespace
+ * @api private
+ */
- var t1l = hl + sigma1l | 0;
- var t1h = hh + sigma1h + getCarry(t1l, hl) | 0;
- t1l = t1l + chl | 0;
- t1h = t1h + chh + getCarry(t1l, chl) | 0;
- t1l = t1l + Kil | 0;
- t1h = t1h + Kih + getCarry(t1l, Kil) | 0;
- t1l = t1l + Wil | 0;
- t1h = t1h + Wih + getCarry(t1l, Wil) | 0;
+ function selectColor(namespace) {
+ var hash = 0;
- // t2 = sigma0 + maj
- var t2l = sigma0l + majl | 0;
- var t2h = sigma0h + majh + getCarry(t2l, sigma0l) | 0;
+ for (var i = 0; i < namespace.length; i++) {
+ hash = (hash << 5) - hash + namespace.charCodeAt(i);
+ hash |= 0; // Convert to 32bit integer
+ }
- hh = gh;
- hl = gl;
- gh = fh;
- gl = fl;
- fh = eh;
- fl = el;
- el = dl + t1l | 0;
- eh = dh + t1h + getCarry(el, dl) | 0;
- dh = ch;
- dl = cl;
- ch = bh;
- cl = bl;
- bh = ah;
- bl = al;
- al = t1l + t2l | 0;
- ah = t1h + t2h + getCarry(al, t1l) | 0;
+ return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
}
- this._al = this._al + al | 0;
- this._bl = this._bl + bl | 0;
- this._cl = this._cl + cl | 0;
- this._dl = this._dl + dl | 0;
- this._el = this._el + el | 0;
- this._fl = this._fl + fl | 0;
- this._gl = this._gl + gl | 0;
- this._hl = this._hl + hl | 0;
-
- this._ah = this._ah + ah + getCarry(this._al, al) | 0;
- this._bh = this._bh + bh + getCarry(this._bl, bl) | 0;
- this._ch = this._ch + ch + getCarry(this._cl, cl) | 0;
- this._dh = this._dh + dh + getCarry(this._dl, dl) | 0;
- this._eh = this._eh + eh + getCarry(this._el, el) | 0;
- this._fh = this._fh + fh + getCarry(this._fl, fl) | 0;
- this._gh = this._gh + gh + getCarry(this._gl, gl) | 0;
- this._hh = this._hh + hh + getCarry(this._hl, hl) | 0;
-};
+ createDebug.selectColor = selectColor;
+ /**
+ * Create a debugger with the given `namespace`.
+ *
+ * @param {String} namespace
+ * @return {Function}
+ * @api public
+ */
-Sha512.prototype._hash = function () {
- var H = Buffer.allocUnsafe(64);
+ function createDebug(namespace) {
+ var prevTime;
- function writeInt64BE(h, l, offset) {
- H.writeInt32BE(h, offset);
- H.writeInt32BE(l, offset + 4);
- }
+ function debug() {
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
- writeInt64BE(this._ah, this._al, 0);
- writeInt64BE(this._bh, this._bl, 8);
- writeInt64BE(this._ch, this._cl, 16);
- writeInt64BE(this._dh, this._dl, 24);
- writeInt64BE(this._eh, this._el, 32);
- writeInt64BE(this._fh, this._fl, 40);
- writeInt64BE(this._gh, this._gl, 48);
- writeInt64BE(this._hh, this._hl, 56);
+ // Disabled?
+ if (!debug.enabled) {
+ return;
+ }
- return H;
-};
+ var self = debug; // Set `diff` timestamp
-module.exports = Sha512;
+ var curr = Number(new Date());
+ var ms = curr - (prevTime || curr);
+ self.diff = ms;
+ self.prev = prevTime;
+ self.curr = curr;
+ prevTime = curr;
+ args[0] = createDebug.coerce(args[0]);
-},{"./hash":738,"inherits":671,"safe-buffer":729}],746:[function(require,module,exports){
-"use strict";
+ if (typeof args[0] !== 'string') {
+ // Anything else let's inspect with %O
+ args.unshift('%O');
+ } // Apply any `formatters` transformations
-var distance = require("leven");
-module.exports = function (a, b) {
- if (!a || !b || !a.length || !b.length) return 0;
- if (a === b) return 1;
- var d = distance(a.toLowerCase(), b.toLowerCase());
- var longest = Math.max(a.length, b.length);
- return (longest - d) / longest;
-};
+ var index = 0;
+ args[0] = args[0].replace(/%([a-zA-Z%])/g, function (match, format) {
+ // If we encounter an escaped % then don't increase the array index
+ if (match === '%%') {
+ return match;
+ }
-},{"leven":682}],747:[function(require,module,exports){
-(function (Buffer){
-'use strict';
+ index++;
+ var formatter = createDebug.formatters[format];
-var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+ if (typeof formatter === 'function') {
+ var val = args[index];
+ match = formatter.call(self, val); // Now we need to remove `args[index]` since it's inlined in the `format`
-module.exports = Peer;
+ args.splice(index, 1);
+ index--;
+ }
-var debug = require('debug')('simple-peer');
-var getBrowserRTC = require('get-browser-rtc');
-var inherits = require('inherits');
-var randombytes = require('randombytes');
-var stream = require('readable-stream');
+ return match;
+ }); // Apply env-specific formatting (colors, etc.)
-var MAX_BUFFERED_AMOUNT = 64 * 1024;
+ createDebug.formatArgs.call(self, args);
+ var logFn = self.log || createDebug.log;
+ logFn.apply(self, args);
+ }
-inherits(Peer, stream.Duplex);
+ debug.namespace = namespace;
+ debug.enabled = createDebug.enabled(namespace);
+ debug.useColors = createDebug.useColors();
+ debug.color = selectColor(namespace);
+ debug.destroy = destroy;
+ debug.extend = extend; // Debug.formatArgs = formatArgs;
+ // debug.rawLog = rawLog;
+ // env-specific initialization logic for debug instances
-/**
- * WebRTC peer connection. Same API as node core `net.Socket`, plus a few extra methods.
- * Duplex stream.
- * @param {Object} opts
- */
-function Peer(opts) {
- var self = this;
- if (!(self instanceof Peer)) return new Peer(opts);
+ if (typeof createDebug.init === 'function') {
+ createDebug.init(debug);
+ }
- self._id = randombytes(4).toString('hex').slice(0, 7);
- self._debug('new peer %o', opts);
+ createDebug.instances.push(debug);
+ return debug;
+ }
- opts = Object.assign({
- allowHalfOpen: false
- }, opts);
+ function destroy() {
+ var index = createDebug.instances.indexOf(this);
- stream.Duplex.call(self, opts);
+ if (index !== -1) {
+ createDebug.instances.splice(index, 1);
+ return true;
+ }
- self.channelName = opts.initiator ? opts.channelName || randombytes(20).toString('hex') : null;
+ return false;
+ }
- // Needed by _transformConstraints, so set this early
- self._isChromium = typeof window !== 'undefined' && !!window.webkitRTCPeerConnection;
+ function extend(namespace, delimiter) {
+ return createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
+ }
+ /**
+ * Enables a debug mode by namespaces. This can include modes
+ * separated by a colon and wildcards.
+ *
+ * @param {String} namespaces
+ * @api public
+ */
- self.initiator = opts.initiator || false;
- self.channelConfig = opts.channelConfig || Peer.channelConfig;
- self.config = opts.config || Peer.config;
- self.constraints = self._transformConstraints(opts.constraints || Peer.constraints);
- self.offerConstraints = self._transformConstraints(opts.offerConstraints || {});
- self.answerConstraints = self._transformConstraints(opts.answerConstraints || {});
- self.sdpTransform = opts.sdpTransform || function (sdp) {
- return sdp;
- };
- self.streams = opts.streams || (opts.stream ? [opts.stream] : []); // support old "stream" option
- self.trickle = opts.trickle !== undefined ? opts.trickle : true;
+ function enable(namespaces) {
+ createDebug.save(namespaces);
+ createDebug.names = [];
+ createDebug.skips = [];
+ var i;
+ var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
+ var len = split.length;
- self.destroyed = false;
- self.connected = false;
+ for (i = 0; i < len; i++) {
+ if (!split[i]) {
+ // ignore empty strings
+ continue;
+ }
- self.remoteAddress = undefined;
- self.remoteFamily = undefined;
- self.remotePort = undefined;
- self.localAddress = undefined;
- self.localPort = undefined;
+ namespaces = split[i].replace(/\*/g, '.*?');
- self._wrtc = opts.wrtc && _typeof(opts.wrtc) === 'object' ? opts.wrtc : getBrowserRTC();
+ if (namespaces[0] === '-') {
+ createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
+ } else {
+ createDebug.names.push(new RegExp('^' + namespaces + '$'));
+ }
+ }
- if (!self._wrtc) {
- if (typeof window === 'undefined') {
- throw makeError('No WebRTC support: Specify `opts.wrtc` option in this environment', 'ERR_WEBRTC_SUPPORT');
- } else {
- throw makeError('No WebRTC support: Not a supported browser', 'ERR_WEBRTC_SUPPORT');
+ for (i = 0; i < createDebug.instances.length; i++) {
+ var instance = createDebug.instances[i];
+ instance.enabled = createDebug.enabled(instance.namespace);
}
}
+ /**
+ * Disable debug output.
+ *
+ * @api public
+ */
- self._pcReady = false;
- self._channelReady = false;
- self._iceComplete = false; // ice candidate trickle done (got null candidate)
- self._channel = null;
- self._pendingCandidates = [];
-
- self._isNegotiating = false; // is this peer waiting for negotiation to complete?
- self._batchedNegotiation = false; // batch synchronous negotiations
- self._queuedNegotiation = false; // is there a queued negotiation request?
- self._sendersAwaitingStable = [];
- self._senderMap = new WeakMap();
-
- self._remoteTracks = [];
- self._remoteStreams = [];
-
- self._chunk = null;
- self._cb = null;
- self._interval = null;
+ function disable() {
+ createDebug.enable('');
+ }
+ /**
+ * Returns true if the given mode name is enabled, false otherwise.
+ *
+ * @param {String} name
+ * @return {Boolean}
+ * @api public
+ */
- self._pc = new self._wrtc.RTCPeerConnection(self.config, self.constraints);
+ function enabled(name) {
+ if (name[name.length - 1] === '*') {
+ return true;
+ }
- // We prefer feature detection whenever possible, but sometimes that's not
- // possible for certain implementations.
- self._isReactNativeWebrtc = typeof self._pc._peerConnectionId === 'number';
+ var i;
+ var len;
- self._pc.oniceconnectionstatechange = function () {
- self._onIceStateChange();
- };
- self._pc.onicegatheringstatechange = function () {
- self._onIceStateChange();
- };
- self._pc.onsignalingstatechange = function () {
- self._onSignalingStateChange();
- };
- self._pc.onicecandidate = function (event) {
- self._onIceCandidate(event);
- };
+ for (i = 0, len = createDebug.skips.length; i < len; i++) {
+ if (createDebug.skips[i].test(name)) {
+ return false;
+ }
+ }
- // Other spec events, unused by this implementation:
- // - onconnectionstatechange
- // - onicecandidateerror
- // - onfingerprintfailure
- // - onnegotiationneeded
+ for (i = 0, len = createDebug.names.length; i < len; i++) {
+ if (createDebug.names[i].test(name)) {
+ return true;
+ }
+ }
- if (self.initiator) {
- self._setupData({
- channel: self._pc.createDataChannel(self.channelName, self.channelConfig)
- });
- } else {
- self._pc.ondatachannel = function (event) {
- self._setupData(event);
- };
+ return false;
}
+ /**
+ * Coerce `val`.
+ *
+ * @param {Mixed} val
+ * @return {Mixed}
+ * @api private
+ */
- if ('addTrack' in self._pc) {
- if (self.streams) {
- self.streams.forEach(function (stream) {
- self.addStream(stream);
- });
+ function coerce(val) {
+ if (val instanceof Error) {
+ return val.stack || val.message;
}
- self._pc.ontrack = function (event) {
- self._onTrack(event);
- };
- }
- if (self.initiator) {
- self._needsNegotiation();
+ return val;
}
- self._onFinishBound = function () {
- self._onFinish();
- };
- self.once('finish', self._onFinishBound);
+ createDebug.enable(createDebug.load());
+ return createDebug;
}
-Peer.WEBRTC_SUPPORT = !!getBrowserRTC();
-
-/**
- * Expose config, constraints, and data channel config for overriding all Peer
- * instances. Otherwise, just set opts.config, opts.constraints, or opts.channelConfig
- * when constructing a Peer.
- */
-Peer.config = {
- iceServers: [{
- urls: 'stun:stun.l.google.com:19302'
- }, {
- urls: 'stun:global.stun.twilio.com:3478?transport=udp'
- }]
-};
-Peer.constraints = {};
-Peer.channelConfig = {};
-
-Object.defineProperty(Peer.prototype, 'bufferSize', {
- get: function get() {
- var self = this;
- return self._channel && self._channel.bufferedAmount || 0;
- }
-});
+module.exports = setup;
-Peer.prototype.address = function () {
- var self = this;
- return { port: self.localPort, family: 'IPv4', address: self.localAddress };
-};
+},{"ms":748}],748:[function(require,module,exports){
+'use strict';
-Peer.prototype.signal = function (data) {
- var self = this;
- if (self.destroyed) throw makeError('cannot signal after peer is destroyed', 'ERR_SIGNALING');
- if (typeof data === 'string') {
- try {
- data = JSON.parse(data);
- } catch (err) {
- data = {};
- }
- }
- self._debug('signal()');
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
- if (data.renegotiate) {
- self._debug('got request to renegotiate');
- self._needsNegotiation();
- }
- if (data.candidate) {
- if (self._pc.remoteDescription && self._pc.remoteDescription.type) self._addIceCandidate(data.candidate);else self._pendingCandidates.push(data.candidate);
- }
- if (data.sdp) {
- self._pc.setRemoteDescription(new self._wrtc.RTCSessionDescription(data), function () {
- if (self.destroyed) return;
+/**
+ * Helpers.
+ */
- self._pendingCandidates.forEach(function (candidate) {
- self._addIceCandidate(candidate);
- });
- self._pendingCandidates = [];
+var s = 1000;
+var m = s * 60;
+var h = m * 60;
+var d = h * 24;
+var w = d * 7;
+var y = d * 365.25;
- if (self._pc.remoteDescription.type === 'offer') self._createAnswer();
- }, function (err) {
- self.destroy(makeError(err, 'ERR_SET_REMOTE_DESCRIPTION'));
- });
- }
- if (!data.sdp && !data.candidate && !data.renegotiate) {
- self.destroy(makeError('signal() called with invalid signal data', 'ERR_SIGNALING'));
- }
-};
+/**
+ * Parse or format the given `val`.
+ *
+ * Options:
+ *
+ * - `long` verbose formatting [false]
+ *
+ * @param {String|Number} val
+ * @param {Object} [options]
+ * @throws {Error} throw an error if val is not a non-empty string or a number
+ * @return {String|Number}
+ * @api public
+ */
-Peer.prototype._addIceCandidate = function (candidate) {
- var self = this;
- try {
- self._pc.addIceCandidate(new self._wrtc.RTCIceCandidate(candidate), noop, function (err) {
- self.destroy(makeError(err, 'ERR_ADD_ICE_CANDIDATE'));
- });
- } catch (err) {
- self.destroy(makeError('error adding candidate: ' + err.message, 'ERR_ADD_ICE_CANDIDATE'));
+module.exports = function (val, options) {
+ options = options || {};
+ var type = typeof val === 'undefined' ? 'undefined' : _typeof(val);
+ if (type === 'string' && val.length > 0) {
+ return parse(val);
+ } else if (type === 'number' && isNaN(val) === false) {
+ return options.long ? fmtLong(val) : fmtShort(val);
}
+ throw new Error('val is not a non-empty string or a valid number. val=' + JSON.stringify(val));
};
/**
- * Send text/binary data to the remote peer.
- * @param {ArrayBufferView|ArrayBuffer|Buffer|string|Blob} chunk
+ * Parse the given `str` and return milliseconds.
+ *
+ * @param {String} str
+ * @return {Number}
+ * @api private
*/
-Peer.prototype.send = function (chunk) {
- var self = this;
- self._channel.send(chunk);
-};
+
+function parse(str) {
+ str = String(str);
+ if (str.length > 100) {
+ return;
+ }
+ var match = /^((?:\d+)?\-?\d?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str);
+ if (!match) {
+ return;
+ }
+ var n = parseFloat(match[1]);
+ var type = (match[2] || 'ms').toLowerCase();
+ switch (type) {
+ case 'years':
+ case 'year':
+ case 'yrs':
+ case 'yr':
+ case 'y':
+ return n * y;
+ case 'weeks':
+ case 'week':
+ case 'w':
+ return n * w;
+ case 'days':
+ case 'day':
+ case 'd':
+ return n * d;
+ case 'hours':
+ case 'hour':
+ case 'hrs':
+ case 'hr':
+ case 'h':
+ return n * h;
+ case 'minutes':
+ case 'minute':
+ case 'mins':
+ case 'min':
+ case 'm':
+ return n * m;
+ case 'seconds':
+ case 'second':
+ case 'secs':
+ case 'sec':
+ case 's':
+ return n * s;
+ case 'milliseconds':
+ case 'millisecond':
+ case 'msecs':
+ case 'msec':
+ case 'ms':
+ return n;
+ default:
+ return undefined;
+ }
+}
/**
- * Add a MediaStream to the connection.
- * @param {MediaStream} stream
+ * Short format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
*/
-Peer.prototype.addStream = function (stream) {
- var self = this;
-
- self._debug('addStream()');
- stream.getTracks().forEach(function (track) {
- self.addTrack(track, stream);
- });
-};
+function fmtShort(ms) {
+ var msAbs = Math.abs(ms);
+ if (msAbs >= d) {
+ return Math.round(ms / d) + 'd';
+ }
+ if (msAbs >= h) {
+ return Math.round(ms / h) + 'h';
+ }
+ if (msAbs >= m) {
+ return Math.round(ms / m) + 'm';
+ }
+ if (msAbs >= s) {
+ return Math.round(ms / s) + 's';
+ }
+ return ms + 'ms';
+}
/**
- * Add a MediaStreamTrack to the connection.
- * @param {MediaStreamTrack} track
- * @param {MediaStream} stream
+ * Long format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
*/
-Peer.prototype.addTrack = function (track, stream) {
- var self = this;
-
- self._debug('addTrack()');
- var sender = self._pc.addTrack(track, stream);
- var submap = self._senderMap.get(track) || new WeakMap(); // nested WeakMaps map [track, stream] to sender
- submap.set(stream, sender);
- self._senderMap.set(track, submap);
- self._needsNegotiation();
-};
+function fmtLong(ms) {
+ var msAbs = Math.abs(ms);
+ if (msAbs >= d) {
+ return plural(ms, msAbs, d, 'day');
+ }
+ if (msAbs >= h) {
+ return plural(ms, msAbs, h, 'hour');
+ }
+ if (msAbs >= m) {
+ return plural(ms, msAbs, m, 'minute');
+ }
+ if (msAbs >= s) {
+ return plural(ms, msAbs, s, 'second');
+ }
+ return ms + ' ms';
+}
/**
- * Remove a MediaStreamTrack from the connection.
- * @param {MediaStreamTrack} track
- * @param {MediaStream} stream
+ * Pluralization helper.
*/
-Peer.prototype.removeTrack = function (track, stream) {
- var self = this;
- self._debug('removeSender()');
+function plural(ms, msAbs, n, name) {
+ var isPlural = msAbs >= n * 1.5;
+ return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
+}
- var submap = self._senderMap.get(track);
- var sender = submap ? submap.get(stream) : null;
- if (!sender) {
- self.destroy(new Error('Cannot remove track that was never added.'));
- }
- try {
- self._pc.removeTrack(sender);
- } catch (err) {
- if (err.name === 'NS_ERROR_UNEXPECTED') {
- self._sendersAwaitingStable.push(sender); // HACK: Firefox must wait until (signalingState === stable) https://bugzilla.mozilla.org/show_bug.cgi?id=1133874
- } else {
- self.destroy(err);
- }
- }
-};
+},{}],749:[function(require,module,exports){
+'use strict';
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
/**
- * Remove a MediaStream from the connection.
- * @param {MediaStream} stream
+ * Module dependencies.
*/
-Peer.prototype.removeStream = function (stream) {
- var self = this;
- self._debug('removeSenders()');
+var url = require('./url');
+var parser = require('socket.io-parser');
+var Manager = require('./manager');
+var debug = require('debug')('socket.io-client');
- stream.getTracks().forEach(function (track) {
- self.removeTrack(track, stream);
- });
-};
+/**
+ * Module exports.
+ */
-Peer.prototype._needsNegotiation = function () {
- var self = this;
+module.exports = exports = lookup;
- self._debug('_needsNegotiation');
- if (self._batchedNegotiation) return; // batch synchronous renegotiations
- self._batchedNegotiation = true;
- setTimeout(function () {
- self._batchedNegotiation = false;
- self._debug('starting batched negotiation');
- self.negotiate();
- }, 0);
-};
+/**
+ * Managers cache.
+ */
-Peer.prototype.negotiate = function () {
- var self = this;
+var cache = exports.managers = {};
- if (self.initiator) {
- if (self._isNegotiating) {
- self._queuedNegotiation = true;
- self._debug('already negotiating, queueing');
- } else {
- self._debug('start negotiation');
- self._createOffer();
- }
- } else {
- self._debug('requesting negotiation from initiator');
- self.emit('signal', { // request initiator to renegotiate
- renegotiate: true
- });
+/**
+ * Looks up an existing `Manager` for multiplexing.
+ * If the user summons:
+ *
+ * `io('http://localhost/a');`
+ * `io('http://localhost/b');`
+ *
+ * We reuse the existing instance based on same scheme/port/host,
+ * and we initialize sockets for each namespace.
+ *
+ * @api public
+ */
+
+function lookup(uri, opts) {
+ if ((typeof uri === 'undefined' ? 'undefined' : _typeof(uri)) === 'object') {
+ opts = uri;
+ uri = undefined;
}
- self._isNegotiating = true;
-};
-// TODO: Delete this method once readable-stream is updated to contain a default
-// implementation of destroy() that automatically calls _destroy()
-// See: https://github.com/nodejs/readable-stream/issues/283
-Peer.prototype.destroy = function (err) {
- var self = this;
- self._destroy(err, function () {});
-};
+ opts = opts || {};
-Peer.prototype._destroy = function (err, cb) {
- var self = this;
- if (self.destroyed) return;
+ var parsed = url(uri);
+ var source = parsed.source;
+ var id = parsed.id;
+ var path = parsed.path;
+ var sameNamespace = cache[id] && path in cache[id].nsps;
+ var newConnection = opts.forceNew || opts['force new connection'] || false === opts.multiplex || sameNamespace;
- self._debug('destroy (error: %s)', err && (err.message || err));
+ var io;
- self.readable = self.writable = false;
+ if (newConnection) {
+ debug('ignoring socket cache for %s', source);
+ io = Manager(source, opts);
+ } else {
+ if (!cache[id]) {
+ debug('new io instance for %s', source);
+ cache[id] = Manager(source, opts);
+ }
+ io = cache[id];
+ }
+ if (parsed.query && !opts.query) {
+ opts.query = parsed.query;
+ }
+ return io.socket(parsed.path, opts);
+}
- if (!self._readableState.ended) self.push(null);
- if (!self._writableState.finished) self.end();
+/**
+ * Protocol version.
+ *
+ * @api public
+ */
- self.destroyed = true;
- self.connected = false;
- self._pcReady = false;
- self._channelReady = false;
- self._remoteTracks = null;
- self._remoteStreams = null;
- self._senderMap = null;
+exports.protocol = parser.protocol;
- clearInterval(self._interval);
- self._interval = null;
- self._chunk = null;
- self._cb = null;
+/**
+ * `connect`.
+ *
+ * @param {String} uri
+ * @api public
+ */
- if (self._onFinishBound) self.removeListener('finish', self._onFinishBound);
- self._onFinishBound = null;
+exports.connect = lookup;
- if (self._channel) {
- try {
- self._channel.close();
- } catch (err) {}
+/**
+ * Expose constructors for standalone build.
+ *
+ * @api public
+ */
- self._channel.onmessage = null;
- self._channel.onopen = null;
- self._channel.onclose = null;
- self._channel.onerror = null;
- }
- if (self._pc) {
- try {
- self._pc.close();
- } catch (err) {}
+exports.Manager = require('./manager');
+exports.Socket = require('./socket');
- self._pc.oniceconnectionstatechange = null;
- self._pc.onicegatheringstatechange = null;
- self._pc.onsignalingstatechange = null;
- self._pc.onicecandidate = null;
- if ('addTrack' in self._pc) {
- self._pc.ontrack = null;
- }
- self._pc.ondatachannel = null;
- }
- self._pc = null;
- self._channel = null;
+},{"./manager":750,"./socket":752,"./url":753,"debug":754,"socket.io-parser":757}],750:[function(require,module,exports){
+'use strict';
- if (err) self.emit('error', err);
- self.emit('close');
- cb();
-};
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
-Peer.prototype._setupData = function (event) {
- var self = this;
- if (!event.channel) {
- // In some situations `pc.createDataChannel()` returns `undefined` (in wrtc),
- // which is invalid behavior. Handle it gracefully.
- // See: https://github.com/feross/simple-peer/issues/163
- return self.destroy(makeError('Data channel event is missing `channel` property', 'ERR_DATA_CHANNEL'));
- }
+/**
+ * Module dependencies.
+ */
- self._channel = event.channel;
- self._channel.binaryType = 'arraybuffer';
+var eio = require('engine.io-client');
+var Socket = require('./socket');
+var Emitter = require('component-emitter');
+var parser = require('socket.io-parser');
+var on = require('./on');
+var bind = require('component-bind');
+var debug = require('debug')('socket.io-client:manager');
+var indexOf = require('indexof');
+var Backoff = require('backo2');
- if (typeof self._channel.bufferedAmountLowThreshold === 'number') {
- self._channel.bufferedAmountLowThreshold = MAX_BUFFERED_AMOUNT;
- }
+/**
+ * IE6+ hasOwnProperty
+ */
- self.channelName = self._channel.label;
+var has = Object.prototype.hasOwnProperty;
- self._channel.onmessage = function (event) {
- self._onChannelMessage(event);
- };
- self._channel.onbufferedamountlow = function () {
- self._onChannelBufferedAmountLow();
- };
- self._channel.onopen = function () {
- self._onChannelOpen();
- };
- self._channel.onclose = function () {
- self._onChannelClose();
- };
- self._channel.onerror = function (err) {
- self.destroy(makeError(err, 'ERR_DATA_CHANNEL'));
- };
-};
+/**
+ * Module exports
+ */
-Peer.prototype._read = function () {};
+module.exports = Manager;
-Peer.prototype._write = function (chunk, encoding, cb) {
- var self = this;
- if (self.destroyed) return cb(makeError('cannot write after peer is destroyed', 'ERR_DATA_CHANNEL'));
+/**
+ * `Manager` constructor.
+ *
+ * @param {String} engine instance or engine uri/opts
+ * @param {Object} options
+ * @api public
+ */
- if (self.connected) {
- try {
- self.send(chunk);
- } catch (err) {
- return self.destroy(makeError(err, 'ERR_DATA_CHANNEL'));
- }
- if (self._channel.bufferedAmount > MAX_BUFFERED_AMOUNT) {
- self._debug('start backpressure: bufferedAmount %d', self._channel.bufferedAmount);
- self._cb = cb;
- } else {
- cb(null);
- }
- } else {
- self._debug('write before connect');
- self._chunk = chunk;
- self._cb = cb;
+function Manager(uri, opts) {
+ if (!(this instanceof Manager)) return new Manager(uri, opts);
+ if (uri && 'object' === (typeof uri === 'undefined' ? 'undefined' : _typeof(uri))) {
+ opts = uri;
+ uri = undefined;
}
-};
+ opts = opts || {};
-// When stream finishes writing, close socket. Half open connections are not
-// supported.
-Peer.prototype._onFinish = function () {
- var self = this;
- if (self.destroyed) return;
+ opts.path = opts.path || '/socket.io';
+ this.nsps = {};
+ this.subs = [];
+ this.opts = opts;
+ this.reconnection(opts.reconnection !== false);
+ this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);
+ this.reconnectionDelay(opts.reconnectionDelay || 1000);
+ this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);
+ this.randomizationFactor(opts.randomizationFactor || 0.5);
+ this.backoff = new Backoff({
+ min: this.reconnectionDelay(),
+ max: this.reconnectionDelayMax(),
+ jitter: this.randomizationFactor()
+ });
+ this.timeout(null == opts.timeout ? 20000 : opts.timeout);
+ this.readyState = 'closed';
+ this.uri = uri;
+ this.connecting = [];
+ this.lastPing = null;
+ this.encoding = false;
+ this.packetBuffer = [];
+ var _parser = opts.parser || parser;
+ this.encoder = new _parser.Encoder();
+ this.decoder = new _parser.Decoder();
+ this.autoConnect = opts.autoConnect !== false;
+ if (this.autoConnect) this.open();
+}
- if (self.connected) {
- destroySoon();
- } else {
- self.once('connect', destroySoon);
- }
+/**
+ * Propagate given event to sockets and emit on `this`
+ *
+ * @api private
+ */
- // Wait a bit before destroying so the socket flushes.
- // TODO: is there a more reliable way to accomplish this?
- function destroySoon() {
- setTimeout(function () {
- self.destroy();
- }, 1000);
+Manager.prototype.emitAll = function () {
+ this.emit.apply(this, arguments);
+ for (var nsp in this.nsps) {
+ if (has.call(this.nsps, nsp)) {
+ this.nsps[nsp].emit.apply(this.nsps[nsp], arguments);
+ }
}
};
-Peer.prototype._createOffer = function () {
- var self = this;
- if (self.destroyed) return;
-
- self._pc.createOffer(function (offer) {
- if (self.destroyed) return;
- offer.sdp = self.sdpTransform(offer.sdp);
- self._pc.setLocalDescription(offer, onSuccess, onError);
+/**
+ * Update `socket.id` of all sockets
+ *
+ * @api private
+ */
- function onSuccess() {
- self._debug('createOffer success');
- if (self.destroyed) return;
- if (self.trickle || self._iceComplete) sendOffer();else self.once('_iceComplete', sendOffer); // wait for candidates
+Manager.prototype.updateSocketIds = function () {
+ for (var nsp in this.nsps) {
+ if (has.call(this.nsps, nsp)) {
+ this.nsps[nsp].id = this.generateId(nsp);
}
+ }
+};
- function onError(err) {
- self.destroy(makeError(err, 'ERR_SET_LOCAL_DESCRIPTION'));
- }
+/**
+ * generate `socket.id` for the given `nsp`
+ *
+ * @param {String} nsp
+ * @return {String}
+ * @api private
+ */
- function sendOffer() {
- var signal = self._pc.localDescription || offer;
- self._debug('signal');
- self.emit('signal', {
- type: signal.type,
- sdp: signal.sdp
- });
- }
- }, function (err) {
- self.destroy(makeError(err, 'ERR_CREATE_OFFER'));
- }, self.offerConstraints);
+Manager.prototype.generateId = function (nsp) {
+ return (nsp === '/' ? '' : nsp + '#') + this.engine.id;
};
-Peer.prototype._createAnswer = function () {
- var self = this;
- if (self.destroyed) return;
+/**
+ * Mix in `Emitter`.
+ */
- self._pc.createAnswer(function (answer) {
- if (self.destroyed) return;
- answer.sdp = self.sdpTransform(answer.sdp);
- self._pc.setLocalDescription(answer, onSuccess, onError);
+Emitter(Manager.prototype);
- function onSuccess() {
- if (self.destroyed) return;
- if (self.trickle || self._iceComplete) sendAnswer();else self.once('_iceComplete', sendAnswer);
- }
+/**
+ * Sets the `reconnection` config.
+ *
+ * @param {Boolean} true/false if it should automatically reconnect
+ * @return {Manager} self or value
+ * @api public
+ */
- function onError(err) {
- self.destroy(makeError(err, 'ERR_SET_LOCAL_DESCRIPTION'));
- }
+Manager.prototype.reconnection = function (v) {
+ if (!arguments.length) return this._reconnection;
+ this._reconnection = !!v;
+ return this;
+};
- function sendAnswer() {
- var signal = self._pc.localDescription || answer;
- self._debug('signal');
- self.emit('signal', {
- type: signal.type,
- sdp: signal.sdp
- });
- }
- }, function (err) {
- self.destroy(makeError(err, 'ERR_CREATE_ANSWER'));
- }, self.answerConstraints);
+/**
+ * Sets the reconnection attempts config.
+ *
+ * @param {Number} max reconnection attempts before giving up
+ * @return {Manager} self or value
+ * @api public
+ */
+
+Manager.prototype.reconnectionAttempts = function (v) {
+ if (!arguments.length) return this._reconnectionAttempts;
+ this._reconnectionAttempts = v;
+ return this;
};
-Peer.prototype._onIceStateChange = function () {
- var self = this;
- if (self.destroyed) return;
- var iceConnectionState = self._pc.iceConnectionState;
- var iceGatheringState = self._pc.iceGatheringState;
+/**
+ * Sets the delay between reconnections.
+ *
+ * @param {Number} delay
+ * @return {Manager} self or value
+ * @api public
+ */
- self._debug('iceStateChange (connection: %s) (gathering: %s)', iceConnectionState, iceGatheringState);
- self.emit('iceStateChange', iceConnectionState, iceGatheringState);
+Manager.prototype.reconnectionDelay = function (v) {
+ if (!arguments.length) return this._reconnectionDelay;
+ this._reconnectionDelay = v;
+ this.backoff && this.backoff.setMin(v);
+ return this;
+};
- if (iceConnectionState === 'connected' || iceConnectionState === 'completed') {
- self._pcReady = true;
- self._maybeReady();
- }
- if (iceConnectionState === 'failed') {
- self.destroy(makeError('Ice connection failed.', 'ERR_ICE_CONNECTION_FAILURE'));
- }
- if (iceConnectionState === 'closed') {
- self.destroy(new Error('Ice connection closed.'));
- }
+Manager.prototype.randomizationFactor = function (v) {
+ if (!arguments.length) return this._randomizationFactor;
+ this._randomizationFactor = v;
+ this.backoff && this.backoff.setJitter(v);
+ return this;
};
-Peer.prototype.getStats = function (cb) {
- var self = this;
+/**
+ * Sets the maximum delay between reconnections.
+ *
+ * @param {Number} delay
+ * @return {Manager} self or value
+ * @api public
+ */
- // Promise-based getStats() (standard)
- if (self._pc.getStats.length === 0) {
- self._pc.getStats().then(function (res) {
- var reports = [];
- res.forEach(function (report) {
- reports.push(report);
- });
- cb(null, reports);
- }, function (err) {
- cb(err);
- });
+Manager.prototype.reconnectionDelayMax = function (v) {
+ if (!arguments.length) return this._reconnectionDelayMax;
+ this._reconnectionDelayMax = v;
+ this.backoff && this.backoff.setMax(v);
+ return this;
+};
- // Two-parameter callback-based getStats() (deprecated, former standard)
- } else if (self._isReactNativeWebrtc) {
- self._pc.getStats(null, function (res) {
- var reports = [];
- res.forEach(function (report) {
- reports.push(report);
- });
- cb(null, reports);
- }, function (err) {
- cb(err);
- });
+/**
+ * Sets the connection timeout. `false` to disable
+ *
+ * @return {Manager} self or value
+ * @api public
+ */
- // Single-parameter callback-based getStats() (non-standard)
- } else if (self._pc.getStats.length > 0) {
- self._pc.getStats(function (res) {
- // If we destroy connection in `connect` callback this code might happen to run when actual connection is already closed
- if (self.destroyed) return;
+Manager.prototype.timeout = function (v) {
+ if (!arguments.length) return this._timeout;
+ this._timeout = v;
+ return this;
+};
- var reports = [];
- res.result().forEach(function (result) {
- var report = {};
- result.names().forEach(function (name) {
- report[name] = result.stat(name);
- });
- report.id = result.id;
- report.type = result.type;
- report.timestamp = result.timestamp;
- reports.push(report);
- });
- cb(null, reports);
- }, function (err) {
- cb(err);
- });
+/**
+ * Starts trying to reconnect if reconnection is enabled and we have not
+ * started reconnecting yet
+ *
+ * @api private
+ */
- // Unknown browser, skip getStats() since it's anyone's guess which style of
- // getStats() they implement.
- } else {
- cb(null, []);
+Manager.prototype.maybeReconnectOnOpen = function () {
+ // Only try to reconnect if it's the first time we're connecting
+ if (!this.reconnecting && this._reconnection && this.backoff.attempts === 0) {
+ // keeps reconnection from firing twice for the same reconnection loop
+ this.reconnect();
}
};
-Peer.prototype._maybeReady = function () {
- var self = this;
- self._debug('maybeReady pc %s channel %s', self._pcReady, self._channelReady);
- if (self.connected || self._connecting || !self._pcReady || !self._channelReady) return;
+/**
+ * Sets the current transport `socket`.
+ *
+ * @param {Function} optional, callback
+ * @return {Manager} self
+ * @api public
+ */
- self._connecting = true;
+Manager.prototype.open = Manager.prototype.connect = function (fn, opts) {
+ debug('readyState %s', this.readyState);
+ if (~this.readyState.indexOf('open')) return this;
- // HACK: We can't rely on order here, for details see https://github.com/js-platform/node-webrtc/issues/339
- function findCandidatePair() {
- if (self.destroyed) return;
+ debug('opening %s', this.uri);
+ this.engine = eio(this.uri, this.opts);
+ var socket = this.engine;
+ var self = this;
+ this.readyState = 'opening';
+ this.skipReconnect = false;
- self.getStats(function (err, items) {
- if (self.destroyed) return;
+ // emit `open`
+ var openSub = on(socket, 'open', function () {
+ self.onopen();
+ fn && fn();
+ });
- // Treat getStats error as non-fatal. It's not essential.
- if (err) items = [];
+ // emit `connect_error`
+ var errorSub = on(socket, 'error', function (data) {
+ debug('connect_error');
+ self.cleanup();
+ self.readyState = 'closed';
+ self.emitAll('connect_error', data);
+ if (fn) {
+ var err = new Error('Connection error');
+ err.data = data;
+ fn(err);
+ } else {
+ // Only do this if there is no fn to handle the error
+ self.maybeReconnectOnOpen();
+ }
+ });
- var remoteCandidates = {};
- var localCandidates = {};
- var candidatePairs = {};
- var foundSelectedCandidatePair = false;
+ // emit `connect_timeout`
+ if (false !== this._timeout) {
+ var timeout = this._timeout;
+ debug('connect attempt will timeout after %d', timeout);
- items.forEach(function (item) {
- // TODO: Once all browsers support the hyphenated stats report types, remove
- // the non-hypenated ones
- if (item.type === 'remotecandidate' || item.type === 'remote-candidate') {
- remoteCandidates[item.id] = item;
- }
- if (item.type === 'localcandidate' || item.type === 'local-candidate') {
- localCandidates[item.id] = item;
- }
- if (item.type === 'candidatepair' || item.type === 'candidate-pair') {
- candidatePairs[item.id] = item;
- }
- });
+ // set timer
+ var timer = setTimeout(function () {
+ debug('connect attempt timed out after %d', timeout);
+ openSub.destroy();
+ socket.close();
+ socket.emit('error', 'timeout');
+ self.emitAll('connect_timeout', timeout);
+ }, timeout);
- items.forEach(function (item) {
- // Spec-compliant
- if (item.type === 'transport' && item.selectedCandidatePairId) {
- setSelectedCandidatePair(candidatePairs[item.selectedCandidatePairId]);
- }
+ this.subs.push({
+ destroy: function destroy() {
+ clearTimeout(timer);
+ }
+ });
+ }
- // Old implementations
- if (item.type === 'googCandidatePair' && item.googActiveConnection === 'true' || (item.type === 'candidatepair' || item.type === 'candidate-pair') && item.selected) {
- setSelectedCandidatePair(item);
- }
- });
+ this.subs.push(openSub);
+ this.subs.push(errorSub);
- function setSelectedCandidatePair(selectedCandidatePair) {
- foundSelectedCandidatePair = true;
+ return this;
+};
- var local = localCandidates[selectedCandidatePair.localCandidateId];
+/**
+ * Called upon transport open.
+ *
+ * @api private
+ */
- if (local && local.ip) {
- // Spec
- self.localAddress = local.ip;
- self.localPort = Number(local.port);
- } else if (local && local.ipAddress) {
- // Firefox
- self.localAddress = local.ipAddress;
- self.localPort = Number(local.portNumber);
- } else if (typeof selectedCandidatePair.googLocalAddress === 'string') {
- // TODO: remove this once Chrome 58 is released
- local = selectedCandidatePair.googLocalAddress.split(':');
- self.localAddress = local[0];
- self.localPort = Number(local[1]);
- }
+Manager.prototype.onopen = function () {
+ debug('open');
- var remote = remoteCandidates[selectedCandidatePair.remoteCandidateId];
+ // clear old subs
+ this.cleanup();
- if (remote && remote.ip) {
- // Spec
- self.remoteAddress = remote.ip;
- self.remotePort = Number(remote.port);
- } else if (remote && remote.ipAddress) {
- // Firefox
- self.remoteAddress = remote.ipAddress;
- self.remotePort = Number(remote.portNumber);
- } else if (typeof selectedCandidatePair.googRemoteAddress === 'string') {
- // TODO: remove this once Chrome 58 is released
- remote = selectedCandidatePair.googRemoteAddress.split(':');
- self.remoteAddress = remote[0];
- self.remotePort = Number(remote[1]);
- }
- self.remoteFamily = 'IPv4';
+ // mark as open
+ this.readyState = 'open';
+ this.emit('open');
- self._debug('connect local: %s:%s remote: %s:%s', self.localAddress, self.localPort, self.remoteAddress, self.remotePort);
- }
+ // add new subs
+ var socket = this.engine;
+ this.subs.push(on(socket, 'data', bind(this, 'ondata')));
+ this.subs.push(on(socket, 'ping', bind(this, 'onping')));
+ this.subs.push(on(socket, 'pong', bind(this, 'onpong')));
+ this.subs.push(on(socket, 'error', bind(this, 'onerror')));
+ this.subs.push(on(socket, 'close', bind(this, 'onclose')));
+ this.subs.push(on(this.decoder, 'decoded', bind(this, 'ondecoded')));
+};
- // Ignore candidate pair selection in browsers like Safari 11 that do not have any local or remote candidates
- // But wait until at least 1 candidate pair is available
- if (!foundSelectedCandidatePair && (!Object.keys(candidatePairs).length || Object.keys(localCandidates).length)) {
- setTimeout(findCandidatePair, 100);
- return;
- } else {
- self._connecting = false;
- self.connected = true;
- }
+/**
+ * Called upon a ping.
+ *
+ * @api private
+ */
- if (self._chunk) {
- try {
- self.send(self._chunk);
- } catch (err) {
- return self.destroy(makeError(err, 'ERR_DATA_CHANNEL'));
- }
- self._chunk = null;
- self._debug('sent chunk from "write before connect"');
+Manager.prototype.onping = function () {
+ this.lastPing = new Date();
+ this.emitAll('ping');
+};
- var cb = self._cb;
- self._cb = null;
- cb(null);
- }
+/**
+ * Called upon a packet.
+ *
+ * @api private
+ */
- // If `bufferedAmountLowThreshold` and 'onbufferedamountlow' are unsupported,
- // fallback to using setInterval to implement backpressure.
- if (typeof self._channel.bufferedAmountLowThreshold !== 'number') {
- self._interval = setInterval(function () {
- self._onInterval();
- }, 150);
- if (self._interval.unref) self._interval.unref();
- }
+Manager.prototype.onpong = function () {
+ this.emitAll('pong', new Date() - this.lastPing);
+};
- self._debug('connect');
- self.emit('connect');
- });
- }
- findCandidatePair();
+/**
+ * Called with data.
+ *
+ * @api private
+ */
+
+Manager.prototype.ondata = function (data) {
+ this.decoder.add(data);
};
-Peer.prototype._onInterval = function () {
- var self = this;
- if (!self._cb || !self._channel || self._channel.bufferedAmount > MAX_BUFFERED_AMOUNT) {
- return;
- }
- self._onChannelBufferedAmountLow();
+/**
+ * Called when parser fully decodes a packet.
+ *
+ * @api private
+ */
+
+Manager.prototype.ondecoded = function (packet) {
+ this.emit('packet', packet);
};
-Peer.prototype._onSignalingStateChange = function () {
- var self = this;
- if (self.destroyed) return;
+/**
+ * Called upon socket error.
+ *
+ * @api private
+ */
- if (self._pc.signalingState === 'stable') {
- self._isNegotiating = false;
+Manager.prototype.onerror = function (err) {
+ debug('error', err);
+ this.emitAll('error', err);
+};
- // HACK: Firefox doesn't yet support removing tracks when signalingState !== 'stable'
- self._debug('flushing sender queue', self._sendersAwaitingStable);
- self._sendersAwaitingStable.forEach(function (sender) {
- self.removeTrack(sender);
- self._queuedNegotiation = true;
+/**
+ * Creates a new socket for the given `nsp`.
+ *
+ * @return {Socket}
+ * @api public
+ */
+
+Manager.prototype.socket = function (nsp, opts) {
+ var socket = this.nsps[nsp];
+ if (!socket) {
+ socket = new Socket(this, nsp, opts);
+ this.nsps[nsp] = socket;
+ var self = this;
+ socket.on('connecting', onConnecting);
+ socket.on('connect', function () {
+ socket.id = self.generateId(nsp);
});
- self._sendersAwaitingStable = [];
- if (self._queuedNegotiation) {
- self._debug('flushing negotiation queue');
- self._queuedNegotiation = false;
- self._needsNegotiation(); // negotiate again
+ if (this.autoConnect) {
+ // manually call here since connecting event is fired before listening
+ onConnecting();
}
+ }
- self._debug('negotiate');
- self.emit('negotiate');
+ function onConnecting() {
+ if (!~indexOf(self.connecting, socket)) {
+ self.connecting.push(socket);
+ }
}
- self._debug('signalingStateChange %s', self._pc.signalingState);
- self.emit('signalingStateChange', self._pc.signalingState);
+ return socket;
};
-Peer.prototype._onIceCandidate = function (event) {
+/**
+ * Called upon a socket close.
+ *
+ * @param {Socket} socket
+ */
+
+Manager.prototype.destroy = function (socket) {
+ var index = indexOf(this.connecting, socket);
+ if (~index) this.connecting.splice(index, 1);
+ if (this.connecting.length) return;
+
+ this.close();
+};
+
+/**
+ * Writes a packet.
+ *
+ * @param {Object} packet
+ * @api private
+ */
+
+Manager.prototype.packet = function (packet) {
+ debug('writing packet %j', packet);
var self = this;
- if (self.destroyed) return;
- if (event.candidate && self.trickle) {
- self.emit('signal', {
- candidate: {
- candidate: event.candidate.candidate,
- sdpMLineIndex: event.candidate.sdpMLineIndex,
- sdpMid: event.candidate.sdpMid
+ if (packet.query && packet.type === 0) packet.nsp += '?' + packet.query;
+
+ if (!self.encoding) {
+ // encode, then write to engine with result
+ self.encoding = true;
+ this.encoder.encode(packet, function (encodedPackets) {
+ for (var i = 0; i < encodedPackets.length; i++) {
+ self.engine.write(encodedPackets[i], packet.options);
}
+ self.encoding = false;
+ self.processPacketQueue();
});
- } else if (!event.candidate) {
- self._iceComplete = true;
- self.emit('_iceComplete');
+ } else {
+ // add packet to the queue
+ self.packetBuffer.push(packet);
}
};
-Peer.prototype._onChannelMessage = function (event) {
- var self = this;
- if (self.destroyed) return;
- var data = event.data;
- if (data instanceof ArrayBuffer) data = Buffer.from(data);
- self.push(data);
-};
+/**
+ * If packet buffer is non-empty, begins encoding the
+ * next packet in line.
+ *
+ * @api private
+ */
-Peer.prototype._onChannelBufferedAmountLow = function () {
- var self = this;
- if (self.destroyed || !self._cb) return;
- self._debug('ending backpressure: bufferedAmount %d', self._channel.bufferedAmount);
- var cb = self._cb;
- self._cb = null;
- cb(null);
+Manager.prototype.processPacketQueue = function () {
+ if (this.packetBuffer.length > 0 && !this.encoding) {
+ var pack = this.packetBuffer.shift();
+ this.packet(pack);
+ }
};
-Peer.prototype._onChannelOpen = function () {
- var self = this;
- if (self.connected || self.destroyed) return;
- self._debug('on channel open');
- self._channelReady = true;
- self._maybeReady();
-};
+/**
+ * Clean up transport subscriptions and packet buffer.
+ *
+ * @api private
+ */
-Peer.prototype._onChannelClose = function () {
- var self = this;
- if (self.destroyed) return;
- self._debug('on channel close');
- self.destroy();
-};
+Manager.prototype.cleanup = function () {
+ debug('cleanup');
-Peer.prototype._onTrack = function (event) {
- var self = this;
- if (self.destroyed) return;
+ var subsLength = this.subs.length;
+ for (var i = 0; i < subsLength; i++) {
+ var sub = this.subs.shift();
+ sub.destroy();
+ }
- event.streams.forEach(function (eventStream) {
- self._debug('on track');
- self.emit('track', event.track, eventStream);
+ this.packetBuffer = [];
+ this.encoding = false;
+ this.lastPing = null;
- self._remoteTracks.push({
- track: event.track,
- stream: eventStream
- });
+ this.decoder.destroy();
+};
- if (self._remoteStreams.some(function (remoteStream) {
- return remoteStream.id === eventStream.id;
- })) return; // Only fire one 'stream' event, even though there may be multiple tracks per stream
+/**
+ * Close the current socket.
+ *
+ * @api private
+ */
- self._remoteStreams.push(eventStream);
- setTimeout(function () {
- self.emit('stream', eventStream); // ensure all tracks have been added
- }, 0);
- });
+Manager.prototype.close = Manager.prototype.disconnect = function () {
+ debug('disconnect');
+ this.skipReconnect = true;
+ this.reconnecting = false;
+ if ('opening' === this.readyState) {
+ // `onclose` will not fire because
+ // an open event never happened
+ this.cleanup();
+ }
+ this.backoff.reset();
+ this.readyState = 'closed';
+ if (this.engine) this.engine.close();
};
-Peer.prototype._debug = function () {
- var self = this;
- var args = [].slice.call(arguments);
- args[0] = '[' + self._id + '] ' + args[0];
- debug.apply(null, args);
-};
+/**
+ * Called upon engine close.
+ *
+ * @api private
+ */
-// Transform constraints objects into the new format (unless Chromium)
-// TODO: This can be removed when Chromium supports the new format
-Peer.prototype._transformConstraints = function (constraints) {
- var self = this;
+Manager.prototype.onclose = function (reason) {
+ debug('onclose');
- if (Object.keys(constraints).length === 0) {
- return constraints;
+ this.cleanup();
+ this.backoff.reset();
+ this.readyState = 'closed';
+ this.emit('close', reason);
+
+ if (this._reconnection && !this.skipReconnect) {
+ this.reconnect();
}
+};
- if ((constraints.mandatory || constraints.optional) && !self._isChromium) {
- // convert to new format
+/**
+ * Attempt a reconnection.
+ *
+ * @api private
+ */
- // Merge mandatory and optional objects, prioritizing mandatory
- var newConstraints = Object.assign({}, constraints.optional, constraints.mandatory);
+Manager.prototype.reconnect = function () {
+ if (this.reconnecting || this.skipReconnect) return this;
- // fix casing
- if (newConstraints.OfferToReceiveVideo !== undefined) {
- newConstraints.offerToReceiveVideo = newConstraints.OfferToReceiveVideo;
- delete newConstraints['OfferToReceiveVideo'];
- }
+ var self = this;
- if (newConstraints.OfferToReceiveAudio !== undefined) {
- newConstraints.offerToReceiveAudio = newConstraints.OfferToReceiveAudio;
- delete newConstraints['OfferToReceiveAudio'];
- }
+ if (this.backoff.attempts >= this._reconnectionAttempts) {
+ debug('reconnect failed');
+ this.backoff.reset();
+ this.emitAll('reconnect_failed');
+ this.reconnecting = false;
+ } else {
+ var delay = this.backoff.duration();
+ debug('will wait %dms before reconnect attempt', delay);
- return newConstraints;
- } else if (!constraints.mandatory && !constraints.optional && self._isChromium) {
- // convert to old format
+ this.reconnecting = true;
+ var timer = setTimeout(function () {
+ if (self.skipReconnect) return;
- // fix casing
- if (constraints.offerToReceiveVideo !== undefined) {
- constraints.OfferToReceiveVideo = constraints.offerToReceiveVideo;
- delete constraints['offerToReceiveVideo'];
- }
+ debug('attempting reconnect');
+ self.emitAll('reconnect_attempt', self.backoff.attempts);
+ self.emitAll('reconnecting', self.backoff.attempts);
- if (constraints.offerToReceiveAudio !== undefined) {
- constraints.OfferToReceiveAudio = constraints.offerToReceiveAudio;
- delete constraints['offerToReceiveAudio'];
- }
+ // check again for the case socket closed in above events
+ if (self.skipReconnect) return;
- return {
- mandatory: constraints // NOTE: All constraints are upgraded to mandatory
- };
- }
+ self.open(function (err) {
+ if (err) {
+ debug('reconnect attempt error');
+ self.reconnecting = false;
+ self.reconnect();
+ self.emitAll('reconnect_error', err.data);
+ } else {
+ debug('reconnect success');
+ self.onreconnect();
+ }
+ });
+ }, delay);
- return constraints;
+ this.subs.push({
+ destroy: function destroy() {
+ clearTimeout(timer);
+ }
+ });
+ }
};
-function makeError(message, code) {
- var err = new Error(message);
- err.code = code;
- return err;
-}
+/**
+ * Called upon successful reconnect.
+ *
+ * @api private
+ */
-function noop() {}
+Manager.prototype.onreconnect = function () {
+ var attempt = this.backoff.attempts;
+ this.reconnecting = false;
+ this.backoff.reset();
+ this.updateSocketIds();
+ this.emitAll('reconnect', attempt);
+};
-}).call(this,require("buffer").Buffer)
-},{"buffer":256,"debug":748,"get-browser-rtc":648,"inherits":671,"randombytes":711,"readable-stream":723}],748:[function(require,module,exports){
-(function (process){
+},{"./on":751,"./socket":752,"backo2":210,"component-bind":264,"component-emitter":265,"debug":754,"engine.io-client":628,"indexof":670,"socket.io-parser":757}],751:[function(require,module,exports){
"use strict";
-var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+/**
+ * Module exports.
+ */
-function _typeof(obj) {
- if (typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol") {
- _typeof = function _typeof(obj) {
- return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
- };
- } else {
- _typeof = function _typeof(obj) {
- return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj);
- };
- }return _typeof(obj);
+module.exports = on;
+
+/**
+ * Helper for subscriptions.
+ *
+ * @param {Object|EventEmitter} obj with `Emitter` mixin or `EventEmitter`
+ * @param {String} event name
+ * @param {Function} callback
+ * @api public
+ */
+
+function on(obj, ev, fn) {
+ obj.on(ev, fn);
+ return {
+ destroy: function destroy() {
+ obj.removeListener(ev, fn);
+ }
+ };
}
-/* eslint-env browser */
+},{}],752:[function(require,module,exports){
+'use strict';
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
/**
- * This is the web browser implementation of `debug()`.
+ * Module dependencies.
*/
-exports.log = log;
-exports.formatArgs = formatArgs;
-exports.save = save;
-exports.load = load;
-exports.useColors = useColors;
-exports.storage = localstorage();
+
+var parser = require('socket.io-parser');
+var Emitter = require('component-emitter');
+var toArray = require('to-array');
+var on = require('./on');
+var bind = require('component-bind');
+var debug = require('debug')('socket.io-client:socket');
+var parseqs = require('parseqs');
+var hasBin = require('has-binary2');
+
/**
- * Colors.
+ * Module exports.
*/
-exports.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'];
+module.exports = exports = Socket;
+
/**
- * Currently only WebKit-based Web Inspectors, Firefox >= v31,
- * and the Firebug extension (any Firefox version) are known
- * to support "%c" CSS customizations.
+ * Internal events (blacklisted).
+ * These events can't be emitted by the user.
*
- * TODO: add a `localStorage` variable to explicitly enable/disable colors
+ * @api private
*/
-// eslint-disable-next-line complexity
-
-function useColors() {
- // NB: In an Electron preload script, document will be defined but not fully
- // initialized. Since we know we're in Chrome, we'll just detect this case
- // explicitly
- if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
- return true;
- } // Internet Explorer and Edge do not support colors.
+var events = {
+ connect: 1,
+ connect_error: 1,
+ connect_timeout: 1,
+ connecting: 1,
+ disconnect: 1,
+ error: 1,
+ reconnect: 1,
+ reconnect_attempt: 1,
+ reconnect_failed: 1,
+ reconnect_error: 1,
+ reconnecting: 1,
+ ping: 1,
+ pong: 1
+};
- if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
- return false;
- } // Is webkit? http://stackoverflow.com/a/16459606/376773
- // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
+/**
+ * Shortcut to `Emitter#emit`.
+ */
+var emit = Emitter.prototype.emit;
- return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773
- typeof window !== 'undefined' && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31?
- // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
- typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker
- typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/);
-}
/**
- * Colorize log arguments if enabled.
+ * `Socket` constructor.
*
* @api public
*/
-function formatArgs(args) {
- args[0] = (this.useColors ? '%c' : '') + this.namespace + (this.useColors ? ' %c' : ' ') + args[0] + (this.useColors ? '%c ' : ' ') + '+' + module.exports.humanize(this.diff);
-
- if (!this.useColors) {
- return;
+function Socket(io, nsp, opts) {
+ this.io = io;
+ this.nsp = nsp;
+ this.json = this; // compat
+ this.ids = 0;
+ this.acks = {};
+ this.receiveBuffer = [];
+ this.sendBuffer = [];
+ this.connected = false;
+ this.disconnected = true;
+ this.flags = {};
+ if (opts && opts.query) {
+ this.query = opts.query;
}
+ if (this.io.autoConnect) this.open();
+}
- var c = 'color: ' + this.color;
- args.splice(1, 0, c, 'color: inherit'); // The final "%c" is somewhat tricky, because there could be other
- // arguments passed either before or after the %c, so we need to
- // figure out the correct index to insert the CSS into
+/**
+ * Mix in `Emitter`.
+ */
- var index = 0;
- var lastC = 0;
- args[0].replace(/%[a-zA-Z%]/g, function (match) {
- if (match === '%%') {
- return;
- }
+Emitter(Socket.prototype);
- index++;
+/**
+ * Subscribe to open, close and packet events
+ *
+ * @api private
+ */
+
+Socket.prototype.subEvents = function () {
+ if (this.subs) return;
+
+ var io = this.io;
+ this.subs = [on(io, 'open', bind(this, 'onopen')), on(io, 'packet', bind(this, 'onpacket')), on(io, 'close', bind(this, 'onclose'))];
+};
- if (match === '%c') {
- // We only are interested in the *last* %c
- // (the user may have provided their own)
- lastC = index;
- }
- });
- args.splice(lastC, 0, c);
-}
/**
- * Invokes `console.log()` when available.
- * No-op when `console.log` is not a "function".
+ * "Opens" the socket.
*
* @api public
*/
-function log() {
- var _console;
+Socket.prototype.open = Socket.prototype.connect = function () {
+ if (this.connected) return this;
+
+ this.subEvents();
+ this.io.open(); // ensure open
+ if ('open' === this.io.readyState) this.onopen();
+ this.emit('connecting');
+ return this;
+};
- // This hackery is required for IE8/9, where
- // the `console.log` function doesn't have 'apply'
- return (typeof console === "undefined" ? "undefined" : _typeof(console)) === 'object' && console.log && (_console = console).log.apply(_console, arguments);
-}
/**
- * Save `namespaces`.
+ * Sends a `message` event.
*
- * @param {String} namespaces
- * @api private
+ * @return {Socket} self
+ * @api public
*/
-function save(namespaces) {
- try {
- if (namespaces) {
- exports.storage.setItem('debug', namespaces);
- } else {
- exports.storage.removeItem('debug');
- }
- } catch (error) {// Swallow
- // XXX (@Qix-) should we be logging these?
- }
-}
+Socket.prototype.send = function () {
+ var args = toArray(arguments);
+ args.unshift('message');
+ this.emit.apply(this, args);
+ return this;
+};
+
/**
- * Load `namespaces`.
+ * Override `emit`.
+ * If the event is in `events`, it's emitted normally.
*
- * @return {String} returns the previously persisted debug modes
- * @api private
+ * @param {String} event name
+ * @return {Socket} self
+ * @api public
*/
-function load() {
- var r;
+Socket.prototype.emit = function (ev) {
+ if (events.hasOwnProperty(ev)) {
+ emit.apply(this, arguments);
+ return this;
+ }
- try {
- r = exports.storage.getItem('debug');
- } catch (error) {} // Swallow
- // XXX (@Qix-) should we be logging these?
- // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
+ var args = toArray(arguments);
+ var packet = {
+ type: (this.flags.binary !== undefined ? this.flags.binary : hasBin(args)) ? parser.BINARY_EVENT : parser.EVENT,
+ data: args
+ };
+ packet.options = {};
+ packet.options.compress = !this.flags || false !== this.flags.compress;
- if (!r && typeof process !== 'undefined' && 'env' in process) {
- r = process.env.DEBUG;
+ // event ack callback
+ if ('function' === typeof args[args.length - 1]) {
+ debug('emitting packet with ack id %d', this.ids);
+ this.acks[this.ids] = args.pop();
+ packet.id = this.ids++;
}
- return r;
-}
+ if (this.connected) {
+ this.packet(packet);
+ } else {
+ this.sendBuffer.push(packet);
+ }
+
+ this.flags = {};
+
+ return this;
+};
+
/**
- * Localstorage attempts to return the localstorage.
- *
- * This is necessary because safari throws
- * when a user disables cookies/localstorage
- * and you attempt to access it.
+ * Sends a packet.
*
- * @return {LocalStorage}
+ * @param {Object} packet
* @api private
*/
-function localstorage() {
- try {
- // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
- // The Browser also has localStorage in the global context.
- return localStorage;
- } catch (error) {// Swallow
- // XXX (@Qix-) should we be logging these?
- }
-}
+Socket.prototype.packet = function (packet) {
+ packet.nsp = this.nsp;
+ this.io.packet(packet);
+};
-module.exports = require('./common')(exports);
-var formatters = module.exports.formatters;
/**
- * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
+ * Called upon engine `open`.
+ *
+ * @api private
*/
-formatters.j = function (v) {
- try {
- return JSON.stringify(v);
- } catch (error) {
- return '[UnexpectedJSONParseError]: ' + error.message;
+Socket.prototype.onopen = function () {
+ debug('transport is open - connecting');
+
+ // write connect packet if necessary
+ if ('/' !== this.nsp) {
+ if (this.query) {
+ var query = _typeof(this.query) === 'object' ? parseqs.encode(this.query) : this.query;
+ debug('sending connect packet with query %s', query);
+ this.packet({ type: parser.CONNECT, query: query });
+ } else {
+ this.packet({ type: parser.CONNECT });
+ }
}
};
-}).call(this,require('_process'))
-},{"./common":749,"_process":704}],749:[function(require,module,exports){
-"use strict";
-
/**
- * This is the common logic for both the Node.js and web browser
- * implementations of `debug()`.
+ * Called upon engine `close`.
+ *
+ * @param {String} reason
+ * @api private
*/
-function setup(env) {
- createDebug.debug = createDebug;
- createDebug.default = createDebug;
- createDebug.coerce = coerce;
- createDebug.disable = disable;
- createDebug.enable = enable;
- createDebug.enabled = enabled;
- createDebug.humanize = require('ms');
- Object.keys(env).forEach(function (key) {
- createDebug[key] = env[key];
- });
- /**
- * Active `debug` instances.
- */
-
- createDebug.instances = [];
- /**
- * The currently active debug mode names, and names to skip.
- */
-
- createDebug.names = [];
- createDebug.skips = [];
- /**
- * Map of special "%n" handling functions, for the debug "format" argument.
- *
- * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
- */
-
- createDebug.formatters = {};
- /**
- * Selects a color for a debug namespace
- * @param {String} namespace The namespace string for the for the debug instance to be colored
- * @return {Number|String} An ANSI color code for the given namespace
- * @api private
- */
-
- function selectColor(namespace) {
- var hash = 0;
-
- for (var i = 0; i < namespace.length; i++) {
- hash = (hash << 5) - hash + namespace.charCodeAt(i);
- hash |= 0; // Convert to 32bit integer
- }
-
- return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
- }
-
- createDebug.selectColor = selectColor;
- /**
- * Create a debugger with the given `namespace`.
- *
- * @param {String} namespace
- * @return {Function}
- * @api public
- */
-
- function createDebug(namespace) {
- var prevTime;
-
- function debug() {
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
- args[_key] = arguments[_key];
- }
-
- // Disabled?
- if (!debug.enabled) {
- return;
- }
-
- var self = debug; // Set `diff` timestamp
-
- var curr = Number(new Date());
- var ms = curr - (prevTime || curr);
- self.diff = ms;
- self.prev = prevTime;
- self.curr = curr;
- prevTime = curr;
- args[0] = createDebug.coerce(args[0]);
-
- if (typeof args[0] !== 'string') {
- // Anything else let's inspect with %O
- args.unshift('%O');
- } // Apply any `formatters` transformations
+Socket.prototype.onclose = function (reason) {
+ debug('close (%s)', reason);
+ this.connected = false;
+ this.disconnected = true;
+ delete this.id;
+ this.emit('disconnect', reason);
+};
+/**
+ * Called with socket packet.
+ *
+ * @param {Object} packet
+ * @api private
+ */
- var index = 0;
- args[0] = args[0].replace(/%([a-zA-Z%])/g, function (match, format) {
- // If we encounter an escaped % then don't increase the array index
- if (match === '%%') {
- return match;
- }
+Socket.prototype.onpacket = function (packet) {
+ var sameNamespace = packet.nsp === this.nsp;
+ var rootNamespaceError = packet.type === parser.ERROR && packet.nsp === '/';
- index++;
- var formatter = createDebug.formatters[format];
+ if (!sameNamespace && !rootNamespaceError) return;
- if (typeof formatter === 'function') {
- var val = args[index];
- match = formatter.call(self, val); // Now we need to remove `args[index]` since it's inlined in the `format`
+ switch (packet.type) {
+ case parser.CONNECT:
+ this.onconnect();
+ break;
- args.splice(index, 1);
- index--;
- }
+ case parser.EVENT:
+ this.onevent(packet);
+ break;
- return match;
- }); // Apply env-specific formatting (colors, etc.)
+ case parser.BINARY_EVENT:
+ this.onevent(packet);
+ break;
- createDebug.formatArgs.call(self, args);
- var logFn = self.log || createDebug.log;
- logFn.apply(self, args);
- }
+ case parser.ACK:
+ this.onack(packet);
+ break;
- debug.namespace = namespace;
- debug.enabled = createDebug.enabled(namespace);
- debug.useColors = createDebug.useColors();
- debug.color = selectColor(namespace);
- debug.destroy = destroy;
- debug.extend = extend; // Debug.formatArgs = formatArgs;
- // debug.rawLog = rawLog;
- // env-specific initialization logic for debug instances
+ case parser.BINARY_ACK:
+ this.onack(packet);
+ break;
- if (typeof createDebug.init === 'function') {
- createDebug.init(debug);
- }
+ case parser.DISCONNECT:
+ this.ondisconnect();
+ break;
- createDebug.instances.push(debug);
- return debug;
+ case parser.ERROR:
+ this.emit('error', packet.data);
+ break;
}
+};
- function destroy() {
- var index = createDebug.instances.indexOf(this);
+/**
+ * Called upon a server event.
+ *
+ * @param {Object} packet
+ * @api private
+ */
- if (index !== -1) {
- createDebug.instances.splice(index, 1);
- return true;
- }
+Socket.prototype.onevent = function (packet) {
+ var args = packet.data || [];
+ debug('emitting event %j', args);
- return false;
+ if (null != packet.id) {
+ debug('attaching ack callback to event');
+ args.push(this.ack(packet.id));
}
- function extend(namespace, delimiter) {
- return createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
+ if (this.connected) {
+ emit.apply(this, args);
+ } else {
+ this.receiveBuffer.push(args);
}
- /**
- * Enables a debug mode by namespaces. This can include modes
- * separated by a colon and wildcards.
- *
- * @param {String} namespaces
- * @api public
- */
-
- function enable(namespaces) {
- createDebug.save(namespaces);
- createDebug.names = [];
- createDebug.skips = [];
- var i;
- var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
- var len = split.length;
+};
- for (i = 0; i < len; i++) {
- if (!split[i]) {
- // ignore empty strings
- continue;
- }
+/**
+ * Produces an ack callback to emit with an event.
+ *
+ * @api private
+ */
- namespaces = split[i].replace(/\*/g, '.*?');
+Socket.prototype.ack = function (id) {
+ var self = this;
+ var sent = false;
+ return function () {
+ // prevent double callbacks
+ if (sent) return;
+ sent = true;
+ var args = toArray(arguments);
+ debug('sending ack %j', args);
- if (namespaces[0] === '-') {
- createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
- } else {
- createDebug.names.push(new RegExp('^' + namespaces + '$'));
- }
- }
+ self.packet({
+ type: hasBin(args) ? parser.BINARY_ACK : parser.ACK,
+ id: id,
+ data: args
+ });
+ };
+};
- for (i = 0; i < createDebug.instances.length; i++) {
- var instance = createDebug.instances[i];
- instance.enabled = createDebug.enabled(instance.namespace);
- }
- }
- /**
- * Disable debug output.
- *
- * @api public
- */
+/**
+ * Called upon a server acknowlegement.
+ *
+ * @param {Object} packet
+ * @api private
+ */
- function disable() {
- createDebug.enable('');
+Socket.prototype.onack = function (packet) {
+ var ack = this.acks[packet.id];
+ if ('function' === typeof ack) {
+ debug('calling ack %s with %j', packet.id, packet.data);
+ ack.apply(this, packet.data);
+ delete this.acks[packet.id];
+ } else {
+ debug('bad ack %s', packet.id);
}
- /**
- * Returns true if the given mode name is enabled, false otherwise.
- *
- * @param {String} name
- * @return {Boolean}
- * @api public
- */
-
- function enabled(name) {
- if (name[name.length - 1] === '*') {
- return true;
- }
+};
- var i;
- var len;
+/**
+ * Called upon server connect.
+ *
+ * @api private
+ */
- for (i = 0, len = createDebug.skips.length; i < len; i++) {
- if (createDebug.skips[i].test(name)) {
- return false;
- }
- }
+Socket.prototype.onconnect = function () {
+ this.connected = true;
+ this.disconnected = false;
+ this.emit('connect');
+ this.emitBuffered();
+};
- for (i = 0, len = createDebug.names.length; i < len; i++) {
- if (createDebug.names[i].test(name)) {
- return true;
- }
- }
+/**
+ * Emit buffered events (received and emitted).
+ *
+ * @api private
+ */
- return false;
+Socket.prototype.emitBuffered = function () {
+ var i;
+ for (i = 0; i < this.receiveBuffer.length; i++) {
+ emit.apply(this, this.receiveBuffer[i]);
}
- /**
- * Coerce `val`.
- *
- * @param {Mixed} val
- * @return {Mixed}
- * @api private
- */
-
- function coerce(val) {
- if (val instanceof Error) {
- return val.stack || val.message;
- }
+ this.receiveBuffer = [];
- return val;
+ for (i = 0; i < this.sendBuffer.length; i++) {
+ this.packet(this.sendBuffer[i]);
}
-
- createDebug.enable(createDebug.load());
- return createDebug;
-}
-
-module.exports = setup;
-
-},{"ms":750}],750:[function(require,module,exports){
-'use strict';
-
-var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+ this.sendBuffer = [];
+};
/**
- * Helpers.
+ * Called upon server disconnect.
+ *
+ * @api private
*/
-var s = 1000;
-var m = s * 60;
-var h = m * 60;
-var d = h * 24;
-var w = d * 7;
-var y = d * 365.25;
+Socket.prototype.ondisconnect = function () {
+ debug('server disconnect (%s)', this.nsp);
+ this.destroy();
+ this.onclose('io server disconnect');
+};
/**
- * Parse or format the given `val`.
- *
- * Options:
- *
- * - `long` verbose formatting [false]
+ * Called upon forced client/server side disconnections,
+ * this method ensures the manager stops tracking us and
+ * that reconnections don't get triggered for this.
*
- * @param {String|Number} val
- * @param {Object} [options]
- * @throws {Error} throw an error if val is not a non-empty string or a number
- * @return {String|Number}
- * @api public
+ * @api private.
*/
-module.exports = function (val, options) {
- options = options || {};
- var type = typeof val === 'undefined' ? 'undefined' : _typeof(val);
- if (type === 'string' && val.length > 0) {
- return parse(val);
- } else if (type === 'number' && isNaN(val) === false) {
- return options.long ? fmtLong(val) : fmtShort(val);
+Socket.prototype.destroy = function () {
+ if (this.subs) {
+ // clean subscriptions to avoid reconnections
+ for (var i = 0; i < this.subs.length; i++) {
+ this.subs[i].destroy();
+ }
+ this.subs = null;
}
- throw new Error('val is not a non-empty string or a valid number. val=' + JSON.stringify(val));
+
+ this.io.destroy(this);
};
/**
- * Parse the given `str` and return milliseconds.
+ * Disconnects the socket manually.
*
- * @param {String} str
- * @return {Number}
- * @api private
+ * @return {Socket} self
+ * @api public
*/
-function parse(str) {
- str = String(str);
- if (str.length > 100) {
- return;
- }
- var match = /^((?:\d+)?\-?\d?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str);
- if (!match) {
- return;
- }
- var n = parseFloat(match[1]);
- var type = (match[2] || 'ms').toLowerCase();
- switch (type) {
- case 'years':
- case 'year':
- case 'yrs':
- case 'yr':
- case 'y':
- return n * y;
- case 'weeks':
- case 'week':
- case 'w':
- return n * w;
- case 'days':
- case 'day':
- case 'd':
- return n * d;
- case 'hours':
- case 'hour':
- case 'hrs':
- case 'hr':
- case 'h':
- return n * h;
- case 'minutes':
- case 'minute':
- case 'mins':
- case 'min':
- case 'm':
- return n * m;
- case 'seconds':
- case 'second':
- case 'secs':
- case 'sec':
- case 's':
- return n * s;
- case 'milliseconds':
- case 'millisecond':
- case 'msecs':
- case 'msec':
- case 'ms':
- return n;
- default:
- return undefined;
+Socket.prototype.close = Socket.prototype.disconnect = function () {
+ if (this.connected) {
+ debug('performing disconnect (%s)', this.nsp);
+ this.packet({ type: parser.DISCONNECT });
}
-}
-/**
- * Short format for `ms`.
- *
- * @param {Number} ms
- * @return {String}
- * @api private
- */
+ // remove socket from pool
+ this.destroy();
-function fmtShort(ms) {
- var msAbs = Math.abs(ms);
- if (msAbs >= d) {
- return Math.round(ms / d) + 'd';
- }
- if (msAbs >= h) {
- return Math.round(ms / h) + 'h';
- }
- if (msAbs >= m) {
- return Math.round(ms / m) + 'm';
- }
- if (msAbs >= s) {
- return Math.round(ms / s) + 's';
+ if (this.connected) {
+ // fire events
+ this.onclose('io client disconnect');
}
- return ms + 'ms';
-}
+ return this;
+};
/**
- * Long format for `ms`.
+ * Sets the compress flag.
*
- * @param {Number} ms
- * @return {String}
- * @api private
+ * @param {Boolean} if `true`, compresses the sending data
+ * @return {Socket} self
+ * @api public
*/
-function fmtLong(ms) {
- var msAbs = Math.abs(ms);
- if (msAbs >= d) {
- return plural(ms, msAbs, d, 'day');
- }
- if (msAbs >= h) {
- return plural(ms, msAbs, h, 'hour');
- }
- if (msAbs >= m) {
- return plural(ms, msAbs, m, 'minute');
- }
- if (msAbs >= s) {
- return plural(ms, msAbs, s, 'second');
- }
- return ms + ' ms';
-}
+Socket.prototype.compress = function (compress) {
+ this.flags.compress = compress;
+ return this;
+};
/**
- * Pluralization helper.
+ * Sets the binary flag
+ *
+ * @param {Boolean} whether the emitted data contains binary
+ * @return {Socket} self
+ * @api public
*/
-function plural(ms, msAbs, n, name) {
- var isPlural = msAbs >= n * 1.5;
- return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
-}
+Socket.prototype.binary = function (binary) {
+ this.flags.binary = binary;
+ return this;
+};
-},{}],751:[function(require,module,exports){
+},{"./on":751,"component-bind":264,"component-emitter":265,"debug":754,"has-binary2":649,"parseqs":696,"socket.io-parser":757,"to-array":766}],753:[function(require,module,exports){
+(function (global){
'use strict';
-var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
-
/**
* Module dependencies.
*/
-var url = require('./url');
-var parser = require('socket.io-parser');
-var Manager = require('./manager');
-var debug = require('debug')('socket.io-client');
+var parseuri = require('parseuri');
+var debug = require('debug')('socket.io-client:url');
/**
* Module exports.
*/
-module.exports = exports = lookup;
+module.exports = url;
/**
- * Managers cache.
+ * URL parser.
+ *
+ * @param {String} url
+ * @param {Object} An object meant to mimic window.location.
+ * Defaults to window.location.
+ * @api public
*/
-var cache = exports.managers = {};
+function url(uri, loc) {
+ var obj = uri;
-/**
- * Looks up an existing `Manager` for multiplexing.
- * If the user summons:
- *
- * `io('http://localhost/a');`
- * `io('http://localhost/b');`
- *
- * We reuse the existing instance based on same scheme/port/host,
- * and we initialize sockets for each namespace.
- *
- * @api public
- */
-
-function lookup(uri, opts) {
- if ((typeof uri === 'undefined' ? 'undefined' : _typeof(uri)) === 'object') {
- opts = uri;
- uri = undefined;
- }
+ // default to window.location
+ loc = loc || global.location;
+ if (null == uri) uri = loc.protocol + '//' + loc.host;
- opts = opts || {};
+ // relative path support
+ if ('string' === typeof uri) {
+ if ('/' === uri.charAt(0)) {
+ if ('/' === uri.charAt(1)) {
+ uri = loc.protocol + uri;
+ } else {
+ uri = loc.host + uri;
+ }
+ }
- var parsed = url(uri);
- var source = parsed.source;
- var id = parsed.id;
- var path = parsed.path;
- var sameNamespace = cache[id] && path in cache[id].nsps;
- var newConnection = opts.forceNew || opts['force new connection'] || false === opts.multiplex || sameNamespace;
+ if (!/^(https?|wss?):\/\//.test(uri)) {
+ debug('protocol-less url %s', uri);
+ if ('undefined' !== typeof loc) {
+ uri = loc.protocol + '//' + uri;
+ } else {
+ uri = 'https://' + uri;
+ }
+ }
- var io;
+ // parse
+ debug('parse %s', uri);
+ obj = parseuri(uri);
+ }
- if (newConnection) {
- debug('ignoring socket cache for %s', source);
- io = Manager(source, opts);
- } else {
- if (!cache[id]) {
- debug('new io instance for %s', source);
- cache[id] = Manager(source, opts);
+ // make sure we treat `localhost:80` and `localhost` equally
+ if (!obj.port) {
+ if (/^(http|ws)$/.test(obj.protocol)) {
+ obj.port = '80';
+ } else if (/^(http|ws)s$/.test(obj.protocol)) {
+ obj.port = '443';
}
- io = cache[id];
- }
- if (parsed.query && !opts.query) {
- opts.query = parsed.query;
}
- return io.socket(parsed.path, opts);
-}
-
-/**
- * Protocol version.
- *
- * @api public
- */
-
-exports.protocol = parser.protocol;
-/**
- * `connect`.
- *
- * @param {String} uri
- * @api public
- */
+ obj.path = obj.path || '/';
-exports.connect = lookup;
+ var ipv6 = obj.host.indexOf(':') !== -1;
+ var host = ipv6 ? '[' + obj.host + ']' : obj.host;
-/**
- * Expose constructors for standalone build.
- *
- * @api public
- */
+ // define unique id
+ obj.id = obj.protocol + '://' + host + ':' + obj.port;
+ // define href
+ obj.href = obj.protocol + '://' + host + (loc && loc.port === obj.port ? '' : ':' + obj.port);
-exports.Manager = require('./manager');
-exports.Socket = require('./socket');
+ return obj;
+}
-},{"./manager":752,"./socket":754,"./url":755,"debug":756,"socket.io-parser":759}],752:[function(require,module,exports){
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"debug":754,"parseuri":697}],754:[function(require,module,exports){
+arguments[4][637][0].apply(exports,arguments)
+},{"./debug":755,"_process":704,"dup":637}],755:[function(require,module,exports){
+arguments[4][638][0].apply(exports,arguments)
+},{"dup":638,"ms":690}],756:[function(require,module,exports){
+(function (global){
'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+/*global Blob,File*/
+
/**
- * Module dependencies.
+ * Module requirements
*/
-var eio = require('engine.io-client');
-var Socket = require('./socket');
-var Emitter = require('component-emitter');
-var parser = require('socket.io-parser');
-var on = require('./on');
-var bind = require('component-bind');
-var debug = require('debug')('socket.io-client:manager');
-var indexOf = require('indexof');
-var Backoff = require('backo2');
+var isArray = require('isarray');
+var isBuf = require('./is-buffer');
+var toString = Object.prototype.toString;
+var withNativeBlob = typeof global.Blob === 'function' || toString.call(global.Blob) === '[object BlobConstructor]';
+var withNativeFile = typeof global.File === 'function' || toString.call(global.File) === '[object FileConstructor]';
/**
- * IE6+ hasOwnProperty
+ * Replaces every Buffer | ArrayBuffer in packet with a numbered placeholder.
+ * Anything with blobs or files should be fed through removeBlobs before coming
+ * here.
+ *
+ * @param {Object} packet - socket.io event packet
+ * @return {Object} with deconstructed packet and list of buffers
+ * @api public
*/
-var has = Object.prototype.hasOwnProperty;
+exports.deconstructPacket = function (packet) {
+ var buffers = [];
+ var packetData = packet.data;
+ var pack = packet;
+ pack.data = _deconstructPacket(packetData, buffers);
+ pack.attachments = buffers.length; // number of binary 'attachments'
+ return { packet: pack, buffers: buffers };
+};
-/**
- * Module exports
- */
+function _deconstructPacket(data, buffers) {
+ if (!data) return data;
-module.exports = Manager;
+ if (isBuf(data)) {
+ var placeholder = { _placeholder: true, num: buffers.length };
+ buffers.push(data);
+ return placeholder;
+ } else if (isArray(data)) {
+ var newData = new Array(data.length);
+ for (var i = 0; i < data.length; i++) {
+ newData[i] = _deconstructPacket(data[i], buffers);
+ }
+ return newData;
+ } else if ((typeof data === 'undefined' ? 'undefined' : _typeof(data)) === 'object' && !(data instanceof Date)) {
+ var newData = {};
+ for (var key in data) {
+ newData[key] = _deconstructPacket(data[key], buffers);
+ }
+ return newData;
+ }
+ return data;
+}
/**
- * `Manager` constructor.
+ * Reconstructs a binary packet from its placeholder packet and buffers
*
- * @param {String} engine instance or engine uri/opts
- * @param {Object} options
+ * @param {Object} packet - event packet with placeholders
+ * @param {Array} buffers - binary buffers to put in placeholder positions
+ * @return {Object} reconstructed packet
* @api public
*/
-function Manager(uri, opts) {
- if (!(this instanceof Manager)) return new Manager(uri, opts);
- if (uri && 'object' === (typeof uri === 'undefined' ? 'undefined' : _typeof(uri))) {
- opts = uri;
- uri = undefined;
+exports.reconstructPacket = function (packet, buffers) {
+ packet.data = _reconstructPacket(packet.data, buffers);
+ packet.attachments = undefined; // no longer useful
+ return packet;
+};
+
+function _reconstructPacket(data, buffers) {
+ if (!data) return data;
+
+ if (data && data._placeholder) {
+ return buffers[data.num]; // appropriate buffer (should be natural order anyway)
+ } else if (isArray(data)) {
+ for (var i = 0; i < data.length; i++) {
+ data[i] = _reconstructPacket(data[i], buffers);
+ }
+ } else if ((typeof data === 'undefined' ? 'undefined' : _typeof(data)) === 'object') {
+ for (var key in data) {
+ data[key] = _reconstructPacket(data[key], buffers);
+ }
}
- opts = opts || {};
- opts.path = opts.path || '/socket.io';
- this.nsps = {};
- this.subs = [];
- this.opts = opts;
- this.reconnection(opts.reconnection !== false);
- this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);
- this.reconnectionDelay(opts.reconnectionDelay || 1000);
- this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);
- this.randomizationFactor(opts.randomizationFactor || 0.5);
- this.backoff = new Backoff({
- min: this.reconnectionDelay(),
- max: this.reconnectionDelayMax(),
- jitter: this.randomizationFactor()
- });
- this.timeout(null == opts.timeout ? 20000 : opts.timeout);
- this.readyState = 'closed';
- this.uri = uri;
- this.connecting = [];
- this.lastPing = null;
- this.encoding = false;
- this.packetBuffer = [];
- var _parser = opts.parser || parser;
- this.encoder = new _parser.Encoder();
- this.decoder = new _parser.Decoder();
- this.autoConnect = opts.autoConnect !== false;
- if (this.autoConnect) this.open();
+ return data;
}
/**
- * Propagate given event to sockets and emit on `this`
+ * Asynchronously removes Blobs or Files from data via
+ * FileReader's readAsArrayBuffer method. Used before encoding
+ * data as msgpack. Calls callback with the blobless data.
*
+ * @param {Object} data
+ * @param {Function} callback
* @api private
*/
-Manager.prototype.emitAll = function () {
- this.emit.apply(this, arguments);
- for (var nsp in this.nsps) {
- if (has.call(this.nsps, nsp)) {
- this.nsps[nsp].emit.apply(this.nsps[nsp], arguments);
- }
- }
-};
+exports.removeBlobs = function (data, callback) {
+ function _removeBlobs(obj, curKey, containingObject) {
+ if (!obj) return obj;
-/**
- * Update `socket.id` of all sockets
- *
- * @api private
- */
+ // convert any blob
+ if (withNativeBlob && obj instanceof Blob || withNativeFile && obj instanceof File) {
+ pendingBlobs++;
-Manager.prototype.updateSocketIds = function () {
- for (var nsp in this.nsps) {
- if (has.call(this.nsps, nsp)) {
- this.nsps[nsp].id = this.generateId(nsp);
+ // async filereader
+ var fileReader = new FileReader();
+ fileReader.onload = function () {
+ // this.result == arraybuffer
+ if (containingObject) {
+ containingObject[curKey] = this.result;
+ } else {
+ bloblessData = this.result;
+ }
+
+ // if nothing pending its callback time
+ if (! --pendingBlobs) {
+ callback(bloblessData);
+ }
+ };
+
+ fileReader.readAsArrayBuffer(obj); // blob -> arraybuffer
+ } else if (isArray(obj)) {
+ // handle array
+ for (var i = 0; i < obj.length; i++) {
+ _removeBlobs(obj[i], i, obj);
+ }
+ } else if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && !isBuf(obj)) {
+ // and object
+ for (var key in obj) {
+ _removeBlobs(obj[key], key, obj);
+ }
}
}
+
+ var pendingBlobs = 0;
+ var bloblessData = data;
+ _removeBlobs(bloblessData);
+ if (!pendingBlobs) {
+ callback(bloblessData);
+ }
};
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./is-buffer":758,"isarray":761}],757:[function(require,module,exports){
+'use strict';
+
/**
- * generate `socket.id` for the given `nsp`
- *
- * @param {String} nsp
- * @return {String}
- * @api private
+ * Module dependencies.
*/
-Manager.prototype.generateId = function (nsp) {
- return (nsp === '/' ? '' : nsp + '#') + this.engine.id;
-};
+var debug = require('debug')('socket.io-parser');
+var Emitter = require('component-emitter');
+var binary = require('./binary');
+var isArray = require('isarray');
+var isBuf = require('./is-buffer');
/**
- * Mix in `Emitter`.
+ * Protocol version.
+ *
+ * @api public
*/
-Emitter(Manager.prototype);
+exports.protocol = 4;
/**
- * Sets the `reconnection` config.
+ * Packet types.
*
- * @param {Boolean} true/false if it should automatically reconnect
- * @return {Manager} self or value
* @api public
*/
-Manager.prototype.reconnection = function (v) {
- if (!arguments.length) return this._reconnection;
- this._reconnection = !!v;
- return this;
-};
+exports.types = ['CONNECT', 'DISCONNECT', 'EVENT', 'ACK', 'ERROR', 'BINARY_EVENT', 'BINARY_ACK'];
/**
- * Sets the reconnection attempts config.
+ * Packet type `connect`.
*
- * @param {Number} max reconnection attempts before giving up
- * @return {Manager} self or value
* @api public
*/
-Manager.prototype.reconnectionAttempts = function (v) {
- if (!arguments.length) return this._reconnectionAttempts;
- this._reconnectionAttempts = v;
- return this;
-};
+exports.CONNECT = 0;
/**
- * Sets the delay between reconnections.
+ * Packet type `disconnect`.
*
- * @param {Number} delay
- * @return {Manager} self or value
* @api public
*/
-Manager.prototype.reconnectionDelay = function (v) {
- if (!arguments.length) return this._reconnectionDelay;
- this._reconnectionDelay = v;
- this.backoff && this.backoff.setMin(v);
- return this;
-};
-
-Manager.prototype.randomizationFactor = function (v) {
- if (!arguments.length) return this._randomizationFactor;
- this._randomizationFactor = v;
- this.backoff && this.backoff.setJitter(v);
- return this;
-};
+exports.DISCONNECT = 1;
/**
- * Sets the maximum delay between reconnections.
+ * Packet type `event`.
*
- * @param {Number} delay
- * @return {Manager} self or value
* @api public
*/
-Manager.prototype.reconnectionDelayMax = function (v) {
- if (!arguments.length) return this._reconnectionDelayMax;
- this._reconnectionDelayMax = v;
- this.backoff && this.backoff.setMax(v);
- return this;
-};
+exports.EVENT = 2;
/**
- * Sets the connection timeout. `false` to disable
+ * Packet type `ack`.
*
- * @return {Manager} self or value
* @api public
*/
-Manager.prototype.timeout = function (v) {
- if (!arguments.length) return this._timeout;
- this._timeout = v;
- return this;
-};
+exports.ACK = 3;
/**
- * Starts trying to reconnect if reconnection is enabled and we have not
- * started reconnecting yet
+ * Packet type `error`.
*
- * @api private
+ * @api public
*/
-Manager.prototype.maybeReconnectOnOpen = function () {
- // Only try to reconnect if it's the first time we're connecting
- if (!this.reconnecting && this._reconnection && this.backoff.attempts === 0) {
- // keeps reconnection from firing twice for the same reconnection loop
- this.reconnect();
- }
-};
+exports.ERROR = 4;
/**
- * Sets the current transport `socket`.
+ * Packet type 'binary event'
*
- * @param {Function} optional, callback
- * @return {Manager} self
* @api public
*/
-Manager.prototype.open = Manager.prototype.connect = function (fn, opts) {
- debug('readyState %s', this.readyState);
- if (~this.readyState.indexOf('open')) return this;
-
- debug('opening %s', this.uri);
- this.engine = eio(this.uri, this.opts);
- var socket = this.engine;
- var self = this;
- this.readyState = 'opening';
- this.skipReconnect = false;
-
- // emit `open`
- var openSub = on(socket, 'open', function () {
- self.onopen();
- fn && fn();
- });
-
- // emit `connect_error`
- var errorSub = on(socket, 'error', function (data) {
- debug('connect_error');
- self.cleanup();
- self.readyState = 'closed';
- self.emitAll('connect_error', data);
- if (fn) {
- var err = new Error('Connection error');
- err.data = data;
- fn(err);
- } else {
- // Only do this if there is no fn to handle the error
- self.maybeReconnectOnOpen();
- }
- });
-
- // emit `connect_timeout`
- if (false !== this._timeout) {
- var timeout = this._timeout;
- debug('connect attempt will timeout after %d', timeout);
-
- // set timer
- var timer = setTimeout(function () {
- debug('connect attempt timed out after %d', timeout);
- openSub.destroy();
- socket.close();
- socket.emit('error', 'timeout');
- self.emitAll('connect_timeout', timeout);
- }, timeout);
-
- this.subs.push({
- destroy: function destroy() {
- clearTimeout(timer);
- }
- });
- }
-
- this.subs.push(openSub);
- this.subs.push(errorSub);
-
- return this;
-};
+exports.BINARY_EVENT = 5;
/**
- * Called upon transport open.
+ * Packet type `binary ack`. For acks with binary arguments.
*
- * @api private
+ * @api public
*/
-Manager.prototype.onopen = function () {
- debug('open');
-
- // clear old subs
- this.cleanup();
-
- // mark as open
- this.readyState = 'open';
- this.emit('open');
-
- // add new subs
- var socket = this.engine;
- this.subs.push(on(socket, 'data', bind(this, 'ondata')));
- this.subs.push(on(socket, 'ping', bind(this, 'onping')));
- this.subs.push(on(socket, 'pong', bind(this, 'onpong')));
- this.subs.push(on(socket, 'error', bind(this, 'onerror')));
- this.subs.push(on(socket, 'close', bind(this, 'onclose')));
- this.subs.push(on(this.decoder, 'decoded', bind(this, 'ondecoded')));
-};
+exports.BINARY_ACK = 6;
/**
- * Called upon a ping.
+ * Encoder constructor.
*
- * @api private
+ * @api public
*/
-Manager.prototype.onping = function () {
- this.lastPing = new Date();
- this.emitAll('ping');
-};
+exports.Encoder = Encoder;
/**
- * Called upon a packet.
+ * Decoder constructor.
*
- * @api private
+ * @api public
*/
-Manager.prototype.onpong = function () {
- this.emitAll('pong', new Date() - this.lastPing);
-};
+exports.Decoder = Decoder;
/**
- * Called with data.
+ * A socket.io Encoder instance
*
- * @api private
+ * @api public
*/
-Manager.prototype.ondata = function (data) {
- this.decoder.add(data);
-};
+function Encoder() {}
+
+var ERROR_PACKET = exports.ERROR + '"encode error"';
/**
- * Called when parser fully decodes a packet.
+ * Encode a packet as a single string if non-binary, or as a
+ * buffer sequence, depending on packet type.
*
- * @api private
+ * @param {Object} obj - packet object
+ * @param {Function} callback - function to handle encodings (likely engine.write)
+ * @return Calls callback with Array of encodings
+ * @api public
*/
-Manager.prototype.ondecoded = function (packet) {
- this.emit('packet', packet);
+Encoder.prototype.encode = function (obj, callback) {
+ debug('encoding packet %j', obj);
+
+ if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) {
+ encodeAsBinary(obj, callback);
+ } else {
+ var encoding = encodeAsString(obj);
+ callback([encoding]);
+ }
};
/**
- * Called upon socket error.
+ * Encode packet as string.
*
+ * @param {Object} packet
+ * @return {String} encoded
* @api private
*/
-Manager.prototype.onerror = function (err) {
- debug('error', err);
- this.emitAll('error', err);
-};
-
-/**
- * Creates a new socket for the given `nsp`.
- *
- * @return {Socket}
- * @api public
- */
+function encodeAsString(obj) {
-Manager.prototype.socket = function (nsp, opts) {
- var socket = this.nsps[nsp];
- if (!socket) {
- socket = new Socket(this, nsp, opts);
- this.nsps[nsp] = socket;
- var self = this;
- socket.on('connecting', onConnecting);
- socket.on('connect', function () {
- socket.id = self.generateId(nsp);
- });
+ // first is type
+ var str = '' + obj.type;
- if (this.autoConnect) {
- // manually call here since connecting event is fired before listening
- onConnecting();
- }
+ // attachments if we have them
+ if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) {
+ str += obj.attachments + '-';
}
- function onConnecting() {
- if (!~indexOf(self.connecting, socket)) {
- self.connecting.push(socket);
- }
+ // if we have a namespace other than `/`
+ // we append it followed by a comma `,`
+ if (obj.nsp && '/' !== obj.nsp) {
+ str += obj.nsp + ',';
}
- return socket;
-};
+ // immediately followed by the id
+ if (null != obj.id) {
+ str += obj.id;
+ }
-/**
- * Called upon a socket close.
- *
- * @param {Socket} socket
- */
+ // json data
+ if (null != obj.data) {
+ var payload = tryStringify(obj.data);
+ if (payload !== false) {
+ str += payload;
+ } else {
+ return ERROR_PACKET;
+ }
+ }
-Manager.prototype.destroy = function (socket) {
- var index = indexOf(this.connecting, socket);
- if (~index) this.connecting.splice(index, 1);
- if (this.connecting.length) return;
+ debug('encoded %j as %s', obj, str);
+ return str;
+}
- this.close();
-};
+function tryStringify(str) {
+ try {
+ return JSON.stringify(str);
+ } catch (e) {
+ return false;
+ }
+}
/**
- * Writes a packet.
+ * Encode packet as 'buffer sequence' by removing blobs, and
+ * deconstructing packet into object with placeholders and
+ * a list of buffers.
*
* @param {Object} packet
+ * @return {Buffer} encoded
* @api private
*/
-Manager.prototype.packet = function (packet) {
- debug('writing packet %j', packet);
- var self = this;
- if (packet.query && packet.type === 0) packet.nsp += '?' + packet.query;
-
- if (!self.encoding) {
- // encode, then write to engine with result
- self.encoding = true;
- this.encoder.encode(packet, function (encodedPackets) {
- for (var i = 0; i < encodedPackets.length; i++) {
- self.engine.write(encodedPackets[i], packet.options);
- }
- self.encoding = false;
- self.processPacketQueue();
- });
- } else {
- // add packet to the queue
- self.packetBuffer.push(packet);
- }
-};
+function encodeAsBinary(obj, callback) {
-/**
- * If packet buffer is non-empty, begins encoding the
- * next packet in line.
- *
- * @api private
- */
+ function writeEncoding(bloblessData) {
+ var deconstruction = binary.deconstructPacket(bloblessData);
+ var pack = encodeAsString(deconstruction.packet);
+ var buffers = deconstruction.buffers;
-Manager.prototype.processPacketQueue = function () {
- if (this.packetBuffer.length > 0 && !this.encoding) {
- var pack = this.packetBuffer.shift();
- this.packet(pack);
+ buffers.unshift(pack); // add packet info to beginning of data list
+ callback(buffers); // write all the buffers
}
-};
+
+ binary.removeBlobs(obj, writeEncoding);
+}
/**
- * Clean up transport subscriptions and packet buffer.
+ * A socket.io Decoder instance
*
- * @api private
+ * @return {Object} decoder
+ * @api public
*/
-Manager.prototype.cleanup = function () {
- debug('cleanup');
-
- var subsLength = this.subs.length;
- for (var i = 0; i < subsLength; i++) {
- var sub = this.subs.shift();
- sub.destroy();
- }
-
- this.packetBuffer = [];
- this.encoding = false;
- this.lastPing = null;
-
- this.decoder.destroy();
-};
+function Decoder() {
+ this.reconstructor = null;
+}
/**
- * Close the current socket.
- *
- * @api private
+ * Mix in `Emitter` with Decoder.
*/
-Manager.prototype.close = Manager.prototype.disconnect = function () {
- debug('disconnect');
- this.skipReconnect = true;
- this.reconnecting = false;
- if ('opening' === this.readyState) {
- // `onclose` will not fire because
- // an open event never happened
- this.cleanup();
- }
- this.backoff.reset();
- this.readyState = 'closed';
- if (this.engine) this.engine.close();
-};
+Emitter(Decoder.prototype);
/**
- * Called upon engine close.
+ * Decodes an ecoded packet string into packet JSON.
*
- * @api private
+ * @param {String} obj - encoded packet
+ * @return {Object} packet
+ * @api public
*/
-Manager.prototype.onclose = function (reason) {
- debug('onclose');
-
- this.cleanup();
- this.backoff.reset();
- this.readyState = 'closed';
- this.emit('close', reason);
+Decoder.prototype.add = function (obj) {
+ var packet;
+ if (typeof obj === 'string') {
+ packet = decodeString(obj);
+ if (exports.BINARY_EVENT === packet.type || exports.BINARY_ACK === packet.type) {
+ // binary packet's json
+ this.reconstructor = new BinaryReconstructor(packet);
- if (this._reconnection && !this.skipReconnect) {
- this.reconnect();
+ // no attachments, labeled binary but no binary data to follow
+ if (this.reconstructor.reconPack.attachments === 0) {
+ this.emit('decoded', packet);
+ }
+ } else {
+ // non-binary full packet
+ this.emit('decoded', packet);
+ }
+ } else if (isBuf(obj) || obj.base64) {
+ // raw binary data
+ if (!this.reconstructor) {
+ throw new Error('got binary data when not reconstructing a packet');
+ } else {
+ packet = this.reconstructor.takeBinaryData(obj);
+ if (packet) {
+ // received final buffer
+ this.reconstructor = null;
+ this.emit('decoded', packet);
+ }
+ }
+ } else {
+ throw new Error('Unknown type: ' + obj);
}
};
/**
- * Attempt a reconnection.
+ * Decode a packet String (JSON data)
*
+ * @param {String} str
+ * @return {Object} packet
* @api private
*/
-Manager.prototype.reconnect = function () {
- if (this.reconnecting || this.skipReconnect) return this;
+function decodeString(str) {
+ var i = 0;
+ // look up type
+ var p = {
+ type: Number(str.charAt(0))
+ };
- var self = this;
+ if (null == exports.types[p.type]) {
+ return error('unknown packet type ' + p.type);
+ }
- if (this.backoff.attempts >= this._reconnectionAttempts) {
- debug('reconnect failed');
- this.backoff.reset();
- this.emitAll('reconnect_failed');
- this.reconnecting = false;
+ // look up attachments if type binary
+ if (exports.BINARY_EVENT === p.type || exports.BINARY_ACK === p.type) {
+ var buf = '';
+ while (str.charAt(++i) !== '-') {
+ buf += str.charAt(i);
+ if (i == str.length) break;
+ }
+ if (buf != Number(buf) || str.charAt(i) !== '-') {
+ throw new Error('Illegal attachments');
+ }
+ p.attachments = Number(buf);
+ }
+
+ // look up namespace (if any)
+ if ('/' === str.charAt(i + 1)) {
+ p.nsp = '';
+ while (++i) {
+ var c = str.charAt(i);
+ if (',' === c) break;
+ p.nsp += c;
+ if (i === str.length) break;
+ }
} else {
- var delay = this.backoff.duration();
- debug('will wait %dms before reconnect attempt', delay);
+ p.nsp = '/';
+ }
- this.reconnecting = true;
- var timer = setTimeout(function () {
- if (self.skipReconnect) return;
+ // look up id
+ var next = str.charAt(i + 1);
+ if ('' !== next && Number(next) == next) {
+ p.id = '';
+ while (++i) {
+ var c = str.charAt(i);
+ if (null == c || Number(c) != c) {
+ --i;
+ break;
+ }
+ p.id += str.charAt(i);
+ if (i === str.length) break;
+ }
+ p.id = Number(p.id);
+ }
- debug('attempting reconnect');
- self.emitAll('reconnect_attempt', self.backoff.attempts);
- self.emitAll('reconnecting', self.backoff.attempts);
+ // look up json data
+ if (str.charAt(++i)) {
+ var payload = tryParse(str.substr(i));
+ var isPayloadValid = payload !== false && (p.type === exports.ERROR || isArray(payload));
+ if (isPayloadValid) {
+ p.data = payload;
+ } else {
+ return error('invalid payload');
+ }
+ }
- // check again for the case socket closed in above events
- if (self.skipReconnect) return;
+ debug('decoded %s as %j', str, p);
+ return p;
+}
- self.open(function (err) {
- if (err) {
- debug('reconnect attempt error');
- self.reconnecting = false;
- self.reconnect();
- self.emitAll('reconnect_error', err.data);
- } else {
- debug('reconnect success');
- self.onreconnect();
- }
- });
- }, delay);
+function tryParse(str) {
+ try {
+ return JSON.parse(str);
+ } catch (e) {
+ return false;
+ }
+}
- this.subs.push({
- destroy: function destroy() {
- clearTimeout(timer);
- }
- });
+/**
+ * Deallocates a parser's resources
+ *
+ * @api public
+ */
+
+Decoder.prototype.destroy = function () {
+ if (this.reconstructor) {
+ this.reconstructor.finishedReconstruction();
}
};
/**
- * Called upon successful reconnect.
+ * A manager of a binary event's 'buffer sequence'. Should
+ * be constructed whenever a packet of type BINARY_EVENT is
+ * decoded.
*
+ * @param {Object} packet
+ * @return {BinaryReconstructor} initialized reconstructor
* @api private
*/
-Manager.prototype.onreconnect = function () {
- var attempt = this.backoff.attempts;
- this.reconnecting = false;
- this.backoff.reset();
- this.updateSocketIds();
- this.emitAll('reconnect', attempt);
-};
-
-},{"./on":753,"./socket":754,"backo2":210,"component-bind":264,"component-emitter":265,"debug":756,"engine.io-client":628,"indexof":670,"socket.io-parser":759}],753:[function(require,module,exports){
-"use strict";
+function BinaryReconstructor(packet) {
+ this.reconPack = packet;
+ this.buffers = [];
+}
/**
- * Module exports.
+ * Method to be called when binary data received from connection
+ * after a BINARY_EVENT packet.
+ *
+ * @param {Buffer | ArrayBuffer} binData - the raw binary data received
+ * @return {null | Object} returns null if more binary data is expected or
+ * a reconstructed packet object if all buffers have been received.
+ * @api private
*/
-module.exports = on;
+BinaryReconstructor.prototype.takeBinaryData = function (binData) {
+ this.buffers.push(binData);
+ if (this.buffers.length === this.reconPack.attachments) {
+ // done with buffer list
+ var packet = binary.reconstructPacket(this.reconPack, this.buffers);
+ this.finishedReconstruction();
+ return packet;
+ }
+ return null;
+};
/**
- * Helper for subscriptions.
+ * Cleans up binary packet reconstruction variables.
*
- * @param {Object|EventEmitter} obj with `Emitter` mixin or `EventEmitter`
- * @param {String} event name
- * @param {Function} callback
- * @api public
+ * @api private
*/
-function on(obj, ev, fn) {
- obj.on(ev, fn);
+BinaryReconstructor.prototype.finishedReconstruction = function () {
+ this.reconPack = null;
+ this.buffers = [];
+};
+
+function error(msg) {
return {
- destroy: function destroy() {
- obj.removeListener(ev, fn);
- }
+ type: exports.ERROR,
+ data: 'parser error: ' + msg
};
}
-},{}],754:[function(require,module,exports){
+},{"./binary":756,"./is-buffer":758,"component-emitter":265,"debug":759,"isarray":761}],758:[function(require,module,exports){
+(function (global){
'use strict';
-var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
-
-/**
- * Module dependencies.
- */
-
-var parser = require('socket.io-parser');
-var Emitter = require('component-emitter');
-var toArray = require('to-array');
-var on = require('./on');
-var bind = require('component-bind');
-var debug = require('debug')('socket.io-client:socket');
-var parseqs = require('parseqs');
-var hasBin = require('has-binary2');
+module.exports = isBuf;
-/**
- * Module exports.
- */
+var withNativeBuffer = typeof global.Buffer === 'function' && typeof global.Buffer.isBuffer === 'function';
+var withNativeArrayBuffer = typeof global.ArrayBuffer === 'function';
-module.exports = exports = Socket;
+var isView = function () {
+ if (withNativeArrayBuffer && typeof global.ArrayBuffer.isView === 'function') {
+ return global.ArrayBuffer.isView;
+ } else {
+ return function (obj) {
+ return obj.buffer instanceof global.ArrayBuffer;
+ };
+ }
+}();
/**
- * Internal events (blacklisted).
- * These events can't be emitted by the user.
+ * Returns true if obj is a buffer or an arraybuffer.
*
* @api private
*/
-var events = {
- connect: 1,
- connect_error: 1,
- connect_timeout: 1,
- connecting: 1,
- disconnect: 1,
- error: 1,
- reconnect: 1,
- reconnect_attempt: 1,
- reconnect_failed: 1,
- reconnect_error: 1,
- reconnecting: 1,
- ping: 1,
- pong: 1
-};
+function isBuf(obj) {
+ return withNativeBuffer && global.Buffer.isBuffer(obj) || withNativeArrayBuffer && (obj instanceof global.ArrayBuffer || isView(obj));
+}
-/**
- * Shortcut to `Emitter#emit`.
- */
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],759:[function(require,module,exports){
+arguments[4][637][0].apply(exports,arguments)
+},{"./debug":760,"_process":704,"dup":637}],760:[function(require,module,exports){
+arguments[4][638][0].apply(exports,arguments)
+},{"dup":638,"ms":690}],761:[function(require,module,exports){
+arguments[4][650][0].apply(exports,arguments)
+},{"dup":650}],762:[function(require,module,exports){
+'use strict';
-var emit = Emitter.prototype.emit;
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
-/**
- * `Socket` constructor.
- *
- * @api public
- */
+module.exports = Stream;
-function Socket(io, nsp, opts) {
- this.io = io;
- this.nsp = nsp;
- this.json = this; // compat
- this.ids = 0;
- this.acks = {};
- this.receiveBuffer = [];
- this.sendBuffer = [];
- this.connected = false;
- this.disconnected = true;
- this.flags = {};
- if (opts && opts.query) {
- this.query = opts.query;
- }
- if (this.io.autoConnect) this.open();
-}
+var EE = require('events').EventEmitter;
+var inherits = require('inherits');
-/**
- * Mix in `Emitter`.
- */
+inherits(Stream, EE);
+Stream.Readable = require('readable-stream/readable.js');
+Stream.Writable = require('readable-stream/writable.js');
+Stream.Duplex = require('readable-stream/duplex.js');
+Stream.Transform = require('readable-stream/transform.js');
+Stream.PassThrough = require('readable-stream/passthrough.js');
-Emitter(Socket.prototype);
+// Backwards-compat with node 0.4.x
+Stream.Stream = Stream;
-/**
- * Subscribe to open, close and packet events
- *
- * @api private
- */
+// old-style streams. Note that the pipe method (the only relevant
+// part of this class) is overridden in the Readable class.
-Socket.prototype.subEvents = function () {
- if (this.subs) return;
+function Stream() {
+ EE.call(this);
+}
- var io = this.io;
- this.subs = [on(io, 'open', bind(this, 'onopen')), on(io, 'packet', bind(this, 'onpacket')), on(io, 'close', bind(this, 'onclose'))];
-};
+Stream.prototype.pipe = function (dest, options) {
+ var source = this;
-/**
- * "Opens" the socket.
- *
- * @api public
- */
+ function ondata(chunk) {
+ if (dest.writable) {
+ if (false === dest.write(chunk) && source.pause) {
+ source.pause();
+ }
+ }
+ }
-Socket.prototype.open = Socket.prototype.connect = function () {
- if (this.connected) return this;
+ source.on('data', ondata);
- this.subEvents();
- this.io.open(); // ensure open
- if ('open' === this.io.readyState) this.onopen();
- this.emit('connecting');
- return this;
-};
+ function ondrain() {
+ if (source.readable && source.resume) {
+ source.resume();
+ }
+ }
-/**
- * Sends a `message` event.
- *
- * @return {Socket} self
- * @api public
- */
+ dest.on('drain', ondrain);
-Socket.prototype.send = function () {
- var args = toArray(arguments);
- args.unshift('message');
- this.emit.apply(this, args);
- return this;
-};
+ // If the 'end' option is not supplied, dest.end() will be called when
+ // source gets the 'end' or 'close' events. Only dest.end() once.
+ if (!dest._isStdio && (!options || options.end !== false)) {
+ source.on('end', onend);
+ source.on('close', onclose);
+ }
-/**
- * Override `emit`.
- * If the event is in `events`, it's emitted normally.
- *
- * @param {String} event name
- * @return {Socket} self
- * @api public
- */
+ var didOnEnd = false;
+ function onend() {
+ if (didOnEnd) return;
+ didOnEnd = true;
-Socket.prototype.emit = function (ev) {
- if (events.hasOwnProperty(ev)) {
- emit.apply(this, arguments);
- return this;
+ dest.end();
}
- var args = toArray(arguments);
- var packet = {
- type: (this.flags.binary !== undefined ? this.flags.binary : hasBin(args)) ? parser.BINARY_EVENT : parser.EVENT,
- data: args
- };
-
- packet.options = {};
- packet.options.compress = !this.flags || false !== this.flags.compress;
+ function onclose() {
+ if (didOnEnd) return;
+ didOnEnd = true;
- // event ack callback
- if ('function' === typeof args[args.length - 1]) {
- debug('emitting packet with ack id %d', this.ids);
- this.acks[this.ids] = args.pop();
- packet.id = this.ids++;
+ if (typeof dest.destroy === 'function') dest.destroy();
}
- if (this.connected) {
- this.packet(packet);
- } else {
- this.sendBuffer.push(packet);
+ // don't leave dangling pipes when there are errors.
+ function onerror(er) {
+ cleanup();
+ if (EE.listenerCount(this, 'error') === 0) {
+ throw er; // Unhandled stream error in pipe.
+ }
}
- this.flags = {};
-
- return this;
-};
+ source.on('error', onerror);
+ dest.on('error', onerror);
-/**
- * Sends a packet.
- *
- * @param {Object} packet
- * @api private
- */
+ // remove all the event listeners that were added.
+ function cleanup() {
+ source.removeListener('data', ondata);
+ dest.removeListener('drain', ondrain);
-Socket.prototype.packet = function (packet) {
- packet.nsp = this.nsp;
- this.io.packet(packet);
-};
+ source.removeListener('end', onend);
+ source.removeListener('close', onclose);
-/**
- * Called upon engine `open`.
- *
- * @api private
- */
+ source.removeListener('error', onerror);
+ dest.removeListener('error', onerror);
-Socket.prototype.onopen = function () {
- debug('transport is open - connecting');
+ source.removeListener('end', cleanup);
+ source.removeListener('close', cleanup);
- // write connect packet if necessary
- if ('/' !== this.nsp) {
- if (this.query) {
- var query = _typeof(this.query) === 'object' ? parseqs.encode(this.query) : this.query;
- debug('sending connect packet with query %s', query);
- this.packet({ type: parser.CONNECT, query: query });
- } else {
- this.packet({ type: parser.CONNECT });
- }
+ dest.removeListener('close', cleanup);
}
-};
-/**
- * Called upon engine `close`.
- *
- * @param {String} reason
- * @api private
- */
+ source.on('end', cleanup);
+ source.on('close', cleanup);
-Socket.prototype.onclose = function (reason) {
- debug('close (%s)', reason);
- this.connected = false;
- this.disconnected = true;
- delete this.id;
- this.emit('disconnect', reason);
+ dest.on('close', cleanup);
+
+ dest.emit('pipe', source);
+
+ // Allow for unix-like usage: A.pipe(B).pipe(C)
+ return dest;
};
-/**
- * Called with socket packet.
- *
- * @param {Object} packet
- * @api private
- */
+},{"events":646,"inherits":671,"readable-stream/duplex.js":713,"readable-stream/passthrough.js":722,"readable-stream/readable.js":723,"readable-stream/transform.js":724,"readable-stream/writable.js":725}],763:[function(require,module,exports){
+'use strict';
-Socket.prototype.onpacket = function (packet) {
- var sameNamespace = packet.nsp === this.nsp;
- var rootNamespaceError = packet.type === parser.ERROR && packet.nsp === '/';
+// Generated by CoffeeScript 1.8.0
+(function () {
+ var ValueError,
+ create,
+ explicitToImplicit,
+ format,
+ implicitToExplicit,
+ lookup,
+ resolve,
+ __hasProp = {}.hasOwnProperty,
+ __extends = function __extends(child, parent) {
+ for (var key in parent) {
+ if (__hasProp.call(parent, key)) child[key] = parent[key];
+ }function ctor() {
+ this.constructor = child;
+ }ctor.prototype = parent.prototype;child.prototype = new ctor();child.__super__ = parent.prototype;return child;
+ },
+ __slice = [].slice;
- if (!sameNamespace && !rootNamespaceError) return;
+ ValueError = function (_super) {
+ __extends(ValueError, _super);
- switch (packet.type) {
- case parser.CONNECT:
- this.onconnect();
- break;
+ function ValueError(message) {
+ this.message = message;
+ }
- case parser.EVENT:
- this.onevent(packet);
- break;
+ ValueError.prototype.name = 'ValueError';
- case parser.BINARY_EVENT:
- this.onevent(packet);
- break;
+ return ValueError;
+ }(Error);
- case parser.ACK:
- this.onack(packet);
- break;
+ implicitToExplicit = 'cannot switch from implicit to explicit numbering';
- case parser.BINARY_ACK:
- this.onack(packet);
- break;
+ explicitToImplicit = 'cannot switch from explicit to implicit numbering';
- case parser.DISCONNECT:
- this.ondisconnect();
- break;
+ create = function create(transformers) {
+ if (transformers == null) {
+ transformers = {};
+ }
+ return function () {
+ var args, explicit, idx, implicit, message, template;
+ template = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+ idx = 0;
+ explicit = implicit = false;
+ message = 'cannot switch from {} to {} numbering';
+ return template.replace(/([{}])\1|[{](.*?)(?:!(.+?))?[}]/g, function (match, literal, key, transformer) {
+ var value, _ref, _ref1;
+ if (literal) {
+ return literal;
+ }
+ if (key.length) {
+ if (implicit) {
+ throw new ValueError(implicitToExplicit);
+ }
+ explicit = true;
+ value = (_ref = lookup(args, key)) != null ? _ref : '';
+ } else {
+ if (explicit) {
+ throw new ValueError(explicitToImplicit);
+ }
+ implicit = true;
+ value = (_ref1 = args[idx++]) != null ? _ref1 : '';
+ }
+ if (Object.prototype.hasOwnProperty.call(transformers, transformer)) {
+ return transformers[transformer](value);
+ } else {
+ return value;
+ }
+ });
+ };
+ };
- case parser.ERROR:
- this.emit('error', packet.data);
- break;
- }
-};
+ lookup = function lookup(object, key) {
+ var match;
+ if (!/^(\d+)([.]|$)/.test(key)) {
+ key = '0.' + key;
+ }
+ while (match = /(.+?)[.](.+)/.exec(key)) {
+ object = resolve(object, match[1]);
+ key = match[2];
+ }
+ return resolve(object, key);
+ };
-/**
- * Called upon a server event.
- *
- * @param {Object} packet
- * @api private
- */
+ resolve = function resolve(object, key) {
+ var value;
+ value = object[key];
+ if (typeof value === 'function') {
+ return value.call(object);
+ } else {
+ return value;
+ }
+ };
-Socket.prototype.onevent = function (packet) {
- var args = packet.data || [];
- debug('emitting event %j', args);
+ format = create({});
- if (null != packet.id) {
- debug('attaching ack callback to event');
- args.push(this.ack(packet.id));
- }
+ format.create = create;
- if (this.connected) {
- emit.apply(this, args);
+ format.extend = function (prototype, transformers) {
+ var $format;
+ $format = create(transformers);
+ prototype.format = function () {
+ return $format.apply(null, [this].concat(__slice.call(arguments)));
+ };
+ };
+
+ if (typeof module !== 'undefined') {
+ module.exports = format;
+ } else if (typeof define === 'function' && define.amd) {
+ define(format);
} else {
- this.receiveBuffer.push(args);
+ window.format = format;
}
-};
+}).call(undefined);
-/**
- * Produces an ack callback to emit with an event.
- *
- * @api private
- */
+},{}],764:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
-Socket.prototype.ack = function (id) {
- var self = this;
- var sent = false;
- return function () {
- // prevent double callbacks
- if (sent) return;
- sent = true;
- var args = toArray(arguments);
- debug('sending ack %j', args);
+'use strict';
- self.packet({
- type: hasBin(args) ? parser.BINARY_ACK : parser.ACK,
- id: id,
- data: args
- });
- };
-};
+/**/
-/**
- * Called upon a server acknowlegement.
- *
- * @param {Object} packet
- * @api private
- */
+var Buffer = require('safe-buffer').Buffer;
+/**/
-Socket.prototype.onack = function (packet) {
- var ack = this.acks[packet.id];
- if ('function' === typeof ack) {
- debug('calling ack %s with %j', packet.id, packet.data);
- ack.apply(this, packet.data);
- delete this.acks[packet.id];
- } else {
- debug('bad ack %s', packet.id);
+var isEncoding = Buffer.isEncoding || function (encoding) {
+ encoding = '' + encoding;
+ switch (encoding && encoding.toLowerCase()) {
+ case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':
+ return true;
+ default:
+ return false;
}
};
-/**
- * Called upon server connect.
- *
- * @api private
- */
-
-Socket.prototype.onconnect = function () {
- this.connected = true;
- this.disconnected = false;
- this.emit('connect');
- this.emitBuffered();
+function _normalizeEncoding(enc) {
+ if (!enc) return 'utf8';
+ var retried;
+ while (true) {
+ switch (enc) {
+ case 'utf8':
+ case 'utf-8':
+ return 'utf8';
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return 'utf16le';
+ case 'latin1':
+ case 'binary':
+ return 'latin1';
+ case 'base64':
+ case 'ascii':
+ case 'hex':
+ return enc;
+ default:
+ if (retried) return; // undefined
+ enc = ('' + enc).toLowerCase();
+ retried = true;
+ }
+ }
};
-/**
- * Emit buffered events (received and emitted).
- *
- * @api private
- */
+// Do not cache `Buffer.isEncoding` when checking encoding names as some
+// modules monkey-patch it to support additional encodings
+function normalizeEncoding(enc) {
+ var nenc = _normalizeEncoding(enc);
+ if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);
+ return nenc || enc;
+}
-Socket.prototype.emitBuffered = function () {
- var i;
- for (i = 0; i < this.receiveBuffer.length; i++) {
- emit.apply(this, this.receiveBuffer[i]);
+// StringDecoder provides an interface for efficiently splitting a series of
+// buffers into a series of JS strings without breaking apart multi-byte
+// characters.
+exports.StringDecoder = StringDecoder;
+function StringDecoder(encoding) {
+ this.encoding = normalizeEncoding(encoding);
+ var nb;
+ switch (this.encoding) {
+ case 'utf16le':
+ this.text = utf16Text;
+ this.end = utf16End;
+ nb = 4;
+ break;
+ case 'utf8':
+ this.fillLast = utf8FillLast;
+ nb = 4;
+ break;
+ case 'base64':
+ this.text = base64Text;
+ this.end = base64End;
+ nb = 3;
+ break;
+ default:
+ this.write = simpleWrite;
+ this.end = simpleEnd;
+ return;
}
- this.receiveBuffer = [];
+ this.lastNeed = 0;
+ this.lastTotal = 0;
+ this.lastChar = Buffer.allocUnsafe(nb);
+}
- for (i = 0; i < this.sendBuffer.length; i++) {
- this.packet(this.sendBuffer[i]);
+StringDecoder.prototype.write = function (buf) {
+ if (buf.length === 0) return '';
+ var r;
+ var i;
+ if (this.lastNeed) {
+ r = this.fillLast(buf);
+ if (r === undefined) return '';
+ i = this.lastNeed;
+ this.lastNeed = 0;
+ } else {
+ i = 0;
}
- this.sendBuffer = [];
+ if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);
+ return r || '';
};
-/**
- * Called upon server disconnect.
- *
- * @api private
- */
-
-Socket.prototype.ondisconnect = function () {
- debug('server disconnect (%s)', this.nsp);
- this.destroy();
- this.onclose('io server disconnect');
-};
+StringDecoder.prototype.end = utf8End;
-/**
- * Called upon forced client/server side disconnections,
- * this method ensures the manager stops tracking us and
- * that reconnections don't get triggered for this.
- *
- * @api private.
- */
+// Returns only complete characters in a Buffer
+StringDecoder.prototype.text = utf8Text;
-Socket.prototype.destroy = function () {
- if (this.subs) {
- // clean subscriptions to avoid reconnections
- for (var i = 0; i < this.subs.length; i++) {
- this.subs[i].destroy();
- }
- this.subs = null;
+// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
+StringDecoder.prototype.fillLast = function (buf) {
+ if (this.lastNeed <= buf.length) {
+ buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
+ return this.lastChar.toString(this.encoding, 0, this.lastTotal);
}
-
- this.io.destroy(this);
+ buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
+ this.lastNeed -= buf.length;
};
-/**
- * Disconnects the socket manually.
- *
- * @return {Socket} self
- * @api public
- */
+// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
+// continuation byte. If an invalid byte is detected, -2 is returned.
+function utf8CheckByte(byte) {
+ if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
+ return byte >> 6 === 0x02 ? -1 : -2;
+}
-Socket.prototype.close = Socket.prototype.disconnect = function () {
- if (this.connected) {
- debug('performing disconnect (%s)', this.nsp);
- this.packet({ type: parser.DISCONNECT });
+// Checks at most 3 bytes at the end of a Buffer in order to detect an
+// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
+// needed to complete the UTF-8 character (if applicable) are returned.
+function utf8CheckIncomplete(self, buf, i) {
+ var j = buf.length - 1;
+ if (j < i) return 0;
+ var nb = utf8CheckByte(buf[j]);
+ if (nb >= 0) {
+ if (nb > 0) self.lastNeed = nb - 1;
+ return nb;
}
-
- // remove socket from pool
- this.destroy();
-
- if (this.connected) {
- // fire events
- this.onclose('io client disconnect');
+ if (--j < i || nb === -2) return 0;
+ nb = utf8CheckByte(buf[j]);
+ if (nb >= 0) {
+ if (nb > 0) self.lastNeed = nb - 2;
+ return nb;
}
- return this;
-};
-
-/**
- * Sets the compress flag.
- *
- * @param {Boolean} if `true`, compresses the sending data
- * @return {Socket} self
- * @api public
- */
-
-Socket.prototype.compress = function (compress) {
- this.flags.compress = compress;
- return this;
-};
-
-/**
- * Sets the binary flag
- *
- * @param {Boolean} whether the emitted data contains binary
- * @return {Socket} self
- * @api public
- */
-
-Socket.prototype.binary = function (binary) {
- this.flags.binary = binary;
- return this;
-};
-
-},{"./on":753,"component-bind":264,"component-emitter":265,"debug":756,"has-binary2":649,"parseqs":696,"socket.io-parser":759,"to-array":768}],755:[function(require,module,exports){
-(function (global){
-'use strict';
-
-/**
- * Module dependencies.
- */
-
-var parseuri = require('parseuri');
-var debug = require('debug')('socket.io-client:url');
-
-/**
- * Module exports.
- */
-
-module.exports = url;
+ if (--j < i || nb === -2) return 0;
+ nb = utf8CheckByte(buf[j]);
+ if (nb >= 0) {
+ if (nb > 0) {
+ if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
+ }
+ return nb;
+ }
+ return 0;
+}
-/**
- * URL parser.
- *
- * @param {String} url
- * @param {Object} An object meant to mimic window.location.
- * Defaults to window.location.
- * @api public
- */
+// Validates as many continuation bytes for a multi-byte UTF-8 character as
+// needed or are available. If we see a non-continuation byte where we expect
+// one, we "replace" the validated continuation bytes we've seen so far with
+// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding
+// behavior. The continuation byte check is included three times in the case
+// where all of the continuation bytes for a character exist in the same buffer.
+// It is also done this way as a slight performance increase instead of using a
+// loop.
+function utf8CheckExtraBytes(self, buf, p) {
+ if ((buf[0] & 0xC0) !== 0x80) {
+ self.lastNeed = 0;
+ return '\uFFFD';
+ }
+ if (self.lastNeed > 1 && buf.length > 1) {
+ if ((buf[1] & 0xC0) !== 0x80) {
+ self.lastNeed = 1;
+ return '\uFFFD';
+ }
+ if (self.lastNeed > 2 && buf.length > 2) {
+ if ((buf[2] & 0xC0) !== 0x80) {
+ self.lastNeed = 2;
+ return '\uFFFD';
+ }
+ }
+ }
+}
-function url(uri, loc) {
- var obj = uri;
+// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
+function utf8FillLast(buf) {
+ var p = this.lastTotal - this.lastNeed;
+ var r = utf8CheckExtraBytes(this, buf, p);
+ if (r !== undefined) return r;
+ if (this.lastNeed <= buf.length) {
+ buf.copy(this.lastChar, p, 0, this.lastNeed);
+ return this.lastChar.toString(this.encoding, 0, this.lastTotal);
+ }
+ buf.copy(this.lastChar, p, 0, buf.length);
+ this.lastNeed -= buf.length;
+}
- // default to window.location
- loc = loc || global.location;
- if (null == uri) uri = loc.protocol + '//' + loc.host;
+// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
+// partial character, the character's bytes are buffered until the required
+// number of bytes are available.
+function utf8Text(buf, i) {
+ var total = utf8CheckIncomplete(this, buf, i);
+ if (!this.lastNeed) return buf.toString('utf8', i);
+ this.lastTotal = total;
+ var end = buf.length - (total - this.lastNeed);
+ buf.copy(this.lastChar, 0, end);
+ return buf.toString('utf8', i, end);
+}
- // relative path support
- if ('string' === typeof uri) {
- if ('/' === uri.charAt(0)) {
- if ('/' === uri.charAt(1)) {
- uri = loc.protocol + uri;
- } else {
- uri = loc.host + uri;
- }
- }
+// For UTF-8, a replacement character is added when ending on a partial
+// character.
+function utf8End(buf) {
+ var r = buf && buf.length ? this.write(buf) : '';
+ if (this.lastNeed) return r + '\uFFFD';
+ return r;
+}
- if (!/^(https?|wss?):\/\//.test(uri)) {
- debug('protocol-less url %s', uri);
- if ('undefined' !== typeof loc) {
- uri = loc.protocol + '//' + uri;
- } else {
- uri = 'https://' + uri;
+// UTF-16LE typically needs two bytes per character, but even if we have an even
+// number of bytes available, we need to check if we end on a leading/high
+// surrogate. In that case, we need to wait for the next two bytes in order to
+// decode the last character properly.
+function utf16Text(buf, i) {
+ if ((buf.length - i) % 2 === 0) {
+ var r = buf.toString('utf16le', i);
+ if (r) {
+ var c = r.charCodeAt(r.length - 1);
+ if (c >= 0xD800 && c <= 0xDBFF) {
+ this.lastNeed = 2;
+ this.lastTotal = 4;
+ this.lastChar[0] = buf[buf.length - 2];
+ this.lastChar[1] = buf[buf.length - 1];
+ return r.slice(0, -1);
}
}
-
- // parse
- debug('parse %s', uri);
- obj = parseuri(uri);
+ return r;
}
+ this.lastNeed = 1;
+ this.lastTotal = 2;
+ this.lastChar[0] = buf[buf.length - 1];
+ return buf.toString('utf16le', i, buf.length - 1);
+}
- // make sure we treat `localhost:80` and `localhost` equally
- if (!obj.port) {
- if (/^(http|ws)$/.test(obj.protocol)) {
- obj.port = '80';
- } else if (/^(http|ws)s$/.test(obj.protocol)) {
- obj.port = '443';
- }
+// For UTF-16LE we do not explicitly append special replacement characters if we
+// end on a partial character, we simply let v8 handle that.
+function utf16End(buf) {
+ var r = buf && buf.length ? this.write(buf) : '';
+ if (this.lastNeed) {
+ var end = this.lastTotal - this.lastNeed;
+ return r + this.lastChar.toString('utf16le', 0, end);
}
+ return r;
+}
- obj.path = obj.path || '/';
+function base64Text(buf, i) {
+ var n = (buf.length - i) % 3;
+ if (n === 0) return buf.toString('base64', i);
+ this.lastNeed = 3 - n;
+ this.lastTotal = 3;
+ if (n === 1) {
+ this.lastChar[0] = buf[buf.length - 1];
+ } else {
+ this.lastChar[0] = buf[buf.length - 2];
+ this.lastChar[1] = buf[buf.length - 1];
+ }
+ return buf.toString('base64', i, buf.length - n);
+}
- var ipv6 = obj.host.indexOf(':') !== -1;
- var host = ipv6 ? '[' + obj.host + ']' : obj.host;
+function base64End(buf) {
+ var r = buf && buf.length ? this.write(buf) : '';
+ if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
+ return r;
+}
- // define unique id
- obj.id = obj.protocol + '://' + host + ':' + obj.port;
- // define href
- obj.href = obj.protocol + '://' + host + (loc && loc.port === obj.port ? '' : ':' + obj.port);
+// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
+function simpleWrite(buf) {
+ return buf.toString(this.encoding);
+}
- return obj;
+function simpleEnd(buf) {
+ return buf && buf.length ? this.write(buf) : '';
}
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"debug":756,"parseuri":697}],756:[function(require,module,exports){
-arguments[4][637][0].apply(exports,arguments)
-},{"./debug":757,"_process":704,"dup":637}],757:[function(require,module,exports){
-arguments[4][638][0].apply(exports,arguments)
-},{"dup":638,"ms":690}],758:[function(require,module,exports){
-(function (global){
+},{"safe-buffer":728}],765:[function(require,module,exports){
'use strict';
-var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
-
-/*global Blob,File*/
-
-/**
- * Module requirements
- */
-
-var isArray = require('isarray');
-var isBuf = require('./is-buffer');
-var toString = Object.prototype.toString;
-var withNativeBlob = typeof global.Blob === 'function' || toString.call(global.Blob) === '[object BlobConstructor]';
-var withNativeFile = typeof global.File === 'function' || toString.call(global.File) === '[object FileConstructor]';
+var isHexPrefixed = require('is-hex-prefixed');
/**
- * Replaces every Buffer | ArrayBuffer in packet with a numbered placeholder.
- * Anything with blobs or files should be fed through removeBlobs before coming
- * here.
- *
- * @param {Object} packet - socket.io event packet
- * @return {Object} with deconstructed packet and list of buffers
- * @api public
+ * Removes '0x' from a given `String` is present
+ * @param {String} str the string value
+ * @return {String|Optional} a string by pass if necessary
*/
+module.exports = function stripHexPrefix(str) {
+ if (typeof str !== 'string') {
+ return str;
+ }
-exports.deconstructPacket = function (packet) {
- var buffers = [];
- var packetData = packet.data;
- var pack = packet;
- pack.data = _deconstructPacket(packetData, buffers);
- pack.attachments = buffers.length; // number of binary 'attachments'
- return { packet: pack, buffers: buffers };
+ return isHexPrefixed(str) ? str.slice(2) : str;
};
-function _deconstructPacket(data, buffers) {
- if (!data) return data;
-
- if (isBuf(data)) {
- var placeholder = { _placeholder: true, num: buffers.length };
- buffers.push(data);
- return placeholder;
- } else if (isArray(data)) {
- var newData = new Array(data.length);
- for (var i = 0; i < data.length; i++) {
- newData[i] = _deconstructPacket(data[i], buffers);
- }
- return newData;
- } else if ((typeof data === 'undefined' ? 'undefined' : _typeof(data)) === 'object' && !(data instanceof Date)) {
- var newData = {};
- for (var key in data) {
- newData[key] = _deconstructPacket(data[key], buffers);
- }
- return newData;
- }
- return data;
-}
+},{"is-hex-prefixed":673}],766:[function(require,module,exports){
+"use strict";
-/**
- * Reconstructs a binary packet from its placeholder packet and buffers
- *
- * @param {Object} packet - event packet with placeholders
- * @param {Array} buffers - binary buffers to put in placeholder positions
- * @return {Object} reconstructed packet
- * @api public
- */
+module.exports = toArray;
-exports.reconstructPacket = function (packet, buffers) {
- packet.data = _reconstructPacket(packet.data, buffers);
- packet.attachments = undefined; // no longer useful
- return packet;
-};
+function toArray(list, index) {
+ var array = [];
-function _reconstructPacket(data, buffers) {
- if (!data) return data;
+ index = index || 0;
- if (data && data._placeholder) {
- return buffers[data.num]; // appropriate buffer (should be natural order anyway)
- } else if (isArray(data)) {
- for (var i = 0; i < data.length; i++) {
- data[i] = _reconstructPacket(data[i], buffers);
- }
- } else if ((typeof data === 'undefined' ? 'undefined' : _typeof(data)) === 'object') {
- for (var key in data) {
- data[key] = _reconstructPacket(data[key], buffers);
+ for (var i = index || 0; i < list.length; i++) {
+ array[i - index] = list[i];
}
- }
- return data;
+ return array;
}
-/**
- * Asynchronously removes Blobs or Files from data via
- * FileReader's readAsArrayBuffer method. Used before encoding
- * data as msgpack. Calls callback with the blobless data.
- *
- * @param {Object} data
- * @param {Function} callback
- * @api private
- */
-
-exports.removeBlobs = function (data, callback) {
- function _removeBlobs(obj, curKey, containingObject) {
- if (!obj) return obj;
+},{}],767:[function(require,module,exports){
+"use strict";
- // convert any blob
- if (withNativeBlob && obj instanceof Blob || withNativeFile && obj instanceof File) {
- pendingBlobs++;
+module.exports = { 97: { "value": "0061", "name": "LATIN SMALL LETTER A", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0041", "lowercase_mapping": "", "titlecase_mapping": "0041", "symbol": "\x61" }, 98: { "value": "0062", "name": "LATIN SMALL LETTER B", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0042", "lowercase_mapping": "", "titlecase_mapping": "0042", "symbol": "\x62" }, 99: { "value": "0063", "name": "LATIN SMALL LETTER C", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0043", "lowercase_mapping": "", "titlecase_mapping": "0043", "symbol": "\x63" }, 100: { "value": "0064", "name": "LATIN SMALL LETTER D", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0044", "lowercase_mapping": "", "titlecase_mapping": "0044", "symbol": "\x64" }, 101: { "value": "0065", "name": "LATIN SMALL LETTER E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0045", "lowercase_mapping": "", "titlecase_mapping": "0045", "symbol": "\x65" }, 102: { "value": "0066", "name": "LATIN SMALL LETTER F", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0046", "lowercase_mapping": "", "titlecase_mapping": "0046", "symbol": "\x66" }, 103: { "value": "0067", "name": "LATIN SMALL LETTER G", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0047", "lowercase_mapping": "", "titlecase_mapping": "0047", "symbol": "\x67" }, 104: { "value": "0068", "name": "LATIN SMALL LETTER H", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0048", "lowercase_mapping": "", "titlecase_mapping": "0048", "symbol": "\x68" }, 105: { "value": "0069", "name": "LATIN SMALL LETTER I", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0049", "lowercase_mapping": "", "titlecase_mapping": "0049", "symbol": "\x69" }, 106: { "value": "006A", "name": "LATIN SMALL LETTER J", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "004A", "lowercase_mapping": "", "titlecase_mapping": "004A", "symbol": "\x6A" }, 107: { "value": "006B", "name": "LATIN SMALL LETTER K", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "004B", "lowercase_mapping": "", "titlecase_mapping": "004B", "symbol": "\x6B" }, 108: { "value": "006C", "name": "LATIN SMALL LETTER L", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "004C", "lowercase_mapping": "", "titlecase_mapping": "004C", "symbol": "\x6C" }, 109: { "value": "006D", "name": "LATIN SMALL LETTER M", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "004D", "lowercase_mapping": "", "titlecase_mapping": "004D", "symbol": "\x6D" }, 110: { "value": "006E", "name": "LATIN SMALL LETTER N", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "004E", "lowercase_mapping": "", "titlecase_mapping": "004E", "symbol": "\x6E" }, 111: { "value": "006F", "name": "LATIN SMALL LETTER O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "004F", "lowercase_mapping": "", "titlecase_mapping": "004F", "symbol": "\x6F" }, 112: { "value": "0070", "name": "LATIN SMALL LETTER P", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0050", "lowercase_mapping": "", "titlecase_mapping": "0050", "symbol": "\x70" }, 113: { "value": "0071", "name": "LATIN SMALL LETTER Q", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0051", "lowercase_mapping": "", "titlecase_mapping": "0051", "symbol": "\x71" }, 114: { "value": "0072", "name": "LATIN SMALL LETTER R", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0052", "lowercase_mapping": "", "titlecase_mapping": "0052", "symbol": "\x72" }, 115: { "value": "0073", "name": "LATIN SMALL LETTER S", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0053", "lowercase_mapping": "", "titlecase_mapping": "0053", "symbol": "\x73" }, 116: { "value": "0074", "name": "LATIN SMALL LETTER T", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0054", "lowercase_mapping": "", "titlecase_mapping": "0054", "symbol": "\x74" }, 117: { "value": "0075", "name": "LATIN SMALL LETTER U", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0055", "lowercase_mapping": "", "titlecase_mapping": "0055", "symbol": "\x75" }, 118: { "value": "0076", "name": "LATIN SMALL LETTER V", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0056", "lowercase_mapping": "", "titlecase_mapping": "0056", "symbol": "\x76" }, 119: { "value": "0077", "name": "LATIN SMALL LETTER W", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0057", "lowercase_mapping": "", "titlecase_mapping": "0057", "symbol": "\x77" }, 120: { "value": "0078", "name": "LATIN SMALL LETTER X", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0058", "lowercase_mapping": "", "titlecase_mapping": "0058", "symbol": "\x78" }, 121: { "value": "0079", "name": "LATIN SMALL LETTER Y", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0059", "lowercase_mapping": "", "titlecase_mapping": "0059", "symbol": "\x79" }, 122: { "value": "007A", "name": "LATIN SMALL LETTER Z", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "005A", "lowercase_mapping": "", "titlecase_mapping": "005A", "symbol": "\x7A" }, 181: { "value": "00B5", "name": "MICRO SIGN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 03BC", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "039C", "lowercase_mapping": "", "titlecase_mapping": "039C", "symbol": "\xB5" }, 223: { "value": "00DF", "name": "LATIN SMALL LETTER SHARP S", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\xDF" }, 224: { "value": "00E0", "name": "LATIN SMALL LETTER A WITH GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0061 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER A GRAVE", "comment": "", "uppercase_mapping": "00C0", "lowercase_mapping": "", "titlecase_mapping": "00C0", "symbol": "\xE0" }, 225: { "value": "00E1", "name": "LATIN SMALL LETTER A WITH ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0061 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER A ACUTE", "comment": "", "uppercase_mapping": "00C1", "lowercase_mapping": "", "titlecase_mapping": "00C1", "symbol": "\xE1" }, 226: { "value": "00E2", "name": "LATIN SMALL LETTER A WITH CIRCUMFLEX", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0061 0302", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER A CIRCUMFLEX", "comment": "", "uppercase_mapping": "00C2", "lowercase_mapping": "", "titlecase_mapping": "00C2", "symbol": "\xE2" }, 227: { "value": "00E3", "name": "LATIN SMALL LETTER A WITH TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0061 0303", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER A TILDE", "comment": "", "uppercase_mapping": "00C3", "lowercase_mapping": "", "titlecase_mapping": "00C3", "symbol": "\xE3" }, 228: { "value": "00E4", "name": "LATIN SMALL LETTER A WITH DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0061 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER A DIAERESIS", "comment": "", "uppercase_mapping": "00C4", "lowercase_mapping": "", "titlecase_mapping": "00C4", "symbol": "\xE4" }, 229: { "value": "00E5", "name": "LATIN SMALL LETTER A WITH RING ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0061 030A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER A RING", "comment": "", "uppercase_mapping": "00C5", "lowercase_mapping": "", "titlecase_mapping": "00C5", "symbol": "\xE5" }, 230: { "value": "00E6", "name": "LATIN SMALL LETTER AE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER A E", "comment": "", "uppercase_mapping": "00C6", "lowercase_mapping": "", "titlecase_mapping": "00C6", "symbol": "\xE6" }, 231: { "value": "00E7", "name": "LATIN SMALL LETTER C WITH CEDILLA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0063 0327", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER C CEDILLA", "comment": "", "uppercase_mapping": "00C7", "lowercase_mapping": "", "titlecase_mapping": "00C7", "symbol": "\xE7" }, 232: { "value": "00E8", "name": "LATIN SMALL LETTER E WITH GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0065 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER E GRAVE", "comment": "", "uppercase_mapping": "00C8", "lowercase_mapping": "", "titlecase_mapping": "00C8", "symbol": "\xE8" }, 233: { "value": "00E9", "name": "LATIN SMALL LETTER E WITH ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0065 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER E ACUTE", "comment": "", "uppercase_mapping": "00C9", "lowercase_mapping": "", "titlecase_mapping": "00C9", "symbol": "\xE9" }, 234: { "value": "00EA", "name": "LATIN SMALL LETTER E WITH CIRCUMFLEX", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0065 0302", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER E CIRCUMFLEX", "comment": "", "uppercase_mapping": "00CA", "lowercase_mapping": "", "titlecase_mapping": "00CA", "symbol": "\xEA" }, 235: { "value": "00EB", "name": "LATIN SMALL LETTER E WITH DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0065 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER E DIAERESIS", "comment": "", "uppercase_mapping": "00CB", "lowercase_mapping": "", "titlecase_mapping": "00CB", "symbol": "\xEB" }, 236: { "value": "00EC", "name": "LATIN SMALL LETTER I WITH GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0069 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER I GRAVE", "comment": "", "uppercase_mapping": "00CC", "lowercase_mapping": "", "titlecase_mapping": "00CC", "symbol": "\xEC" }, 237: { "value": "00ED", "name": "LATIN SMALL LETTER I WITH ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0069 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER I ACUTE", "comment": "", "uppercase_mapping": "00CD", "lowercase_mapping": "", "titlecase_mapping": "00CD", "symbol": "\xED" }, 238: { "value": "00EE", "name": "LATIN SMALL LETTER I WITH CIRCUMFLEX", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0069 0302", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER I CIRCUMFLEX", "comment": "", "uppercase_mapping": "00CE", "lowercase_mapping": "", "titlecase_mapping": "00CE", "symbol": "\xEE" }, 239: { "value": "00EF", "name": "LATIN SMALL LETTER I WITH DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0069 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER I DIAERESIS", "comment": "", "uppercase_mapping": "00CF", "lowercase_mapping": "", "titlecase_mapping": "00CF", "symbol": "\xEF" }, 240: { "value": "00F0", "name": "LATIN SMALL LETTER ETH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "00D0", "lowercase_mapping": "", "titlecase_mapping": "00D0", "symbol": "\xF0" }, 241: { "value": "00F1", "name": "LATIN SMALL LETTER N WITH TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006E 0303", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER N TILDE", "comment": "", "uppercase_mapping": "00D1", "lowercase_mapping": "", "titlecase_mapping": "00D1", "symbol": "\xF1" }, 242: { "value": "00F2", "name": "LATIN SMALL LETTER O WITH GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006F 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER O GRAVE", "comment": "", "uppercase_mapping": "00D2", "lowercase_mapping": "", "titlecase_mapping": "00D2", "symbol": "\xF2" }, 243: { "value": "00F3", "name": "LATIN SMALL LETTER O WITH ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006F 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER O ACUTE", "comment": "", "uppercase_mapping": "00D3", "lowercase_mapping": "", "titlecase_mapping": "00D3", "symbol": "\xF3" }, 244: { "value": "00F4", "name": "LATIN SMALL LETTER O WITH CIRCUMFLEX", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006F 0302", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER O CIRCUMFLEX", "comment": "", "uppercase_mapping": "00D4", "lowercase_mapping": "", "titlecase_mapping": "00D4", "symbol": "\xF4" }, 245: { "value": "00F5", "name": "LATIN SMALL LETTER O WITH TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006F 0303", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER O TILDE", "comment": "", "uppercase_mapping": "00D5", "lowercase_mapping": "", "titlecase_mapping": "00D5", "symbol": "\xF5" }, 246: { "value": "00F6", "name": "LATIN SMALL LETTER O WITH DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006F 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER O DIAERESIS", "comment": "", "uppercase_mapping": "00D6", "lowercase_mapping": "", "titlecase_mapping": "00D6", "symbol": "\xF6" }, 248: { "value": "00F8", "name": "LATIN SMALL LETTER O WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER O SLASH", "comment": "", "uppercase_mapping": "00D8", "lowercase_mapping": "", "titlecase_mapping": "00D8", "symbol": "\xF8" }, 249: { "value": "00F9", "name": "LATIN SMALL LETTER U WITH GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0075 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER U GRAVE", "comment": "", "uppercase_mapping": "00D9", "lowercase_mapping": "", "titlecase_mapping": "00D9", "symbol": "\xF9" }, 250: { "value": "00FA", "name": "LATIN SMALL LETTER U WITH ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0075 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER U ACUTE", "comment": "", "uppercase_mapping": "00DA", "lowercase_mapping": "", "titlecase_mapping": "00DA", "symbol": "\xFA" }, 251: { "value": "00FB", "name": "LATIN SMALL LETTER U WITH CIRCUMFLEX", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0075 0302", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER U CIRCUMFLEX", "comment": "", "uppercase_mapping": "00DB", "lowercase_mapping": "", "titlecase_mapping": "00DB", "symbol": "\xFB" }, 252: { "value": "00FC", "name": "LATIN SMALL LETTER U WITH DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0075 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER U DIAERESIS", "comment": "", "uppercase_mapping": "00DC", "lowercase_mapping": "", "titlecase_mapping": "00DC", "symbol": "\xFC" }, 253: { "value": "00FD", "name": "LATIN SMALL LETTER Y WITH ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0079 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER Y ACUTE", "comment": "", "uppercase_mapping": "00DD", "lowercase_mapping": "", "titlecase_mapping": "00DD", "symbol": "\xFD" }, 254: { "value": "00FE", "name": "LATIN SMALL LETTER THORN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "00DE", "lowercase_mapping": "", "titlecase_mapping": "00DE", "symbol": "\xFE" }, 255: { "value": "00FF", "name": "LATIN SMALL LETTER Y WITH DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0079 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER Y DIAERESIS", "comment": "", "uppercase_mapping": "0178", "lowercase_mapping": "", "titlecase_mapping": "0178", "symbol": "\xFF" }, 257: { "value": "0101", "name": "LATIN SMALL LETTER A WITH MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0061 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER A MACRON", "comment": "", "uppercase_mapping": "0100", "lowercase_mapping": "", "titlecase_mapping": "0100", "symbol": "\u0101" }, 259: { "value": "0103", "name": "LATIN SMALL LETTER A WITH BREVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0061 0306", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER A BREVE", "comment": "", "uppercase_mapping": "0102", "lowercase_mapping": "", "titlecase_mapping": "0102", "symbol": "\u0103" }, 261: { "value": "0105", "name": "LATIN SMALL LETTER A WITH OGONEK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0061 0328", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER A OGONEK", "comment": "", "uppercase_mapping": "0104", "lowercase_mapping": "", "titlecase_mapping": "0104", "symbol": "\u0105" }, 263: { "value": "0107", "name": "LATIN SMALL LETTER C WITH ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0063 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER C ACUTE", "comment": "", "uppercase_mapping": "0106", "lowercase_mapping": "", "titlecase_mapping": "0106", "symbol": "\u0107" }, 265: { "value": "0109", "name": "LATIN SMALL LETTER C WITH CIRCUMFLEX", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0063 0302", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER C CIRCUMFLEX", "comment": "", "uppercase_mapping": "0108", "lowercase_mapping": "", "titlecase_mapping": "0108", "symbol": "\u0109" }, 267: { "value": "010B", "name": "LATIN SMALL LETTER C WITH DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0063 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER C DOT", "comment": "", "uppercase_mapping": "010A", "lowercase_mapping": "", "titlecase_mapping": "010A", "symbol": "\u010B" }, 269: { "value": "010D", "name": "LATIN SMALL LETTER C WITH CARON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0063 030C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER C HACEK", "comment": "", "uppercase_mapping": "010C", "lowercase_mapping": "", "titlecase_mapping": "010C", "symbol": "\u010D" }, 271: { "value": "010F", "name": "LATIN SMALL LETTER D WITH CARON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0064 030C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER D HACEK", "comment": "", "uppercase_mapping": "010E", "lowercase_mapping": "", "titlecase_mapping": "010E", "symbol": "\u010F" }, 273: { "value": "0111", "name": "LATIN SMALL LETTER D WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER D BAR", "comment": "", "uppercase_mapping": "0110", "lowercase_mapping": "", "titlecase_mapping": "0110", "symbol": "\u0111" }, 275: { "value": "0113", "name": "LATIN SMALL LETTER E WITH MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0065 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER E MACRON", "comment": "", "uppercase_mapping": "0112", "lowercase_mapping": "", "titlecase_mapping": "0112", "symbol": "\u0113" }, 277: { "value": "0115", "name": "LATIN SMALL LETTER E WITH BREVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0065 0306", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER E BREVE", "comment": "", "uppercase_mapping": "0114", "lowercase_mapping": "", "titlecase_mapping": "0114", "symbol": "\u0115" }, 279: { "value": "0117", "name": "LATIN SMALL LETTER E WITH DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0065 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER E DOT", "comment": "", "uppercase_mapping": "0116", "lowercase_mapping": "", "titlecase_mapping": "0116", "symbol": "\u0117" }, 281: { "value": "0119", "name": "LATIN SMALL LETTER E WITH OGONEK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0065 0328", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER E OGONEK", "comment": "", "uppercase_mapping": "0118", "lowercase_mapping": "", "titlecase_mapping": "0118", "symbol": "\u0119" }, 283: { "value": "011B", "name": "LATIN SMALL LETTER E WITH CARON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0065 030C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER E HACEK", "comment": "", "uppercase_mapping": "011A", "lowercase_mapping": "", "titlecase_mapping": "011A", "symbol": "\u011B" }, 285: { "value": "011D", "name": "LATIN SMALL LETTER G WITH CIRCUMFLEX", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0067 0302", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER G CIRCUMFLEX", "comment": "", "uppercase_mapping": "011C", "lowercase_mapping": "", "titlecase_mapping": "011C", "symbol": "\u011D" }, 287: { "value": "011F", "name": "LATIN SMALL LETTER G WITH BREVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0067 0306", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER G BREVE", "comment": "", "uppercase_mapping": "011E", "lowercase_mapping": "", "titlecase_mapping": "011E", "symbol": "\u011F" }, 289: { "value": "0121", "name": "LATIN SMALL LETTER G WITH DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0067 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER G DOT", "comment": "", "uppercase_mapping": "0120", "lowercase_mapping": "", "titlecase_mapping": "0120", "symbol": "\u0121" }, 291: { "value": "0123", "name": "LATIN SMALL LETTER G WITH CEDILLA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0067 0327", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER G CEDILLA", "comment": "", "uppercase_mapping": "0122", "lowercase_mapping": "", "titlecase_mapping": "0122", "symbol": "\u0123" }, 293: { "value": "0125", "name": "LATIN SMALL LETTER H WITH CIRCUMFLEX", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0068 0302", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER H CIRCUMFLEX", "comment": "", "uppercase_mapping": "0124", "lowercase_mapping": "", "titlecase_mapping": "0124", "symbol": "\u0125" }, 295: { "value": "0127", "name": "LATIN SMALL LETTER H WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER H BAR", "comment": "", "uppercase_mapping": "0126", "lowercase_mapping": "", "titlecase_mapping": "0126", "symbol": "\u0127" }, 297: { "value": "0129", "name": "LATIN SMALL LETTER I WITH TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0069 0303", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER I TILDE", "comment": "", "uppercase_mapping": "0128", "lowercase_mapping": "", "titlecase_mapping": "0128", "symbol": "\u0129" }, 299: { "value": "012B", "name": "LATIN SMALL LETTER I WITH MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0069 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER I MACRON", "comment": "", "uppercase_mapping": "012A", "lowercase_mapping": "", "titlecase_mapping": "012A", "symbol": "\u012B" }, 301: { "value": "012D", "name": "LATIN SMALL LETTER I WITH BREVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0069 0306", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER I BREVE", "comment": "", "uppercase_mapping": "012C", "lowercase_mapping": "", "titlecase_mapping": "012C", "symbol": "\u012D" }, 303: { "value": "012F", "name": "LATIN SMALL LETTER I WITH OGONEK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0069 0328", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER I OGONEK", "comment": "", "uppercase_mapping": "012E", "lowercase_mapping": "", "titlecase_mapping": "012E", "symbol": "\u012F" }, 305: { "value": "0131", "name": "LATIN SMALL LETTER DOTLESS I", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0049", "lowercase_mapping": "", "titlecase_mapping": "0049", "symbol": "\u0131" }, 307: { "value": "0133", "name": "LATIN SMALL LIGATURE IJ", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0069 006A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER I J", "comment": "", "uppercase_mapping": "0132", "lowercase_mapping": "", "titlecase_mapping": "0132", "symbol": "\u0133" }, 309: { "value": "0135", "name": "LATIN SMALL LETTER J WITH CIRCUMFLEX", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006A 0302", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER J CIRCUMFLEX", "comment": "", "uppercase_mapping": "0134", "lowercase_mapping": "", "titlecase_mapping": "0134", "symbol": "\u0135" }, 311: { "value": "0137", "name": "LATIN SMALL LETTER K WITH CEDILLA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006B 0327", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER K CEDILLA", "comment": "", "uppercase_mapping": "0136", "lowercase_mapping": "", "titlecase_mapping": "0136", "symbol": "\u0137" }, 312: { "value": "0138", "name": "LATIN SMALL LETTER KRA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0138" }, 314: { "value": "013A", "name": "LATIN SMALL LETTER L WITH ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006C 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER L ACUTE", "comment": "", "uppercase_mapping": "0139", "lowercase_mapping": "", "titlecase_mapping": "0139", "symbol": "\u013A" }, 316: { "value": "013C", "name": "LATIN SMALL LETTER L WITH CEDILLA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006C 0327", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER L CEDILLA", "comment": "", "uppercase_mapping": "013B", "lowercase_mapping": "", "titlecase_mapping": "013B", "symbol": "\u013C" }, 318: { "value": "013E", "name": "LATIN SMALL LETTER L WITH CARON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006C 030C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER L HACEK", "comment": "", "uppercase_mapping": "013D", "lowercase_mapping": "", "titlecase_mapping": "013D", "symbol": "\u013E" }, 320: { "value": "0140", "name": "LATIN SMALL LETTER L WITH MIDDLE DOT", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006C 00B7", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "013F", "lowercase_mapping": "", "titlecase_mapping": "013F", "symbol": "\u0140" }, 322: { "value": "0142", "name": "LATIN SMALL LETTER L WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER L SLASH", "comment": "", "uppercase_mapping": "0141", "lowercase_mapping": "", "titlecase_mapping": "0141", "symbol": "\u0142" }, 324: { "value": "0144", "name": "LATIN SMALL LETTER N WITH ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006E 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER N ACUTE", "comment": "", "uppercase_mapping": "0143", "lowercase_mapping": "", "titlecase_mapping": "0143", "symbol": "\u0144" }, 326: { "value": "0146", "name": "LATIN SMALL LETTER N WITH CEDILLA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006E 0327", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER N CEDILLA", "comment": "", "uppercase_mapping": "0145", "lowercase_mapping": "", "titlecase_mapping": "0145", "symbol": "\u0146" }, 328: { "value": "0148", "name": "LATIN SMALL LETTER N WITH CARON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006E 030C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER N HACEK", "comment": "", "uppercase_mapping": "0147", "lowercase_mapping": "", "titlecase_mapping": "0147", "symbol": "\u0148" }, 329: { "value": "0149", "name": "LATIN SMALL LETTER N PRECEDED BY APOSTROPHE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 02BC 006E", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER APOSTROPHE N", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0149" }, 331: { "value": "014B", "name": "LATIN SMALL LETTER ENG", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "014A", "lowercase_mapping": "", "titlecase_mapping": "014A", "symbol": "\u014B" }, 333: { "value": "014D", "name": "LATIN SMALL LETTER O WITH MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006F 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER O MACRON", "comment": "", "uppercase_mapping": "014C", "lowercase_mapping": "", "titlecase_mapping": "014C", "symbol": "\u014D" }, 335: { "value": "014F", "name": "LATIN SMALL LETTER O WITH BREVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006F 0306", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER O BREVE", "comment": "", "uppercase_mapping": "014E", "lowercase_mapping": "", "titlecase_mapping": "014E", "symbol": "\u014F" }, 337: { "value": "0151", "name": "LATIN SMALL LETTER O WITH DOUBLE ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006F 030B", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER O DOUBLE ACUTE", "comment": "", "uppercase_mapping": "0150", "lowercase_mapping": "", "titlecase_mapping": "0150", "symbol": "\u0151" }, 339: { "value": "0153", "name": "LATIN SMALL LIGATURE OE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER O E", "comment": "", "uppercase_mapping": "0152", "lowercase_mapping": "", "titlecase_mapping": "0152", "symbol": "\u0153" }, 341: { "value": "0155", "name": "LATIN SMALL LETTER R WITH ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0072 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER R ACUTE", "comment": "", "uppercase_mapping": "0154", "lowercase_mapping": "", "titlecase_mapping": "0154", "symbol": "\u0155" }, 343: { "value": "0157", "name": "LATIN SMALL LETTER R WITH CEDILLA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0072 0327", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER R CEDILLA", "comment": "", "uppercase_mapping": "0156", "lowercase_mapping": "", "titlecase_mapping": "0156", "symbol": "\u0157" }, 345: { "value": "0159", "name": "LATIN SMALL LETTER R WITH CARON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0072 030C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER R HACEK", "comment": "", "uppercase_mapping": "0158", "lowercase_mapping": "", "titlecase_mapping": "0158", "symbol": "\u0159" }, 347: { "value": "015B", "name": "LATIN SMALL LETTER S WITH ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0073 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER S ACUTE", "comment": "", "uppercase_mapping": "015A", "lowercase_mapping": "", "titlecase_mapping": "015A", "symbol": "\u015B" }, 349: { "value": "015D", "name": "LATIN SMALL LETTER S WITH CIRCUMFLEX", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0073 0302", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER S CIRCUMFLEX", "comment": "", "uppercase_mapping": "015C", "lowercase_mapping": "", "titlecase_mapping": "015C", "symbol": "\u015D" }, 351: { "value": "015F", "name": "LATIN SMALL LETTER S WITH CEDILLA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0073 0327", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER S CEDILLA", "comment": "", "uppercase_mapping": "015E", "lowercase_mapping": "", "titlecase_mapping": "015E", "symbol": "\u015F" }, 353: { "value": "0161", "name": "LATIN SMALL LETTER S WITH CARON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0073 030C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER S HACEK", "comment": "", "uppercase_mapping": "0160", "lowercase_mapping": "", "titlecase_mapping": "0160", "symbol": "\u0161" }, 355: { "value": "0163", "name": "LATIN SMALL LETTER T WITH CEDILLA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0074 0327", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER T CEDILLA", "comment": "", "uppercase_mapping": "0162", "lowercase_mapping": "", "titlecase_mapping": "0162", "symbol": "\u0163" }, 357: { "value": "0165", "name": "LATIN SMALL LETTER T WITH CARON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0074 030C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER T HACEK", "comment": "", "uppercase_mapping": "0164", "lowercase_mapping": "", "titlecase_mapping": "0164", "symbol": "\u0165" }, 359: { "value": "0167", "name": "LATIN SMALL LETTER T WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER T BAR", "comment": "", "uppercase_mapping": "0166", "lowercase_mapping": "", "titlecase_mapping": "0166", "symbol": "\u0167" }, 361: { "value": "0169", "name": "LATIN SMALL LETTER U WITH TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0075 0303", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER U TILDE", "comment": "", "uppercase_mapping": "0168", "lowercase_mapping": "", "titlecase_mapping": "0168", "symbol": "\u0169" }, 363: { "value": "016B", "name": "LATIN SMALL LETTER U WITH MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0075 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER U MACRON", "comment": "", "uppercase_mapping": "016A", "lowercase_mapping": "", "titlecase_mapping": "016A", "symbol": "\u016B" }, 365: { "value": "016D", "name": "LATIN SMALL LETTER U WITH BREVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0075 0306", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER U BREVE", "comment": "", "uppercase_mapping": "016C", "lowercase_mapping": "", "titlecase_mapping": "016C", "symbol": "\u016D" }, 367: { "value": "016F", "name": "LATIN SMALL LETTER U WITH RING ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0075 030A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER U RING", "comment": "", "uppercase_mapping": "016E", "lowercase_mapping": "", "titlecase_mapping": "016E", "symbol": "\u016F" }, 369: { "value": "0171", "name": "LATIN SMALL LETTER U WITH DOUBLE ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0075 030B", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER U DOUBLE ACUTE", "comment": "", "uppercase_mapping": "0170", "lowercase_mapping": "", "titlecase_mapping": "0170", "symbol": "\u0171" }, 371: { "value": "0173", "name": "LATIN SMALL LETTER U WITH OGONEK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0075 0328", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER U OGONEK", "comment": "", "uppercase_mapping": "0172", "lowercase_mapping": "", "titlecase_mapping": "0172", "symbol": "\u0173" }, 373: { "value": "0175", "name": "LATIN SMALL LETTER W WITH CIRCUMFLEX", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0077 0302", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER W CIRCUMFLEX", "comment": "", "uppercase_mapping": "0174", "lowercase_mapping": "", "titlecase_mapping": "0174", "symbol": "\u0175" }, 375: { "value": "0177", "name": "LATIN SMALL LETTER Y WITH CIRCUMFLEX", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0079 0302", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER Y CIRCUMFLEX", "comment": "", "uppercase_mapping": "0176", "lowercase_mapping": "", "titlecase_mapping": "0176", "symbol": "\u0177" }, 378: { "value": "017A", "name": "LATIN SMALL LETTER Z WITH ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "007A 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER Z ACUTE", "comment": "", "uppercase_mapping": "0179", "lowercase_mapping": "", "titlecase_mapping": "0179", "symbol": "\u017A" }, 380: { "value": "017C", "name": "LATIN SMALL LETTER Z WITH DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "007A 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER Z DOT", "comment": "", "uppercase_mapping": "017B", "lowercase_mapping": "", "titlecase_mapping": "017B", "symbol": "\u017C" }, 382: { "value": "017E", "name": "LATIN SMALL LETTER Z WITH CARON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "007A 030C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER Z HACEK", "comment": "", "uppercase_mapping": "017D", "lowercase_mapping": "", "titlecase_mapping": "017D", "symbol": "\u017E" }, 383: { "value": "017F", "name": "LATIN SMALL LETTER LONG S", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0073", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0053", "lowercase_mapping": "", "titlecase_mapping": "0053", "symbol": "\u017F" }, 384: { "value": "0180", "name": "LATIN SMALL LETTER B WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER B BAR", "comment": "", "uppercase_mapping": "0243", "lowercase_mapping": "", "titlecase_mapping": "0243", "symbol": "\u0180" }, 387: { "value": "0183", "name": "LATIN SMALL LETTER B WITH TOPBAR", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER B TOPBAR", "comment": "", "uppercase_mapping": "0182", "lowercase_mapping": "", "titlecase_mapping": "0182", "symbol": "\u0183" }, 389: { "value": "0185", "name": "LATIN SMALL LETTER TONE SIX", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0184", "lowercase_mapping": "", "titlecase_mapping": "0184", "symbol": "\u0185" }, 392: { "value": "0188", "name": "LATIN SMALL LETTER C WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER C HOOK", "comment": "", "uppercase_mapping": "0187", "lowercase_mapping": "", "titlecase_mapping": "0187", "symbol": "\u0188" }, 396: { "value": "018C", "name": "LATIN SMALL LETTER D WITH TOPBAR", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER D TOPBAR", "comment": "", "uppercase_mapping": "018B", "lowercase_mapping": "", "titlecase_mapping": "018B", "symbol": "\u018C" }, 397: { "value": "018D", "name": "LATIN SMALL LETTER TURNED DELTA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u018D" }, 402: { "value": "0192", "name": "LATIN SMALL LETTER F WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER SCRIPT F", "comment": "", "uppercase_mapping": "0191", "lowercase_mapping": "", "titlecase_mapping": "0191", "symbol": "\u0192" }, 405: { "value": "0195", "name": "LATIN SMALL LETTER HV", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER H V", "comment": "", "uppercase_mapping": "01F6", "lowercase_mapping": "", "titlecase_mapping": "01F6", "symbol": "\u0195" }, 409: { "value": "0199", "name": "LATIN SMALL LETTER K WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER K HOOK", "comment": "", "uppercase_mapping": "0198", "lowercase_mapping": "", "titlecase_mapping": "0198", "symbol": "\u0199" }, 410: { "value": "019A", "name": "LATIN SMALL LETTER L WITH BAR", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER BARRED L", "comment": "", "uppercase_mapping": "023D", "lowercase_mapping": "", "titlecase_mapping": "023D", "symbol": "\u019A" }, 411: { "value": "019B", "name": "LATIN SMALL LETTER LAMBDA WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER BARRED LAMBDA", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u019B" }, 414: { "value": "019E", "name": "LATIN SMALL LETTER N WITH LONG RIGHT LEG", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0220", "lowercase_mapping": "", "titlecase_mapping": "0220", "symbol": "\u019E" }, 417: { "value": "01A1", "name": "LATIN SMALL LETTER O WITH HORN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006F 031B", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER O HORN", "comment": "", "uppercase_mapping": "01A0", "lowercase_mapping": "", "titlecase_mapping": "01A0", "symbol": "\u01A1" }, 419: { "value": "01A3", "name": "LATIN SMALL LETTER OI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER O I", "comment": "", "uppercase_mapping": "01A2", "lowercase_mapping": "", "titlecase_mapping": "01A2", "symbol": "\u01A3" }, 421: { "value": "01A5", "name": "LATIN SMALL LETTER P WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER P HOOK", "comment": "", "uppercase_mapping": "01A4", "lowercase_mapping": "", "titlecase_mapping": "01A4", "symbol": "\u01A5" }, 424: { "value": "01A8", "name": "LATIN SMALL LETTER TONE TWO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "01A7", "lowercase_mapping": "", "titlecase_mapping": "01A7", "symbol": "\u01A8" }, 426: { "value": "01AA", "name": "LATIN LETTER REVERSED ESH LOOP", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u01AA" }, 427: { "value": "01AB", "name": "LATIN SMALL LETTER T WITH PALATAL HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER T PALATAL HOOK", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u01AB" }, 429: { "value": "01AD", "name": "LATIN SMALL LETTER T WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER T HOOK", "comment": "", "uppercase_mapping": "01AC", "lowercase_mapping": "", "titlecase_mapping": "01AC", "symbol": "\u01AD" }, 432: { "value": "01B0", "name": "LATIN SMALL LETTER U WITH HORN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0075 031B", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER U HORN", "comment": "", "uppercase_mapping": "01AF", "lowercase_mapping": "", "titlecase_mapping": "01AF", "symbol": "\u01B0" }, 436: { "value": "01B4", "name": "LATIN SMALL LETTER Y WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER Y HOOK", "comment": "", "uppercase_mapping": "01B3", "lowercase_mapping": "", "titlecase_mapping": "01B3", "symbol": "\u01B4" }, 438: { "value": "01B6", "name": "LATIN SMALL LETTER Z WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER Z BAR", "comment": "", "uppercase_mapping": "01B5", "lowercase_mapping": "", "titlecase_mapping": "01B5", "symbol": "\u01B6" }, 441: { "value": "01B9", "name": "LATIN SMALL LETTER EZH REVERSED", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER REVERSED YOGH", "comment": "", "uppercase_mapping": "01B8", "lowercase_mapping": "", "titlecase_mapping": "01B8", "symbol": "\u01B9" }, 442: { "value": "01BA", "name": "LATIN SMALL LETTER EZH WITH TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER YOGH WITH TAIL", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u01BA" }, 445: { "value": "01BD", "name": "LATIN SMALL LETTER TONE FIVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "01BC", "lowercase_mapping": "", "titlecase_mapping": "01BC", "symbol": "\u01BD" }, 446: { "value": "01BE", "name": "LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN LETTER INVERTED GLOTTAL STOP BAR", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u01BE" }, 447: { "value": "01BF", "name": "LATIN LETTER WYNN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "01F7", "lowercase_mapping": "", "titlecase_mapping": "01F7", "symbol": "\u01BF" }, 454: { "value": "01C6", "name": "LATIN SMALL LETTER DZ WITH CARON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0064 017E", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER D Z HACEK", "comment": "", "uppercase_mapping": "01C4", "lowercase_mapping": "", "titlecase_mapping": "01C5", "symbol": "\u01C6" }, 457: { "value": "01C9", "name": "LATIN SMALL LETTER LJ", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006C 006A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER L J", "comment": "", "uppercase_mapping": "01C7", "lowercase_mapping": "", "titlecase_mapping": "01C8", "symbol": "\u01C9" }, 460: { "value": "01CC", "name": "LATIN SMALL LETTER NJ", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006E 006A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER N J", "comment": "", "uppercase_mapping": "01CA", "lowercase_mapping": "", "titlecase_mapping": "01CB", "symbol": "\u01CC" }, 462: { "value": "01CE", "name": "LATIN SMALL LETTER A WITH CARON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0061 030C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER A HACEK", "comment": "", "uppercase_mapping": "01CD", "lowercase_mapping": "", "titlecase_mapping": "01CD", "symbol": "\u01CE" }, 464: { "value": "01D0", "name": "LATIN SMALL LETTER I WITH CARON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0069 030C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER I HACEK", "comment": "", "uppercase_mapping": "01CF", "lowercase_mapping": "", "titlecase_mapping": "01CF", "symbol": "\u01D0" }, 466: { "value": "01D2", "name": "LATIN SMALL LETTER O WITH CARON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006F 030C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER O HACEK", "comment": "", "uppercase_mapping": "01D1", "lowercase_mapping": "", "titlecase_mapping": "01D1", "symbol": "\u01D2" }, 468: { "value": "01D4", "name": "LATIN SMALL LETTER U WITH CARON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0075 030C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER U HACEK", "comment": "", "uppercase_mapping": "01D3", "lowercase_mapping": "", "titlecase_mapping": "01D3", "symbol": "\u01D4" }, 470: { "value": "01D6", "name": "LATIN SMALL LETTER U WITH DIAERESIS AND MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00FC 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER U DIAERESIS MACRON", "comment": "", "uppercase_mapping": "01D5", "lowercase_mapping": "", "titlecase_mapping": "01D5", "symbol": "\u01D6" }, 472: { "value": "01D8", "name": "LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00FC 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER U DIAERESIS ACUTE", "comment": "", "uppercase_mapping": "01D7", "lowercase_mapping": "", "titlecase_mapping": "01D7", "symbol": "\u01D8" }, 474: { "value": "01DA", "name": "LATIN SMALL LETTER U WITH DIAERESIS AND CARON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00FC 030C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER U DIAERESIS HACEK", "comment": "", "uppercase_mapping": "01D9", "lowercase_mapping": "", "titlecase_mapping": "01D9", "symbol": "\u01DA" }, 476: { "value": "01DC", "name": "LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00FC 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER U DIAERESIS GRAVE", "comment": "", "uppercase_mapping": "01DB", "lowercase_mapping": "", "titlecase_mapping": "01DB", "symbol": "\u01DC" }, 477: { "value": "01DD", "name": "LATIN SMALL LETTER TURNED E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "018E", "lowercase_mapping": "", "titlecase_mapping": "018E", "symbol": "\u01DD" }, 479: { "value": "01DF", "name": "LATIN SMALL LETTER A WITH DIAERESIS AND MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00E4 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER A DIAERESIS MACRON", "comment": "", "uppercase_mapping": "01DE", "lowercase_mapping": "", "titlecase_mapping": "01DE", "symbol": "\u01DF" }, 481: { "value": "01E1", "name": "LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0227 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER A DOT MACRON", "comment": "", "uppercase_mapping": "01E0", "lowercase_mapping": "", "titlecase_mapping": "01E0", "symbol": "\u01E1" }, 483: { "value": "01E3", "name": "LATIN SMALL LETTER AE WITH MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00E6 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER A E MACRON", "comment": "", "uppercase_mapping": "01E2", "lowercase_mapping": "", "titlecase_mapping": "01E2", "symbol": "\u01E3" }, 485: { "value": "01E5", "name": "LATIN SMALL LETTER G WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER G BAR", "comment": "", "uppercase_mapping": "01E4", "lowercase_mapping": "", "titlecase_mapping": "01E4", "symbol": "\u01E5" }, 487: { "value": "01E7", "name": "LATIN SMALL LETTER G WITH CARON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0067 030C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER G HACEK", "comment": "", "uppercase_mapping": "01E6", "lowercase_mapping": "", "titlecase_mapping": "01E6", "symbol": "\u01E7" }, 489: { "value": "01E9", "name": "LATIN SMALL LETTER K WITH CARON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006B 030C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER K HACEK", "comment": "", "uppercase_mapping": "01E8", "lowercase_mapping": "", "titlecase_mapping": "01E8", "symbol": "\u01E9" }, 491: { "value": "01EB", "name": "LATIN SMALL LETTER O WITH OGONEK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006F 0328", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER O OGONEK", "comment": "", "uppercase_mapping": "01EA", "lowercase_mapping": "", "titlecase_mapping": "01EA", "symbol": "\u01EB" }, 493: { "value": "01ED", "name": "LATIN SMALL LETTER O WITH OGONEK AND MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "01EB 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER O OGONEK MACRON", "comment": "", "uppercase_mapping": "01EC", "lowercase_mapping": "", "titlecase_mapping": "01EC", "symbol": "\u01ED" }, 495: { "value": "01EF", "name": "LATIN SMALL LETTER EZH WITH CARON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0292 030C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER YOGH HACEK", "comment": "", "uppercase_mapping": "01EE", "lowercase_mapping": "", "titlecase_mapping": "01EE", "symbol": "\u01EF" }, 496: { "value": "01F0", "name": "LATIN SMALL LETTER J WITH CARON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006A 030C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER J HACEK", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u01F0" }, 499: { "value": "01F3", "name": "LATIN SMALL LETTER DZ", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0064 007A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "01F1", "lowercase_mapping": "", "titlecase_mapping": "01F2", "symbol": "\u01F3" }, 501: { "value": "01F5", "name": "LATIN SMALL LETTER G WITH ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0067 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "01F4", "lowercase_mapping": "", "titlecase_mapping": "01F4", "symbol": "\u01F5" }, 505: { "value": "01F9", "name": "LATIN SMALL LETTER N WITH GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006E 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "01F8", "lowercase_mapping": "", "titlecase_mapping": "01F8", "symbol": "\u01F9" }, 507: { "value": "01FB", "name": "LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00E5 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "01FA", "lowercase_mapping": "", "titlecase_mapping": "01FA", "symbol": "\u01FB" }, 509: { "value": "01FD", "name": "LATIN SMALL LETTER AE WITH ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00E6 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "01FC", "lowercase_mapping": "", "titlecase_mapping": "01FC", "symbol": "\u01FD" }, 511: { "value": "01FF", "name": "LATIN SMALL LETTER O WITH STROKE AND ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00F8 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "01FE", "lowercase_mapping": "", "titlecase_mapping": "01FE", "symbol": "\u01FF" }, 513: { "value": "0201", "name": "LATIN SMALL LETTER A WITH DOUBLE GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0061 030F", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0200", "lowercase_mapping": "", "titlecase_mapping": "0200", "symbol": "\u0201" }, 515: { "value": "0203", "name": "LATIN SMALL LETTER A WITH INVERTED BREVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0061 0311", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0202", "lowercase_mapping": "", "titlecase_mapping": "0202", "symbol": "\u0203" }, 517: { "value": "0205", "name": "LATIN SMALL LETTER E WITH DOUBLE GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0065 030F", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0204", "lowercase_mapping": "", "titlecase_mapping": "0204", "symbol": "\u0205" }, 519: { "value": "0207", "name": "LATIN SMALL LETTER E WITH INVERTED BREVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0065 0311", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0206", "lowercase_mapping": "", "titlecase_mapping": "0206", "symbol": "\u0207" }, 521: { "value": "0209", "name": "LATIN SMALL LETTER I WITH DOUBLE GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0069 030F", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0208", "lowercase_mapping": "", "titlecase_mapping": "0208", "symbol": "\u0209" }, 523: { "value": "020B", "name": "LATIN SMALL LETTER I WITH INVERTED BREVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0069 0311", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "020A", "lowercase_mapping": "", "titlecase_mapping": "020A", "symbol": "\u020B" }, 525: { "value": "020D", "name": "LATIN SMALL LETTER O WITH DOUBLE GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006F 030F", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "020C", "lowercase_mapping": "", "titlecase_mapping": "020C", "symbol": "\u020D" }, 527: { "value": "020F", "name": "LATIN SMALL LETTER O WITH INVERTED BREVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006F 0311", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "020E", "lowercase_mapping": "", "titlecase_mapping": "020E", "symbol": "\u020F" }, 529: { "value": "0211", "name": "LATIN SMALL LETTER R WITH DOUBLE GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0072 030F", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0210", "lowercase_mapping": "", "titlecase_mapping": "0210", "symbol": "\u0211" }, 531: { "value": "0213", "name": "LATIN SMALL LETTER R WITH INVERTED BREVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0072 0311", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0212", "lowercase_mapping": "", "titlecase_mapping": "0212", "symbol": "\u0213" }, 533: { "value": "0215", "name": "LATIN SMALL LETTER U WITH DOUBLE GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0075 030F", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0214", "lowercase_mapping": "", "titlecase_mapping": "0214", "symbol": "\u0215" }, 535: { "value": "0217", "name": "LATIN SMALL LETTER U WITH INVERTED BREVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0075 0311", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0216", "lowercase_mapping": "", "titlecase_mapping": "0216", "symbol": "\u0217" }, 537: { "value": "0219", "name": "LATIN SMALL LETTER S WITH COMMA BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0073 0326", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0218", "lowercase_mapping": "", "titlecase_mapping": "0218", "symbol": "\u0219" }, 539: { "value": "021B", "name": "LATIN SMALL LETTER T WITH COMMA BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0074 0326", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "021A", "lowercase_mapping": "", "titlecase_mapping": "021A", "symbol": "\u021B" }, 541: { "value": "021D", "name": "LATIN SMALL LETTER YOGH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "021C", "lowercase_mapping": "", "titlecase_mapping": "021C", "symbol": "\u021D" }, 543: { "value": "021F", "name": "LATIN SMALL LETTER H WITH CARON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0068 030C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "021E", "lowercase_mapping": "", "titlecase_mapping": "021E", "symbol": "\u021F" }, 545: { "value": "0221", "name": "LATIN SMALL LETTER D WITH CURL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0221" }, 547: { "value": "0223", "name": "LATIN SMALL LETTER OU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0222", "lowercase_mapping": "", "titlecase_mapping": "0222", "symbol": "\u0223" }, 549: { "value": "0225", "name": "LATIN SMALL LETTER Z WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0224", "lowercase_mapping": "", "titlecase_mapping": "0224", "symbol": "\u0225" }, 551: { "value": "0227", "name": "LATIN SMALL LETTER A WITH DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0061 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0226", "lowercase_mapping": "", "titlecase_mapping": "0226", "symbol": "\u0227" }, 553: { "value": "0229", "name": "LATIN SMALL LETTER E WITH CEDILLA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0065 0327", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0228", "lowercase_mapping": "", "titlecase_mapping": "0228", "symbol": "\u0229" }, 555: { "value": "022B", "name": "LATIN SMALL LETTER O WITH DIAERESIS AND MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00F6 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "022A", "lowercase_mapping": "", "titlecase_mapping": "022A", "symbol": "\u022B" }, 557: { "value": "022D", "name": "LATIN SMALL LETTER O WITH TILDE AND MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00F5 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "022C", "lowercase_mapping": "", "titlecase_mapping": "022C", "symbol": "\u022D" }, 559: { "value": "022F", "name": "LATIN SMALL LETTER O WITH DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006F 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "022E", "lowercase_mapping": "", "titlecase_mapping": "022E", "symbol": "\u022F" }, 561: { "value": "0231", "name": "LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "022F 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0230", "lowercase_mapping": "", "titlecase_mapping": "0230", "symbol": "\u0231" }, 563: { "value": "0233", "name": "LATIN SMALL LETTER Y WITH MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0079 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0232", "lowercase_mapping": "", "titlecase_mapping": "0232", "symbol": "\u0233" }, 564: { "value": "0234", "name": "LATIN SMALL LETTER L WITH CURL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0234" }, 565: { "value": "0235", "name": "LATIN SMALL LETTER N WITH CURL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0235" }, 566: { "value": "0236", "name": "LATIN SMALL LETTER T WITH CURL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0236" }, 567: { "value": "0237", "name": "LATIN SMALL LETTER DOTLESS J", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0237" }, 568: { "value": "0238", "name": "LATIN SMALL LETTER DB DIGRAPH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0238" }, 569: { "value": "0239", "name": "LATIN SMALL LETTER QP DIGRAPH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0239" }, 572: { "value": "023C", "name": "LATIN SMALL LETTER C WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "023B", "lowercase_mapping": "", "titlecase_mapping": "023B", "symbol": "\u023C" }, 575: { "value": "023F", "name": "LATIN SMALL LETTER S WITH SWASH TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C7E", "lowercase_mapping": "", "titlecase_mapping": "2C7E", "symbol": "\u023F" }, 576: { "value": "0240", "name": "LATIN SMALL LETTER Z WITH SWASH TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C7F", "lowercase_mapping": "", "titlecase_mapping": "2C7F", "symbol": "\u0240" }, 578: { "value": "0242", "name": "LATIN SMALL LETTER GLOTTAL STOP", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0241", "lowercase_mapping": "", "titlecase_mapping": "0241", "symbol": "\u0242" }, 583: { "value": "0247", "name": "LATIN SMALL LETTER E WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0246", "lowercase_mapping": "", "titlecase_mapping": "0246", "symbol": "\u0247" }, 585: { "value": "0249", "name": "LATIN SMALL LETTER J WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0248", "lowercase_mapping": "", "titlecase_mapping": "0248", "symbol": "\u0249" }, 587: { "value": "024B", "name": "LATIN SMALL LETTER Q WITH HOOK TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "024A", "lowercase_mapping": "", "titlecase_mapping": "024A", "symbol": "\u024B" }, 589: { "value": "024D", "name": "LATIN SMALL LETTER R WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "024C", "lowercase_mapping": "", "titlecase_mapping": "024C", "symbol": "\u024D" }, 591: { "value": "024F", "name": "LATIN SMALL LETTER Y WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "024E", "lowercase_mapping": "", "titlecase_mapping": "024E", "symbol": "\u024F" }, 592: { "value": "0250", "name": "LATIN SMALL LETTER TURNED A", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C6F", "lowercase_mapping": "", "titlecase_mapping": "2C6F", "symbol": "\u0250" }, 593: { "value": "0251", "name": "LATIN SMALL LETTER ALPHA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER SCRIPT A", "comment": "", "uppercase_mapping": "2C6D", "lowercase_mapping": "", "titlecase_mapping": "2C6D", "symbol": "\u0251" }, 594: { "value": "0252", "name": "LATIN SMALL LETTER TURNED ALPHA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER TURNED SCRIPT A", "comment": "", "uppercase_mapping": "2C70", "lowercase_mapping": "", "titlecase_mapping": "2C70", "symbol": "\u0252" }, 595: { "value": "0253", "name": "LATIN SMALL LETTER B WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER B HOOK", "comment": "", "uppercase_mapping": "0181", "lowercase_mapping": "", "titlecase_mapping": "0181", "symbol": "\u0253" }, 596: { "value": "0254", "name": "LATIN SMALL LETTER OPEN O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0186", "lowercase_mapping": "", "titlecase_mapping": "0186", "symbol": "\u0254" }, 597: { "value": "0255", "name": "LATIN SMALL LETTER C WITH CURL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER C CURL", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0255" }, 598: { "value": "0256", "name": "LATIN SMALL LETTER D WITH TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER D RETROFLEX HOOK", "comment": "", "uppercase_mapping": "0189", "lowercase_mapping": "", "titlecase_mapping": "0189", "symbol": "\u0256" }, 599: { "value": "0257", "name": "LATIN SMALL LETTER D WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER D HOOK", "comment": "", "uppercase_mapping": "018A", "lowercase_mapping": "", "titlecase_mapping": "018A", "symbol": "\u0257" }, 600: { "value": "0258", "name": "LATIN SMALL LETTER REVERSED E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0258" }, 601: { "value": "0259", "name": "LATIN SMALL LETTER SCHWA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "018F", "lowercase_mapping": "", "titlecase_mapping": "018F", "symbol": "\u0259" }, 602: { "value": "025A", "name": "LATIN SMALL LETTER SCHWA WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER SCHWA HOOK", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u025A" }, 603: { "value": "025B", "name": "LATIN SMALL LETTER OPEN E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER EPSILON", "comment": "", "uppercase_mapping": "0190", "lowercase_mapping": "", "titlecase_mapping": "0190", "symbol": "\u025B" }, 604: { "value": "025C", "name": "LATIN SMALL LETTER REVERSED OPEN E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER REVERSED EPSILON", "comment": "", "uppercase_mapping": "A7AB", "lowercase_mapping": "", "titlecase_mapping": "A7AB", "symbol": "\u025C" }, 605: { "value": "025D", "name": "LATIN SMALL LETTER REVERSED OPEN E WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER REVERSED EPSILON HOOK", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u025D" }, 606: { "value": "025E", "name": "LATIN SMALL LETTER CLOSED REVERSED OPEN E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER CLOSED REVERSED EPSILON", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u025E" }, 607: { "value": "025F", "name": "LATIN SMALL LETTER DOTLESS J WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER DOTLESS J BAR", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u025F" }, 608: { "value": "0260", "name": "LATIN SMALL LETTER G WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER G HOOK", "comment": "", "uppercase_mapping": "0193", "lowercase_mapping": "", "titlecase_mapping": "0193", "symbol": "\u0260" }, 609: { "value": "0261", "name": "LATIN SMALL LETTER SCRIPT G", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A7AC", "lowercase_mapping": "", "titlecase_mapping": "A7AC", "symbol": "\u0261" }, 610: { "value": "0262", "name": "LATIN LETTER SMALL CAPITAL G", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0262" }, 611: { "value": "0263", "name": "LATIN SMALL LETTER GAMMA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0194", "lowercase_mapping": "", "titlecase_mapping": "0194", "symbol": "\u0263" }, 612: { "value": "0264", "name": "LATIN SMALL LETTER RAMS HORN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER BABY GAMMA", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0264" }, 613: { "value": "0265", "name": "LATIN SMALL LETTER TURNED H", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A78D", "lowercase_mapping": "", "titlecase_mapping": "A78D", "symbol": "\u0265" }, 614: { "value": "0266", "name": "LATIN SMALL LETTER H WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER H HOOK", "comment": "", "uppercase_mapping": "A7AA", "lowercase_mapping": "", "titlecase_mapping": "A7AA", "symbol": "\u0266" }, 615: { "value": "0267", "name": "LATIN SMALL LETTER HENG WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER HENG HOOK", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0267" }, 616: { "value": "0268", "name": "LATIN SMALL LETTER I WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER BARRED I", "comment": "", "uppercase_mapping": "0197", "lowercase_mapping": "", "titlecase_mapping": "0197", "symbol": "\u0268" }, 617: { "value": "0269", "name": "LATIN SMALL LETTER IOTA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0196", "lowercase_mapping": "", "titlecase_mapping": "0196", "symbol": "\u0269" }, 618: { "value": "026A", "name": "LATIN LETTER SMALL CAPITAL I", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A7AE", "lowercase_mapping": "", "titlecase_mapping": "A7AE", "symbol": "\u026A" }, 619: { "value": "026B", "name": "LATIN SMALL LETTER L WITH MIDDLE TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C62", "lowercase_mapping": "", "titlecase_mapping": "2C62", "symbol": "\u026B" }, 620: { "value": "026C", "name": "LATIN SMALL LETTER L WITH BELT", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER L BELT", "comment": "", "uppercase_mapping": "A7AD", "lowercase_mapping": "", "titlecase_mapping": "A7AD", "symbol": "\u026C" }, 621: { "value": "026D", "name": "LATIN SMALL LETTER L WITH RETROFLEX HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER L RETROFLEX HOOK", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u026D" }, 622: { "value": "026E", "name": "LATIN SMALL LETTER LEZH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER L YOGH", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u026E" }, 623: { "value": "026F", "name": "LATIN SMALL LETTER TURNED M", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "019C", "lowercase_mapping": "", "titlecase_mapping": "019C", "symbol": "\u026F" }, 624: { "value": "0270", "name": "LATIN SMALL LETTER TURNED M WITH LONG LEG", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0270" }, 625: { "value": "0271", "name": "LATIN SMALL LETTER M WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER M HOOK", "comment": "", "uppercase_mapping": "2C6E", "lowercase_mapping": "", "titlecase_mapping": "2C6E", "symbol": "\u0271" }, 626: { "value": "0272", "name": "LATIN SMALL LETTER N WITH LEFT HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER N HOOK", "comment": "", "uppercase_mapping": "019D", "lowercase_mapping": "", "titlecase_mapping": "019D", "symbol": "\u0272" }, 627: { "value": "0273", "name": "LATIN SMALL LETTER N WITH RETROFLEX HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER N RETROFLEX HOOK", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0273" }, 628: { "value": "0274", "name": "LATIN LETTER SMALL CAPITAL N", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0274" }, 629: { "value": "0275", "name": "LATIN SMALL LETTER BARRED O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "019F", "lowercase_mapping": "", "titlecase_mapping": "019F", "symbol": "\u0275" }, 630: { "value": "0276", "name": "LATIN LETTER SMALL CAPITAL OE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN LETTER SMALL CAPITAL O E", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0276" }, 631: { "value": "0277", "name": "LATIN SMALL LETTER CLOSED OMEGA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0277" }, 632: { "value": "0278", "name": "LATIN SMALL LETTER PHI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0278" }, 633: { "value": "0279", "name": "LATIN SMALL LETTER TURNED R", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0279" }, 634: { "value": "027A", "name": "LATIN SMALL LETTER TURNED R WITH LONG LEG", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u027A" }, 635: { "value": "027B", "name": "LATIN SMALL LETTER TURNED R WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER TURNED R HOOK", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u027B" }, 636: { "value": "027C", "name": "LATIN SMALL LETTER R WITH LONG LEG", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u027C" }, 637: { "value": "027D", "name": "LATIN SMALL LETTER R WITH TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER R HOOK", "comment": "", "uppercase_mapping": "2C64", "lowercase_mapping": "", "titlecase_mapping": "2C64", "symbol": "\u027D" }, 638: { "value": "027E", "name": "LATIN SMALL LETTER R WITH FISHHOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER FISHHOOK R", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u027E" }, 639: { "value": "027F", "name": "LATIN SMALL LETTER REVERSED R WITH FISHHOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER REVERSED FISHHOOK R", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u027F" }, 640: { "value": "0280", "name": "LATIN LETTER SMALL CAPITAL R", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "01A6", "lowercase_mapping": "", "titlecase_mapping": "01A6", "symbol": "\u0280" }, 641: { "value": "0281", "name": "LATIN LETTER SMALL CAPITAL INVERTED R", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0281" }, 642: { "value": "0282", "name": "LATIN SMALL LETTER S WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER S HOOK", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0282" }, 643: { "value": "0283", "name": "LATIN SMALL LETTER ESH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "01A9", "lowercase_mapping": "", "titlecase_mapping": "01A9", "symbol": "\u0283" }, 644: { "value": "0284", "name": "LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER DOTLESS J BAR HOOK", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0284" }, 645: { "value": "0285", "name": "LATIN SMALL LETTER SQUAT REVERSED ESH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0285" }, 646: { "value": "0286", "name": "LATIN SMALL LETTER ESH WITH CURL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER ESH CURL", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0286" }, 647: { "value": "0287", "name": "LATIN SMALL LETTER TURNED T", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A7B1", "lowercase_mapping": "", "titlecase_mapping": "A7B1", "symbol": "\u0287" }, 648: { "value": "0288", "name": "LATIN SMALL LETTER T WITH RETROFLEX HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER T RETROFLEX HOOK", "comment": "", "uppercase_mapping": "01AE", "lowercase_mapping": "", "titlecase_mapping": "01AE", "symbol": "\u0288" }, 649: { "value": "0289", "name": "LATIN SMALL LETTER U BAR", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0244", "lowercase_mapping": "", "titlecase_mapping": "0244", "symbol": "\u0289" }, 650: { "value": "028A", "name": "LATIN SMALL LETTER UPSILON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "01B1", "lowercase_mapping": "", "titlecase_mapping": "01B1", "symbol": "\u028A" }, 651: { "value": "028B", "name": "LATIN SMALL LETTER V WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER SCRIPT V", "comment": "", "uppercase_mapping": "01B2", "lowercase_mapping": "", "titlecase_mapping": "01B2", "symbol": "\u028B" }, 652: { "value": "028C", "name": "LATIN SMALL LETTER TURNED V", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0245", "lowercase_mapping": "", "titlecase_mapping": "0245", "symbol": "\u028C" }, 653: { "value": "028D", "name": "LATIN SMALL LETTER TURNED W", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u028D" }, 654: { "value": "028E", "name": "LATIN SMALL LETTER TURNED Y", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u028E" }, 655: { "value": "028F", "name": "LATIN LETTER SMALL CAPITAL Y", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u028F" }, 656: { "value": "0290", "name": "LATIN SMALL LETTER Z WITH RETROFLEX HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER Z RETROFLEX HOOK", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0290" }, 657: { "value": "0291", "name": "LATIN SMALL LETTER Z WITH CURL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER Z CURL", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0291" }, 658: { "value": "0292", "name": "LATIN SMALL LETTER EZH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER YOGH", "comment": "", "uppercase_mapping": "01B7", "lowercase_mapping": "", "titlecase_mapping": "01B7", "symbol": "\u0292" }, 659: { "value": "0293", "name": "LATIN SMALL LETTER EZH WITH CURL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER YOGH CURL", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0293" }, 661: { "value": "0295", "name": "LATIN LETTER PHARYNGEAL VOICED FRICATIVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN LETTER REVERSED GLOTTAL STOP", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0295" }, 662: { "value": "0296", "name": "LATIN LETTER INVERTED GLOTTAL STOP", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0296" }, 663: { "value": "0297", "name": "LATIN LETTER STRETCHED C", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0297" }, 664: { "value": "0298", "name": "LATIN LETTER BILABIAL CLICK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN LETTER BULLSEYE", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0298" }, 665: { "value": "0299", "name": "LATIN LETTER SMALL CAPITAL B", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0299" }, 666: { "value": "029A", "name": "LATIN SMALL LETTER CLOSED OPEN E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER CLOSED EPSILON", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u029A" }, 667: { "value": "029B", "name": "LATIN LETTER SMALL CAPITAL G WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN LETTER SMALL CAPITAL G HOOK", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u029B" }, 668: { "value": "029C", "name": "LATIN LETTER SMALL CAPITAL H", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u029C" }, 669: { "value": "029D", "name": "LATIN SMALL LETTER J WITH CROSSED-TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER CROSSED-TAIL J", "comment": "", "uppercase_mapping": "A7B2", "lowercase_mapping": "", "titlecase_mapping": "A7B2", "symbol": "\u029D" }, 670: { "value": "029E", "name": "LATIN SMALL LETTER TURNED K", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A7B0", "lowercase_mapping": "", "titlecase_mapping": "A7B0", "symbol": "\u029E" }, 671: { "value": "029F", "name": "LATIN LETTER SMALL CAPITAL L", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u029F" }, 672: { "value": "02A0", "name": "LATIN SMALL LETTER Q WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER Q HOOK", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u02A0" }, 673: { "value": "02A1", "name": "LATIN LETTER GLOTTAL STOP WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN LETTER GLOTTAL STOP BAR", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u02A1" }, 674: { "value": "02A2", "name": "LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN LETTER REVERSED GLOTTAL STOP BAR", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u02A2" }, 675: { "value": "02A3", "name": "LATIN SMALL LETTER DZ DIGRAPH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER D Z", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u02A3" }, 676: { "value": "02A4", "name": "LATIN SMALL LETTER DEZH DIGRAPH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER D YOGH", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u02A4" }, 677: { "value": "02A5", "name": "LATIN SMALL LETTER DZ DIGRAPH WITH CURL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER D Z CURL", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u02A5" }, 678: { "value": "02A6", "name": "LATIN SMALL LETTER TS DIGRAPH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER T S", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u02A6" }, 679: { "value": "02A7", "name": "LATIN SMALL LETTER TESH DIGRAPH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER T ESH", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u02A7" }, 680: { "value": "02A8", "name": "LATIN SMALL LETTER TC DIGRAPH WITH CURL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "LATIN SMALL LETTER T C CURL", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u02A8" }, 681: { "value": "02A9", "name": "LATIN SMALL LETTER FENG DIGRAPH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u02A9" }, 682: { "value": "02AA", "name": "LATIN SMALL LETTER LS DIGRAPH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u02AA" }, 683: { "value": "02AB", "name": "LATIN SMALL LETTER LZ DIGRAPH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u02AB" }, 684: { "value": "02AC", "name": "LATIN LETTER BILABIAL PERCUSSIVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u02AC" }, 685: { "value": "02AD", "name": "LATIN LETTER BIDENTAL PERCUSSIVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u02AD" }, 686: { "value": "02AE", "name": "LATIN SMALL LETTER TURNED H WITH FISHHOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u02AE" }, 687: { "value": "02AF", "name": "LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u02AF" }, 881: { "value": "0371", "name": "GREEK SMALL LETTER HETA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0370", "lowercase_mapping": "", "titlecase_mapping": "0370", "symbol": "\u0371" }, 883: { "value": "0373", "name": "GREEK SMALL LETTER ARCHAIC SAMPI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0372", "lowercase_mapping": "", "titlecase_mapping": "0372", "symbol": "\u0373" }, 887: { "value": "0377", "name": "GREEK SMALL LETTER PAMPHYLIAN DIGAMMA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0376", "lowercase_mapping": "", "titlecase_mapping": "0376", "symbol": "\u0377" }, 891: { "value": "037B", "name": "GREEK SMALL REVERSED LUNATE SIGMA SYMBOL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "03FD", "lowercase_mapping": "", "titlecase_mapping": "03FD", "symbol": "\u037B" }, 892: { "value": "037C", "name": "GREEK SMALL DOTTED LUNATE SIGMA SYMBOL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "03FE", "lowercase_mapping": "", "titlecase_mapping": "03FE", "symbol": "\u037C" }, 893: { "value": "037D", "name": "GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "03FF", "lowercase_mapping": "", "titlecase_mapping": "03FF", "symbol": "\u037D" }, 912: { "value": "0390", "name": "GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03CA 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER IOTA DIAERESIS TONOS", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0390" }, 940: { "value": "03AC", "name": "GREEK SMALL LETTER ALPHA WITH TONOS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B1 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER ALPHA TONOS", "comment": "", "uppercase_mapping": "0386", "lowercase_mapping": "", "titlecase_mapping": "0386", "symbol": "\u03AC" }, 941: { "value": "03AD", "name": "GREEK SMALL LETTER EPSILON WITH TONOS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B5 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER EPSILON TONOS", "comment": "", "uppercase_mapping": "0388", "lowercase_mapping": "", "titlecase_mapping": "0388", "symbol": "\u03AD" }, 942: { "value": "03AE", "name": "GREEK SMALL LETTER ETA WITH TONOS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B7 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER ETA TONOS", "comment": "", "uppercase_mapping": "0389", "lowercase_mapping": "", "titlecase_mapping": "0389", "symbol": "\u03AE" }, 943: { "value": "03AF", "name": "GREEK SMALL LETTER IOTA WITH TONOS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B9 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER IOTA TONOS", "comment": "", "uppercase_mapping": "038A", "lowercase_mapping": "", "titlecase_mapping": "038A", "symbol": "\u03AF" }, 944: { "value": "03B0", "name": "GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03CB 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER UPSILON DIAERESIS TONOS", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u03B0" }, 945: { "value": "03B1", "name": "GREEK SMALL LETTER ALPHA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0391", "lowercase_mapping": "", "titlecase_mapping": "0391", "symbol": "\u03B1" }, 946: { "value": "03B2", "name": "GREEK SMALL LETTER BETA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0392", "lowercase_mapping": "", "titlecase_mapping": "0392", "symbol": "\u03B2" }, 947: { "value": "03B3", "name": "GREEK SMALL LETTER GAMMA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0393", "lowercase_mapping": "", "titlecase_mapping": "0393", "symbol": "\u03B3" }, 948: { "value": "03B4", "name": "GREEK SMALL LETTER DELTA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0394", "lowercase_mapping": "", "titlecase_mapping": "0394", "symbol": "\u03B4" }, 949: { "value": "03B5", "name": "GREEK SMALL LETTER EPSILON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0395", "lowercase_mapping": "", "titlecase_mapping": "0395", "symbol": "\u03B5" }, 950: { "value": "03B6", "name": "GREEK SMALL LETTER ZETA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0396", "lowercase_mapping": "", "titlecase_mapping": "0396", "symbol": "\u03B6" }, 951: { "value": "03B7", "name": "GREEK SMALL LETTER ETA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0397", "lowercase_mapping": "", "titlecase_mapping": "0397", "symbol": "\u03B7" }, 952: { "value": "03B8", "name": "GREEK SMALL LETTER THETA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0398", "lowercase_mapping": "", "titlecase_mapping": "0398", "symbol": "\u03B8" }, 953: { "value": "03B9", "name": "GREEK SMALL LETTER IOTA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0399", "lowercase_mapping": "", "titlecase_mapping": "0399", "symbol": "\u03B9" }, 954: { "value": "03BA", "name": "GREEK SMALL LETTER KAPPA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "039A", "lowercase_mapping": "", "titlecase_mapping": "039A", "symbol": "\u03BA" }, 955: { "value": "03BB", "name": "GREEK SMALL LETTER LAMDA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER LAMBDA", "comment": "", "uppercase_mapping": "039B", "lowercase_mapping": "", "titlecase_mapping": "039B", "symbol": "\u03BB" }, 956: { "value": "03BC", "name": "GREEK SMALL LETTER MU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "039C", "lowercase_mapping": "", "titlecase_mapping": "039C", "symbol": "\u03BC" }, 957: { "value": "03BD", "name": "GREEK SMALL LETTER NU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "039D", "lowercase_mapping": "", "titlecase_mapping": "039D", "symbol": "\u03BD" }, 958: { "value": "03BE", "name": "GREEK SMALL LETTER XI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "039E", "lowercase_mapping": "", "titlecase_mapping": "039E", "symbol": "\u03BE" }, 959: { "value": "03BF", "name": "GREEK SMALL LETTER OMICRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "039F", "lowercase_mapping": "", "titlecase_mapping": "039F", "symbol": "\u03BF" }, 960: { "value": "03C0", "name": "GREEK SMALL LETTER PI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "03A0", "lowercase_mapping": "", "titlecase_mapping": "03A0", "symbol": "\u03C0" }, 961: { "value": "03C1", "name": "GREEK SMALL LETTER RHO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "03A1", "lowercase_mapping": "", "titlecase_mapping": "03A1", "symbol": "\u03C1" }, 962: { "value": "03C2", "name": "GREEK SMALL LETTER FINAL SIGMA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "03A3", "lowercase_mapping": "", "titlecase_mapping": "03A3", "symbol": "\u03C2" }, 963: { "value": "03C3", "name": "GREEK SMALL LETTER SIGMA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "03A3", "lowercase_mapping": "", "titlecase_mapping": "03A3", "symbol": "\u03C3" }, 964: { "value": "03C4", "name": "GREEK SMALL LETTER TAU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "03A4", "lowercase_mapping": "", "titlecase_mapping": "03A4", "symbol": "\u03C4" }, 965: { "value": "03C5", "name": "GREEK SMALL LETTER UPSILON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "03A5", "lowercase_mapping": "", "titlecase_mapping": "03A5", "symbol": "\u03C5" }, 966: { "value": "03C6", "name": "GREEK SMALL LETTER PHI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "03A6", "lowercase_mapping": "", "titlecase_mapping": "03A6", "symbol": "\u03C6" }, 967: { "value": "03C7", "name": "GREEK SMALL LETTER CHI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "03A7", "lowercase_mapping": "", "titlecase_mapping": "03A7", "symbol": "\u03C7" }, 968: { "value": "03C8", "name": "GREEK SMALL LETTER PSI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "03A8", "lowercase_mapping": "", "titlecase_mapping": "03A8", "symbol": "\u03C8" }, 969: { "value": "03C9", "name": "GREEK SMALL LETTER OMEGA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "03A9", "lowercase_mapping": "", "titlecase_mapping": "03A9", "symbol": "\u03C9" }, 970: { "value": "03CA", "name": "GREEK SMALL LETTER IOTA WITH DIALYTIKA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B9 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER IOTA DIAERESIS", "comment": "", "uppercase_mapping": "03AA", "lowercase_mapping": "", "titlecase_mapping": "03AA", "symbol": "\u03CA" }, 971: { "value": "03CB", "name": "GREEK SMALL LETTER UPSILON WITH DIALYTIKA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03C5 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER UPSILON DIAERESIS", "comment": "", "uppercase_mapping": "03AB", "lowercase_mapping": "", "titlecase_mapping": "03AB", "symbol": "\u03CB" }, 972: { "value": "03CC", "name": "GREEK SMALL LETTER OMICRON WITH TONOS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03BF 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER OMICRON TONOS", "comment": "", "uppercase_mapping": "038C", "lowercase_mapping": "", "titlecase_mapping": "038C", "symbol": "\u03CC" }, 973: { "value": "03CD", "name": "GREEK SMALL LETTER UPSILON WITH TONOS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03C5 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER UPSILON TONOS", "comment": "", "uppercase_mapping": "038E", "lowercase_mapping": "", "titlecase_mapping": "038E", "symbol": "\u03CD" }, 974: { "value": "03CE", "name": "GREEK SMALL LETTER OMEGA WITH TONOS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03C9 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER OMEGA TONOS", "comment": "", "uppercase_mapping": "038F", "lowercase_mapping": "", "titlecase_mapping": "038F", "symbol": "\u03CE" }, 976: { "value": "03D0", "name": "GREEK BETA SYMBOL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 03B2", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER CURLED BETA", "comment": "", "uppercase_mapping": "0392", "lowercase_mapping": "", "titlecase_mapping": "0392", "symbol": "\u03D0" }, 977: { "value": "03D1", "name": "GREEK THETA SYMBOL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 03B8", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER SCRIPT THETA", "comment": "", "uppercase_mapping": "0398", "lowercase_mapping": "", "titlecase_mapping": "0398", "symbol": "\u03D1" }, 981: { "value": "03D5", "name": "GREEK PHI SYMBOL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 03C6", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER SCRIPT PHI", "comment": "", "uppercase_mapping": "03A6", "lowercase_mapping": "", "titlecase_mapping": "03A6", "symbol": "\u03D5" }, 982: { "value": "03D6", "name": "GREEK PI SYMBOL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 03C0", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER OMEGA PI", "comment": "", "uppercase_mapping": "03A0", "lowercase_mapping": "", "titlecase_mapping": "03A0", "symbol": "\u03D6" }, 983: { "value": "03D7", "name": "GREEK KAI SYMBOL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "03CF", "lowercase_mapping": "", "titlecase_mapping": "03CF", "symbol": "\u03D7" }, 985: { "value": "03D9", "name": "GREEK SMALL LETTER ARCHAIC KOPPA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "03D8", "lowercase_mapping": "", "titlecase_mapping": "03D8", "symbol": "\u03D9" }, 987: { "value": "03DB", "name": "GREEK SMALL LETTER STIGMA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "03DA", "lowercase_mapping": "", "titlecase_mapping": "03DA", "symbol": "\u03DB" }, 989: { "value": "03DD", "name": "GREEK SMALL LETTER DIGAMMA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "03DC", "lowercase_mapping": "", "titlecase_mapping": "03DC", "symbol": "\u03DD" }, 991: { "value": "03DF", "name": "GREEK SMALL LETTER KOPPA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "03DE", "lowercase_mapping": "", "titlecase_mapping": "03DE", "symbol": "\u03DF" }, 993: { "value": "03E1", "name": "GREEK SMALL LETTER SAMPI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "03E0", "lowercase_mapping": "", "titlecase_mapping": "03E0", "symbol": "\u03E1" }, 995: { "value": "03E3", "name": "COPTIC SMALL LETTER SHEI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER SHEI", "comment": "", "uppercase_mapping": "03E2", "lowercase_mapping": "", "titlecase_mapping": "03E2", "symbol": "\u03E3" }, 997: { "value": "03E5", "name": "COPTIC SMALL LETTER FEI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER FEI", "comment": "", "uppercase_mapping": "03E4", "lowercase_mapping": "", "titlecase_mapping": "03E4", "symbol": "\u03E5" }, 999: { "value": "03E7", "name": "COPTIC SMALL LETTER KHEI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER KHEI", "comment": "", "uppercase_mapping": "03E6", "lowercase_mapping": "", "titlecase_mapping": "03E6", "symbol": "\u03E7" }, 1001: { "value": "03E9", "name": "COPTIC SMALL LETTER HORI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER HORI", "comment": "", "uppercase_mapping": "03E8", "lowercase_mapping": "", "titlecase_mapping": "03E8", "symbol": "\u03E9" }, 1003: { "value": "03EB", "name": "COPTIC SMALL LETTER GANGIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER GANGIA", "comment": "", "uppercase_mapping": "03EA", "lowercase_mapping": "", "titlecase_mapping": "03EA", "symbol": "\u03EB" }, 1005: { "value": "03ED", "name": "COPTIC SMALL LETTER SHIMA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER SHIMA", "comment": "", "uppercase_mapping": "03EC", "lowercase_mapping": "", "titlecase_mapping": "03EC", "symbol": "\u03ED" }, 1007: { "value": "03EF", "name": "COPTIC SMALL LETTER DEI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER DEI", "comment": "", "uppercase_mapping": "03EE", "lowercase_mapping": "", "titlecase_mapping": "03EE", "symbol": "\u03EF" }, 1008: { "value": "03F0", "name": "GREEK KAPPA SYMBOL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 03BA", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER SCRIPT KAPPA", "comment": "", "uppercase_mapping": "039A", "lowercase_mapping": "", "titlecase_mapping": "039A", "symbol": "\u03F0" }, 1009: { "value": "03F1", "name": "GREEK RHO SYMBOL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 03C1", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER TAILED RHO", "comment": "", "uppercase_mapping": "03A1", "lowercase_mapping": "", "titlecase_mapping": "03A1", "symbol": "\u03F1" }, 1010: { "value": "03F2", "name": "GREEK LUNATE SIGMA SYMBOL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 03C2", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "GREEK SMALL LETTER LUNATE SIGMA", "comment": "", "uppercase_mapping": "03F9", "lowercase_mapping": "", "titlecase_mapping": "03F9", "symbol": "\u03F2" }, 1011: { "value": "03F3", "name": "GREEK LETTER YOT", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "037F", "lowercase_mapping": "", "titlecase_mapping": "037F", "symbol": "\u03F3" }, 1013: { "value": "03F5", "name": "GREEK LUNATE EPSILON SYMBOL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 03B5", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0395", "lowercase_mapping": "", "titlecase_mapping": "0395", "symbol": "\u03F5" }, 1016: { "value": "03F8", "name": "GREEK SMALL LETTER SHO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "03F7", "lowercase_mapping": "", "titlecase_mapping": "03F7", "symbol": "\u03F8" }, 1019: { "value": "03FB", "name": "GREEK SMALL LETTER SAN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "03FA", "lowercase_mapping": "", "titlecase_mapping": "03FA", "symbol": "\u03FB" }, 1020: { "value": "03FC", "name": "GREEK RHO WITH STROKE SYMBOL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u03FC" }, 1072: { "value": "0430", "name": "CYRILLIC SMALL LETTER A", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0410", "lowercase_mapping": "", "titlecase_mapping": "0410", "symbol": "\u0430" }, 1073: { "value": "0431", "name": "CYRILLIC SMALL LETTER BE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0411", "lowercase_mapping": "", "titlecase_mapping": "0411", "symbol": "\u0431" }, 1074: { "value": "0432", "name": "CYRILLIC SMALL LETTER VE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0412", "lowercase_mapping": "", "titlecase_mapping": "0412", "symbol": "\u0432" }, 1075: { "value": "0433", "name": "CYRILLIC SMALL LETTER GHE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER GE", "comment": "", "uppercase_mapping": "0413", "lowercase_mapping": "", "titlecase_mapping": "0413", "symbol": "\u0433" }, 1076: { "value": "0434", "name": "CYRILLIC SMALL LETTER DE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0414", "lowercase_mapping": "", "titlecase_mapping": "0414", "symbol": "\u0434" }, 1077: { "value": "0435", "name": "CYRILLIC SMALL LETTER IE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0415", "lowercase_mapping": "", "titlecase_mapping": "0415", "symbol": "\u0435" }, 1078: { "value": "0436", "name": "CYRILLIC SMALL LETTER ZHE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0416", "lowercase_mapping": "", "titlecase_mapping": "0416", "symbol": "\u0436" }, 1079: { "value": "0437", "name": "CYRILLIC SMALL LETTER ZE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0417", "lowercase_mapping": "", "titlecase_mapping": "0417", "symbol": "\u0437" }, 1080: { "value": "0438", "name": "CYRILLIC SMALL LETTER I", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER II", "comment": "", "uppercase_mapping": "0418", "lowercase_mapping": "", "titlecase_mapping": "0418", "symbol": "\u0438" }, 1081: { "value": "0439", "name": "CYRILLIC SMALL LETTER SHORT I", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0438 0306", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER SHORT II", "comment": "", "uppercase_mapping": "0419", "lowercase_mapping": "", "titlecase_mapping": "0419", "symbol": "\u0439" }, 1082: { "value": "043A", "name": "CYRILLIC SMALL LETTER KA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "041A", "lowercase_mapping": "", "titlecase_mapping": "041A", "symbol": "\u043A" }, 1083: { "value": "043B", "name": "CYRILLIC SMALL LETTER EL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "041B", "lowercase_mapping": "", "titlecase_mapping": "041B", "symbol": "\u043B" }, 1084: { "value": "043C", "name": "CYRILLIC SMALL LETTER EM", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "041C", "lowercase_mapping": "", "titlecase_mapping": "041C", "symbol": "\u043C" }, 1085: { "value": "043D", "name": "CYRILLIC SMALL LETTER EN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "041D", "lowercase_mapping": "", "titlecase_mapping": "041D", "symbol": "\u043D" }, 1086: { "value": "043E", "name": "CYRILLIC SMALL LETTER O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "041E", "lowercase_mapping": "", "titlecase_mapping": "041E", "symbol": "\u043E" }, 1087: { "value": "043F", "name": "CYRILLIC SMALL LETTER PE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "041F", "lowercase_mapping": "", "titlecase_mapping": "041F", "symbol": "\u043F" }, 1088: { "value": "0440", "name": "CYRILLIC SMALL LETTER ER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0420", "lowercase_mapping": "", "titlecase_mapping": "0420", "symbol": "\u0440" }, 1089: { "value": "0441", "name": "CYRILLIC SMALL LETTER ES", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0421", "lowercase_mapping": "", "titlecase_mapping": "0421", "symbol": "\u0441" }, 1090: { "value": "0442", "name": "CYRILLIC SMALL LETTER TE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0422", "lowercase_mapping": "", "titlecase_mapping": "0422", "symbol": "\u0442" }, 1091: { "value": "0443", "name": "CYRILLIC SMALL LETTER U", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0423", "lowercase_mapping": "", "titlecase_mapping": "0423", "symbol": "\u0443" }, 1092: { "value": "0444", "name": "CYRILLIC SMALL LETTER EF", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0424", "lowercase_mapping": "", "titlecase_mapping": "0424", "symbol": "\u0444" }, 1093: { "value": "0445", "name": "CYRILLIC SMALL LETTER HA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER KHA", "comment": "", "uppercase_mapping": "0425", "lowercase_mapping": "", "titlecase_mapping": "0425", "symbol": "\u0445" }, 1094: { "value": "0446", "name": "CYRILLIC SMALL LETTER TSE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0426", "lowercase_mapping": "", "titlecase_mapping": "0426", "symbol": "\u0446" }, 1095: { "value": "0447", "name": "CYRILLIC SMALL LETTER CHE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0427", "lowercase_mapping": "", "titlecase_mapping": "0427", "symbol": "\u0447" }, 1096: { "value": "0448", "name": "CYRILLIC SMALL LETTER SHA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0428", "lowercase_mapping": "", "titlecase_mapping": "0428", "symbol": "\u0448" }, 1097: { "value": "0449", "name": "CYRILLIC SMALL LETTER SHCHA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0429", "lowercase_mapping": "", "titlecase_mapping": "0429", "symbol": "\u0449" }, 1098: { "value": "044A", "name": "CYRILLIC SMALL LETTER HARD SIGN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "042A", "lowercase_mapping": "", "titlecase_mapping": "042A", "symbol": "\u044A" }, 1099: { "value": "044B", "name": "CYRILLIC SMALL LETTER YERU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER YERI", "comment": "", "uppercase_mapping": "042B", "lowercase_mapping": "", "titlecase_mapping": "042B", "symbol": "\u044B" }, 1100: { "value": "044C", "name": "CYRILLIC SMALL LETTER SOFT SIGN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "042C", "lowercase_mapping": "", "titlecase_mapping": "042C", "symbol": "\u044C" }, 1101: { "value": "044D", "name": "CYRILLIC SMALL LETTER E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER REVERSED E", "comment": "", "uppercase_mapping": "042D", "lowercase_mapping": "", "titlecase_mapping": "042D", "symbol": "\u044D" }, 1102: { "value": "044E", "name": "CYRILLIC SMALL LETTER YU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER IU", "comment": "", "uppercase_mapping": "042E", "lowercase_mapping": "", "titlecase_mapping": "042E", "symbol": "\u044E" }, 1103: { "value": "044F", "name": "CYRILLIC SMALL LETTER YA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER IA", "comment": "", "uppercase_mapping": "042F", "lowercase_mapping": "", "titlecase_mapping": "042F", "symbol": "\u044F" }, 1104: { "value": "0450", "name": "CYRILLIC SMALL LETTER IE WITH GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0435 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0400", "lowercase_mapping": "", "titlecase_mapping": "0400", "symbol": "\u0450" }, 1105: { "value": "0451", "name": "CYRILLIC SMALL LETTER IO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0435 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0401", "lowercase_mapping": "", "titlecase_mapping": "0401", "symbol": "\u0451" }, 1106: { "value": "0452", "name": "CYRILLIC SMALL LETTER DJE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0402", "lowercase_mapping": "", "titlecase_mapping": "0402", "symbol": "\u0452" }, 1107: { "value": "0453", "name": "CYRILLIC SMALL LETTER GJE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0433 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0403", "lowercase_mapping": "", "titlecase_mapping": "0403", "symbol": "\u0453" }, 1108: { "value": "0454", "name": "CYRILLIC SMALL LETTER UKRAINIAN IE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER E", "comment": "", "uppercase_mapping": "0404", "lowercase_mapping": "", "titlecase_mapping": "0404", "symbol": "\u0454" }, 1109: { "value": "0455", "name": "CYRILLIC SMALL LETTER DZE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0405", "lowercase_mapping": "", "titlecase_mapping": "0405", "symbol": "\u0455" }, 1110: { "value": "0456", "name": "CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER I", "comment": "", "uppercase_mapping": "0406", "lowercase_mapping": "", "titlecase_mapping": "0406", "symbol": "\u0456" }, 1111: { "value": "0457", "name": "CYRILLIC SMALL LETTER YI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0456 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0407", "lowercase_mapping": "", "titlecase_mapping": "0407", "symbol": "\u0457" }, 1112: { "value": "0458", "name": "CYRILLIC SMALL LETTER JE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0408", "lowercase_mapping": "", "titlecase_mapping": "0408", "symbol": "\u0458" }, 1113: { "value": "0459", "name": "CYRILLIC SMALL LETTER LJE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0409", "lowercase_mapping": "", "titlecase_mapping": "0409", "symbol": "\u0459" }, 1114: { "value": "045A", "name": "CYRILLIC SMALL LETTER NJE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "040A", "lowercase_mapping": "", "titlecase_mapping": "040A", "symbol": "\u045A" }, 1115: { "value": "045B", "name": "CYRILLIC SMALL LETTER TSHE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "040B", "lowercase_mapping": "", "titlecase_mapping": "040B", "symbol": "\u045B" }, 1116: { "value": "045C", "name": "CYRILLIC SMALL LETTER KJE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "043A 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "040C", "lowercase_mapping": "", "titlecase_mapping": "040C", "symbol": "\u045C" }, 1117: { "value": "045D", "name": "CYRILLIC SMALL LETTER I WITH GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0438 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "040D", "lowercase_mapping": "", "titlecase_mapping": "040D", "symbol": "\u045D" }, 1118: { "value": "045E", "name": "CYRILLIC SMALL LETTER SHORT U", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0443 0306", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "040E", "lowercase_mapping": "", "titlecase_mapping": "040E", "symbol": "\u045E" }, 1119: { "value": "045F", "name": "CYRILLIC SMALL LETTER DZHE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "040F", "lowercase_mapping": "", "titlecase_mapping": "040F", "symbol": "\u045F" }, 1121: { "value": "0461", "name": "CYRILLIC SMALL LETTER OMEGA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0460", "lowercase_mapping": "", "titlecase_mapping": "0460", "symbol": "\u0461" }, 1123: { "value": "0463", "name": "CYRILLIC SMALL LETTER YAT", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0462", "lowercase_mapping": "", "titlecase_mapping": "0462", "symbol": "\u0463" }, 1125: { "value": "0465", "name": "CYRILLIC SMALL LETTER IOTIFIED E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0464", "lowercase_mapping": "", "titlecase_mapping": "0464", "symbol": "\u0465" }, 1127: { "value": "0467", "name": "CYRILLIC SMALL LETTER LITTLE YUS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0466", "lowercase_mapping": "", "titlecase_mapping": "0466", "symbol": "\u0467" }, 1129: { "value": "0469", "name": "CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0468", "lowercase_mapping": "", "titlecase_mapping": "0468", "symbol": "\u0469" }, 1131: { "value": "046B", "name": "CYRILLIC SMALL LETTER BIG YUS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "046A", "lowercase_mapping": "", "titlecase_mapping": "046A", "symbol": "\u046B" }, 1133: { "value": "046D", "name": "CYRILLIC SMALL LETTER IOTIFIED BIG YUS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "046C", "lowercase_mapping": "", "titlecase_mapping": "046C", "symbol": "\u046D" }, 1135: { "value": "046F", "name": "CYRILLIC SMALL LETTER KSI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "046E", "lowercase_mapping": "", "titlecase_mapping": "046E", "symbol": "\u046F" }, 1137: { "value": "0471", "name": "CYRILLIC SMALL LETTER PSI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0470", "lowercase_mapping": "", "titlecase_mapping": "0470", "symbol": "\u0471" }, 1139: { "value": "0473", "name": "CYRILLIC SMALL LETTER FITA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0472", "lowercase_mapping": "", "titlecase_mapping": "0472", "symbol": "\u0473" }, 1141: { "value": "0475", "name": "CYRILLIC SMALL LETTER IZHITSA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0474", "lowercase_mapping": "", "titlecase_mapping": "0474", "symbol": "\u0475" }, 1143: { "value": "0477", "name": "CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0475 030F", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE", "comment": "", "uppercase_mapping": "0476", "lowercase_mapping": "", "titlecase_mapping": "0476", "symbol": "\u0477" }, 1145: { "value": "0479", "name": "CYRILLIC SMALL LETTER UK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER UK DIGRAPH", "comment": "", "uppercase_mapping": "0478", "lowercase_mapping": "", "titlecase_mapping": "0478", "symbol": "\u0479" }, 1147: { "value": "047B", "name": "CYRILLIC SMALL LETTER ROUND OMEGA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "047A", "lowercase_mapping": "", "titlecase_mapping": "047A", "symbol": "\u047B" }, 1149: { "value": "047D", "name": "CYRILLIC SMALL LETTER OMEGA WITH TITLO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER OMEGA TITLO", "comment": "", "uppercase_mapping": "047C", "lowercase_mapping": "", "titlecase_mapping": "047C", "symbol": "\u047D" }, 1151: { "value": "047F", "name": "CYRILLIC SMALL LETTER OT", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "047E", "lowercase_mapping": "", "titlecase_mapping": "047E", "symbol": "\u047F" }, 1153: { "value": "0481", "name": "CYRILLIC SMALL LETTER KOPPA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0480", "lowercase_mapping": "", "titlecase_mapping": "0480", "symbol": "\u0481" }, 1163: { "value": "048B", "name": "CYRILLIC SMALL LETTER SHORT I WITH TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "048A", "lowercase_mapping": "", "titlecase_mapping": "048A", "symbol": "\u048B" }, 1165: { "value": "048D", "name": "CYRILLIC SMALL LETTER SEMISOFT SIGN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "048C", "lowercase_mapping": "", "titlecase_mapping": "048C", "symbol": "\u048D" }, 1167: { "value": "048F", "name": "CYRILLIC SMALL LETTER ER WITH TICK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "048E", "lowercase_mapping": "", "titlecase_mapping": "048E", "symbol": "\u048F" }, 1169: { "value": "0491", "name": "CYRILLIC SMALL LETTER GHE WITH UPTURN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER GE WITH UPTURN", "comment": "", "uppercase_mapping": "0490", "lowercase_mapping": "", "titlecase_mapping": "0490", "symbol": "\u0491" }, 1171: { "value": "0493", "name": "CYRILLIC SMALL LETTER GHE WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER GE BAR", "comment": "", "uppercase_mapping": "0492", "lowercase_mapping": "", "titlecase_mapping": "0492", "symbol": "\u0493" }, 1173: { "value": "0495", "name": "CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER GE HOOK", "comment": "", "uppercase_mapping": "0494", "lowercase_mapping": "", "titlecase_mapping": "0494", "symbol": "\u0495" }, 1175: { "value": "0497", "name": "CYRILLIC SMALL LETTER ZHE WITH DESCENDER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER", "comment": "", "uppercase_mapping": "0496", "lowercase_mapping": "", "titlecase_mapping": "0496", "symbol": "\u0497" }, 1177: { "value": "0499", "name": "CYRILLIC SMALL LETTER ZE WITH DESCENDER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER ZE CEDILLA", "comment": "", "uppercase_mapping": "0498", "lowercase_mapping": "", "titlecase_mapping": "0498", "symbol": "\u0499" }, 1179: { "value": "049B", "name": "CYRILLIC SMALL LETTER KA WITH DESCENDER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER", "comment": "", "uppercase_mapping": "049A", "lowercase_mapping": "", "titlecase_mapping": "049A", "symbol": "\u049B" }, 1181: { "value": "049D", "name": "CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER KA VERTICAL BAR", "comment": "", "uppercase_mapping": "049C", "lowercase_mapping": "", "titlecase_mapping": "049C", "symbol": "\u049D" }, 1183: { "value": "049F", "name": "CYRILLIC SMALL LETTER KA WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER KA BAR", "comment": "", "uppercase_mapping": "049E", "lowercase_mapping": "", "titlecase_mapping": "049E", "symbol": "\u049F" }, 1185: { "value": "04A1", "name": "CYRILLIC SMALL LETTER BASHKIR KA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER REVERSED GE KA", "comment": "", "uppercase_mapping": "04A0", "lowercase_mapping": "", "titlecase_mapping": "04A0", "symbol": "\u04A1" }, 1187: { "value": "04A3", "name": "CYRILLIC SMALL LETTER EN WITH DESCENDER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER", "comment": "", "uppercase_mapping": "04A2", "lowercase_mapping": "", "titlecase_mapping": "04A2", "symbol": "\u04A3" }, 1189: { "value": "04A5", "name": "CYRILLIC SMALL LIGATURE EN GHE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER EN GE", "comment": "", "uppercase_mapping": "04A4", "lowercase_mapping": "", "titlecase_mapping": "04A4", "symbol": "\u04A5" }, 1191: { "value": "04A7", "name": "CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER PE HOOK", "comment": "", "uppercase_mapping": "04A6", "lowercase_mapping": "", "titlecase_mapping": "04A6", "symbol": "\u04A7" }, 1193: { "value": "04A9", "name": "CYRILLIC SMALL LETTER ABKHASIAN HA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER O HOOK", "comment": "", "uppercase_mapping": "04A8", "lowercase_mapping": "", "titlecase_mapping": "04A8", "symbol": "\u04A9" }, 1195: { "value": "04AB", "name": "CYRILLIC SMALL LETTER ES WITH DESCENDER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER ES CEDILLA", "comment": "", "uppercase_mapping": "04AA", "lowercase_mapping": "", "titlecase_mapping": "04AA", "symbol": "\u04AB" }, 1197: { "value": "04AD", "name": "CYRILLIC SMALL LETTER TE WITH DESCENDER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER", "comment": "", "uppercase_mapping": "04AC", "lowercase_mapping": "", "titlecase_mapping": "04AC", "symbol": "\u04AD" }, 1199: { "value": "04AF", "name": "CYRILLIC SMALL LETTER STRAIGHT U", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04AE", "lowercase_mapping": "", "titlecase_mapping": "04AE", "symbol": "\u04AF" }, 1201: { "value": "04B1", "name": "CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER STRAIGHT U BAR", "comment": "", "uppercase_mapping": "04B0", "lowercase_mapping": "", "titlecase_mapping": "04B0", "symbol": "\u04B1" }, 1203: { "value": "04B3", "name": "CYRILLIC SMALL LETTER HA WITH DESCENDER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER", "comment": "", "uppercase_mapping": "04B2", "lowercase_mapping": "", "titlecase_mapping": "04B2", "symbol": "\u04B3" }, 1205: { "value": "04B5", "name": "CYRILLIC SMALL LIGATURE TE TSE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER TE TSE", "comment": "", "uppercase_mapping": "04B4", "lowercase_mapping": "", "titlecase_mapping": "04B4", "symbol": "\u04B5" }, 1207: { "value": "04B7", "name": "CYRILLIC SMALL LETTER CHE WITH DESCENDER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER", "comment": "", "uppercase_mapping": "04B6", "lowercase_mapping": "", "titlecase_mapping": "04B6", "symbol": "\u04B7" }, 1209: { "value": "04B9", "name": "CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER CHE VERTICAL BAR", "comment": "", "uppercase_mapping": "04B8", "lowercase_mapping": "", "titlecase_mapping": "04B8", "symbol": "\u04B9" }, 1211: { "value": "04BB", "name": "CYRILLIC SMALL LETTER SHHA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER H", "comment": "", "uppercase_mapping": "04BA", "lowercase_mapping": "", "titlecase_mapping": "04BA", "symbol": "\u04BB" }, 1213: { "value": "04BD", "name": "CYRILLIC SMALL LETTER ABKHASIAN CHE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER IE HOOK", "comment": "", "uppercase_mapping": "04BC", "lowercase_mapping": "", "titlecase_mapping": "04BC", "symbol": "\u04BD" }, 1215: { "value": "04BF", "name": "CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER IE HOOK OGONEK", "comment": "", "uppercase_mapping": "04BE", "lowercase_mapping": "", "titlecase_mapping": "04BE", "symbol": "\u04BF" }, 1218: { "value": "04C2", "name": "CYRILLIC SMALL LETTER ZHE WITH BREVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0436 0306", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER SHORT ZHE", "comment": "", "uppercase_mapping": "04C1", "lowercase_mapping": "", "titlecase_mapping": "04C1", "symbol": "\u04C2" }, 1220: { "value": "04C4", "name": "CYRILLIC SMALL LETTER KA WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER KA HOOK", "comment": "", "uppercase_mapping": "04C3", "lowercase_mapping": "", "titlecase_mapping": "04C3", "symbol": "\u04C4" }, 1222: { "value": "04C6", "name": "CYRILLIC SMALL LETTER EL WITH TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04C5", "lowercase_mapping": "", "titlecase_mapping": "04C5", "symbol": "\u04C6" }, 1224: { "value": "04C8", "name": "CYRILLIC SMALL LETTER EN WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER EN HOOK", "comment": "", "uppercase_mapping": "04C7", "lowercase_mapping": "", "titlecase_mapping": "04C7", "symbol": "\u04C8" }, 1226: { "value": "04CA", "name": "CYRILLIC SMALL LETTER EN WITH TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04C9", "lowercase_mapping": "", "titlecase_mapping": "04C9", "symbol": "\u04CA" }, 1228: { "value": "04CC", "name": "CYRILLIC SMALL LETTER KHAKASSIAN CHE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER", "comment": "", "uppercase_mapping": "04CB", "lowercase_mapping": "", "titlecase_mapping": "04CB", "symbol": "\u04CC" }, 1230: { "value": "04CE", "name": "CYRILLIC SMALL LETTER EM WITH TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04CD", "lowercase_mapping": "", "titlecase_mapping": "04CD", "symbol": "\u04CE" }, 1231: { "value": "04CF", "name": "CYRILLIC SMALL LETTER PALOCHKA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04C0", "lowercase_mapping": "", "titlecase_mapping": "04C0", "symbol": "\u04CF" }, 1233: { "value": "04D1", "name": "CYRILLIC SMALL LETTER A WITH BREVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0430 0306", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04D0", "lowercase_mapping": "", "titlecase_mapping": "04D0", "symbol": "\u04D1" }, 1235: { "value": "04D3", "name": "CYRILLIC SMALL LETTER A WITH DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0430 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04D2", "lowercase_mapping": "", "titlecase_mapping": "04D2", "symbol": "\u04D3" }, 1237: { "value": "04D5", "name": "CYRILLIC SMALL LIGATURE A IE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04D4", "lowercase_mapping": "", "titlecase_mapping": "04D4", "symbol": "\u04D5" }, 1239: { "value": "04D7", "name": "CYRILLIC SMALL LETTER IE WITH BREVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0435 0306", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04D6", "lowercase_mapping": "", "titlecase_mapping": "04D6", "symbol": "\u04D7" }, 1241: { "value": "04D9", "name": "CYRILLIC SMALL LETTER SCHWA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04D8", "lowercase_mapping": "", "titlecase_mapping": "04D8", "symbol": "\u04D9" }, 1243: { "value": "04DB", "name": "CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "04D9 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04DA", "lowercase_mapping": "", "titlecase_mapping": "04DA", "symbol": "\u04DB" }, 1245: { "value": "04DD", "name": "CYRILLIC SMALL LETTER ZHE WITH DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0436 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04DC", "lowercase_mapping": "", "titlecase_mapping": "04DC", "symbol": "\u04DD" }, 1247: { "value": "04DF", "name": "CYRILLIC SMALL LETTER ZE WITH DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0437 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04DE", "lowercase_mapping": "", "titlecase_mapping": "04DE", "symbol": "\u04DF" }, 1249: { "value": "04E1", "name": "CYRILLIC SMALL LETTER ABKHASIAN DZE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04E0", "lowercase_mapping": "", "titlecase_mapping": "04E0", "symbol": "\u04E1" }, 1251: { "value": "04E3", "name": "CYRILLIC SMALL LETTER I WITH MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0438 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04E2", "lowercase_mapping": "", "titlecase_mapping": "04E2", "symbol": "\u04E3" }, 1253: { "value": "04E5", "name": "CYRILLIC SMALL LETTER I WITH DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0438 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04E4", "lowercase_mapping": "", "titlecase_mapping": "04E4", "symbol": "\u04E5" }, 1255: { "value": "04E7", "name": "CYRILLIC SMALL LETTER O WITH DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "043E 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04E6", "lowercase_mapping": "", "titlecase_mapping": "04E6", "symbol": "\u04E7" }, 1257: { "value": "04E9", "name": "CYRILLIC SMALL LETTER BARRED O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04E8", "lowercase_mapping": "", "titlecase_mapping": "04E8", "symbol": "\u04E9" }, 1259: { "value": "04EB", "name": "CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "04E9 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04EA", "lowercase_mapping": "", "titlecase_mapping": "04EA", "symbol": "\u04EB" }, 1261: { "value": "04ED", "name": "CYRILLIC SMALL LETTER E WITH DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "044D 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04EC", "lowercase_mapping": "", "titlecase_mapping": "04EC", "symbol": "\u04ED" }, 1263: { "value": "04EF", "name": "CYRILLIC SMALL LETTER U WITH MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0443 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04EE", "lowercase_mapping": "", "titlecase_mapping": "04EE", "symbol": "\u04EF" }, 1265: { "value": "04F1", "name": "CYRILLIC SMALL LETTER U WITH DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0443 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04F0", "lowercase_mapping": "", "titlecase_mapping": "04F0", "symbol": "\u04F1" }, 1267: { "value": "04F3", "name": "CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0443 030B", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04F2", "lowercase_mapping": "", "titlecase_mapping": "04F2", "symbol": "\u04F3" }, 1269: { "value": "04F5", "name": "CYRILLIC SMALL LETTER CHE WITH DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0447 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04F4", "lowercase_mapping": "", "titlecase_mapping": "04F4", "symbol": "\u04F5" }, 1271: { "value": "04F7", "name": "CYRILLIC SMALL LETTER GHE WITH DESCENDER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04F6", "lowercase_mapping": "", "titlecase_mapping": "04F6", "symbol": "\u04F7" }, 1273: { "value": "04F9", "name": "CYRILLIC SMALL LETTER YERU WITH DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "044B 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04F8", "lowercase_mapping": "", "titlecase_mapping": "04F8", "symbol": "\u04F9" }, 1275: { "value": "04FB", "name": "CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04FA", "lowercase_mapping": "", "titlecase_mapping": "04FA", "symbol": "\u04FB" }, 1277: { "value": "04FD", "name": "CYRILLIC SMALL LETTER HA WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04FC", "lowercase_mapping": "", "titlecase_mapping": "04FC", "symbol": "\u04FD" }, 1279: { "value": "04FF", "name": "CYRILLIC SMALL LETTER HA WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "04FE", "lowercase_mapping": "", "titlecase_mapping": "04FE", "symbol": "\u04FF" }, 1281: { "value": "0501", "name": "CYRILLIC SMALL LETTER KOMI DE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0500", "lowercase_mapping": "", "titlecase_mapping": "0500", "symbol": "\u0501" }, 1283: { "value": "0503", "name": "CYRILLIC SMALL LETTER KOMI DJE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0502", "lowercase_mapping": "", "titlecase_mapping": "0502", "symbol": "\u0503" }, 1285: { "value": "0505", "name": "CYRILLIC SMALL LETTER KOMI ZJE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0504", "lowercase_mapping": "", "titlecase_mapping": "0504", "symbol": "\u0505" }, 1287: { "value": "0507", "name": "CYRILLIC SMALL LETTER KOMI DZJE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0506", "lowercase_mapping": "", "titlecase_mapping": "0506", "symbol": "\u0507" }, 1289: { "value": "0509", "name": "CYRILLIC SMALL LETTER KOMI LJE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0508", "lowercase_mapping": "", "titlecase_mapping": "0508", "symbol": "\u0509" }, 1291: { "value": "050B", "name": "CYRILLIC SMALL LETTER KOMI NJE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "050A", "lowercase_mapping": "", "titlecase_mapping": "050A", "symbol": "\u050B" }, 1293: { "value": "050D", "name": "CYRILLIC SMALL LETTER KOMI SJE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "050C", "lowercase_mapping": "", "titlecase_mapping": "050C", "symbol": "\u050D" }, 1295: { "value": "050F", "name": "CYRILLIC SMALL LETTER KOMI TJE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "050E", "lowercase_mapping": "", "titlecase_mapping": "050E", "symbol": "\u050F" }, 1297: { "value": "0511", "name": "CYRILLIC SMALL LETTER REVERSED ZE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0510", "lowercase_mapping": "", "titlecase_mapping": "0510", "symbol": "\u0511" }, 1299: { "value": "0513", "name": "CYRILLIC SMALL LETTER EL WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0512", "lowercase_mapping": "", "titlecase_mapping": "0512", "symbol": "\u0513" }, 1301: { "value": "0515", "name": "CYRILLIC SMALL LETTER LHA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0514", "lowercase_mapping": "", "titlecase_mapping": "0514", "symbol": "\u0515" }, 1303: { "value": "0517", "name": "CYRILLIC SMALL LETTER RHA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0516", "lowercase_mapping": "", "titlecase_mapping": "0516", "symbol": "\u0517" }, 1305: { "value": "0519", "name": "CYRILLIC SMALL LETTER YAE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0518", "lowercase_mapping": "", "titlecase_mapping": "0518", "symbol": "\u0519" }, 1307: { "value": "051B", "name": "CYRILLIC SMALL LETTER QA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "051A", "lowercase_mapping": "", "titlecase_mapping": "051A", "symbol": "\u051B" }, 1309: { "value": "051D", "name": "CYRILLIC SMALL LETTER WE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "051C", "lowercase_mapping": "", "titlecase_mapping": "051C", "symbol": "\u051D" }, 1311: { "value": "051F", "name": "CYRILLIC SMALL LETTER ALEUT KA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "051E", "lowercase_mapping": "", "titlecase_mapping": "051E", "symbol": "\u051F" }, 1313: { "value": "0521", "name": "CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0520", "lowercase_mapping": "", "titlecase_mapping": "0520", "symbol": "\u0521" }, 1315: { "value": "0523", "name": "CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0522", "lowercase_mapping": "", "titlecase_mapping": "0522", "symbol": "\u0523" }, 1317: { "value": "0525", "name": "CYRILLIC SMALL LETTER PE WITH DESCENDER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0524", "lowercase_mapping": "", "titlecase_mapping": "0524", "symbol": "\u0525" }, 1319: { "value": "0527", "name": "CYRILLIC SMALL LETTER SHHA WITH DESCENDER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0526", "lowercase_mapping": "", "titlecase_mapping": "0526", "symbol": "\u0527" }, 1321: { "value": "0529", "name": "CYRILLIC SMALL LETTER EN WITH LEFT HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0528", "lowercase_mapping": "", "titlecase_mapping": "0528", "symbol": "\u0529" }, 1323: { "value": "052B", "name": "CYRILLIC SMALL LETTER DZZHE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "052A", "lowercase_mapping": "", "titlecase_mapping": "052A", "symbol": "\u052B" }, 1325: { "value": "052D", "name": "CYRILLIC SMALL LETTER DCHE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "052C", "lowercase_mapping": "", "titlecase_mapping": "052C", "symbol": "\u052D" }, 1327: { "value": "052F", "name": "CYRILLIC SMALL LETTER EL WITH DESCENDER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "052E", "lowercase_mapping": "", "titlecase_mapping": "052E", "symbol": "\u052F" }, 1377: { "value": "0561", "name": "ARMENIAN SMALL LETTER AYB", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0531", "lowercase_mapping": "", "titlecase_mapping": "0531", "symbol": "\u0561" }, 1378: { "value": "0562", "name": "ARMENIAN SMALL LETTER BEN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0532", "lowercase_mapping": "", "titlecase_mapping": "0532", "symbol": "\u0562" }, 1379: { "value": "0563", "name": "ARMENIAN SMALL LETTER GIM", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0533", "lowercase_mapping": "", "titlecase_mapping": "0533", "symbol": "\u0563" }, 1380: { "value": "0564", "name": "ARMENIAN SMALL LETTER DA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0534", "lowercase_mapping": "", "titlecase_mapping": "0534", "symbol": "\u0564" }, 1381: { "value": "0565", "name": "ARMENIAN SMALL LETTER ECH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0535", "lowercase_mapping": "", "titlecase_mapping": "0535", "symbol": "\u0565" }, 1382: { "value": "0566", "name": "ARMENIAN SMALL LETTER ZA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0536", "lowercase_mapping": "", "titlecase_mapping": "0536", "symbol": "\u0566" }, 1383: { "value": "0567", "name": "ARMENIAN SMALL LETTER EH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0537", "lowercase_mapping": "", "titlecase_mapping": "0537", "symbol": "\u0567" }, 1384: { "value": "0568", "name": "ARMENIAN SMALL LETTER ET", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0538", "lowercase_mapping": "", "titlecase_mapping": "0538", "symbol": "\u0568" }, 1385: { "value": "0569", "name": "ARMENIAN SMALL LETTER TO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0539", "lowercase_mapping": "", "titlecase_mapping": "0539", "symbol": "\u0569" }, 1386: { "value": "056A", "name": "ARMENIAN SMALL LETTER ZHE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "053A", "lowercase_mapping": "", "titlecase_mapping": "053A", "symbol": "\u056A" }, 1387: { "value": "056B", "name": "ARMENIAN SMALL LETTER INI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "053B", "lowercase_mapping": "", "titlecase_mapping": "053B", "symbol": "\u056B" }, 1388: { "value": "056C", "name": "ARMENIAN SMALL LETTER LIWN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "053C", "lowercase_mapping": "", "titlecase_mapping": "053C", "symbol": "\u056C" }, 1389: { "value": "056D", "name": "ARMENIAN SMALL LETTER XEH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "053D", "lowercase_mapping": "", "titlecase_mapping": "053D", "symbol": "\u056D" }, 1390: { "value": "056E", "name": "ARMENIAN SMALL LETTER CA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "053E", "lowercase_mapping": "", "titlecase_mapping": "053E", "symbol": "\u056E" }, 1391: { "value": "056F", "name": "ARMENIAN SMALL LETTER KEN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "053F", "lowercase_mapping": "", "titlecase_mapping": "053F", "symbol": "\u056F" }, 1392: { "value": "0570", "name": "ARMENIAN SMALL LETTER HO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0540", "lowercase_mapping": "", "titlecase_mapping": "0540", "symbol": "\u0570" }, 1393: { "value": "0571", "name": "ARMENIAN SMALL LETTER JA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0541", "lowercase_mapping": "", "titlecase_mapping": "0541", "symbol": "\u0571" }, 1394: { "value": "0572", "name": "ARMENIAN SMALL LETTER GHAD", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "ARMENIAN SMALL LETTER LAD", "comment": "", "uppercase_mapping": "0542", "lowercase_mapping": "", "titlecase_mapping": "0542", "symbol": "\u0572" }, 1395: { "value": "0573", "name": "ARMENIAN SMALL LETTER CHEH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0543", "lowercase_mapping": "", "titlecase_mapping": "0543", "symbol": "\u0573" }, 1396: { "value": "0574", "name": "ARMENIAN SMALL LETTER MEN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0544", "lowercase_mapping": "", "titlecase_mapping": "0544", "symbol": "\u0574" }, 1397: { "value": "0575", "name": "ARMENIAN SMALL LETTER YI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0545", "lowercase_mapping": "", "titlecase_mapping": "0545", "symbol": "\u0575" }, 1398: { "value": "0576", "name": "ARMENIAN SMALL LETTER NOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0546", "lowercase_mapping": "", "titlecase_mapping": "0546", "symbol": "\u0576" }, 1399: { "value": "0577", "name": "ARMENIAN SMALL LETTER SHA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0547", "lowercase_mapping": "", "titlecase_mapping": "0547", "symbol": "\u0577" }, 1400: { "value": "0578", "name": "ARMENIAN SMALL LETTER VO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0548", "lowercase_mapping": "", "titlecase_mapping": "0548", "symbol": "\u0578" }, 1401: { "value": "0579", "name": "ARMENIAN SMALL LETTER CHA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0549", "lowercase_mapping": "", "titlecase_mapping": "0549", "symbol": "\u0579" }, 1402: { "value": "057A", "name": "ARMENIAN SMALL LETTER PEH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "054A", "lowercase_mapping": "", "titlecase_mapping": "054A", "symbol": "\u057A" }, 1403: { "value": "057B", "name": "ARMENIAN SMALL LETTER JHEH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "054B", "lowercase_mapping": "", "titlecase_mapping": "054B", "symbol": "\u057B" }, 1404: { "value": "057C", "name": "ARMENIAN SMALL LETTER RA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "054C", "lowercase_mapping": "", "titlecase_mapping": "054C", "symbol": "\u057C" }, 1405: { "value": "057D", "name": "ARMENIAN SMALL LETTER SEH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "054D", "lowercase_mapping": "", "titlecase_mapping": "054D", "symbol": "\u057D" }, 1406: { "value": "057E", "name": "ARMENIAN SMALL LETTER VEW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "054E", "lowercase_mapping": "", "titlecase_mapping": "054E", "symbol": "\u057E" }, 1407: { "value": "057F", "name": "ARMENIAN SMALL LETTER TIWN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "054F", "lowercase_mapping": "", "titlecase_mapping": "054F", "symbol": "\u057F" }, 1408: { "value": "0580", "name": "ARMENIAN SMALL LETTER REH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0550", "lowercase_mapping": "", "titlecase_mapping": "0550", "symbol": "\u0580" }, 1409: { "value": "0581", "name": "ARMENIAN SMALL LETTER CO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0551", "lowercase_mapping": "", "titlecase_mapping": "0551", "symbol": "\u0581" }, 1410: { "value": "0582", "name": "ARMENIAN SMALL LETTER YIWN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0552", "lowercase_mapping": "", "titlecase_mapping": "0552", "symbol": "\u0582" }, 1411: { "value": "0583", "name": "ARMENIAN SMALL LETTER PIWR", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0553", "lowercase_mapping": "", "titlecase_mapping": "0553", "symbol": "\u0583" }, 1412: { "value": "0584", "name": "ARMENIAN SMALL LETTER KEH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0554", "lowercase_mapping": "", "titlecase_mapping": "0554", "symbol": "\u0584" }, 1413: { "value": "0585", "name": "ARMENIAN SMALL LETTER OH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0555", "lowercase_mapping": "", "titlecase_mapping": "0555", "symbol": "\u0585" }, 1414: { "value": "0586", "name": "ARMENIAN SMALL LETTER FEH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0556", "lowercase_mapping": "", "titlecase_mapping": "0556", "symbol": "\u0586" }, 1415: { "value": "0587", "name": "ARMENIAN SMALL LIGATURE ECH YIWN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0565 0582", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u0587" }, 5112: { "value": "13F8", "name": "CHEROKEE SMALL LETTER YE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13F0", "lowercase_mapping": "", "titlecase_mapping": "13F0", "symbol": "\u13F8" }, 5113: { "value": "13F9", "name": "CHEROKEE SMALL LETTER YI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13F1", "lowercase_mapping": "", "titlecase_mapping": "13F1", "symbol": "\u13F9" }, 5114: { "value": "13FA", "name": "CHEROKEE SMALL LETTER YO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13F2", "lowercase_mapping": "", "titlecase_mapping": "13F2", "symbol": "\u13FA" }, 5115: { "value": "13FB", "name": "CHEROKEE SMALL LETTER YU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13F3", "lowercase_mapping": "", "titlecase_mapping": "13F3", "symbol": "\u13FB" }, 5116: { "value": "13FC", "name": "CHEROKEE SMALL LETTER YV", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13F4", "lowercase_mapping": "", "titlecase_mapping": "13F4", "symbol": "\u13FC" }, 5117: { "value": "13FD", "name": "CHEROKEE SMALL LETTER MV", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13F5", "lowercase_mapping": "", "titlecase_mapping": "13F5", "symbol": "\u13FD" }, 7296: { "value": "1C80", "name": "CYRILLIC SMALL LETTER ROUNDED VE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0412", "lowercase_mapping": "", "titlecase_mapping": "0412", "symbol": "\u1C80" }, 7297: { "value": "1C81", "name": "CYRILLIC SMALL LETTER LONG-LEGGED DE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0414", "lowercase_mapping": "", "titlecase_mapping": "0414", "symbol": "\u1C81" }, 7298: { "value": "1C82", "name": "CYRILLIC SMALL LETTER NARROW O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "041E", "lowercase_mapping": "", "titlecase_mapping": "041E", "symbol": "\u1C82" }, 7299: { "value": "1C83", "name": "CYRILLIC SMALL LETTER WIDE ES", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0421", "lowercase_mapping": "", "titlecase_mapping": "0421", "symbol": "\u1C83" }, 7300: { "value": "1C84", "name": "CYRILLIC SMALL LETTER TALL TE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0422", "lowercase_mapping": "", "titlecase_mapping": "0422", "symbol": "\u1C84" }, 7301: { "value": "1C85", "name": "CYRILLIC SMALL LETTER THREE-LEGGED TE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0422", "lowercase_mapping": "", "titlecase_mapping": "0422", "symbol": "\u1C85" }, 7302: { "value": "1C86", "name": "CYRILLIC SMALL LETTER TALL HARD SIGN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "042A", "lowercase_mapping": "", "titlecase_mapping": "042A", "symbol": "\u1C86" }, 7303: { "value": "1C87", "name": "CYRILLIC SMALL LETTER TALL YAT", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0462", "lowercase_mapping": "", "titlecase_mapping": "0462", "symbol": "\u1C87" }, 7304: { "value": "1C88", "name": "CYRILLIC SMALL LETTER UNBLENDED UK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A64A", "lowercase_mapping": "", "titlecase_mapping": "A64A", "symbol": "\u1C88" }, 7424: { "value": "1D00", "name": "LATIN LETTER SMALL CAPITAL A", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D00" }, 7425: { "value": "1D01", "name": "LATIN LETTER SMALL CAPITAL AE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D01" }, 7426: { "value": "1D02", "name": "LATIN SMALL LETTER TURNED AE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D02" }, 7427: { "value": "1D03", "name": "LATIN LETTER SMALL CAPITAL BARRED B", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D03" }, 7428: { "value": "1D04", "name": "LATIN LETTER SMALL CAPITAL C", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D04" }, 7429: { "value": "1D05", "name": "LATIN LETTER SMALL CAPITAL D", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D05" }, 7430: { "value": "1D06", "name": "LATIN LETTER SMALL CAPITAL ETH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D06" }, 7431: { "value": "1D07", "name": "LATIN LETTER SMALL CAPITAL E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D07" }, 7432: { "value": "1D08", "name": "LATIN SMALL LETTER TURNED OPEN E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D08" }, 7433: { "value": "1D09", "name": "LATIN SMALL LETTER TURNED I", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D09" }, 7434: { "value": "1D0A", "name": "LATIN LETTER SMALL CAPITAL J", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D0A" }, 7435: { "value": "1D0B", "name": "LATIN LETTER SMALL CAPITAL K", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D0B" }, 7436: { "value": "1D0C", "name": "LATIN LETTER SMALL CAPITAL L WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D0C" }, 7437: { "value": "1D0D", "name": "LATIN LETTER SMALL CAPITAL M", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D0D" }, 7438: { "value": "1D0E", "name": "LATIN LETTER SMALL CAPITAL REVERSED N", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D0E" }, 7439: { "value": "1D0F", "name": "LATIN LETTER SMALL CAPITAL O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D0F" }, 7440: { "value": "1D10", "name": "LATIN LETTER SMALL CAPITAL OPEN O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D10" }, 7441: { "value": "1D11", "name": "LATIN SMALL LETTER SIDEWAYS O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D11" }, 7442: { "value": "1D12", "name": "LATIN SMALL LETTER SIDEWAYS OPEN O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D12" }, 7443: { "value": "1D13", "name": "LATIN SMALL LETTER SIDEWAYS O WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D13" }, 7444: { "value": "1D14", "name": "LATIN SMALL LETTER TURNED OE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D14" }, 7445: { "value": "1D15", "name": "LATIN LETTER SMALL CAPITAL OU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D15" }, 7446: { "value": "1D16", "name": "LATIN SMALL LETTER TOP HALF O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D16" }, 7447: { "value": "1D17", "name": "LATIN SMALL LETTER BOTTOM HALF O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D17" }, 7448: { "value": "1D18", "name": "LATIN LETTER SMALL CAPITAL P", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D18" }, 7449: { "value": "1D19", "name": "LATIN LETTER SMALL CAPITAL REVERSED R", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D19" }, 7450: { "value": "1D1A", "name": "LATIN LETTER SMALL CAPITAL TURNED R", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D1A" }, 7451: { "value": "1D1B", "name": "LATIN LETTER SMALL CAPITAL T", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D1B" }, 7452: { "value": "1D1C", "name": "LATIN LETTER SMALL CAPITAL U", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D1C" }, 7453: { "value": "1D1D", "name": "LATIN SMALL LETTER SIDEWAYS U", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D1D" }, 7454: { "value": "1D1E", "name": "LATIN SMALL LETTER SIDEWAYS DIAERESIZED U", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D1E" }, 7455: { "value": "1D1F", "name": "LATIN SMALL LETTER SIDEWAYS TURNED M", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D1F" }, 7456: { "value": "1D20", "name": "LATIN LETTER SMALL CAPITAL V", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D20" }, 7457: { "value": "1D21", "name": "LATIN LETTER SMALL CAPITAL W", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D21" }, 7458: { "value": "1D22", "name": "LATIN LETTER SMALL CAPITAL Z", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D22" }, 7459: { "value": "1D23", "name": "LATIN LETTER SMALL CAPITAL EZH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D23" }, 7460: { "value": "1D24", "name": "LATIN LETTER VOICED LARYNGEAL SPIRANT", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D24" }, 7461: { "value": "1D25", "name": "LATIN LETTER AIN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D25" }, 7462: { "value": "1D26", "name": "GREEK LETTER SMALL CAPITAL GAMMA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D26" }, 7463: { "value": "1D27", "name": "GREEK LETTER SMALL CAPITAL LAMDA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D27" }, 7464: { "value": "1D28", "name": "GREEK LETTER SMALL CAPITAL PI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D28" }, 7465: { "value": "1D29", "name": "GREEK LETTER SMALL CAPITAL RHO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D29" }, 7466: { "value": "1D2A", "name": "GREEK LETTER SMALL CAPITAL PSI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D2A" }, 7467: { "value": "1D2B", "name": "CYRILLIC LETTER SMALL CAPITAL EL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D2B" }, 7531: { "value": "1D6B", "name": "LATIN SMALL LETTER UE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D6B" }, 7532: { "value": "1D6C", "name": "LATIN SMALL LETTER B WITH MIDDLE TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D6C" }, 7533: { "value": "1D6D", "name": "LATIN SMALL LETTER D WITH MIDDLE TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D6D" }, 7534: { "value": "1D6E", "name": "LATIN SMALL LETTER F WITH MIDDLE TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D6E" }, 7535: { "value": "1D6F", "name": "LATIN SMALL LETTER M WITH MIDDLE TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D6F" }, 7536: { "value": "1D70", "name": "LATIN SMALL LETTER N WITH MIDDLE TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D70" }, 7537: { "value": "1D71", "name": "LATIN SMALL LETTER P WITH MIDDLE TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D71" }, 7538: { "value": "1D72", "name": "LATIN SMALL LETTER R WITH MIDDLE TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D72" }, 7539: { "value": "1D73", "name": "LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D73" }, 7540: { "value": "1D74", "name": "LATIN SMALL LETTER S WITH MIDDLE TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D74" }, 7541: { "value": "1D75", "name": "LATIN SMALL LETTER T WITH MIDDLE TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D75" }, 7542: { "value": "1D76", "name": "LATIN SMALL LETTER Z WITH MIDDLE TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D76" }, 7543: { "value": "1D77", "name": "LATIN SMALL LETTER TURNED G", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D77" }, 7545: { "value": "1D79", "name": "LATIN SMALL LETTER INSULAR G", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A77D", "lowercase_mapping": "", "titlecase_mapping": "A77D", "symbol": "\u1D79" }, 7546: { "value": "1D7A", "name": "LATIN SMALL LETTER TH WITH STRIKETHROUGH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D7A" }, 7547: { "value": "1D7B", "name": "LATIN SMALL CAPITAL LETTER I WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D7B" }, 7548: { "value": "1D7C", "name": "LATIN SMALL LETTER IOTA WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D7C" }, 7549: { "value": "1D7D", "name": "LATIN SMALL LETTER P WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C63", "lowercase_mapping": "", "titlecase_mapping": "2C63", "symbol": "\u1D7D" }, 7550: { "value": "1D7E", "name": "LATIN SMALL CAPITAL LETTER U WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D7E" }, 7551: { "value": "1D7F", "name": "LATIN SMALL LETTER UPSILON WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D7F" }, 7552: { "value": "1D80", "name": "LATIN SMALL LETTER B WITH PALATAL HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D80" }, 7553: { "value": "1D81", "name": "LATIN SMALL LETTER D WITH PALATAL HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D81" }, 7554: { "value": "1D82", "name": "LATIN SMALL LETTER F WITH PALATAL HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D82" }, 7555: { "value": "1D83", "name": "LATIN SMALL LETTER G WITH PALATAL HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D83" }, 7556: { "value": "1D84", "name": "LATIN SMALL LETTER K WITH PALATAL HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D84" }, 7557: { "value": "1D85", "name": "LATIN SMALL LETTER L WITH PALATAL HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D85" }, 7558: { "value": "1D86", "name": "LATIN SMALL LETTER M WITH PALATAL HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D86" }, 7559: { "value": "1D87", "name": "LATIN SMALL LETTER N WITH PALATAL HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D87" }, 7560: { "value": "1D88", "name": "LATIN SMALL LETTER P WITH PALATAL HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D88" }, 7561: { "value": "1D89", "name": "LATIN SMALL LETTER R WITH PALATAL HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D89" }, 7562: { "value": "1D8A", "name": "LATIN SMALL LETTER S WITH PALATAL HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D8A" }, 7563: { "value": "1D8B", "name": "LATIN SMALL LETTER ESH WITH PALATAL HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D8B" }, 7564: { "value": "1D8C", "name": "LATIN SMALL LETTER V WITH PALATAL HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D8C" }, 7565: { "value": "1D8D", "name": "LATIN SMALL LETTER X WITH PALATAL HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D8D" }, 7566: { "value": "1D8E", "name": "LATIN SMALL LETTER Z WITH PALATAL HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D8E" }, 7567: { "value": "1D8F", "name": "LATIN SMALL LETTER A WITH RETROFLEX HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D8F" }, 7568: { "value": "1D90", "name": "LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D90" }, 7569: { "value": "1D91", "name": "LATIN SMALL LETTER D WITH HOOK AND TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D91" }, 7570: { "value": "1D92", "name": "LATIN SMALL LETTER E WITH RETROFLEX HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D92" }, 7571: { "value": "1D93", "name": "LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D93" }, 7572: { "value": "1D94", "name": "LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D94" }, 7573: { "value": "1D95", "name": "LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D95" }, 7574: { "value": "1D96", "name": "LATIN SMALL LETTER I WITH RETROFLEX HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D96" }, 7575: { "value": "1D97", "name": "LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D97" }, 7576: { "value": "1D98", "name": "LATIN SMALL LETTER ESH WITH RETROFLEX HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D98" }, 7577: { "value": "1D99", "name": "LATIN SMALL LETTER U WITH RETROFLEX HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D99" }, 7578: { "value": "1D9A", "name": "LATIN SMALL LETTER EZH WITH RETROFLEX HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1D9A" }, 7681: { "value": "1E01", "name": "LATIN SMALL LETTER A WITH RING BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0061 0325", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E00", "lowercase_mapping": "", "titlecase_mapping": "1E00", "symbol": "\u1E01" }, 7683: { "value": "1E03", "name": "LATIN SMALL LETTER B WITH DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0062 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E02", "lowercase_mapping": "", "titlecase_mapping": "1E02", "symbol": "\u1E03" }, 7685: { "value": "1E05", "name": "LATIN SMALL LETTER B WITH DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0062 0323", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E04", "lowercase_mapping": "", "titlecase_mapping": "1E04", "symbol": "\u1E05" }, 7687: { "value": "1E07", "name": "LATIN SMALL LETTER B WITH LINE BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0062 0331", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E06", "lowercase_mapping": "", "titlecase_mapping": "1E06", "symbol": "\u1E07" }, 7689: { "value": "1E09", "name": "LATIN SMALL LETTER C WITH CEDILLA AND ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00E7 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E08", "lowercase_mapping": "", "titlecase_mapping": "1E08", "symbol": "\u1E09" }, 7691: { "value": "1E0B", "name": "LATIN SMALL LETTER D WITH DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0064 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E0A", "lowercase_mapping": "", "titlecase_mapping": "1E0A", "symbol": "\u1E0B" }, 7693: { "value": "1E0D", "name": "LATIN SMALL LETTER D WITH DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0064 0323", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E0C", "lowercase_mapping": "", "titlecase_mapping": "1E0C", "symbol": "\u1E0D" }, 7695: { "value": "1E0F", "name": "LATIN SMALL LETTER D WITH LINE BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0064 0331", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E0E", "lowercase_mapping": "", "titlecase_mapping": "1E0E", "symbol": "\u1E0F" }, 7697: { "value": "1E11", "name": "LATIN SMALL LETTER D WITH CEDILLA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0064 0327", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E10", "lowercase_mapping": "", "titlecase_mapping": "1E10", "symbol": "\u1E11" }, 7699: { "value": "1E13", "name": "LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0064 032D", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E12", "lowercase_mapping": "", "titlecase_mapping": "1E12", "symbol": "\u1E13" }, 7701: { "value": "1E15", "name": "LATIN SMALL LETTER E WITH MACRON AND GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0113 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E14", "lowercase_mapping": "", "titlecase_mapping": "1E14", "symbol": "\u1E15" }, 7703: { "value": "1E17", "name": "LATIN SMALL LETTER E WITH MACRON AND ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0113 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E16", "lowercase_mapping": "", "titlecase_mapping": "1E16", "symbol": "\u1E17" }, 7705: { "value": "1E19", "name": "LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0065 032D", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E18", "lowercase_mapping": "", "titlecase_mapping": "1E18", "symbol": "\u1E19" }, 7707: { "value": "1E1B", "name": "LATIN SMALL LETTER E WITH TILDE BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0065 0330", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E1A", "lowercase_mapping": "", "titlecase_mapping": "1E1A", "symbol": "\u1E1B" }, 7709: { "value": "1E1D", "name": "LATIN SMALL LETTER E WITH CEDILLA AND BREVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0229 0306", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E1C", "lowercase_mapping": "", "titlecase_mapping": "1E1C", "symbol": "\u1E1D" }, 7711: { "value": "1E1F", "name": "LATIN SMALL LETTER F WITH DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0066 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E1E", "lowercase_mapping": "", "titlecase_mapping": "1E1E", "symbol": "\u1E1F" }, 7713: { "value": "1E21", "name": "LATIN SMALL LETTER G WITH MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0067 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E20", "lowercase_mapping": "", "titlecase_mapping": "1E20", "symbol": "\u1E21" }, 7715: { "value": "1E23", "name": "LATIN SMALL LETTER H WITH DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0068 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E22", "lowercase_mapping": "", "titlecase_mapping": "1E22", "symbol": "\u1E23" }, 7717: { "value": "1E25", "name": "LATIN SMALL LETTER H WITH DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0068 0323", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E24", "lowercase_mapping": "", "titlecase_mapping": "1E24", "symbol": "\u1E25" }, 7719: { "value": "1E27", "name": "LATIN SMALL LETTER H WITH DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0068 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E26", "lowercase_mapping": "", "titlecase_mapping": "1E26", "symbol": "\u1E27" }, 7721: { "value": "1E29", "name": "LATIN SMALL LETTER H WITH CEDILLA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0068 0327", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E28", "lowercase_mapping": "", "titlecase_mapping": "1E28", "symbol": "\u1E29" }, 7723: { "value": "1E2B", "name": "LATIN SMALL LETTER H WITH BREVE BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0068 032E", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E2A", "lowercase_mapping": "", "titlecase_mapping": "1E2A", "symbol": "\u1E2B" }, 7725: { "value": "1E2D", "name": "LATIN SMALL LETTER I WITH TILDE BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0069 0330", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E2C", "lowercase_mapping": "", "titlecase_mapping": "1E2C", "symbol": "\u1E2D" }, 7727: { "value": "1E2F", "name": "LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00EF 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E2E", "lowercase_mapping": "", "titlecase_mapping": "1E2E", "symbol": "\u1E2F" }, 7729: { "value": "1E31", "name": "LATIN SMALL LETTER K WITH ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006B 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E30", "lowercase_mapping": "", "titlecase_mapping": "1E30", "symbol": "\u1E31" }, 7731: { "value": "1E33", "name": "LATIN SMALL LETTER K WITH DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006B 0323", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E32", "lowercase_mapping": "", "titlecase_mapping": "1E32", "symbol": "\u1E33" }, 7733: { "value": "1E35", "name": "LATIN SMALL LETTER K WITH LINE BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006B 0331", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E34", "lowercase_mapping": "", "titlecase_mapping": "1E34", "symbol": "\u1E35" }, 7735: { "value": "1E37", "name": "LATIN SMALL LETTER L WITH DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006C 0323", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E36", "lowercase_mapping": "", "titlecase_mapping": "1E36", "symbol": "\u1E37" }, 7737: { "value": "1E39", "name": "LATIN SMALL LETTER L WITH DOT BELOW AND MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1E37 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E38", "lowercase_mapping": "", "titlecase_mapping": "1E38", "symbol": "\u1E39" }, 7739: { "value": "1E3B", "name": "LATIN SMALL LETTER L WITH LINE BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006C 0331", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E3A", "lowercase_mapping": "", "titlecase_mapping": "1E3A", "symbol": "\u1E3B" }, 7741: { "value": "1E3D", "name": "LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006C 032D", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E3C", "lowercase_mapping": "", "titlecase_mapping": "1E3C", "symbol": "\u1E3D" }, 7743: { "value": "1E3F", "name": "LATIN SMALL LETTER M WITH ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006D 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E3E", "lowercase_mapping": "", "titlecase_mapping": "1E3E", "symbol": "\u1E3F" }, 7745: { "value": "1E41", "name": "LATIN SMALL LETTER M WITH DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006D 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E40", "lowercase_mapping": "", "titlecase_mapping": "1E40", "symbol": "\u1E41" }, 7747: { "value": "1E43", "name": "LATIN SMALL LETTER M WITH DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006D 0323", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E42", "lowercase_mapping": "", "titlecase_mapping": "1E42", "symbol": "\u1E43" }, 7749: { "value": "1E45", "name": "LATIN SMALL LETTER N WITH DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006E 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E44", "lowercase_mapping": "", "titlecase_mapping": "1E44", "symbol": "\u1E45" }, 7751: { "value": "1E47", "name": "LATIN SMALL LETTER N WITH DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006E 0323", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E46", "lowercase_mapping": "", "titlecase_mapping": "1E46", "symbol": "\u1E47" }, 7753: { "value": "1E49", "name": "LATIN SMALL LETTER N WITH LINE BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006E 0331", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E48", "lowercase_mapping": "", "titlecase_mapping": "1E48", "symbol": "\u1E49" }, 7755: { "value": "1E4B", "name": "LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006E 032D", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E4A", "lowercase_mapping": "", "titlecase_mapping": "1E4A", "symbol": "\u1E4B" }, 7757: { "value": "1E4D", "name": "LATIN SMALL LETTER O WITH TILDE AND ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00F5 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E4C", "lowercase_mapping": "", "titlecase_mapping": "1E4C", "symbol": "\u1E4D" }, 7759: { "value": "1E4F", "name": "LATIN SMALL LETTER O WITH TILDE AND DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00F5 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E4E", "lowercase_mapping": "", "titlecase_mapping": "1E4E", "symbol": "\u1E4F" }, 7761: { "value": "1E51", "name": "LATIN SMALL LETTER O WITH MACRON AND GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "014D 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E50", "lowercase_mapping": "", "titlecase_mapping": "1E50", "symbol": "\u1E51" }, 7763: { "value": "1E53", "name": "LATIN SMALL LETTER O WITH MACRON AND ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "014D 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E52", "lowercase_mapping": "", "titlecase_mapping": "1E52", "symbol": "\u1E53" }, 7765: { "value": "1E55", "name": "LATIN SMALL LETTER P WITH ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0070 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E54", "lowercase_mapping": "", "titlecase_mapping": "1E54", "symbol": "\u1E55" }, 7767: { "value": "1E57", "name": "LATIN SMALL LETTER P WITH DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0070 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E56", "lowercase_mapping": "", "titlecase_mapping": "1E56", "symbol": "\u1E57" }, 7769: { "value": "1E59", "name": "LATIN SMALL LETTER R WITH DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0072 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E58", "lowercase_mapping": "", "titlecase_mapping": "1E58", "symbol": "\u1E59" }, 7771: { "value": "1E5B", "name": "LATIN SMALL LETTER R WITH DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0072 0323", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E5A", "lowercase_mapping": "", "titlecase_mapping": "1E5A", "symbol": "\u1E5B" }, 7773: { "value": "1E5D", "name": "LATIN SMALL LETTER R WITH DOT BELOW AND MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1E5B 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E5C", "lowercase_mapping": "", "titlecase_mapping": "1E5C", "symbol": "\u1E5D" }, 7775: { "value": "1E5F", "name": "LATIN SMALL LETTER R WITH LINE BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0072 0331", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E5E", "lowercase_mapping": "", "titlecase_mapping": "1E5E", "symbol": "\u1E5F" }, 7777: { "value": "1E61", "name": "LATIN SMALL LETTER S WITH DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0073 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E60", "lowercase_mapping": "", "titlecase_mapping": "1E60", "symbol": "\u1E61" }, 7779: { "value": "1E63", "name": "LATIN SMALL LETTER S WITH DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0073 0323", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E62", "lowercase_mapping": "", "titlecase_mapping": "1E62", "symbol": "\u1E63" }, 7781: { "value": "1E65", "name": "LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "015B 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E64", "lowercase_mapping": "", "titlecase_mapping": "1E64", "symbol": "\u1E65" }, 7783: { "value": "1E67", "name": "LATIN SMALL LETTER S WITH CARON AND DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0161 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E66", "lowercase_mapping": "", "titlecase_mapping": "1E66", "symbol": "\u1E67" }, 7785: { "value": "1E69", "name": "LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1E63 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E68", "lowercase_mapping": "", "titlecase_mapping": "1E68", "symbol": "\u1E69" }, 7787: { "value": "1E6B", "name": "LATIN SMALL LETTER T WITH DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0074 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E6A", "lowercase_mapping": "", "titlecase_mapping": "1E6A", "symbol": "\u1E6B" }, 7789: { "value": "1E6D", "name": "LATIN SMALL LETTER T WITH DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0074 0323", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E6C", "lowercase_mapping": "", "titlecase_mapping": "1E6C", "symbol": "\u1E6D" }, 7791: { "value": "1E6F", "name": "LATIN SMALL LETTER T WITH LINE BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0074 0331", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E6E", "lowercase_mapping": "", "titlecase_mapping": "1E6E", "symbol": "\u1E6F" }, 7793: { "value": "1E71", "name": "LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0074 032D", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E70", "lowercase_mapping": "", "titlecase_mapping": "1E70", "symbol": "\u1E71" }, 7795: { "value": "1E73", "name": "LATIN SMALL LETTER U WITH DIAERESIS BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0075 0324", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E72", "lowercase_mapping": "", "titlecase_mapping": "1E72", "symbol": "\u1E73" }, 7797: { "value": "1E75", "name": "LATIN SMALL LETTER U WITH TILDE BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0075 0330", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E74", "lowercase_mapping": "", "titlecase_mapping": "1E74", "symbol": "\u1E75" }, 7799: { "value": "1E77", "name": "LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0075 032D", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E76", "lowercase_mapping": "", "titlecase_mapping": "1E76", "symbol": "\u1E77" }, 7801: { "value": "1E79", "name": "LATIN SMALL LETTER U WITH TILDE AND ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0169 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E78", "lowercase_mapping": "", "titlecase_mapping": "1E78", "symbol": "\u1E79" }, 7803: { "value": "1E7B", "name": "LATIN SMALL LETTER U WITH MACRON AND DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "016B 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E7A", "lowercase_mapping": "", "titlecase_mapping": "1E7A", "symbol": "\u1E7B" }, 7805: { "value": "1E7D", "name": "LATIN SMALL LETTER V WITH TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0076 0303", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E7C", "lowercase_mapping": "", "titlecase_mapping": "1E7C", "symbol": "\u1E7D" }, 7807: { "value": "1E7F", "name": "LATIN SMALL LETTER V WITH DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0076 0323", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E7E", "lowercase_mapping": "", "titlecase_mapping": "1E7E", "symbol": "\u1E7F" }, 7809: { "value": "1E81", "name": "LATIN SMALL LETTER W WITH GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0077 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E80", "lowercase_mapping": "", "titlecase_mapping": "1E80", "symbol": "\u1E81" }, 7811: { "value": "1E83", "name": "LATIN SMALL LETTER W WITH ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0077 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E82", "lowercase_mapping": "", "titlecase_mapping": "1E82", "symbol": "\u1E83" }, 7813: { "value": "1E85", "name": "LATIN SMALL LETTER W WITH DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0077 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E84", "lowercase_mapping": "", "titlecase_mapping": "1E84", "symbol": "\u1E85" }, 7815: { "value": "1E87", "name": "LATIN SMALL LETTER W WITH DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0077 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E86", "lowercase_mapping": "", "titlecase_mapping": "1E86", "symbol": "\u1E87" }, 7817: { "value": "1E89", "name": "LATIN SMALL LETTER W WITH DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0077 0323", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E88", "lowercase_mapping": "", "titlecase_mapping": "1E88", "symbol": "\u1E89" }, 7819: { "value": "1E8B", "name": "LATIN SMALL LETTER X WITH DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0078 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E8A", "lowercase_mapping": "", "titlecase_mapping": "1E8A", "symbol": "\u1E8B" }, 7821: { "value": "1E8D", "name": "LATIN SMALL LETTER X WITH DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0078 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E8C", "lowercase_mapping": "", "titlecase_mapping": "1E8C", "symbol": "\u1E8D" }, 7823: { "value": "1E8F", "name": "LATIN SMALL LETTER Y WITH DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0079 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E8E", "lowercase_mapping": "", "titlecase_mapping": "1E8E", "symbol": "\u1E8F" }, 7825: { "value": "1E91", "name": "LATIN SMALL LETTER Z WITH CIRCUMFLEX", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "007A 0302", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E90", "lowercase_mapping": "", "titlecase_mapping": "1E90", "symbol": "\u1E91" }, 7827: { "value": "1E93", "name": "LATIN SMALL LETTER Z WITH DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "007A 0323", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E92", "lowercase_mapping": "", "titlecase_mapping": "1E92", "symbol": "\u1E93" }, 7829: { "value": "1E95", "name": "LATIN SMALL LETTER Z WITH LINE BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "007A 0331", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E94", "lowercase_mapping": "", "titlecase_mapping": "1E94", "symbol": "\u1E95" }, 7830: { "value": "1E96", "name": "LATIN SMALL LETTER H WITH LINE BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0068 0331", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1E96" }, 7831: { "value": "1E97", "name": "LATIN SMALL LETTER T WITH DIAERESIS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0074 0308", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1E97" }, 7832: { "value": "1E98", "name": "LATIN SMALL LETTER W WITH RING ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0077 030A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1E98" }, 7833: { "value": "1E99", "name": "LATIN SMALL LETTER Y WITH RING ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0079 030A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1E99" }, 7834: { "value": "1E9A", "name": "LATIN SMALL LETTER A WITH RIGHT HALF RING", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0061 02BE", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1E9A" }, 7835: { "value": "1E9B", "name": "LATIN SMALL LETTER LONG S WITH DOT ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "017F 0307", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1E60", "lowercase_mapping": "", "titlecase_mapping": "1E60", "symbol": "\u1E9B" }, 7836: { "value": "1E9C", "name": "LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1E9C" }, 7837: { "value": "1E9D", "name": "LATIN SMALL LETTER LONG S WITH HIGH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1E9D" }, 7839: { "value": "1E9F", "name": "LATIN SMALL LETTER DELTA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1E9F" }, 7841: { "value": "1EA1", "name": "LATIN SMALL LETTER A WITH DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0061 0323", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EA0", "lowercase_mapping": "", "titlecase_mapping": "1EA0", "symbol": "\u1EA1" }, 7843: { "value": "1EA3", "name": "LATIN SMALL LETTER A WITH HOOK ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0061 0309", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EA2", "lowercase_mapping": "", "titlecase_mapping": "1EA2", "symbol": "\u1EA3" }, 7845: { "value": "1EA5", "name": "LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00E2 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EA4", "lowercase_mapping": "", "titlecase_mapping": "1EA4", "symbol": "\u1EA5" }, 7847: { "value": "1EA7", "name": "LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00E2 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EA6", "lowercase_mapping": "", "titlecase_mapping": "1EA6", "symbol": "\u1EA7" }, 7849: { "value": "1EA9", "name": "LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00E2 0309", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EA8", "lowercase_mapping": "", "titlecase_mapping": "1EA8", "symbol": "\u1EA9" }, 7851: { "value": "1EAB", "name": "LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00E2 0303", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EAA", "lowercase_mapping": "", "titlecase_mapping": "1EAA", "symbol": "\u1EAB" }, 7853: { "value": "1EAD", "name": "LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1EA1 0302", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EAC", "lowercase_mapping": "", "titlecase_mapping": "1EAC", "symbol": "\u1EAD" }, 7855: { "value": "1EAF", "name": "LATIN SMALL LETTER A WITH BREVE AND ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0103 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EAE", "lowercase_mapping": "", "titlecase_mapping": "1EAE", "symbol": "\u1EAF" }, 7857: { "value": "1EB1", "name": "LATIN SMALL LETTER A WITH BREVE AND GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0103 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EB0", "lowercase_mapping": "", "titlecase_mapping": "1EB0", "symbol": "\u1EB1" }, 7859: { "value": "1EB3", "name": "LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0103 0309", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EB2", "lowercase_mapping": "", "titlecase_mapping": "1EB2", "symbol": "\u1EB3" }, 7861: { "value": "1EB5", "name": "LATIN SMALL LETTER A WITH BREVE AND TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0103 0303", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EB4", "lowercase_mapping": "", "titlecase_mapping": "1EB4", "symbol": "\u1EB5" }, 7863: { "value": "1EB7", "name": "LATIN SMALL LETTER A WITH BREVE AND DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1EA1 0306", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EB6", "lowercase_mapping": "", "titlecase_mapping": "1EB6", "symbol": "\u1EB7" }, 7865: { "value": "1EB9", "name": "LATIN SMALL LETTER E WITH DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0065 0323", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EB8", "lowercase_mapping": "", "titlecase_mapping": "1EB8", "symbol": "\u1EB9" }, 7867: { "value": "1EBB", "name": "LATIN SMALL LETTER E WITH HOOK ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0065 0309", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EBA", "lowercase_mapping": "", "titlecase_mapping": "1EBA", "symbol": "\u1EBB" }, 7869: { "value": "1EBD", "name": "LATIN SMALL LETTER E WITH TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0065 0303", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EBC", "lowercase_mapping": "", "titlecase_mapping": "1EBC", "symbol": "\u1EBD" }, 7871: { "value": "1EBF", "name": "LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00EA 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EBE", "lowercase_mapping": "", "titlecase_mapping": "1EBE", "symbol": "\u1EBF" }, 7873: { "value": "1EC1", "name": "LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00EA 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EC0", "lowercase_mapping": "", "titlecase_mapping": "1EC0", "symbol": "\u1EC1" }, 7875: { "value": "1EC3", "name": "LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00EA 0309", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EC2", "lowercase_mapping": "", "titlecase_mapping": "1EC2", "symbol": "\u1EC3" }, 7877: { "value": "1EC5", "name": "LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00EA 0303", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EC4", "lowercase_mapping": "", "titlecase_mapping": "1EC4", "symbol": "\u1EC5" }, 7879: { "value": "1EC7", "name": "LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1EB9 0302", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EC6", "lowercase_mapping": "", "titlecase_mapping": "1EC6", "symbol": "\u1EC7" }, 7881: { "value": "1EC9", "name": "LATIN SMALL LETTER I WITH HOOK ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0069 0309", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EC8", "lowercase_mapping": "", "titlecase_mapping": "1EC8", "symbol": "\u1EC9" }, 7883: { "value": "1ECB", "name": "LATIN SMALL LETTER I WITH DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0069 0323", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1ECA", "lowercase_mapping": "", "titlecase_mapping": "1ECA", "symbol": "\u1ECB" }, 7885: { "value": "1ECD", "name": "LATIN SMALL LETTER O WITH DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006F 0323", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1ECC", "lowercase_mapping": "", "titlecase_mapping": "1ECC", "symbol": "\u1ECD" }, 7887: { "value": "1ECF", "name": "LATIN SMALL LETTER O WITH HOOK ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "006F 0309", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1ECE", "lowercase_mapping": "", "titlecase_mapping": "1ECE", "symbol": "\u1ECF" }, 7889: { "value": "1ED1", "name": "LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00F4 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1ED0", "lowercase_mapping": "", "titlecase_mapping": "1ED0", "symbol": "\u1ED1" }, 7891: { "value": "1ED3", "name": "LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00F4 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1ED2", "lowercase_mapping": "", "titlecase_mapping": "1ED2", "symbol": "\u1ED3" }, 7893: { "value": "1ED5", "name": "LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00F4 0309", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1ED4", "lowercase_mapping": "", "titlecase_mapping": "1ED4", "symbol": "\u1ED5" }, 7895: { "value": "1ED7", "name": "LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "00F4 0303", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1ED6", "lowercase_mapping": "", "titlecase_mapping": "1ED6", "symbol": "\u1ED7" }, 7897: { "value": "1ED9", "name": "LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1ECD 0302", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1ED8", "lowercase_mapping": "", "titlecase_mapping": "1ED8", "symbol": "\u1ED9" }, 7899: { "value": "1EDB", "name": "LATIN SMALL LETTER O WITH HORN AND ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "01A1 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EDA", "lowercase_mapping": "", "titlecase_mapping": "1EDA", "symbol": "\u1EDB" }, 7901: { "value": "1EDD", "name": "LATIN SMALL LETTER O WITH HORN AND GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "01A1 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EDC", "lowercase_mapping": "", "titlecase_mapping": "1EDC", "symbol": "\u1EDD" }, 7903: { "value": "1EDF", "name": "LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "01A1 0309", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EDE", "lowercase_mapping": "", "titlecase_mapping": "1EDE", "symbol": "\u1EDF" }, 7905: { "value": "1EE1", "name": "LATIN SMALL LETTER O WITH HORN AND TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "01A1 0303", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EE0", "lowercase_mapping": "", "titlecase_mapping": "1EE0", "symbol": "\u1EE1" }, 7907: { "value": "1EE3", "name": "LATIN SMALL LETTER O WITH HORN AND DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "01A1 0323", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EE2", "lowercase_mapping": "", "titlecase_mapping": "1EE2", "symbol": "\u1EE3" }, 7909: { "value": "1EE5", "name": "LATIN SMALL LETTER U WITH DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0075 0323", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EE4", "lowercase_mapping": "", "titlecase_mapping": "1EE4", "symbol": "\u1EE5" }, 7911: { "value": "1EE7", "name": "LATIN SMALL LETTER U WITH HOOK ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0075 0309", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EE6", "lowercase_mapping": "", "titlecase_mapping": "1EE6", "symbol": "\u1EE7" }, 7913: { "value": "1EE9", "name": "LATIN SMALL LETTER U WITH HORN AND ACUTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "01B0 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EE8", "lowercase_mapping": "", "titlecase_mapping": "1EE8", "symbol": "\u1EE9" }, 7915: { "value": "1EEB", "name": "LATIN SMALL LETTER U WITH HORN AND GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "01B0 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EEA", "lowercase_mapping": "", "titlecase_mapping": "1EEA", "symbol": "\u1EEB" }, 7917: { "value": "1EED", "name": "LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "01B0 0309", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EEC", "lowercase_mapping": "", "titlecase_mapping": "1EEC", "symbol": "\u1EED" }, 7919: { "value": "1EEF", "name": "LATIN SMALL LETTER U WITH HORN AND TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "01B0 0303", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EEE", "lowercase_mapping": "", "titlecase_mapping": "1EEE", "symbol": "\u1EEF" }, 7921: { "value": "1EF1", "name": "LATIN SMALL LETTER U WITH HORN AND DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "01B0 0323", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EF0", "lowercase_mapping": "", "titlecase_mapping": "1EF0", "symbol": "\u1EF1" }, 7923: { "value": "1EF3", "name": "LATIN SMALL LETTER Y WITH GRAVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0079 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EF2", "lowercase_mapping": "", "titlecase_mapping": "1EF2", "symbol": "\u1EF3" }, 7925: { "value": "1EF5", "name": "LATIN SMALL LETTER Y WITH DOT BELOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0079 0323", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EF4", "lowercase_mapping": "", "titlecase_mapping": "1EF4", "symbol": "\u1EF5" }, 7927: { "value": "1EF7", "name": "LATIN SMALL LETTER Y WITH HOOK ABOVE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0079 0309", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EF6", "lowercase_mapping": "", "titlecase_mapping": "1EF6", "symbol": "\u1EF7" }, 7929: { "value": "1EF9", "name": "LATIN SMALL LETTER Y WITH TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0079 0303", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EF8", "lowercase_mapping": "", "titlecase_mapping": "1EF8", "symbol": "\u1EF9" }, 7931: { "value": "1EFB", "name": "LATIN SMALL LETTER MIDDLE-WELSH LL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EFA", "lowercase_mapping": "", "titlecase_mapping": "1EFA", "symbol": "\u1EFB" }, 7933: { "value": "1EFD", "name": "LATIN SMALL LETTER MIDDLE-WELSH V", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EFC", "lowercase_mapping": "", "titlecase_mapping": "1EFC", "symbol": "\u1EFD" }, 7935: { "value": "1EFF", "name": "LATIN SMALL LETTER Y WITH LOOP", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1EFE", "lowercase_mapping": "", "titlecase_mapping": "1EFE", "symbol": "\u1EFF" }, 7936: { "value": "1F00", "name": "GREEK SMALL LETTER ALPHA WITH PSILI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B1 0313", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F08", "lowercase_mapping": "", "titlecase_mapping": "1F08", "symbol": "\u1F00" }, 7937: { "value": "1F01", "name": "GREEK SMALL LETTER ALPHA WITH DASIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B1 0314", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F09", "lowercase_mapping": "", "titlecase_mapping": "1F09", "symbol": "\u1F01" }, 7938: { "value": "1F02", "name": "GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F00 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F0A", "lowercase_mapping": "", "titlecase_mapping": "1F0A", "symbol": "\u1F02" }, 7939: { "value": "1F03", "name": "GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F01 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F0B", "lowercase_mapping": "", "titlecase_mapping": "1F0B", "symbol": "\u1F03" }, 7940: { "value": "1F04", "name": "GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F00 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F0C", "lowercase_mapping": "", "titlecase_mapping": "1F0C", "symbol": "\u1F04" }, 7941: { "value": "1F05", "name": "GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F01 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F0D", "lowercase_mapping": "", "titlecase_mapping": "1F0D", "symbol": "\u1F05" }, 7942: { "value": "1F06", "name": "GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F00 0342", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F0E", "lowercase_mapping": "", "titlecase_mapping": "1F0E", "symbol": "\u1F06" }, 7943: { "value": "1F07", "name": "GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F01 0342", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F0F", "lowercase_mapping": "", "titlecase_mapping": "1F0F", "symbol": "\u1F07" }, 7952: { "value": "1F10", "name": "GREEK SMALL LETTER EPSILON WITH PSILI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B5 0313", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F18", "lowercase_mapping": "", "titlecase_mapping": "1F18", "symbol": "\u1F10" }, 7953: { "value": "1F11", "name": "GREEK SMALL LETTER EPSILON WITH DASIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B5 0314", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F19", "lowercase_mapping": "", "titlecase_mapping": "1F19", "symbol": "\u1F11" }, 7954: { "value": "1F12", "name": "GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F10 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F1A", "lowercase_mapping": "", "titlecase_mapping": "1F1A", "symbol": "\u1F12" }, 7955: { "value": "1F13", "name": "GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F11 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F1B", "lowercase_mapping": "", "titlecase_mapping": "1F1B", "symbol": "\u1F13" }, 7956: { "value": "1F14", "name": "GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F10 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F1C", "lowercase_mapping": "", "titlecase_mapping": "1F1C", "symbol": "\u1F14" }, 7957: { "value": "1F15", "name": "GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F11 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F1D", "lowercase_mapping": "", "titlecase_mapping": "1F1D", "symbol": "\u1F15" }, 7968: { "value": "1F20", "name": "GREEK SMALL LETTER ETA WITH PSILI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B7 0313", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F28", "lowercase_mapping": "", "titlecase_mapping": "1F28", "symbol": "\u1F20" }, 7969: { "value": "1F21", "name": "GREEK SMALL LETTER ETA WITH DASIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B7 0314", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F29", "lowercase_mapping": "", "titlecase_mapping": "1F29", "symbol": "\u1F21" }, 7970: { "value": "1F22", "name": "GREEK SMALL LETTER ETA WITH PSILI AND VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F20 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F2A", "lowercase_mapping": "", "titlecase_mapping": "1F2A", "symbol": "\u1F22" }, 7971: { "value": "1F23", "name": "GREEK SMALL LETTER ETA WITH DASIA AND VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F21 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F2B", "lowercase_mapping": "", "titlecase_mapping": "1F2B", "symbol": "\u1F23" }, 7972: { "value": "1F24", "name": "GREEK SMALL LETTER ETA WITH PSILI AND OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F20 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F2C", "lowercase_mapping": "", "titlecase_mapping": "1F2C", "symbol": "\u1F24" }, 7973: { "value": "1F25", "name": "GREEK SMALL LETTER ETA WITH DASIA AND OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F21 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F2D", "lowercase_mapping": "", "titlecase_mapping": "1F2D", "symbol": "\u1F25" }, 7974: { "value": "1F26", "name": "GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F20 0342", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F2E", "lowercase_mapping": "", "titlecase_mapping": "1F2E", "symbol": "\u1F26" }, 7975: { "value": "1F27", "name": "GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F21 0342", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F2F", "lowercase_mapping": "", "titlecase_mapping": "1F2F", "symbol": "\u1F27" }, 7984: { "value": "1F30", "name": "GREEK SMALL LETTER IOTA WITH PSILI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B9 0313", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F38", "lowercase_mapping": "", "titlecase_mapping": "1F38", "symbol": "\u1F30" }, 7985: { "value": "1F31", "name": "GREEK SMALL LETTER IOTA WITH DASIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B9 0314", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F39", "lowercase_mapping": "", "titlecase_mapping": "1F39", "symbol": "\u1F31" }, 7986: { "value": "1F32", "name": "GREEK SMALL LETTER IOTA WITH PSILI AND VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F30 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F3A", "lowercase_mapping": "", "titlecase_mapping": "1F3A", "symbol": "\u1F32" }, 7987: { "value": "1F33", "name": "GREEK SMALL LETTER IOTA WITH DASIA AND VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F31 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F3B", "lowercase_mapping": "", "titlecase_mapping": "1F3B", "symbol": "\u1F33" }, 7988: { "value": "1F34", "name": "GREEK SMALL LETTER IOTA WITH PSILI AND OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F30 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F3C", "lowercase_mapping": "", "titlecase_mapping": "1F3C", "symbol": "\u1F34" }, 7989: { "value": "1F35", "name": "GREEK SMALL LETTER IOTA WITH DASIA AND OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F31 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F3D", "lowercase_mapping": "", "titlecase_mapping": "1F3D", "symbol": "\u1F35" }, 7990: { "value": "1F36", "name": "GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F30 0342", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F3E", "lowercase_mapping": "", "titlecase_mapping": "1F3E", "symbol": "\u1F36" }, 7991: { "value": "1F37", "name": "GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F31 0342", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F3F", "lowercase_mapping": "", "titlecase_mapping": "1F3F", "symbol": "\u1F37" }, 8000: { "value": "1F40", "name": "GREEK SMALL LETTER OMICRON WITH PSILI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03BF 0313", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F48", "lowercase_mapping": "", "titlecase_mapping": "1F48", "symbol": "\u1F40" }, 8001: { "value": "1F41", "name": "GREEK SMALL LETTER OMICRON WITH DASIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03BF 0314", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F49", "lowercase_mapping": "", "titlecase_mapping": "1F49", "symbol": "\u1F41" }, 8002: { "value": "1F42", "name": "GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F40 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F4A", "lowercase_mapping": "", "titlecase_mapping": "1F4A", "symbol": "\u1F42" }, 8003: { "value": "1F43", "name": "GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F41 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F4B", "lowercase_mapping": "", "titlecase_mapping": "1F4B", "symbol": "\u1F43" }, 8004: { "value": "1F44", "name": "GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F40 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F4C", "lowercase_mapping": "", "titlecase_mapping": "1F4C", "symbol": "\u1F44" }, 8005: { "value": "1F45", "name": "GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F41 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F4D", "lowercase_mapping": "", "titlecase_mapping": "1F4D", "symbol": "\u1F45" }, 8016: { "value": "1F50", "name": "GREEK SMALL LETTER UPSILON WITH PSILI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03C5 0313", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1F50" }, 8017: { "value": "1F51", "name": "GREEK SMALL LETTER UPSILON WITH DASIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03C5 0314", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F59", "lowercase_mapping": "", "titlecase_mapping": "1F59", "symbol": "\u1F51" }, 8018: { "value": "1F52", "name": "GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F50 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1F52" }, 8019: { "value": "1F53", "name": "GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F51 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F5B", "lowercase_mapping": "", "titlecase_mapping": "1F5B", "symbol": "\u1F53" }, 8020: { "value": "1F54", "name": "GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F50 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1F54" }, 8021: { "value": "1F55", "name": "GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F51 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F5D", "lowercase_mapping": "", "titlecase_mapping": "1F5D", "symbol": "\u1F55" }, 8022: { "value": "1F56", "name": "GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F50 0342", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1F56" }, 8023: { "value": "1F57", "name": "GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F51 0342", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F5F", "lowercase_mapping": "", "titlecase_mapping": "1F5F", "symbol": "\u1F57" }, 8032: { "value": "1F60", "name": "GREEK SMALL LETTER OMEGA WITH PSILI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03C9 0313", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F68", "lowercase_mapping": "", "titlecase_mapping": "1F68", "symbol": "\u1F60" }, 8033: { "value": "1F61", "name": "GREEK SMALL LETTER OMEGA WITH DASIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03C9 0314", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F69", "lowercase_mapping": "", "titlecase_mapping": "1F69", "symbol": "\u1F61" }, 8034: { "value": "1F62", "name": "GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F60 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F6A", "lowercase_mapping": "", "titlecase_mapping": "1F6A", "symbol": "\u1F62" }, 8035: { "value": "1F63", "name": "GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F61 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F6B", "lowercase_mapping": "", "titlecase_mapping": "1F6B", "symbol": "\u1F63" }, 8036: { "value": "1F64", "name": "GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F60 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F6C", "lowercase_mapping": "", "titlecase_mapping": "1F6C", "symbol": "\u1F64" }, 8037: { "value": "1F65", "name": "GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F61 0301", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F6D", "lowercase_mapping": "", "titlecase_mapping": "1F6D", "symbol": "\u1F65" }, 8038: { "value": "1F66", "name": "GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F60 0342", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F6E", "lowercase_mapping": "", "titlecase_mapping": "1F6E", "symbol": "\u1F66" }, 8039: { "value": "1F67", "name": "GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F61 0342", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F6F", "lowercase_mapping": "", "titlecase_mapping": "1F6F", "symbol": "\u1F67" }, 8048: { "value": "1F70", "name": "GREEK SMALL LETTER ALPHA WITH VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B1 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FBA", "lowercase_mapping": "", "titlecase_mapping": "1FBA", "symbol": "\u1F70" }, 8049: { "value": "1F71", "name": "GREEK SMALL LETTER ALPHA WITH OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03AC", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FBB", "lowercase_mapping": "", "titlecase_mapping": "1FBB", "symbol": "\u1F71" }, 8050: { "value": "1F72", "name": "GREEK SMALL LETTER EPSILON WITH VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B5 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FC8", "lowercase_mapping": "", "titlecase_mapping": "1FC8", "symbol": "\u1F72" }, 8051: { "value": "1F73", "name": "GREEK SMALL LETTER EPSILON WITH OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03AD", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FC9", "lowercase_mapping": "", "titlecase_mapping": "1FC9", "symbol": "\u1F73" }, 8052: { "value": "1F74", "name": "GREEK SMALL LETTER ETA WITH VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B7 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FCA", "lowercase_mapping": "", "titlecase_mapping": "1FCA", "symbol": "\u1F74" }, 8053: { "value": "1F75", "name": "GREEK SMALL LETTER ETA WITH OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03AE", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FCB", "lowercase_mapping": "", "titlecase_mapping": "1FCB", "symbol": "\u1F75" }, 8054: { "value": "1F76", "name": "GREEK SMALL LETTER IOTA WITH VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B9 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FDA", "lowercase_mapping": "", "titlecase_mapping": "1FDA", "symbol": "\u1F76" }, 8055: { "value": "1F77", "name": "GREEK SMALL LETTER IOTA WITH OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03AF", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FDB", "lowercase_mapping": "", "titlecase_mapping": "1FDB", "symbol": "\u1F77" }, 8056: { "value": "1F78", "name": "GREEK SMALL LETTER OMICRON WITH VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03BF 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FF8", "lowercase_mapping": "", "titlecase_mapping": "1FF8", "symbol": "\u1F78" }, 8057: { "value": "1F79", "name": "GREEK SMALL LETTER OMICRON WITH OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03CC", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FF9", "lowercase_mapping": "", "titlecase_mapping": "1FF9", "symbol": "\u1F79" }, 8058: { "value": "1F7A", "name": "GREEK SMALL LETTER UPSILON WITH VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03C5 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FEA", "lowercase_mapping": "", "titlecase_mapping": "1FEA", "symbol": "\u1F7A" }, 8059: { "value": "1F7B", "name": "GREEK SMALL LETTER UPSILON WITH OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03CD", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FEB", "lowercase_mapping": "", "titlecase_mapping": "1FEB", "symbol": "\u1F7B" }, 8060: { "value": "1F7C", "name": "GREEK SMALL LETTER OMEGA WITH VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03C9 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FFA", "lowercase_mapping": "", "titlecase_mapping": "1FFA", "symbol": "\u1F7C" }, 8061: { "value": "1F7D", "name": "GREEK SMALL LETTER OMEGA WITH OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03CE", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FFB", "lowercase_mapping": "", "titlecase_mapping": "1FFB", "symbol": "\u1F7D" }, 8064: { "value": "1F80", "name": "GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F00 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F88", "lowercase_mapping": "", "titlecase_mapping": "1F88", "symbol": "\u1F80" }, 8065: { "value": "1F81", "name": "GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F01 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F89", "lowercase_mapping": "", "titlecase_mapping": "1F89", "symbol": "\u1F81" }, 8066: { "value": "1F82", "name": "GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F02 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F8A", "lowercase_mapping": "", "titlecase_mapping": "1F8A", "symbol": "\u1F82" }, 8067: { "value": "1F83", "name": "GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F03 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F8B", "lowercase_mapping": "", "titlecase_mapping": "1F8B", "symbol": "\u1F83" }, 8068: { "value": "1F84", "name": "GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F04 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F8C", "lowercase_mapping": "", "titlecase_mapping": "1F8C", "symbol": "\u1F84" }, 8069: { "value": "1F85", "name": "GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F05 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F8D", "lowercase_mapping": "", "titlecase_mapping": "1F8D", "symbol": "\u1F85" }, 8070: { "value": "1F86", "name": "GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F06 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F8E", "lowercase_mapping": "", "titlecase_mapping": "1F8E", "symbol": "\u1F86" }, 8071: { "value": "1F87", "name": "GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F07 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F8F", "lowercase_mapping": "", "titlecase_mapping": "1F8F", "symbol": "\u1F87" }, 8080: { "value": "1F90", "name": "GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F20 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F98", "lowercase_mapping": "", "titlecase_mapping": "1F98", "symbol": "\u1F90" }, 8081: { "value": "1F91", "name": "GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F21 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F99", "lowercase_mapping": "", "titlecase_mapping": "1F99", "symbol": "\u1F91" }, 8082: { "value": "1F92", "name": "GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F22 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F9A", "lowercase_mapping": "", "titlecase_mapping": "1F9A", "symbol": "\u1F92" }, 8083: { "value": "1F93", "name": "GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F23 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F9B", "lowercase_mapping": "", "titlecase_mapping": "1F9B", "symbol": "\u1F93" }, 8084: { "value": "1F94", "name": "GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F24 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F9C", "lowercase_mapping": "", "titlecase_mapping": "1F9C", "symbol": "\u1F94" }, 8085: { "value": "1F95", "name": "GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F25 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F9D", "lowercase_mapping": "", "titlecase_mapping": "1F9D", "symbol": "\u1F95" }, 8086: { "value": "1F96", "name": "GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F26 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F9E", "lowercase_mapping": "", "titlecase_mapping": "1F9E", "symbol": "\u1F96" }, 8087: { "value": "1F97", "name": "GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F27 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1F9F", "lowercase_mapping": "", "titlecase_mapping": "1F9F", "symbol": "\u1F97" }, 8096: { "value": "1FA0", "name": "GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F60 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FA8", "lowercase_mapping": "", "titlecase_mapping": "1FA8", "symbol": "\u1FA0" }, 8097: { "value": "1FA1", "name": "GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F61 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FA9", "lowercase_mapping": "", "titlecase_mapping": "1FA9", "symbol": "\u1FA1" }, 8098: { "value": "1FA2", "name": "GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F62 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FAA", "lowercase_mapping": "", "titlecase_mapping": "1FAA", "symbol": "\u1FA2" }, 8099: { "value": "1FA3", "name": "GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F63 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FAB", "lowercase_mapping": "", "titlecase_mapping": "1FAB", "symbol": "\u1FA3" }, 8100: { "value": "1FA4", "name": "GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F64 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FAC", "lowercase_mapping": "", "titlecase_mapping": "1FAC", "symbol": "\u1FA4" }, 8101: { "value": "1FA5", "name": "GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F65 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FAD", "lowercase_mapping": "", "titlecase_mapping": "1FAD", "symbol": "\u1FA5" }, 8102: { "value": "1FA6", "name": "GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F66 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FAE", "lowercase_mapping": "", "titlecase_mapping": "1FAE", "symbol": "\u1FA6" }, 8103: { "value": "1FA7", "name": "GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F67 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FAF", "lowercase_mapping": "", "titlecase_mapping": "1FAF", "symbol": "\u1FA7" }, 8112: { "value": "1FB0", "name": "GREEK SMALL LETTER ALPHA WITH VRACHY", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B1 0306", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FB8", "lowercase_mapping": "", "titlecase_mapping": "1FB8", "symbol": "\u1FB0" }, 8113: { "value": "1FB1", "name": "GREEK SMALL LETTER ALPHA WITH MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B1 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FB9", "lowercase_mapping": "", "titlecase_mapping": "1FB9", "symbol": "\u1FB1" }, 8114: { "value": "1FB2", "name": "GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F70 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1FB2" }, 8115: { "value": "1FB3", "name": "GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B1 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FBC", "lowercase_mapping": "", "titlecase_mapping": "1FBC", "symbol": "\u1FB3" }, 8116: { "value": "1FB4", "name": "GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03AC 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1FB4" }, 8118: { "value": "1FB6", "name": "GREEK SMALL LETTER ALPHA WITH PERISPOMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B1 0342", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1FB6" }, 8119: { "value": "1FB7", "name": "GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1FB6 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1FB7" }, 8126: { "value": "1FBE", "name": "GREEK PROSGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B9", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "0399", "lowercase_mapping": "", "titlecase_mapping": "0399", "symbol": "\u1FBE" }, 8130: { "value": "1FC2", "name": "GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F74 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1FC2" }, 8131: { "value": "1FC3", "name": "GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B7 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FCC", "lowercase_mapping": "", "titlecase_mapping": "1FCC", "symbol": "\u1FC3" }, 8132: { "value": "1FC4", "name": "GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03AE 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1FC4" }, 8134: { "value": "1FC6", "name": "GREEK SMALL LETTER ETA WITH PERISPOMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B7 0342", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1FC6" }, 8135: { "value": "1FC7", "name": "GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1FC6 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1FC7" }, 8144: { "value": "1FD0", "name": "GREEK SMALL LETTER IOTA WITH VRACHY", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B9 0306", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FD8", "lowercase_mapping": "", "titlecase_mapping": "1FD8", "symbol": "\u1FD0" }, 8145: { "value": "1FD1", "name": "GREEK SMALL LETTER IOTA WITH MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B9 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FD9", "lowercase_mapping": "", "titlecase_mapping": "1FD9", "symbol": "\u1FD1" }, 8146: { "value": "1FD2", "name": "GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03CA 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1FD2" }, 8147: { "value": "1FD3", "name": "GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "0390", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1FD3" }, 8150: { "value": "1FD6", "name": "GREEK SMALL LETTER IOTA WITH PERISPOMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B9 0342", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1FD6" }, 8151: { "value": "1FD7", "name": "GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03CA 0342", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1FD7" }, 8160: { "value": "1FE0", "name": "GREEK SMALL LETTER UPSILON WITH VRACHY", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03C5 0306", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FE8", "lowercase_mapping": "", "titlecase_mapping": "1FE8", "symbol": "\u1FE0" }, 8161: { "value": "1FE1", "name": "GREEK SMALL LETTER UPSILON WITH MACRON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03C5 0304", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FE9", "lowercase_mapping": "", "titlecase_mapping": "1FE9", "symbol": "\u1FE1" }, 8162: { "value": "1FE2", "name": "GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03CB 0300", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1FE2" }, 8163: { "value": "1FE3", "name": "GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03B0", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1FE3" }, 8164: { "value": "1FE4", "name": "GREEK SMALL LETTER RHO WITH PSILI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03C1 0313", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1FE4" }, 8165: { "value": "1FE5", "name": "GREEK SMALL LETTER RHO WITH DASIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03C1 0314", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FEC", "lowercase_mapping": "", "titlecase_mapping": "1FEC", "symbol": "\u1FE5" }, 8166: { "value": "1FE6", "name": "GREEK SMALL LETTER UPSILON WITH PERISPOMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03C5 0342", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1FE6" }, 8167: { "value": "1FE7", "name": "GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03CB 0342", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1FE7" }, 8178: { "value": "1FF2", "name": "GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1F7C 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1FF2" }, 8179: { "value": "1FF3", "name": "GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03C9 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1FFC", "lowercase_mapping": "", "titlecase_mapping": "1FFC", "symbol": "\u1FF3" }, 8180: { "value": "1FF4", "name": "GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03CE 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1FF4" }, 8182: { "value": "1FF6", "name": "GREEK SMALL LETTER OMEGA WITH PERISPOMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "03C9 0342", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1FF6" }, 8183: { "value": "1FF7", "name": "GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "1FF6 0345", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u1FF7" }, 8458: { "value": "210A", "name": "SCRIPT SMALL G", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0067", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u210A" }, 8462: { "value": "210E", "name": "PLANCK CONSTANT", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0068", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u210E" }, 8463: { "value": "210F", "name": "PLANCK CONSTANT OVER TWO PI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0127", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "PLANCK CONSTANT OVER 2 PI", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u210F" }, 8467: { "value": "2113", "name": "SCRIPT SMALL L", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u2113" }, 8495: { "value": "212F", "name": "SCRIPT SMALL E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0065", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u212F" }, 8500: { "value": "2134", "name": "SCRIPT SMALL O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006F", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u2134" }, 8505: { "value": "2139", "name": "INFORMATION SOURCE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0069", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u2139" }, 8508: { "value": "213C", "name": "DOUBLE-STRUCK SMALL PI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 03C0", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u213C" }, 8509: { "value": "213D", "name": "DOUBLE-STRUCK SMALL GAMMA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 03B3", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u213D" }, 8518: { "value": "2146", "name": "DOUBLE-STRUCK ITALIC SMALL D", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0064", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u2146" }, 8519: { "value": "2147", "name": "DOUBLE-STRUCK ITALIC SMALL E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0065", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u2147" }, 8520: { "value": "2148", "name": "DOUBLE-STRUCK ITALIC SMALL I", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0069", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u2148" }, 8521: { "value": "2149", "name": "DOUBLE-STRUCK ITALIC SMALL J", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u2149" }, 8526: { "value": "214E", "name": "TURNED SMALL F", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2132", "lowercase_mapping": "", "titlecase_mapping": "2132", "symbol": "\u214E" }, 8580: { "value": "2184", "name": "LATIN SMALL LETTER REVERSED C", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2183", "lowercase_mapping": "", "titlecase_mapping": "2183", "symbol": "\u2184" }, 11312: { "value": "2C30", "name": "GLAGOLITIC SMALL LETTER AZU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C00", "lowercase_mapping": "", "titlecase_mapping": "2C00", "symbol": "\u2C30" }, 11313: { "value": "2C31", "name": "GLAGOLITIC SMALL LETTER BUKY", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C01", "lowercase_mapping": "", "titlecase_mapping": "2C01", "symbol": "\u2C31" }, 11314: { "value": "2C32", "name": "GLAGOLITIC SMALL LETTER VEDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C02", "lowercase_mapping": "", "titlecase_mapping": "2C02", "symbol": "\u2C32" }, 11315: { "value": "2C33", "name": "GLAGOLITIC SMALL LETTER GLAGOLI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C03", "lowercase_mapping": "", "titlecase_mapping": "2C03", "symbol": "\u2C33" }, 11316: { "value": "2C34", "name": "GLAGOLITIC SMALL LETTER DOBRO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C04", "lowercase_mapping": "", "titlecase_mapping": "2C04", "symbol": "\u2C34" }, 11317: { "value": "2C35", "name": "GLAGOLITIC SMALL LETTER YESTU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C05", "lowercase_mapping": "", "titlecase_mapping": "2C05", "symbol": "\u2C35" }, 11318: { "value": "2C36", "name": "GLAGOLITIC SMALL LETTER ZHIVETE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C06", "lowercase_mapping": "", "titlecase_mapping": "2C06", "symbol": "\u2C36" }, 11319: { "value": "2C37", "name": "GLAGOLITIC SMALL LETTER DZELO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C07", "lowercase_mapping": "", "titlecase_mapping": "2C07", "symbol": "\u2C37" }, 11320: { "value": "2C38", "name": "GLAGOLITIC SMALL LETTER ZEMLJA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C08", "lowercase_mapping": "", "titlecase_mapping": "2C08", "symbol": "\u2C38" }, 11321: { "value": "2C39", "name": "GLAGOLITIC SMALL LETTER IZHE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C09", "lowercase_mapping": "", "titlecase_mapping": "2C09", "symbol": "\u2C39" }, 11322: { "value": "2C3A", "name": "GLAGOLITIC SMALL LETTER INITIAL IZHE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C0A", "lowercase_mapping": "", "titlecase_mapping": "2C0A", "symbol": "\u2C3A" }, 11323: { "value": "2C3B", "name": "GLAGOLITIC SMALL LETTER I", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C0B", "lowercase_mapping": "", "titlecase_mapping": "2C0B", "symbol": "\u2C3B" }, 11324: { "value": "2C3C", "name": "GLAGOLITIC SMALL LETTER DJERVI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C0C", "lowercase_mapping": "", "titlecase_mapping": "2C0C", "symbol": "\u2C3C" }, 11325: { "value": "2C3D", "name": "GLAGOLITIC SMALL LETTER KAKO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C0D", "lowercase_mapping": "", "titlecase_mapping": "2C0D", "symbol": "\u2C3D" }, 11326: { "value": "2C3E", "name": "GLAGOLITIC SMALL LETTER LJUDIJE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C0E", "lowercase_mapping": "", "titlecase_mapping": "2C0E", "symbol": "\u2C3E" }, 11327: { "value": "2C3F", "name": "GLAGOLITIC SMALL LETTER MYSLITE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C0F", "lowercase_mapping": "", "titlecase_mapping": "2C0F", "symbol": "\u2C3F" }, 11328: { "value": "2C40", "name": "GLAGOLITIC SMALL LETTER NASHI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C10", "lowercase_mapping": "", "titlecase_mapping": "2C10", "symbol": "\u2C40" }, 11329: { "value": "2C41", "name": "GLAGOLITIC SMALL LETTER ONU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C11", "lowercase_mapping": "", "titlecase_mapping": "2C11", "symbol": "\u2C41" }, 11330: { "value": "2C42", "name": "GLAGOLITIC SMALL LETTER POKOJI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C12", "lowercase_mapping": "", "titlecase_mapping": "2C12", "symbol": "\u2C42" }, 11331: { "value": "2C43", "name": "GLAGOLITIC SMALL LETTER RITSI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C13", "lowercase_mapping": "", "titlecase_mapping": "2C13", "symbol": "\u2C43" }, 11332: { "value": "2C44", "name": "GLAGOLITIC SMALL LETTER SLOVO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C14", "lowercase_mapping": "", "titlecase_mapping": "2C14", "symbol": "\u2C44" }, 11333: { "value": "2C45", "name": "GLAGOLITIC SMALL LETTER TVRIDO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C15", "lowercase_mapping": "", "titlecase_mapping": "2C15", "symbol": "\u2C45" }, 11334: { "value": "2C46", "name": "GLAGOLITIC SMALL LETTER UKU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C16", "lowercase_mapping": "", "titlecase_mapping": "2C16", "symbol": "\u2C46" }, 11335: { "value": "2C47", "name": "GLAGOLITIC SMALL LETTER FRITU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C17", "lowercase_mapping": "", "titlecase_mapping": "2C17", "symbol": "\u2C47" }, 11336: { "value": "2C48", "name": "GLAGOLITIC SMALL LETTER HERU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C18", "lowercase_mapping": "", "titlecase_mapping": "2C18", "symbol": "\u2C48" }, 11337: { "value": "2C49", "name": "GLAGOLITIC SMALL LETTER OTU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C19", "lowercase_mapping": "", "titlecase_mapping": "2C19", "symbol": "\u2C49" }, 11338: { "value": "2C4A", "name": "GLAGOLITIC SMALL LETTER PE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C1A", "lowercase_mapping": "", "titlecase_mapping": "2C1A", "symbol": "\u2C4A" }, 11339: { "value": "2C4B", "name": "GLAGOLITIC SMALL LETTER SHTA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C1B", "lowercase_mapping": "", "titlecase_mapping": "2C1B", "symbol": "\u2C4B" }, 11340: { "value": "2C4C", "name": "GLAGOLITIC SMALL LETTER TSI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C1C", "lowercase_mapping": "", "titlecase_mapping": "2C1C", "symbol": "\u2C4C" }, 11341: { "value": "2C4D", "name": "GLAGOLITIC SMALL LETTER CHRIVI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C1D", "lowercase_mapping": "", "titlecase_mapping": "2C1D", "symbol": "\u2C4D" }, 11342: { "value": "2C4E", "name": "GLAGOLITIC SMALL LETTER SHA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C1E", "lowercase_mapping": "", "titlecase_mapping": "2C1E", "symbol": "\u2C4E" }, 11343: { "value": "2C4F", "name": "GLAGOLITIC SMALL LETTER YERU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C1F", "lowercase_mapping": "", "titlecase_mapping": "2C1F", "symbol": "\u2C4F" }, 11344: { "value": "2C50", "name": "GLAGOLITIC SMALL LETTER YERI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C20", "lowercase_mapping": "", "titlecase_mapping": "2C20", "symbol": "\u2C50" }, 11345: { "value": "2C51", "name": "GLAGOLITIC SMALL LETTER YATI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C21", "lowercase_mapping": "", "titlecase_mapping": "2C21", "symbol": "\u2C51" }, 11346: { "value": "2C52", "name": "GLAGOLITIC SMALL LETTER SPIDERY HA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C22", "lowercase_mapping": "", "titlecase_mapping": "2C22", "symbol": "\u2C52" }, 11347: { "value": "2C53", "name": "GLAGOLITIC SMALL LETTER YU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C23", "lowercase_mapping": "", "titlecase_mapping": "2C23", "symbol": "\u2C53" }, 11348: { "value": "2C54", "name": "GLAGOLITIC SMALL LETTER SMALL YUS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C24", "lowercase_mapping": "", "titlecase_mapping": "2C24", "symbol": "\u2C54" }, 11349: { "value": "2C55", "name": "GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C25", "lowercase_mapping": "", "titlecase_mapping": "2C25", "symbol": "\u2C55" }, 11350: { "value": "2C56", "name": "GLAGOLITIC SMALL LETTER YO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C26", "lowercase_mapping": "", "titlecase_mapping": "2C26", "symbol": "\u2C56" }, 11351: { "value": "2C57", "name": "GLAGOLITIC SMALL LETTER IOTATED SMALL YUS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C27", "lowercase_mapping": "", "titlecase_mapping": "2C27", "symbol": "\u2C57" }, 11352: { "value": "2C58", "name": "GLAGOLITIC SMALL LETTER BIG YUS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C28", "lowercase_mapping": "", "titlecase_mapping": "2C28", "symbol": "\u2C58" }, 11353: { "value": "2C59", "name": "GLAGOLITIC SMALL LETTER IOTATED BIG YUS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C29", "lowercase_mapping": "", "titlecase_mapping": "2C29", "symbol": "\u2C59" }, 11354: { "value": "2C5A", "name": "GLAGOLITIC SMALL LETTER FITA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C2A", "lowercase_mapping": "", "titlecase_mapping": "2C2A", "symbol": "\u2C5A" }, 11355: { "value": "2C5B", "name": "GLAGOLITIC SMALL LETTER IZHITSA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C2B", "lowercase_mapping": "", "titlecase_mapping": "2C2B", "symbol": "\u2C5B" }, 11356: { "value": "2C5C", "name": "GLAGOLITIC SMALL LETTER SHTAPIC", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C2C", "lowercase_mapping": "", "titlecase_mapping": "2C2C", "symbol": "\u2C5C" }, 11357: { "value": "2C5D", "name": "GLAGOLITIC SMALL LETTER TROKUTASTI A", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C2D", "lowercase_mapping": "", "titlecase_mapping": "2C2D", "symbol": "\u2C5D" }, 11358: { "value": "2C5E", "name": "GLAGOLITIC SMALL LETTER LATINATE MYSLITE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C2E", "lowercase_mapping": "", "titlecase_mapping": "2C2E", "symbol": "\u2C5E" }, 11361: { "value": "2C61", "name": "LATIN SMALL LETTER L WITH DOUBLE BAR", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C60", "lowercase_mapping": "", "titlecase_mapping": "2C60", "symbol": "\u2C61" }, 11365: { "value": "2C65", "name": "LATIN SMALL LETTER A WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "023A", "lowercase_mapping": "", "titlecase_mapping": "023A", "symbol": "\u2C65" }, 11366: { "value": "2C66", "name": "LATIN SMALL LETTER T WITH DIAGONAL STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "023E", "lowercase_mapping": "", "titlecase_mapping": "023E", "symbol": "\u2C66" }, 11368: { "value": "2C68", "name": "LATIN SMALL LETTER H WITH DESCENDER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C67", "lowercase_mapping": "", "titlecase_mapping": "2C67", "symbol": "\u2C68" }, 11370: { "value": "2C6A", "name": "LATIN SMALL LETTER K WITH DESCENDER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C69", "lowercase_mapping": "", "titlecase_mapping": "2C69", "symbol": "\u2C6A" }, 11372: { "value": "2C6C", "name": "LATIN SMALL LETTER Z WITH DESCENDER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C6B", "lowercase_mapping": "", "titlecase_mapping": "2C6B", "symbol": "\u2C6C" }, 11377: { "value": "2C71", "name": "LATIN SMALL LETTER V WITH RIGHT HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u2C71" }, 11379: { "value": "2C73", "name": "LATIN SMALL LETTER W WITH HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C72", "lowercase_mapping": "", "titlecase_mapping": "2C72", "symbol": "\u2C73" }, 11380: { "value": "2C74", "name": "LATIN SMALL LETTER V WITH CURL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u2C74" }, 11382: { "value": "2C76", "name": "LATIN SMALL LETTER HALF H", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C75", "lowercase_mapping": "", "titlecase_mapping": "2C75", "symbol": "\u2C76" }, 11383: { "value": "2C77", "name": "LATIN SMALL LETTER TAILLESS PHI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u2C77" }, 11384: { "value": "2C78", "name": "LATIN SMALL LETTER E WITH NOTCH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u2C78" }, 11385: { "value": "2C79", "name": "LATIN SMALL LETTER TURNED R WITH TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u2C79" }, 11386: { "value": "2C7A", "name": "LATIN SMALL LETTER O WITH LOW RING INSIDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u2C7A" }, 11387: { "value": "2C7B", "name": "LATIN LETTER SMALL CAPITAL TURNED E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u2C7B" }, 11393: { "value": "2C81", "name": "COPTIC SMALL LETTER ALFA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C80", "lowercase_mapping": "", "titlecase_mapping": "2C80", "symbol": "\u2C81" }, 11395: { "value": "2C83", "name": "COPTIC SMALL LETTER VIDA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C82", "lowercase_mapping": "", "titlecase_mapping": "2C82", "symbol": "\u2C83" }, 11397: { "value": "2C85", "name": "COPTIC SMALL LETTER GAMMA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C84", "lowercase_mapping": "", "titlecase_mapping": "2C84", "symbol": "\u2C85" }, 11399: { "value": "2C87", "name": "COPTIC SMALL LETTER DALDA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C86", "lowercase_mapping": "", "titlecase_mapping": "2C86", "symbol": "\u2C87" }, 11401: { "value": "2C89", "name": "COPTIC SMALL LETTER EIE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C88", "lowercase_mapping": "", "titlecase_mapping": "2C88", "symbol": "\u2C89" }, 11403: { "value": "2C8B", "name": "COPTIC SMALL LETTER SOU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C8A", "lowercase_mapping": "", "titlecase_mapping": "2C8A", "symbol": "\u2C8B" }, 11405: { "value": "2C8D", "name": "COPTIC SMALL LETTER ZATA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C8C", "lowercase_mapping": "", "titlecase_mapping": "2C8C", "symbol": "\u2C8D" }, 11407: { "value": "2C8F", "name": "COPTIC SMALL LETTER HATE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C8E", "lowercase_mapping": "", "titlecase_mapping": "2C8E", "symbol": "\u2C8F" }, 11409: { "value": "2C91", "name": "COPTIC SMALL LETTER THETHE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C90", "lowercase_mapping": "", "titlecase_mapping": "2C90", "symbol": "\u2C91" }, 11411: { "value": "2C93", "name": "COPTIC SMALL LETTER IAUDA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C92", "lowercase_mapping": "", "titlecase_mapping": "2C92", "symbol": "\u2C93" }, 11413: { "value": "2C95", "name": "COPTIC SMALL LETTER KAPA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C94", "lowercase_mapping": "", "titlecase_mapping": "2C94", "symbol": "\u2C95" }, 11415: { "value": "2C97", "name": "COPTIC SMALL LETTER LAULA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C96", "lowercase_mapping": "", "titlecase_mapping": "2C96", "symbol": "\u2C97" }, 11417: { "value": "2C99", "name": "COPTIC SMALL LETTER MI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C98", "lowercase_mapping": "", "titlecase_mapping": "2C98", "symbol": "\u2C99" }, 11419: { "value": "2C9B", "name": "COPTIC SMALL LETTER NI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C9A", "lowercase_mapping": "", "titlecase_mapping": "2C9A", "symbol": "\u2C9B" }, 11421: { "value": "2C9D", "name": "COPTIC SMALL LETTER KSI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C9C", "lowercase_mapping": "", "titlecase_mapping": "2C9C", "symbol": "\u2C9D" }, 11423: { "value": "2C9F", "name": "COPTIC SMALL LETTER O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2C9E", "lowercase_mapping": "", "titlecase_mapping": "2C9E", "symbol": "\u2C9F" }, 11425: { "value": "2CA1", "name": "COPTIC SMALL LETTER PI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CA0", "lowercase_mapping": "", "titlecase_mapping": "2CA0", "symbol": "\u2CA1" }, 11427: { "value": "2CA3", "name": "COPTIC SMALL LETTER RO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CA2", "lowercase_mapping": "", "titlecase_mapping": "2CA2", "symbol": "\u2CA3" }, 11429: { "value": "2CA5", "name": "COPTIC SMALL LETTER SIMA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CA4", "lowercase_mapping": "", "titlecase_mapping": "2CA4", "symbol": "\u2CA5" }, 11431: { "value": "2CA7", "name": "COPTIC SMALL LETTER TAU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CA6", "lowercase_mapping": "", "titlecase_mapping": "2CA6", "symbol": "\u2CA7" }, 11433: { "value": "2CA9", "name": "COPTIC SMALL LETTER UA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CA8", "lowercase_mapping": "", "titlecase_mapping": "2CA8", "symbol": "\u2CA9" }, 11435: { "value": "2CAB", "name": "COPTIC SMALL LETTER FI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CAA", "lowercase_mapping": "", "titlecase_mapping": "2CAA", "symbol": "\u2CAB" }, 11437: { "value": "2CAD", "name": "COPTIC SMALL LETTER KHI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CAC", "lowercase_mapping": "", "titlecase_mapping": "2CAC", "symbol": "\u2CAD" }, 11439: { "value": "2CAF", "name": "COPTIC SMALL LETTER PSI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CAE", "lowercase_mapping": "", "titlecase_mapping": "2CAE", "symbol": "\u2CAF" }, 11441: { "value": "2CB1", "name": "COPTIC SMALL LETTER OOU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CB0", "lowercase_mapping": "", "titlecase_mapping": "2CB0", "symbol": "\u2CB1" }, 11443: { "value": "2CB3", "name": "COPTIC SMALL LETTER DIALECT-P ALEF", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CB2", "lowercase_mapping": "", "titlecase_mapping": "2CB2", "symbol": "\u2CB3" }, 11445: { "value": "2CB5", "name": "COPTIC SMALL LETTER OLD COPTIC AIN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CB4", "lowercase_mapping": "", "titlecase_mapping": "2CB4", "symbol": "\u2CB5" }, 11447: { "value": "2CB7", "name": "COPTIC SMALL LETTER CRYPTOGRAMMIC EIE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CB6", "lowercase_mapping": "", "titlecase_mapping": "2CB6", "symbol": "\u2CB7" }, 11449: { "value": "2CB9", "name": "COPTIC SMALL LETTER DIALECT-P KAPA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CB8", "lowercase_mapping": "", "titlecase_mapping": "2CB8", "symbol": "\u2CB9" }, 11451: { "value": "2CBB", "name": "COPTIC SMALL LETTER DIALECT-P NI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CBA", "lowercase_mapping": "", "titlecase_mapping": "2CBA", "symbol": "\u2CBB" }, 11453: { "value": "2CBD", "name": "COPTIC SMALL LETTER CRYPTOGRAMMIC NI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CBC", "lowercase_mapping": "", "titlecase_mapping": "2CBC", "symbol": "\u2CBD" }, 11455: { "value": "2CBF", "name": "COPTIC SMALL LETTER OLD COPTIC OOU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CBE", "lowercase_mapping": "", "titlecase_mapping": "2CBE", "symbol": "\u2CBF" }, 11457: { "value": "2CC1", "name": "COPTIC SMALL LETTER SAMPI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CC0", "lowercase_mapping": "", "titlecase_mapping": "2CC0", "symbol": "\u2CC1" }, 11459: { "value": "2CC3", "name": "COPTIC SMALL LETTER CROSSED SHEI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CC2", "lowercase_mapping": "", "titlecase_mapping": "2CC2", "symbol": "\u2CC3" }, 11461: { "value": "2CC5", "name": "COPTIC SMALL LETTER OLD COPTIC SHEI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CC4", "lowercase_mapping": "", "titlecase_mapping": "2CC4", "symbol": "\u2CC5" }, 11463: { "value": "2CC7", "name": "COPTIC SMALL LETTER OLD COPTIC ESH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CC6", "lowercase_mapping": "", "titlecase_mapping": "2CC6", "symbol": "\u2CC7" }, 11465: { "value": "2CC9", "name": "COPTIC SMALL LETTER AKHMIMIC KHEI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CC8", "lowercase_mapping": "", "titlecase_mapping": "2CC8", "symbol": "\u2CC9" }, 11467: { "value": "2CCB", "name": "COPTIC SMALL LETTER DIALECT-P HORI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CCA", "lowercase_mapping": "", "titlecase_mapping": "2CCA", "symbol": "\u2CCB" }, 11469: { "value": "2CCD", "name": "COPTIC SMALL LETTER OLD COPTIC HORI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CCC", "lowercase_mapping": "", "titlecase_mapping": "2CCC", "symbol": "\u2CCD" }, 11471: { "value": "2CCF", "name": "COPTIC SMALL LETTER OLD COPTIC HA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CCE", "lowercase_mapping": "", "titlecase_mapping": "2CCE", "symbol": "\u2CCF" }, 11473: { "value": "2CD1", "name": "COPTIC SMALL LETTER L-SHAPED HA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CD0", "lowercase_mapping": "", "titlecase_mapping": "2CD0", "symbol": "\u2CD1" }, 11475: { "value": "2CD3", "name": "COPTIC SMALL LETTER OLD COPTIC HEI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CD2", "lowercase_mapping": "", "titlecase_mapping": "2CD2", "symbol": "\u2CD3" }, 11477: { "value": "2CD5", "name": "COPTIC SMALL LETTER OLD COPTIC HAT", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CD4", "lowercase_mapping": "", "titlecase_mapping": "2CD4", "symbol": "\u2CD5" }, 11479: { "value": "2CD7", "name": "COPTIC SMALL LETTER OLD COPTIC GANGIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CD6", "lowercase_mapping": "", "titlecase_mapping": "2CD6", "symbol": "\u2CD7" }, 11481: { "value": "2CD9", "name": "COPTIC SMALL LETTER OLD COPTIC DJA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CD8", "lowercase_mapping": "", "titlecase_mapping": "2CD8", "symbol": "\u2CD9" }, 11483: { "value": "2CDB", "name": "COPTIC SMALL LETTER OLD COPTIC SHIMA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CDA", "lowercase_mapping": "", "titlecase_mapping": "2CDA", "symbol": "\u2CDB" }, 11485: { "value": "2CDD", "name": "COPTIC SMALL LETTER OLD NUBIAN SHIMA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CDC", "lowercase_mapping": "", "titlecase_mapping": "2CDC", "symbol": "\u2CDD" }, 11487: { "value": "2CDF", "name": "COPTIC SMALL LETTER OLD NUBIAN NGI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CDE", "lowercase_mapping": "", "titlecase_mapping": "2CDE", "symbol": "\u2CDF" }, 11489: { "value": "2CE1", "name": "COPTIC SMALL LETTER OLD NUBIAN NYI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CE0", "lowercase_mapping": "", "titlecase_mapping": "2CE0", "symbol": "\u2CE1" }, 11491: { "value": "2CE3", "name": "COPTIC SMALL LETTER OLD NUBIAN WAU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CE2", "lowercase_mapping": "", "titlecase_mapping": "2CE2", "symbol": "\u2CE3" }, 11492: { "value": "2CE4", "name": "COPTIC SYMBOL KAI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\u2CE4" }, 11500: { "value": "2CEC", "name": "COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CEB", "lowercase_mapping": "", "titlecase_mapping": "2CEB", "symbol": "\u2CEC" }, 11502: { "value": "2CEE", "name": "COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CED", "lowercase_mapping": "", "titlecase_mapping": "2CED", "symbol": "\u2CEE" }, 11507: { "value": "2CF3", "name": "COPTIC SMALL LETTER BOHAIRIC KHEI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "2CF2", "lowercase_mapping": "", "titlecase_mapping": "2CF2", "symbol": "\u2CF3" }, 11520: { "value": "2D00", "name": "GEORGIAN SMALL LETTER AN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10A0", "lowercase_mapping": "", "titlecase_mapping": "10A0", "symbol": "\u2D00" }, 11521: { "value": "2D01", "name": "GEORGIAN SMALL LETTER BAN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10A1", "lowercase_mapping": "", "titlecase_mapping": "10A1", "symbol": "\u2D01" }, 11522: { "value": "2D02", "name": "GEORGIAN SMALL LETTER GAN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10A2", "lowercase_mapping": "", "titlecase_mapping": "10A2", "symbol": "\u2D02" }, 11523: { "value": "2D03", "name": "GEORGIAN SMALL LETTER DON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10A3", "lowercase_mapping": "", "titlecase_mapping": "10A3", "symbol": "\u2D03" }, 11524: { "value": "2D04", "name": "GEORGIAN SMALL LETTER EN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10A4", "lowercase_mapping": "", "titlecase_mapping": "10A4", "symbol": "\u2D04" }, 11525: { "value": "2D05", "name": "GEORGIAN SMALL LETTER VIN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10A5", "lowercase_mapping": "", "titlecase_mapping": "10A5", "symbol": "\u2D05" }, 11526: { "value": "2D06", "name": "GEORGIAN SMALL LETTER ZEN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10A6", "lowercase_mapping": "", "titlecase_mapping": "10A6", "symbol": "\u2D06" }, 11527: { "value": "2D07", "name": "GEORGIAN SMALL LETTER TAN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10A7", "lowercase_mapping": "", "titlecase_mapping": "10A7", "symbol": "\u2D07" }, 11528: { "value": "2D08", "name": "GEORGIAN SMALL LETTER IN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10A8", "lowercase_mapping": "", "titlecase_mapping": "10A8", "symbol": "\u2D08" }, 11529: { "value": "2D09", "name": "GEORGIAN SMALL LETTER KAN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10A9", "lowercase_mapping": "", "titlecase_mapping": "10A9", "symbol": "\u2D09" }, 11530: { "value": "2D0A", "name": "GEORGIAN SMALL LETTER LAS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10AA", "lowercase_mapping": "", "titlecase_mapping": "10AA", "symbol": "\u2D0A" }, 11531: { "value": "2D0B", "name": "GEORGIAN SMALL LETTER MAN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10AB", "lowercase_mapping": "", "titlecase_mapping": "10AB", "symbol": "\u2D0B" }, 11532: { "value": "2D0C", "name": "GEORGIAN SMALL LETTER NAR", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10AC", "lowercase_mapping": "", "titlecase_mapping": "10AC", "symbol": "\u2D0C" }, 11533: { "value": "2D0D", "name": "GEORGIAN SMALL LETTER ON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10AD", "lowercase_mapping": "", "titlecase_mapping": "10AD", "symbol": "\u2D0D" }, 11534: { "value": "2D0E", "name": "GEORGIAN SMALL LETTER PAR", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10AE", "lowercase_mapping": "", "titlecase_mapping": "10AE", "symbol": "\u2D0E" }, 11535: { "value": "2D0F", "name": "GEORGIAN SMALL LETTER ZHAR", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10AF", "lowercase_mapping": "", "titlecase_mapping": "10AF", "symbol": "\u2D0F" }, 11536: { "value": "2D10", "name": "GEORGIAN SMALL LETTER RAE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10B0", "lowercase_mapping": "", "titlecase_mapping": "10B0", "symbol": "\u2D10" }, 11537: { "value": "2D11", "name": "GEORGIAN SMALL LETTER SAN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10B1", "lowercase_mapping": "", "titlecase_mapping": "10B1", "symbol": "\u2D11" }, 11538: { "value": "2D12", "name": "GEORGIAN SMALL LETTER TAR", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10B2", "lowercase_mapping": "", "titlecase_mapping": "10B2", "symbol": "\u2D12" }, 11539: { "value": "2D13", "name": "GEORGIAN SMALL LETTER UN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10B3", "lowercase_mapping": "", "titlecase_mapping": "10B3", "symbol": "\u2D13" }, 11540: { "value": "2D14", "name": "GEORGIAN SMALL LETTER PHAR", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10B4", "lowercase_mapping": "", "titlecase_mapping": "10B4", "symbol": "\u2D14" }, 11541: { "value": "2D15", "name": "GEORGIAN SMALL LETTER KHAR", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10B5", "lowercase_mapping": "", "titlecase_mapping": "10B5", "symbol": "\u2D15" }, 11542: { "value": "2D16", "name": "GEORGIAN SMALL LETTER GHAN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10B6", "lowercase_mapping": "", "titlecase_mapping": "10B6", "symbol": "\u2D16" }, 11543: { "value": "2D17", "name": "GEORGIAN SMALL LETTER QAR", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10B7", "lowercase_mapping": "", "titlecase_mapping": "10B7", "symbol": "\u2D17" }, 11544: { "value": "2D18", "name": "GEORGIAN SMALL LETTER SHIN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10B8", "lowercase_mapping": "", "titlecase_mapping": "10B8", "symbol": "\u2D18" }, 11545: { "value": "2D19", "name": "GEORGIAN SMALL LETTER CHIN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10B9", "lowercase_mapping": "", "titlecase_mapping": "10B9", "symbol": "\u2D19" }, 11546: { "value": "2D1A", "name": "GEORGIAN SMALL LETTER CAN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10BA", "lowercase_mapping": "", "titlecase_mapping": "10BA", "symbol": "\u2D1A" }, 11547: { "value": "2D1B", "name": "GEORGIAN SMALL LETTER JIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10BB", "lowercase_mapping": "", "titlecase_mapping": "10BB", "symbol": "\u2D1B" }, 11548: { "value": "2D1C", "name": "GEORGIAN SMALL LETTER CIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10BC", "lowercase_mapping": "", "titlecase_mapping": "10BC", "symbol": "\u2D1C" }, 11549: { "value": "2D1D", "name": "GEORGIAN SMALL LETTER CHAR", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10BD", "lowercase_mapping": "", "titlecase_mapping": "10BD", "symbol": "\u2D1D" }, 11550: { "value": "2D1E", "name": "GEORGIAN SMALL LETTER XAN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10BE", "lowercase_mapping": "", "titlecase_mapping": "10BE", "symbol": "\u2D1E" }, 11551: { "value": "2D1F", "name": "GEORGIAN SMALL LETTER JHAN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10BF", "lowercase_mapping": "", "titlecase_mapping": "10BF", "symbol": "\u2D1F" }, 11552: { "value": "2D20", "name": "GEORGIAN SMALL LETTER HAE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C0", "lowercase_mapping": "", "titlecase_mapping": "10C0", "symbol": "\u2D20" }, 11553: { "value": "2D21", "name": "GEORGIAN SMALL LETTER HE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C1", "lowercase_mapping": "", "titlecase_mapping": "10C1", "symbol": "\u2D21" }, 11554: { "value": "2D22", "name": "GEORGIAN SMALL LETTER HIE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C2", "lowercase_mapping": "", "titlecase_mapping": "10C2", "symbol": "\u2D22" }, 11555: { "value": "2D23", "name": "GEORGIAN SMALL LETTER WE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C3", "lowercase_mapping": "", "titlecase_mapping": "10C3", "symbol": "\u2D23" }, 11556: { "value": "2D24", "name": "GEORGIAN SMALL LETTER HAR", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C4", "lowercase_mapping": "", "titlecase_mapping": "10C4", "symbol": "\u2D24" }, 11557: { "value": "2D25", "name": "GEORGIAN SMALL LETTER HOE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C5", "lowercase_mapping": "", "titlecase_mapping": "10C5", "symbol": "\u2D25" }, 11559: { "value": "2D27", "name": "GEORGIAN SMALL LETTER YN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C7", "lowercase_mapping": "", "titlecase_mapping": "10C7", "symbol": "\u2D27" }, 11565: { "value": "2D2D", "name": "GEORGIAN SMALL LETTER AEN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10CD", "lowercase_mapping": "", "titlecase_mapping": "10CD", "symbol": "\u2D2D" }, 42561: { "value": "A641", "name": "CYRILLIC SMALL LETTER ZEMLYA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A640", "lowercase_mapping": "", "titlecase_mapping": "A640", "symbol": "\uA641" }, 42563: { "value": "A643", "name": "CYRILLIC SMALL LETTER DZELO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A642", "lowercase_mapping": "", "titlecase_mapping": "A642", "symbol": "\uA643" }, 42565: { "value": "A645", "name": "CYRILLIC SMALL LETTER REVERSED DZE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A644", "lowercase_mapping": "", "titlecase_mapping": "A644", "symbol": "\uA645" }, 42567: { "value": "A647", "name": "CYRILLIC SMALL LETTER IOTA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A646", "lowercase_mapping": "", "titlecase_mapping": "A646", "symbol": "\uA647" }, 42569: { "value": "A649", "name": "CYRILLIC SMALL LETTER DJERV", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A648", "lowercase_mapping": "", "titlecase_mapping": "A648", "symbol": "\uA649" }, 42571: { "value": "A64B", "name": "CYRILLIC SMALL LETTER MONOGRAPH UK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A64A", "lowercase_mapping": "", "titlecase_mapping": "A64A", "symbol": "\uA64B" }, 42573: { "value": "A64D", "name": "CYRILLIC SMALL LETTER BROAD OMEGA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A64C", "lowercase_mapping": "", "titlecase_mapping": "A64C", "symbol": "\uA64D" }, 42575: { "value": "A64F", "name": "CYRILLIC SMALL LETTER NEUTRAL YER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A64E", "lowercase_mapping": "", "titlecase_mapping": "A64E", "symbol": "\uA64F" }, 42577: { "value": "A651", "name": "CYRILLIC SMALL LETTER YERU WITH BACK YER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A650", "lowercase_mapping": "", "titlecase_mapping": "A650", "symbol": "\uA651" }, 42579: { "value": "A653", "name": "CYRILLIC SMALL LETTER IOTIFIED YAT", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A652", "lowercase_mapping": "", "titlecase_mapping": "A652", "symbol": "\uA653" }, 42581: { "value": "A655", "name": "CYRILLIC SMALL LETTER REVERSED YU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A654", "lowercase_mapping": "", "titlecase_mapping": "A654", "symbol": "\uA655" }, 42583: { "value": "A657", "name": "CYRILLIC SMALL LETTER IOTIFIED A", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A656", "lowercase_mapping": "", "titlecase_mapping": "A656", "symbol": "\uA657" }, 42585: { "value": "A659", "name": "CYRILLIC SMALL LETTER CLOSED LITTLE YUS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A658", "lowercase_mapping": "", "titlecase_mapping": "A658", "symbol": "\uA659" }, 42587: { "value": "A65B", "name": "CYRILLIC SMALL LETTER BLENDED YUS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A65A", "lowercase_mapping": "", "titlecase_mapping": "A65A", "symbol": "\uA65B" }, 42589: { "value": "A65D", "name": "CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A65C", "lowercase_mapping": "", "titlecase_mapping": "A65C", "symbol": "\uA65D" }, 42591: { "value": "A65F", "name": "CYRILLIC SMALL LETTER YN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A65E", "lowercase_mapping": "", "titlecase_mapping": "A65E", "symbol": "\uA65F" }, 42593: { "value": "A661", "name": "CYRILLIC SMALL LETTER REVERSED TSE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A660", "lowercase_mapping": "", "titlecase_mapping": "A660", "symbol": "\uA661" }, 42595: { "value": "A663", "name": "CYRILLIC SMALL LETTER SOFT DE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A662", "lowercase_mapping": "", "titlecase_mapping": "A662", "symbol": "\uA663" }, 42597: { "value": "A665", "name": "CYRILLIC SMALL LETTER SOFT EL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A664", "lowercase_mapping": "", "titlecase_mapping": "A664", "symbol": "\uA665" }, 42599: { "value": "A667", "name": "CYRILLIC SMALL LETTER SOFT EM", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A666", "lowercase_mapping": "", "titlecase_mapping": "A666", "symbol": "\uA667" }, 42601: { "value": "A669", "name": "CYRILLIC SMALL LETTER MONOCULAR O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A668", "lowercase_mapping": "", "titlecase_mapping": "A668", "symbol": "\uA669" }, 42603: { "value": "A66B", "name": "CYRILLIC SMALL LETTER BINOCULAR O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A66A", "lowercase_mapping": "", "titlecase_mapping": "A66A", "symbol": "\uA66B" }, 42605: { "value": "A66D", "name": "CYRILLIC SMALL LETTER DOUBLE MONOCULAR O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A66C", "lowercase_mapping": "", "titlecase_mapping": "A66C", "symbol": "\uA66D" }, 42625: { "value": "A681", "name": "CYRILLIC SMALL LETTER DWE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A680", "lowercase_mapping": "", "titlecase_mapping": "A680", "symbol": "\uA681" }, 42627: { "value": "A683", "name": "CYRILLIC SMALL LETTER DZWE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A682", "lowercase_mapping": "", "titlecase_mapping": "A682", "symbol": "\uA683" }, 42629: { "value": "A685", "name": "CYRILLIC SMALL LETTER ZHWE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A684", "lowercase_mapping": "", "titlecase_mapping": "A684", "symbol": "\uA685" }, 42631: { "value": "A687", "name": "CYRILLIC SMALL LETTER CCHE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A686", "lowercase_mapping": "", "titlecase_mapping": "A686", "symbol": "\uA687" }, 42633: { "value": "A689", "name": "CYRILLIC SMALL LETTER DZZE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A688", "lowercase_mapping": "", "titlecase_mapping": "A688", "symbol": "\uA689" }, 42635: { "value": "A68B", "name": "CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A68A", "lowercase_mapping": "", "titlecase_mapping": "A68A", "symbol": "\uA68B" }, 42637: { "value": "A68D", "name": "CYRILLIC SMALL LETTER TWE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A68C", "lowercase_mapping": "", "titlecase_mapping": "A68C", "symbol": "\uA68D" }, 42639: { "value": "A68F", "name": "CYRILLIC SMALL LETTER TSWE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A68E", "lowercase_mapping": "", "titlecase_mapping": "A68E", "symbol": "\uA68F" }, 42641: { "value": "A691", "name": "CYRILLIC SMALL LETTER TSSE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A690", "lowercase_mapping": "", "titlecase_mapping": "A690", "symbol": "\uA691" }, 42643: { "value": "A693", "name": "CYRILLIC SMALL LETTER TCHE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A692", "lowercase_mapping": "", "titlecase_mapping": "A692", "symbol": "\uA693" }, 42645: { "value": "A695", "name": "CYRILLIC SMALL LETTER HWE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A694", "lowercase_mapping": "", "titlecase_mapping": "A694", "symbol": "\uA695" }, 42647: { "value": "A697", "name": "CYRILLIC SMALL LETTER SHWE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A696", "lowercase_mapping": "", "titlecase_mapping": "A696", "symbol": "\uA697" }, 42649: { "value": "A699", "name": "CYRILLIC SMALL LETTER DOUBLE O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A698", "lowercase_mapping": "", "titlecase_mapping": "A698", "symbol": "\uA699" }, 42651: { "value": "A69B", "name": "CYRILLIC SMALL LETTER CROSSED O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A69A", "lowercase_mapping": "", "titlecase_mapping": "A69A", "symbol": "\uA69B" }, 42787: { "value": "A723", "name": "LATIN SMALL LETTER EGYPTOLOGICAL ALEF", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A722", "lowercase_mapping": "", "titlecase_mapping": "A722", "symbol": "\uA723" }, 42789: { "value": "A725", "name": "LATIN SMALL LETTER EGYPTOLOGICAL AIN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A724", "lowercase_mapping": "", "titlecase_mapping": "A724", "symbol": "\uA725" }, 42791: { "value": "A727", "name": "LATIN SMALL LETTER HENG", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A726", "lowercase_mapping": "", "titlecase_mapping": "A726", "symbol": "\uA727" }, 42793: { "value": "A729", "name": "LATIN SMALL LETTER TZ", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A728", "lowercase_mapping": "", "titlecase_mapping": "A728", "symbol": "\uA729" }, 42795: { "value": "A72B", "name": "LATIN SMALL LETTER TRESILLO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A72A", "lowercase_mapping": "", "titlecase_mapping": "A72A", "symbol": "\uA72B" }, 42797: { "value": "A72D", "name": "LATIN SMALL LETTER CUATRILLO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A72C", "lowercase_mapping": "", "titlecase_mapping": "A72C", "symbol": "\uA72D" }, 42799: { "value": "A72F", "name": "LATIN SMALL LETTER CUATRILLO WITH COMMA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A72E", "lowercase_mapping": "", "titlecase_mapping": "A72E", "symbol": "\uA72F" }, 42800: { "value": "A730", "name": "LATIN LETTER SMALL CAPITAL F", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uA730" }, 42801: { "value": "A731", "name": "LATIN LETTER SMALL CAPITAL S", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uA731" }, 42803: { "value": "A733", "name": "LATIN SMALL LETTER AA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A732", "lowercase_mapping": "", "titlecase_mapping": "A732", "symbol": "\uA733" }, 42805: { "value": "A735", "name": "LATIN SMALL LETTER AO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A734", "lowercase_mapping": "", "titlecase_mapping": "A734", "symbol": "\uA735" }, 42807: { "value": "A737", "name": "LATIN SMALL LETTER AU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A736", "lowercase_mapping": "", "titlecase_mapping": "A736", "symbol": "\uA737" }, 42809: { "value": "A739", "name": "LATIN SMALL LETTER AV", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A738", "lowercase_mapping": "", "titlecase_mapping": "A738", "symbol": "\uA739" }, 42811: { "value": "A73B", "name": "LATIN SMALL LETTER AV WITH HORIZONTAL BAR", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A73A", "lowercase_mapping": "", "titlecase_mapping": "A73A", "symbol": "\uA73B" }, 42813: { "value": "A73D", "name": "LATIN SMALL LETTER AY", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A73C", "lowercase_mapping": "", "titlecase_mapping": "A73C", "symbol": "\uA73D" }, 42815: { "value": "A73F", "name": "LATIN SMALL LETTER REVERSED C WITH DOT", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A73E", "lowercase_mapping": "", "titlecase_mapping": "A73E", "symbol": "\uA73F" }, 42817: { "value": "A741", "name": "LATIN SMALL LETTER K WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A740", "lowercase_mapping": "", "titlecase_mapping": "A740", "symbol": "\uA741" }, 42819: { "value": "A743", "name": "LATIN SMALL LETTER K WITH DIAGONAL STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A742", "lowercase_mapping": "", "titlecase_mapping": "A742", "symbol": "\uA743" }, 42821: { "value": "A745", "name": "LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A744", "lowercase_mapping": "", "titlecase_mapping": "A744", "symbol": "\uA745" }, 42823: { "value": "A747", "name": "LATIN SMALL LETTER BROKEN L", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A746", "lowercase_mapping": "", "titlecase_mapping": "A746", "symbol": "\uA747" }, 42825: { "value": "A749", "name": "LATIN SMALL LETTER L WITH HIGH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A748", "lowercase_mapping": "", "titlecase_mapping": "A748", "symbol": "\uA749" }, 42827: { "value": "A74B", "name": "LATIN SMALL LETTER O WITH LONG STROKE OVERLAY", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A74A", "lowercase_mapping": "", "titlecase_mapping": "A74A", "symbol": "\uA74B" }, 42829: { "value": "A74D", "name": "LATIN SMALL LETTER O WITH LOOP", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A74C", "lowercase_mapping": "", "titlecase_mapping": "A74C", "symbol": "\uA74D" }, 42831: { "value": "A74F", "name": "LATIN SMALL LETTER OO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A74E", "lowercase_mapping": "", "titlecase_mapping": "A74E", "symbol": "\uA74F" }, 42833: { "value": "A751", "name": "LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A750", "lowercase_mapping": "", "titlecase_mapping": "A750", "symbol": "\uA751" }, 42835: { "value": "A753", "name": "LATIN SMALL LETTER P WITH FLOURISH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A752", "lowercase_mapping": "", "titlecase_mapping": "A752", "symbol": "\uA753" }, 42837: { "value": "A755", "name": "LATIN SMALL LETTER P WITH SQUIRREL TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A754", "lowercase_mapping": "", "titlecase_mapping": "A754", "symbol": "\uA755" }, 42839: { "value": "A757", "name": "LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A756", "lowercase_mapping": "", "titlecase_mapping": "A756", "symbol": "\uA757" }, 42841: { "value": "A759", "name": "LATIN SMALL LETTER Q WITH DIAGONAL STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A758", "lowercase_mapping": "", "titlecase_mapping": "A758", "symbol": "\uA759" }, 42843: { "value": "A75B", "name": "LATIN SMALL LETTER R ROTUNDA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A75A", "lowercase_mapping": "", "titlecase_mapping": "A75A", "symbol": "\uA75B" }, 42845: { "value": "A75D", "name": "LATIN SMALL LETTER RUM ROTUNDA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A75C", "lowercase_mapping": "", "titlecase_mapping": "A75C", "symbol": "\uA75D" }, 42847: { "value": "A75F", "name": "LATIN SMALL LETTER V WITH DIAGONAL STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A75E", "lowercase_mapping": "", "titlecase_mapping": "A75E", "symbol": "\uA75F" }, 42849: { "value": "A761", "name": "LATIN SMALL LETTER VY", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A760", "lowercase_mapping": "", "titlecase_mapping": "A760", "symbol": "\uA761" }, 42851: { "value": "A763", "name": "LATIN SMALL LETTER VISIGOTHIC Z", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A762", "lowercase_mapping": "", "titlecase_mapping": "A762", "symbol": "\uA763" }, 42853: { "value": "A765", "name": "LATIN SMALL LETTER THORN WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A764", "lowercase_mapping": "", "titlecase_mapping": "A764", "symbol": "\uA765" }, 42855: { "value": "A767", "name": "LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A766", "lowercase_mapping": "", "titlecase_mapping": "A766", "symbol": "\uA767" }, 42857: { "value": "A769", "name": "LATIN SMALL LETTER VEND", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A768", "lowercase_mapping": "", "titlecase_mapping": "A768", "symbol": "\uA769" }, 42859: { "value": "A76B", "name": "LATIN SMALL LETTER ET", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A76A", "lowercase_mapping": "", "titlecase_mapping": "A76A", "symbol": "\uA76B" }, 42861: { "value": "A76D", "name": "LATIN SMALL LETTER IS", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A76C", "lowercase_mapping": "", "titlecase_mapping": "A76C", "symbol": "\uA76D" }, 42863: { "value": "A76F", "name": "LATIN SMALL LETTER CON", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A76E", "lowercase_mapping": "", "titlecase_mapping": "A76E", "symbol": "\uA76F" }, 42865: { "value": "A771", "name": "LATIN SMALL LETTER DUM", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uA771" }, 42866: { "value": "A772", "name": "LATIN SMALL LETTER LUM", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uA772" }, 42867: { "value": "A773", "name": "LATIN SMALL LETTER MUM", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uA773" }, 42868: { "value": "A774", "name": "LATIN SMALL LETTER NUM", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uA774" }, 42869: { "value": "A775", "name": "LATIN SMALL LETTER RUM", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uA775" }, 42870: { "value": "A776", "name": "LATIN LETTER SMALL CAPITAL RUM", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uA776" }, 42871: { "value": "A777", "name": "LATIN SMALL LETTER TUM", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uA777" }, 42872: { "value": "A778", "name": "LATIN SMALL LETTER UM", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uA778" }, 42874: { "value": "A77A", "name": "LATIN SMALL LETTER INSULAR D", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A779", "lowercase_mapping": "", "titlecase_mapping": "A779", "symbol": "\uA77A" }, 42876: { "value": "A77C", "name": "LATIN SMALL LETTER INSULAR F", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A77B", "lowercase_mapping": "", "titlecase_mapping": "A77B", "symbol": "\uA77C" }, 42879: { "value": "A77F", "name": "LATIN SMALL LETTER TURNED INSULAR G", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A77E", "lowercase_mapping": "", "titlecase_mapping": "A77E", "symbol": "\uA77F" }, 42881: { "value": "A781", "name": "LATIN SMALL LETTER TURNED L", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A780", "lowercase_mapping": "", "titlecase_mapping": "A780", "symbol": "\uA781" }, 42883: { "value": "A783", "name": "LATIN SMALL LETTER INSULAR R", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A782", "lowercase_mapping": "", "titlecase_mapping": "A782", "symbol": "\uA783" }, 42885: { "value": "A785", "name": "LATIN SMALL LETTER INSULAR S", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A784", "lowercase_mapping": "", "titlecase_mapping": "A784", "symbol": "\uA785" }, 42887: { "value": "A787", "name": "LATIN SMALL LETTER INSULAR T", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A786", "lowercase_mapping": "", "titlecase_mapping": "A786", "symbol": "\uA787" }, 42892: { "value": "A78C", "name": "LATIN SMALL LETTER SALTILLO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A78B", "lowercase_mapping": "", "titlecase_mapping": "A78B", "symbol": "\uA78C" }, 42894: { "value": "A78E", "name": "LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uA78E" }, 42897: { "value": "A791", "name": "LATIN SMALL LETTER N WITH DESCENDER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A790", "lowercase_mapping": "", "titlecase_mapping": "A790", "symbol": "\uA791" }, 42899: { "value": "A793", "name": "LATIN SMALL LETTER C WITH BAR", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A792", "lowercase_mapping": "", "titlecase_mapping": "A792", "symbol": "\uA793" }, 42900: { "value": "A794", "name": "LATIN SMALL LETTER C WITH PALATAL HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uA794" }, 42901: { "value": "A795", "name": "LATIN SMALL LETTER H WITH PALATAL HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uA795" }, 42903: { "value": "A797", "name": "LATIN SMALL LETTER B WITH FLOURISH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A796", "lowercase_mapping": "", "titlecase_mapping": "A796", "symbol": "\uA797" }, 42905: { "value": "A799", "name": "LATIN SMALL LETTER F WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A798", "lowercase_mapping": "", "titlecase_mapping": "A798", "symbol": "\uA799" }, 42907: { "value": "A79B", "name": "LATIN SMALL LETTER VOLAPUK AE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A79A", "lowercase_mapping": "", "titlecase_mapping": "A79A", "symbol": "\uA79B" }, 42909: { "value": "A79D", "name": "LATIN SMALL LETTER VOLAPUK OE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A79C", "lowercase_mapping": "", "titlecase_mapping": "A79C", "symbol": "\uA79D" }, 42911: { "value": "A79F", "name": "LATIN SMALL LETTER VOLAPUK UE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A79E", "lowercase_mapping": "", "titlecase_mapping": "A79E", "symbol": "\uA79F" }, 42913: { "value": "A7A1", "name": "LATIN SMALL LETTER G WITH OBLIQUE STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A7A0", "lowercase_mapping": "", "titlecase_mapping": "A7A0", "symbol": "\uA7A1" }, 42915: { "value": "A7A3", "name": "LATIN SMALL LETTER K WITH OBLIQUE STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A7A2", "lowercase_mapping": "", "titlecase_mapping": "A7A2", "symbol": "\uA7A3" }, 42917: { "value": "A7A5", "name": "LATIN SMALL LETTER N WITH OBLIQUE STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A7A4", "lowercase_mapping": "", "titlecase_mapping": "A7A4", "symbol": "\uA7A5" }, 42919: { "value": "A7A7", "name": "LATIN SMALL LETTER R WITH OBLIQUE STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A7A6", "lowercase_mapping": "", "titlecase_mapping": "A7A6", "symbol": "\uA7A7" }, 42921: { "value": "A7A9", "name": "LATIN SMALL LETTER S WITH OBLIQUE STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A7A8", "lowercase_mapping": "", "titlecase_mapping": "A7A8", "symbol": "\uA7A9" }, 42933: { "value": "A7B5", "name": "LATIN SMALL LETTER BETA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A7B4", "lowercase_mapping": "", "titlecase_mapping": "A7B4", "symbol": "\uA7B5" }, 42935: { "value": "A7B7", "name": "LATIN SMALL LETTER OMEGA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A7B6", "lowercase_mapping": "", "titlecase_mapping": "A7B6", "symbol": "\uA7B7" }, 43002: { "value": "A7FA", "name": "LATIN LETTER SMALL CAPITAL TURNED M", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uA7FA" }, 43824: { "value": "AB30", "name": "LATIN SMALL LETTER BARRED ALPHA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB30" }, 43825: { "value": "AB31", "name": "LATIN SMALL LETTER A REVERSED-SCHWA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB31" }, 43826: { "value": "AB32", "name": "LATIN SMALL LETTER BLACKLETTER E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB32" }, 43827: { "value": "AB33", "name": "LATIN SMALL LETTER BARRED E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB33" }, 43828: { "value": "AB34", "name": "LATIN SMALL LETTER E WITH FLOURISH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB34" }, 43829: { "value": "AB35", "name": "LATIN SMALL LETTER LENIS F", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB35" }, 43830: { "value": "AB36", "name": "LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB36" }, 43831: { "value": "AB37", "name": "LATIN SMALL LETTER L WITH INVERTED LAZY S", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB37" }, 43832: { "value": "AB38", "name": "LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB38" }, 43833: { "value": "AB39", "name": "LATIN SMALL LETTER L WITH MIDDLE RING", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB39" }, 43834: { "value": "AB3A", "name": "LATIN SMALL LETTER M WITH CROSSED-TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB3A" }, 43835: { "value": "AB3B", "name": "LATIN SMALL LETTER N WITH CROSSED-TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB3B" }, 43836: { "value": "AB3C", "name": "LATIN SMALL LETTER ENG WITH CROSSED-TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB3C" }, 43837: { "value": "AB3D", "name": "LATIN SMALL LETTER BLACKLETTER O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB3D" }, 43838: { "value": "AB3E", "name": "LATIN SMALL LETTER BLACKLETTER O WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB3E" }, 43839: { "value": "AB3F", "name": "LATIN SMALL LETTER OPEN O WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB3F" }, 43840: { "value": "AB40", "name": "LATIN SMALL LETTER INVERTED OE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB40" }, 43841: { "value": "AB41", "name": "LATIN SMALL LETTER TURNED OE WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB41" }, 43842: { "value": "AB42", "name": "LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB42" }, 43843: { "value": "AB43", "name": "LATIN SMALL LETTER TURNED O OPEN-O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB43" }, 43844: { "value": "AB44", "name": "LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB44" }, 43845: { "value": "AB45", "name": "LATIN SMALL LETTER STIRRUP R", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB45" }, 43846: { "value": "AB46", "name": "LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB46" }, 43847: { "value": "AB47", "name": "LATIN SMALL LETTER R WITHOUT HANDLE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB47" }, 43848: { "value": "AB48", "name": "LATIN SMALL LETTER DOUBLE R", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB48" }, 43849: { "value": "AB49", "name": "LATIN SMALL LETTER R WITH CROSSED-TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB49" }, 43850: { "value": "AB4A", "name": "LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB4A" }, 43851: { "value": "AB4B", "name": "LATIN SMALL LETTER SCRIPT R", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB4B" }, 43852: { "value": "AB4C", "name": "LATIN SMALL LETTER SCRIPT R WITH RING", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB4C" }, 43853: { "value": "AB4D", "name": "LATIN SMALL LETTER BASELINE ESH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB4D" }, 43854: { "value": "AB4E", "name": "LATIN SMALL LETTER U WITH SHORT RIGHT LEG", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB4E" }, 43855: { "value": "AB4F", "name": "LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB4F" }, 43856: { "value": "AB50", "name": "LATIN SMALL LETTER UI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB50" }, 43857: { "value": "AB51", "name": "LATIN SMALL LETTER TURNED UI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB51" }, 43858: { "value": "AB52", "name": "LATIN SMALL LETTER U WITH LEFT HOOK", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB52" }, 43859: { "value": "AB53", "name": "LATIN SMALL LETTER CHI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "A7B3", "lowercase_mapping": "", "titlecase_mapping": "A7B3", "symbol": "\uAB53" }, 43860: { "value": "AB54", "name": "LATIN SMALL LETTER CHI WITH LOW RIGHT RING", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB54" }, 43861: { "value": "AB55", "name": "LATIN SMALL LETTER CHI WITH LOW LEFT SERIF", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB55" }, 43862: { "value": "AB56", "name": "LATIN SMALL LETTER X WITH LOW RIGHT RING", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB56" }, 43863: { "value": "AB57", "name": "LATIN SMALL LETTER X WITH LONG LEFT LEG", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB57" }, 43864: { "value": "AB58", "name": "LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB58" }, 43865: { "value": "AB59", "name": "LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB59" }, 43866: { "value": "AB5A", "name": "LATIN SMALL LETTER Y WITH SHORT RIGHT LEG", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB5A" }, 43872: { "value": "AB60", "name": "LATIN SMALL LETTER SAKHA YAT", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB60" }, 43873: { "value": "AB61", "name": "LATIN SMALL LETTER IOTIFIED E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB61" }, 43874: { "value": "AB62", "name": "LATIN SMALL LETTER OPEN OE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB62" }, 43875: { "value": "AB63", "name": "LATIN SMALL LETTER UO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB63" }, 43876: { "value": "AB64", "name": "LATIN SMALL LETTER INVERTED ALPHA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB64" }, 43877: { "value": "AB65", "name": "GREEK LETTER SMALL CAPITAL OMEGA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uAB65" }, 43888: { "value": "AB70", "name": "CHEROKEE SMALL LETTER A", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13A0", "lowercase_mapping": "", "titlecase_mapping": "13A0", "symbol": "\uAB70" }, 43889: { "value": "AB71", "name": "CHEROKEE SMALL LETTER E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13A1", "lowercase_mapping": "", "titlecase_mapping": "13A1", "symbol": "\uAB71" }, 43890: { "value": "AB72", "name": "CHEROKEE SMALL LETTER I", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13A2", "lowercase_mapping": "", "titlecase_mapping": "13A2", "symbol": "\uAB72" }, 43891: { "value": "AB73", "name": "CHEROKEE SMALL LETTER O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13A3", "lowercase_mapping": "", "titlecase_mapping": "13A3", "symbol": "\uAB73" }, 43892: { "value": "AB74", "name": "CHEROKEE SMALL LETTER U", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13A4", "lowercase_mapping": "", "titlecase_mapping": "13A4", "symbol": "\uAB74" }, 43893: { "value": "AB75", "name": "CHEROKEE SMALL LETTER V", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13A5", "lowercase_mapping": "", "titlecase_mapping": "13A5", "symbol": "\uAB75" }, 43894: { "value": "AB76", "name": "CHEROKEE SMALL LETTER GA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13A6", "lowercase_mapping": "", "titlecase_mapping": "13A6", "symbol": "\uAB76" }, 43895: { "value": "AB77", "name": "CHEROKEE SMALL LETTER KA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13A7", "lowercase_mapping": "", "titlecase_mapping": "13A7", "symbol": "\uAB77" }, 43896: { "value": "AB78", "name": "CHEROKEE SMALL LETTER GE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13A8", "lowercase_mapping": "", "titlecase_mapping": "13A8", "symbol": "\uAB78" }, 43897: { "value": "AB79", "name": "CHEROKEE SMALL LETTER GI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13A9", "lowercase_mapping": "", "titlecase_mapping": "13A9", "symbol": "\uAB79" }, 43898: { "value": "AB7A", "name": "CHEROKEE SMALL LETTER GO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13AA", "lowercase_mapping": "", "titlecase_mapping": "13AA", "symbol": "\uAB7A" }, 43899: { "value": "AB7B", "name": "CHEROKEE SMALL LETTER GU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13AB", "lowercase_mapping": "", "titlecase_mapping": "13AB", "symbol": "\uAB7B" }, 43900: { "value": "AB7C", "name": "CHEROKEE SMALL LETTER GV", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13AC", "lowercase_mapping": "", "titlecase_mapping": "13AC", "symbol": "\uAB7C" }, 43901: { "value": "AB7D", "name": "CHEROKEE SMALL LETTER HA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13AD", "lowercase_mapping": "", "titlecase_mapping": "13AD", "symbol": "\uAB7D" }, 43902: { "value": "AB7E", "name": "CHEROKEE SMALL LETTER HE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13AE", "lowercase_mapping": "", "titlecase_mapping": "13AE", "symbol": "\uAB7E" }, 43903: { "value": "AB7F", "name": "CHEROKEE SMALL LETTER HI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13AF", "lowercase_mapping": "", "titlecase_mapping": "13AF", "symbol": "\uAB7F" }, 43904: { "value": "AB80", "name": "CHEROKEE SMALL LETTER HO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13B0", "lowercase_mapping": "", "titlecase_mapping": "13B0", "symbol": "\uAB80" }, 43905: { "value": "AB81", "name": "CHEROKEE SMALL LETTER HU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13B1", "lowercase_mapping": "", "titlecase_mapping": "13B1", "symbol": "\uAB81" }, 43906: { "value": "AB82", "name": "CHEROKEE SMALL LETTER HV", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13B2", "lowercase_mapping": "", "titlecase_mapping": "13B2", "symbol": "\uAB82" }, 43907: { "value": "AB83", "name": "CHEROKEE SMALL LETTER LA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13B3", "lowercase_mapping": "", "titlecase_mapping": "13B3", "symbol": "\uAB83" }, 43908: { "value": "AB84", "name": "CHEROKEE SMALL LETTER LE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13B4", "lowercase_mapping": "", "titlecase_mapping": "13B4", "symbol": "\uAB84" }, 43909: { "value": "AB85", "name": "CHEROKEE SMALL LETTER LI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13B5", "lowercase_mapping": "", "titlecase_mapping": "13B5", "symbol": "\uAB85" }, 43910: { "value": "AB86", "name": "CHEROKEE SMALL LETTER LO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13B6", "lowercase_mapping": "", "titlecase_mapping": "13B6", "symbol": "\uAB86" }, 43911: { "value": "AB87", "name": "CHEROKEE SMALL LETTER LU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13B7", "lowercase_mapping": "", "titlecase_mapping": "13B7", "symbol": "\uAB87" }, 43912: { "value": "AB88", "name": "CHEROKEE SMALL LETTER LV", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13B8", "lowercase_mapping": "", "titlecase_mapping": "13B8", "symbol": "\uAB88" }, 43913: { "value": "AB89", "name": "CHEROKEE SMALL LETTER MA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13B9", "lowercase_mapping": "", "titlecase_mapping": "13B9", "symbol": "\uAB89" }, 43914: { "value": "AB8A", "name": "CHEROKEE SMALL LETTER ME", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13BA", "lowercase_mapping": "", "titlecase_mapping": "13BA", "symbol": "\uAB8A" }, 43915: { "value": "AB8B", "name": "CHEROKEE SMALL LETTER MI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13BB", "lowercase_mapping": "", "titlecase_mapping": "13BB", "symbol": "\uAB8B" }, 43916: { "value": "AB8C", "name": "CHEROKEE SMALL LETTER MO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13BC", "lowercase_mapping": "", "titlecase_mapping": "13BC", "symbol": "\uAB8C" }, 43917: { "value": "AB8D", "name": "CHEROKEE SMALL LETTER MU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13BD", "lowercase_mapping": "", "titlecase_mapping": "13BD", "symbol": "\uAB8D" }, 43918: { "value": "AB8E", "name": "CHEROKEE SMALL LETTER NA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13BE", "lowercase_mapping": "", "titlecase_mapping": "13BE", "symbol": "\uAB8E" }, 43919: { "value": "AB8F", "name": "CHEROKEE SMALL LETTER HNA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13BF", "lowercase_mapping": "", "titlecase_mapping": "13BF", "symbol": "\uAB8F" }, 43920: { "value": "AB90", "name": "CHEROKEE SMALL LETTER NAH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13C0", "lowercase_mapping": "", "titlecase_mapping": "13C0", "symbol": "\uAB90" }, 43921: { "value": "AB91", "name": "CHEROKEE SMALL LETTER NE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13C1", "lowercase_mapping": "", "titlecase_mapping": "13C1", "symbol": "\uAB91" }, 43922: { "value": "AB92", "name": "CHEROKEE SMALL LETTER NI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13C2", "lowercase_mapping": "", "titlecase_mapping": "13C2", "symbol": "\uAB92" }, 43923: { "value": "AB93", "name": "CHEROKEE SMALL LETTER NO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13C3", "lowercase_mapping": "", "titlecase_mapping": "13C3", "symbol": "\uAB93" }, 43924: { "value": "AB94", "name": "CHEROKEE SMALL LETTER NU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13C4", "lowercase_mapping": "", "titlecase_mapping": "13C4", "symbol": "\uAB94" }, 43925: { "value": "AB95", "name": "CHEROKEE SMALL LETTER NV", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13C5", "lowercase_mapping": "", "titlecase_mapping": "13C5", "symbol": "\uAB95" }, 43926: { "value": "AB96", "name": "CHEROKEE SMALL LETTER QUA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13C6", "lowercase_mapping": "", "titlecase_mapping": "13C6", "symbol": "\uAB96" }, 43927: { "value": "AB97", "name": "CHEROKEE SMALL LETTER QUE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13C7", "lowercase_mapping": "", "titlecase_mapping": "13C7", "symbol": "\uAB97" }, 43928: { "value": "AB98", "name": "CHEROKEE SMALL LETTER QUI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13C8", "lowercase_mapping": "", "titlecase_mapping": "13C8", "symbol": "\uAB98" }, 43929: { "value": "AB99", "name": "CHEROKEE SMALL LETTER QUO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13C9", "lowercase_mapping": "", "titlecase_mapping": "13C9", "symbol": "\uAB99" }, 43930: { "value": "AB9A", "name": "CHEROKEE SMALL LETTER QUU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13CA", "lowercase_mapping": "", "titlecase_mapping": "13CA", "symbol": "\uAB9A" }, 43931: { "value": "AB9B", "name": "CHEROKEE SMALL LETTER QUV", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13CB", "lowercase_mapping": "", "titlecase_mapping": "13CB", "symbol": "\uAB9B" }, 43932: { "value": "AB9C", "name": "CHEROKEE SMALL LETTER SA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13CC", "lowercase_mapping": "", "titlecase_mapping": "13CC", "symbol": "\uAB9C" }, 43933: { "value": "AB9D", "name": "CHEROKEE SMALL LETTER S", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13CD", "lowercase_mapping": "", "titlecase_mapping": "13CD", "symbol": "\uAB9D" }, 43934: { "value": "AB9E", "name": "CHEROKEE SMALL LETTER SE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13CE", "lowercase_mapping": "", "titlecase_mapping": "13CE", "symbol": "\uAB9E" }, 43935: { "value": "AB9F", "name": "CHEROKEE SMALL LETTER SI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13CF", "lowercase_mapping": "", "titlecase_mapping": "13CF", "symbol": "\uAB9F" }, 43936: { "value": "ABA0", "name": "CHEROKEE SMALL LETTER SO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13D0", "lowercase_mapping": "", "titlecase_mapping": "13D0", "symbol": "\uABA0" }, 43937: { "value": "ABA1", "name": "CHEROKEE SMALL LETTER SU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13D1", "lowercase_mapping": "", "titlecase_mapping": "13D1", "symbol": "\uABA1" }, 43938: { "value": "ABA2", "name": "CHEROKEE SMALL LETTER SV", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13D2", "lowercase_mapping": "", "titlecase_mapping": "13D2", "symbol": "\uABA2" }, 43939: { "value": "ABA3", "name": "CHEROKEE SMALL LETTER DA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13D3", "lowercase_mapping": "", "titlecase_mapping": "13D3", "symbol": "\uABA3" }, 43940: { "value": "ABA4", "name": "CHEROKEE SMALL LETTER TA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13D4", "lowercase_mapping": "", "titlecase_mapping": "13D4", "symbol": "\uABA4" }, 43941: { "value": "ABA5", "name": "CHEROKEE SMALL LETTER DE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13D5", "lowercase_mapping": "", "titlecase_mapping": "13D5", "symbol": "\uABA5" }, 43942: { "value": "ABA6", "name": "CHEROKEE SMALL LETTER TE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13D6", "lowercase_mapping": "", "titlecase_mapping": "13D6", "symbol": "\uABA6" }, 43943: { "value": "ABA7", "name": "CHEROKEE SMALL LETTER DI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13D7", "lowercase_mapping": "", "titlecase_mapping": "13D7", "symbol": "\uABA7" }, 43944: { "value": "ABA8", "name": "CHEROKEE SMALL LETTER TI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13D8", "lowercase_mapping": "", "titlecase_mapping": "13D8", "symbol": "\uABA8" }, 43945: { "value": "ABA9", "name": "CHEROKEE SMALL LETTER DO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13D9", "lowercase_mapping": "", "titlecase_mapping": "13D9", "symbol": "\uABA9" }, 43946: { "value": "ABAA", "name": "CHEROKEE SMALL LETTER DU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13DA", "lowercase_mapping": "", "titlecase_mapping": "13DA", "symbol": "\uABAA" }, 43947: { "value": "ABAB", "name": "CHEROKEE SMALL LETTER DV", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13DB", "lowercase_mapping": "", "titlecase_mapping": "13DB", "symbol": "\uABAB" }, 43948: { "value": "ABAC", "name": "CHEROKEE SMALL LETTER DLA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13DC", "lowercase_mapping": "", "titlecase_mapping": "13DC", "symbol": "\uABAC" }, 43949: { "value": "ABAD", "name": "CHEROKEE SMALL LETTER TLA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13DD", "lowercase_mapping": "", "titlecase_mapping": "13DD", "symbol": "\uABAD" }, 43950: { "value": "ABAE", "name": "CHEROKEE SMALL LETTER TLE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13DE", "lowercase_mapping": "", "titlecase_mapping": "13DE", "symbol": "\uABAE" }, 43951: { "value": "ABAF", "name": "CHEROKEE SMALL LETTER TLI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13DF", "lowercase_mapping": "", "titlecase_mapping": "13DF", "symbol": "\uABAF" }, 43952: { "value": "ABB0", "name": "CHEROKEE SMALL LETTER TLO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13E0", "lowercase_mapping": "", "titlecase_mapping": "13E0", "symbol": "\uABB0" }, 43953: { "value": "ABB1", "name": "CHEROKEE SMALL LETTER TLU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13E1", "lowercase_mapping": "", "titlecase_mapping": "13E1", "symbol": "\uABB1" }, 43954: { "value": "ABB2", "name": "CHEROKEE SMALL LETTER TLV", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13E2", "lowercase_mapping": "", "titlecase_mapping": "13E2", "symbol": "\uABB2" }, 43955: { "value": "ABB3", "name": "CHEROKEE SMALL LETTER TSA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13E3", "lowercase_mapping": "", "titlecase_mapping": "13E3", "symbol": "\uABB3" }, 43956: { "value": "ABB4", "name": "CHEROKEE SMALL LETTER TSE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13E4", "lowercase_mapping": "", "titlecase_mapping": "13E4", "symbol": "\uABB4" }, 43957: { "value": "ABB5", "name": "CHEROKEE SMALL LETTER TSI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13E5", "lowercase_mapping": "", "titlecase_mapping": "13E5", "symbol": "\uABB5" }, 43958: { "value": "ABB6", "name": "CHEROKEE SMALL LETTER TSO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13E6", "lowercase_mapping": "", "titlecase_mapping": "13E6", "symbol": "\uABB6" }, 43959: { "value": "ABB7", "name": "CHEROKEE SMALL LETTER TSU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13E7", "lowercase_mapping": "", "titlecase_mapping": "13E7", "symbol": "\uABB7" }, 43960: { "value": "ABB8", "name": "CHEROKEE SMALL LETTER TSV", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13E8", "lowercase_mapping": "", "titlecase_mapping": "13E8", "symbol": "\uABB8" }, 43961: { "value": "ABB9", "name": "CHEROKEE SMALL LETTER WA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13E9", "lowercase_mapping": "", "titlecase_mapping": "13E9", "symbol": "\uABB9" }, 43962: { "value": "ABBA", "name": "CHEROKEE SMALL LETTER WE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13EA", "lowercase_mapping": "", "titlecase_mapping": "13EA", "symbol": "\uABBA" }, 43963: { "value": "ABBB", "name": "CHEROKEE SMALL LETTER WI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13EB", "lowercase_mapping": "", "titlecase_mapping": "13EB", "symbol": "\uABBB" }, 43964: { "value": "ABBC", "name": "CHEROKEE SMALL LETTER WO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13EC", "lowercase_mapping": "", "titlecase_mapping": "13EC", "symbol": "\uABBC" }, 43965: { "value": "ABBD", "name": "CHEROKEE SMALL LETTER WU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13ED", "lowercase_mapping": "", "titlecase_mapping": "13ED", "symbol": "\uABBD" }, 43966: { "value": "ABBE", "name": "CHEROKEE SMALL LETTER WV", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13EE", "lowercase_mapping": "", "titlecase_mapping": "13EE", "symbol": "\uABBE" }, 43967: { "value": "ABBF", "name": "CHEROKEE SMALL LETTER YA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "13EF", "lowercase_mapping": "", "titlecase_mapping": "13EF", "symbol": "\uABBF" }, 64256: { "value": "FB00", "name": "LATIN SMALL LIGATURE FF", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0066 0066", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uFB00" }, 64257: { "value": "FB01", "name": "LATIN SMALL LIGATURE FI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0066 0069", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uFB01" }, 64258: { "value": "FB02", "name": "LATIN SMALL LIGATURE FL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0066 006C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uFB02" }, 64259: { "value": "FB03", "name": "LATIN SMALL LIGATURE FFI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0066 0066 0069", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uFB03" }, 64260: { "value": "FB04", "name": "LATIN SMALL LIGATURE FFL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0066 0066 006C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uFB04" }, 64261: { "value": "FB05", "name": "LATIN SMALL LIGATURE LONG S T", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 017F 0074", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uFB05" }, 64262: { "value": "FB06", "name": "LATIN SMALL LIGATURE ST", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0073 0074", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uFB06" }, 64275: { "value": "FB13", "name": "ARMENIAN SMALL LIGATURE MEN NOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0574 0576", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uFB13" }, 64276: { "value": "FB14", "name": "ARMENIAN SMALL LIGATURE MEN ECH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0574 0565", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uFB14" }, 64277: { "value": "FB15", "name": "ARMENIAN SMALL LIGATURE MEN INI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0574 056B", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uFB15" }, 64278: { "value": "FB16", "name": "ARMENIAN SMALL LIGATURE VEW NOW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 057E 0576", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uFB16" }, 64279: { "value": "FB17", "name": "ARMENIAN SMALL LIGATURE MEN XEH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0574 056D", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uFB17" }, 65345: { "value": "FF41", "name": "FULLWIDTH LATIN SMALL LETTER A", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0061", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF21", "lowercase_mapping": "", "titlecase_mapping": "FF21", "symbol": "\uFF41" }, 65346: { "value": "FF42", "name": "FULLWIDTH LATIN SMALL LETTER B", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0062", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF22", "lowercase_mapping": "", "titlecase_mapping": "FF22", "symbol": "\uFF42" }, 65347: { "value": "FF43", "name": "FULLWIDTH LATIN SMALL LETTER C", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0063", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF23", "lowercase_mapping": "", "titlecase_mapping": "FF23", "symbol": "\uFF43" }, 65348: { "value": "FF44", "name": "FULLWIDTH LATIN SMALL LETTER D", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0064", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF24", "lowercase_mapping": "", "titlecase_mapping": "FF24", "symbol": "\uFF44" }, 65349: { "value": "FF45", "name": "FULLWIDTH LATIN SMALL LETTER E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0065", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF25", "lowercase_mapping": "", "titlecase_mapping": "FF25", "symbol": "\uFF45" }, 65350: { "value": "FF46", "name": "FULLWIDTH LATIN SMALL LETTER F", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0066", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF26", "lowercase_mapping": "", "titlecase_mapping": "FF26", "symbol": "\uFF46" }, 65351: { "value": "FF47", "name": "FULLWIDTH LATIN SMALL LETTER G", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0067", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF27", "lowercase_mapping": "", "titlecase_mapping": "FF27", "symbol": "\uFF47" }, 65352: { "value": "FF48", "name": "FULLWIDTH LATIN SMALL LETTER H", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0068", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF28", "lowercase_mapping": "", "titlecase_mapping": "FF28", "symbol": "\uFF48" }, 65353: { "value": "FF49", "name": "FULLWIDTH LATIN SMALL LETTER I", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0069", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF29", "lowercase_mapping": "", "titlecase_mapping": "FF29", "symbol": "\uFF49" }, 65354: { "value": "FF4A", "name": "FULLWIDTH LATIN SMALL LETTER J", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF2A", "lowercase_mapping": "", "titlecase_mapping": "FF2A", "symbol": "\uFF4A" }, 65355: { "value": "FF4B", "name": "FULLWIDTH LATIN SMALL LETTER K", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006B", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF2B", "lowercase_mapping": "", "titlecase_mapping": "FF2B", "symbol": "\uFF4B" }, 65356: { "value": "FF4C", "name": "FULLWIDTH LATIN SMALL LETTER L", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF2C", "lowercase_mapping": "", "titlecase_mapping": "FF2C", "symbol": "\uFF4C" }, 65357: { "value": "FF4D", "name": "FULLWIDTH LATIN SMALL LETTER M", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006D", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF2D", "lowercase_mapping": "", "titlecase_mapping": "FF2D", "symbol": "\uFF4D" }, 65358: { "value": "FF4E", "name": "FULLWIDTH LATIN SMALL LETTER N", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006E", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF2E", "lowercase_mapping": "", "titlecase_mapping": "FF2E", "symbol": "\uFF4E" }, 65359: { "value": "FF4F", "name": "FULLWIDTH LATIN SMALL LETTER O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006F", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF2F", "lowercase_mapping": "", "titlecase_mapping": "FF2F", "symbol": "\uFF4F" }, 65360: { "value": "FF50", "name": "FULLWIDTH LATIN SMALL LETTER P", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0070", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF30", "lowercase_mapping": "", "titlecase_mapping": "FF30", "symbol": "\uFF50" }, 65361: { "value": "FF51", "name": "FULLWIDTH LATIN SMALL LETTER Q", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0071", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF31", "lowercase_mapping": "", "titlecase_mapping": "FF31", "symbol": "\uFF51" }, 65362: { "value": "FF52", "name": "FULLWIDTH LATIN SMALL LETTER R", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0072", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF32", "lowercase_mapping": "", "titlecase_mapping": "FF32", "symbol": "\uFF52" }, 65363: { "value": "FF53", "name": "FULLWIDTH LATIN SMALL LETTER S", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0073", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF33", "lowercase_mapping": "", "titlecase_mapping": "FF33", "symbol": "\uFF53" }, 65364: { "value": "FF54", "name": "FULLWIDTH LATIN SMALL LETTER T", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0074", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF34", "lowercase_mapping": "", "titlecase_mapping": "FF34", "symbol": "\uFF54" }, 65365: { "value": "FF55", "name": "FULLWIDTH LATIN SMALL LETTER U", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0075", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF35", "lowercase_mapping": "", "titlecase_mapping": "FF35", "symbol": "\uFF55" }, 65366: { "value": "FF56", "name": "FULLWIDTH LATIN SMALL LETTER V", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0076", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF36", "lowercase_mapping": "", "titlecase_mapping": "FF36", "symbol": "\uFF56" }, 65367: { "value": "FF57", "name": "FULLWIDTH LATIN SMALL LETTER W", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0077", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF37", "lowercase_mapping": "", "titlecase_mapping": "FF37", "symbol": "\uFF57" }, 65368: { "value": "FF58", "name": "FULLWIDTH LATIN SMALL LETTER X", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0078", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF38", "lowercase_mapping": "", "titlecase_mapping": "FF38", "symbol": "\uFF58" }, 65369: { "value": "FF59", "name": "FULLWIDTH LATIN SMALL LETTER Y", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0079", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF39", "lowercase_mapping": "", "titlecase_mapping": "FF39", "symbol": "\uFF59" }, 65370: { "value": "FF5A", "name": "FULLWIDTH LATIN SMALL LETTER Z", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 007A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "FF3A", "lowercase_mapping": "", "titlecase_mapping": "FF3A", "symbol": "\uFF5A" }, 66600: { "value": "10428", "name": "DESERET SMALL LETTER LONG I", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10400", "lowercase_mapping": "", "titlecase_mapping": "10400", "symbol": "\u0428" }, 66601: { "value": "10429", "name": "DESERET SMALL LETTER LONG E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10401", "lowercase_mapping": "", "titlecase_mapping": "10401", "symbol": "\u0429" }, 66602: { "value": "1042A", "name": "DESERET SMALL LETTER LONG A", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10402", "lowercase_mapping": "", "titlecase_mapping": "10402", "symbol": "\u042A" }, 66603: { "value": "1042B", "name": "DESERET SMALL LETTER LONG AH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10403", "lowercase_mapping": "", "titlecase_mapping": "10403", "symbol": "\u042B" }, 66604: { "value": "1042C", "name": "DESERET SMALL LETTER LONG O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10404", "lowercase_mapping": "", "titlecase_mapping": "10404", "symbol": "\u042C" }, 66605: { "value": "1042D", "name": "DESERET SMALL LETTER LONG OO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10405", "lowercase_mapping": "", "titlecase_mapping": "10405", "symbol": "\u042D" }, 66606: { "value": "1042E", "name": "DESERET SMALL LETTER SHORT I", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10406", "lowercase_mapping": "", "titlecase_mapping": "10406", "symbol": "\u042E" }, 66607: { "value": "1042F", "name": "DESERET SMALL LETTER SHORT E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10407", "lowercase_mapping": "", "titlecase_mapping": "10407", "symbol": "\u042F" }, 66608: { "value": "10430", "name": "DESERET SMALL LETTER SHORT A", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10408", "lowercase_mapping": "", "titlecase_mapping": "10408", "symbol": "\u0430" }, 66609: { "value": "10431", "name": "DESERET SMALL LETTER SHORT AH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10409", "lowercase_mapping": "", "titlecase_mapping": "10409", "symbol": "\u0431" }, 66610: { "value": "10432", "name": "DESERET SMALL LETTER SHORT O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1040A", "lowercase_mapping": "", "titlecase_mapping": "1040A", "symbol": "\u0432" }, 66611: { "value": "10433", "name": "DESERET SMALL LETTER SHORT OO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1040B", "lowercase_mapping": "", "titlecase_mapping": "1040B", "symbol": "\u0433" }, 66612: { "value": "10434", "name": "DESERET SMALL LETTER AY", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1040C", "lowercase_mapping": "", "titlecase_mapping": "1040C", "symbol": "\u0434" }, 66613: { "value": "10435", "name": "DESERET SMALL LETTER OW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1040D", "lowercase_mapping": "", "titlecase_mapping": "1040D", "symbol": "\u0435" }, 66614: { "value": "10436", "name": "DESERET SMALL LETTER WU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1040E", "lowercase_mapping": "", "titlecase_mapping": "1040E", "symbol": "\u0436" }, 66615: { "value": "10437", "name": "DESERET SMALL LETTER YEE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1040F", "lowercase_mapping": "", "titlecase_mapping": "1040F", "symbol": "\u0437" }, 66616: { "value": "10438", "name": "DESERET SMALL LETTER H", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10410", "lowercase_mapping": "", "titlecase_mapping": "10410", "symbol": "\u0438" }, 66617: { "value": "10439", "name": "DESERET SMALL LETTER PEE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10411", "lowercase_mapping": "", "titlecase_mapping": "10411", "symbol": "\u0439" }, 66618: { "value": "1043A", "name": "DESERET SMALL LETTER BEE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10412", "lowercase_mapping": "", "titlecase_mapping": "10412", "symbol": "\u043A" }, 66619: { "value": "1043B", "name": "DESERET SMALL LETTER TEE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10413", "lowercase_mapping": "", "titlecase_mapping": "10413", "symbol": "\u043B" }, 66620: { "value": "1043C", "name": "DESERET SMALL LETTER DEE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10414", "lowercase_mapping": "", "titlecase_mapping": "10414", "symbol": "\u043C" }, 66621: { "value": "1043D", "name": "DESERET SMALL LETTER CHEE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10415", "lowercase_mapping": "", "titlecase_mapping": "10415", "symbol": "\u043D" }, 66622: { "value": "1043E", "name": "DESERET SMALL LETTER JEE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10416", "lowercase_mapping": "", "titlecase_mapping": "10416", "symbol": "\u043E" }, 66623: { "value": "1043F", "name": "DESERET SMALL LETTER KAY", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10417", "lowercase_mapping": "", "titlecase_mapping": "10417", "symbol": "\u043F" }, 66624: { "value": "10440", "name": "DESERET SMALL LETTER GAY", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10418", "lowercase_mapping": "", "titlecase_mapping": "10418", "symbol": "\u0440" }, 66625: { "value": "10441", "name": "DESERET SMALL LETTER EF", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10419", "lowercase_mapping": "", "titlecase_mapping": "10419", "symbol": "\u0441" }, 66626: { "value": "10442", "name": "DESERET SMALL LETTER VEE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1041A", "lowercase_mapping": "", "titlecase_mapping": "1041A", "symbol": "\u0442" }, 66627: { "value": "10443", "name": "DESERET SMALL LETTER ETH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1041B", "lowercase_mapping": "", "titlecase_mapping": "1041B", "symbol": "\u0443" }, 66628: { "value": "10444", "name": "DESERET SMALL LETTER THEE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1041C", "lowercase_mapping": "", "titlecase_mapping": "1041C", "symbol": "\u0444" }, 66629: { "value": "10445", "name": "DESERET SMALL LETTER ES", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1041D", "lowercase_mapping": "", "titlecase_mapping": "1041D", "symbol": "\u0445" }, 66630: { "value": "10446", "name": "DESERET SMALL LETTER ZEE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1041E", "lowercase_mapping": "", "titlecase_mapping": "1041E", "symbol": "\u0446" }, 66631: { "value": "10447", "name": "DESERET SMALL LETTER ESH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "1041F", "lowercase_mapping": "", "titlecase_mapping": "1041F", "symbol": "\u0447" }, 66632: { "value": "10448", "name": "DESERET SMALL LETTER ZHEE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10420", "lowercase_mapping": "", "titlecase_mapping": "10420", "symbol": "\u0448" }, 66633: { "value": "10449", "name": "DESERET SMALL LETTER ER", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10421", "lowercase_mapping": "", "titlecase_mapping": "10421", "symbol": "\u0449" }, 66634: { "value": "1044A", "name": "DESERET SMALL LETTER EL", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10422", "lowercase_mapping": "", "titlecase_mapping": "10422", "symbol": "\u044A" }, 66635: { "value": "1044B", "name": "DESERET SMALL LETTER EM", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10423", "lowercase_mapping": "", "titlecase_mapping": "10423", "symbol": "\u044B" }, 66636: { "value": "1044C", "name": "DESERET SMALL LETTER EN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10424", "lowercase_mapping": "", "titlecase_mapping": "10424", "symbol": "\u044C" }, 66637: { "value": "1044D", "name": "DESERET SMALL LETTER ENG", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10425", "lowercase_mapping": "", "titlecase_mapping": "10425", "symbol": "\u044D" }, 66638: { "value": "1044E", "name": "DESERET SMALL LETTER OI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10426", "lowercase_mapping": "", "titlecase_mapping": "10426", "symbol": "\u044E" }, 66639: { "value": "1044F", "name": "DESERET SMALL LETTER EW", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10427", "lowercase_mapping": "", "titlecase_mapping": "10427", "symbol": "\u044F" }, 66776: { "value": "104D8", "name": "OSAGE SMALL LETTER A", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104B0", "lowercase_mapping": "", "titlecase_mapping": "104B0", "symbol": "\u04D8" }, 66777: { "value": "104D9", "name": "OSAGE SMALL LETTER AI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104B1", "lowercase_mapping": "", "titlecase_mapping": "104B1", "symbol": "\u04D9" }, 66778: { "value": "104DA", "name": "OSAGE SMALL LETTER AIN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104B2", "lowercase_mapping": "", "titlecase_mapping": "104B2", "symbol": "\u04DA" }, 66779: { "value": "104DB", "name": "OSAGE SMALL LETTER AH", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104B3", "lowercase_mapping": "", "titlecase_mapping": "104B3", "symbol": "\u04DB" }, 66780: { "value": "104DC", "name": "OSAGE SMALL LETTER BRA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104B4", "lowercase_mapping": "", "titlecase_mapping": "104B4", "symbol": "\u04DC" }, 66781: { "value": "104DD", "name": "OSAGE SMALL LETTER CHA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104B5", "lowercase_mapping": "", "titlecase_mapping": "104B5", "symbol": "\u04DD" }, 66782: { "value": "104DE", "name": "OSAGE SMALL LETTER EHCHA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104B6", "lowercase_mapping": "", "titlecase_mapping": "104B6", "symbol": "\u04DE" }, 66783: { "value": "104DF", "name": "OSAGE SMALL LETTER E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104B7", "lowercase_mapping": "", "titlecase_mapping": "104B7", "symbol": "\u04DF" }, 66784: { "value": "104E0", "name": "OSAGE SMALL LETTER EIN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104B8", "lowercase_mapping": "", "titlecase_mapping": "104B8", "symbol": "\u04E0" }, 66785: { "value": "104E1", "name": "OSAGE SMALL LETTER HA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104B9", "lowercase_mapping": "", "titlecase_mapping": "104B9", "symbol": "\u04E1" }, 66786: { "value": "104E2", "name": "OSAGE SMALL LETTER HYA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104BA", "lowercase_mapping": "", "titlecase_mapping": "104BA", "symbol": "\u04E2" }, 66787: { "value": "104E3", "name": "OSAGE SMALL LETTER I", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104BB", "lowercase_mapping": "", "titlecase_mapping": "104BB", "symbol": "\u04E3" }, 66788: { "value": "104E4", "name": "OSAGE SMALL LETTER KA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104BC", "lowercase_mapping": "", "titlecase_mapping": "104BC", "symbol": "\u04E4" }, 66789: { "value": "104E5", "name": "OSAGE SMALL LETTER EHKA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104BD", "lowercase_mapping": "", "titlecase_mapping": "104BD", "symbol": "\u04E5" }, 66790: { "value": "104E6", "name": "OSAGE SMALL LETTER KYA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104BE", "lowercase_mapping": "", "titlecase_mapping": "104BE", "symbol": "\u04E6" }, 66791: { "value": "104E7", "name": "OSAGE SMALL LETTER LA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104BF", "lowercase_mapping": "", "titlecase_mapping": "104BF", "symbol": "\u04E7" }, 66792: { "value": "104E8", "name": "OSAGE SMALL LETTER MA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104C0", "lowercase_mapping": "", "titlecase_mapping": "104C0", "symbol": "\u04E8" }, 66793: { "value": "104E9", "name": "OSAGE SMALL LETTER NA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104C1", "lowercase_mapping": "", "titlecase_mapping": "104C1", "symbol": "\u04E9" }, 66794: { "value": "104EA", "name": "OSAGE SMALL LETTER O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104C2", "lowercase_mapping": "", "titlecase_mapping": "104C2", "symbol": "\u04EA" }, 66795: { "value": "104EB", "name": "OSAGE SMALL LETTER OIN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104C3", "lowercase_mapping": "", "titlecase_mapping": "104C3", "symbol": "\u04EB" }, 66796: { "value": "104EC", "name": "OSAGE SMALL LETTER PA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104C4", "lowercase_mapping": "", "titlecase_mapping": "104C4", "symbol": "\u04EC" }, 66797: { "value": "104ED", "name": "OSAGE SMALL LETTER EHPA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104C5", "lowercase_mapping": "", "titlecase_mapping": "104C5", "symbol": "\u04ED" }, 66798: { "value": "104EE", "name": "OSAGE SMALL LETTER SA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104C6", "lowercase_mapping": "", "titlecase_mapping": "104C6", "symbol": "\u04EE" }, 66799: { "value": "104EF", "name": "OSAGE SMALL LETTER SHA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104C7", "lowercase_mapping": "", "titlecase_mapping": "104C7", "symbol": "\u04EF" }, 66800: { "value": "104F0", "name": "OSAGE SMALL LETTER TA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104C8", "lowercase_mapping": "", "titlecase_mapping": "104C8", "symbol": "\u04F0" }, 66801: { "value": "104F1", "name": "OSAGE SMALL LETTER EHTA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104C9", "lowercase_mapping": "", "titlecase_mapping": "104C9", "symbol": "\u04F1" }, 66802: { "value": "104F2", "name": "OSAGE SMALL LETTER TSA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104CA", "lowercase_mapping": "", "titlecase_mapping": "104CA", "symbol": "\u04F2" }, 66803: { "value": "104F3", "name": "OSAGE SMALL LETTER EHTSA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104CB", "lowercase_mapping": "", "titlecase_mapping": "104CB", "symbol": "\u04F3" }, 66804: { "value": "104F4", "name": "OSAGE SMALL LETTER TSHA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104CC", "lowercase_mapping": "", "titlecase_mapping": "104CC", "symbol": "\u04F4" }, 66805: { "value": "104F5", "name": "OSAGE SMALL LETTER DHA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104CD", "lowercase_mapping": "", "titlecase_mapping": "104CD", "symbol": "\u04F5" }, 66806: { "value": "104F6", "name": "OSAGE SMALL LETTER U", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104CE", "lowercase_mapping": "", "titlecase_mapping": "104CE", "symbol": "\u04F6" }, 66807: { "value": "104F7", "name": "OSAGE SMALL LETTER WA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104CF", "lowercase_mapping": "", "titlecase_mapping": "104CF", "symbol": "\u04F7" }, 66808: { "value": "104F8", "name": "OSAGE SMALL LETTER KHA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104D0", "lowercase_mapping": "", "titlecase_mapping": "104D0", "symbol": "\u04F8" }, 66809: { "value": "104F9", "name": "OSAGE SMALL LETTER GHA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104D1", "lowercase_mapping": "", "titlecase_mapping": "104D1", "symbol": "\u04F9" }, 66810: { "value": "104FA", "name": "OSAGE SMALL LETTER ZA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104D2", "lowercase_mapping": "", "titlecase_mapping": "104D2", "symbol": "\u04FA" }, 66811: { "value": "104FB", "name": "OSAGE SMALL LETTER ZHA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "104D3", "lowercase_mapping": "", "titlecase_mapping": "104D3", "symbol": "\u04FB" }, 68800: { "value": "10CC0", "name": "OLD HUNGARIAN SMALL LETTER A", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C80", "lowercase_mapping": "", "titlecase_mapping": "10C80", "symbol": "\u0CC0" }, 68801: { "value": "10CC1", "name": "OLD HUNGARIAN SMALL LETTER AA", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C81", "lowercase_mapping": "", "titlecase_mapping": "10C81", "symbol": "\u0CC1" }, 68802: { "value": "10CC2", "name": "OLD HUNGARIAN SMALL LETTER EB", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C82", "lowercase_mapping": "", "titlecase_mapping": "10C82", "symbol": "\u0CC2" }, 68803: { "value": "10CC3", "name": "OLD HUNGARIAN SMALL LETTER AMB", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C83", "lowercase_mapping": "", "titlecase_mapping": "10C83", "symbol": "\u0CC3" }, 68804: { "value": "10CC4", "name": "OLD HUNGARIAN SMALL LETTER EC", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C84", "lowercase_mapping": "", "titlecase_mapping": "10C84", "symbol": "\u0CC4" }, 68805: { "value": "10CC5", "name": "OLD HUNGARIAN SMALL LETTER ENC", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C85", "lowercase_mapping": "", "titlecase_mapping": "10C85", "symbol": "\u0CC5" }, 68806: { "value": "10CC6", "name": "OLD HUNGARIAN SMALL LETTER ECS", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C86", "lowercase_mapping": "", "titlecase_mapping": "10C86", "symbol": "\u0CC6" }, 68807: { "value": "10CC7", "name": "OLD HUNGARIAN SMALL LETTER ED", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C87", "lowercase_mapping": "", "titlecase_mapping": "10C87", "symbol": "\u0CC7" }, 68808: { "value": "10CC8", "name": "OLD HUNGARIAN SMALL LETTER AND", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C88", "lowercase_mapping": "", "titlecase_mapping": "10C88", "symbol": "\u0CC8" }, 68809: { "value": "10CC9", "name": "OLD HUNGARIAN SMALL LETTER E", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C89", "lowercase_mapping": "", "titlecase_mapping": "10C89", "symbol": "\u0CC9" }, 68810: { "value": "10CCA", "name": "OLD HUNGARIAN SMALL LETTER CLOSE E", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C8A", "lowercase_mapping": "", "titlecase_mapping": "10C8A", "symbol": "\u0CCA" }, 68811: { "value": "10CCB", "name": "OLD HUNGARIAN SMALL LETTER EE", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C8B", "lowercase_mapping": "", "titlecase_mapping": "10C8B", "symbol": "\u0CCB" }, 68812: { "value": "10CCC", "name": "OLD HUNGARIAN SMALL LETTER EF", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C8C", "lowercase_mapping": "", "titlecase_mapping": "10C8C", "symbol": "\u0CCC" }, 68813: { "value": "10CCD", "name": "OLD HUNGARIAN SMALL LETTER EG", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C8D", "lowercase_mapping": "", "titlecase_mapping": "10C8D", "symbol": "\u0CCD" }, 68814: { "value": "10CCE", "name": "OLD HUNGARIAN SMALL LETTER EGY", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C8E", "lowercase_mapping": "", "titlecase_mapping": "10C8E", "symbol": "\u0CCE" }, 68815: { "value": "10CCF", "name": "OLD HUNGARIAN SMALL LETTER EH", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C8F", "lowercase_mapping": "", "titlecase_mapping": "10C8F", "symbol": "\u0CCF" }, 68816: { "value": "10CD0", "name": "OLD HUNGARIAN SMALL LETTER I", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C90", "lowercase_mapping": "", "titlecase_mapping": "10C90", "symbol": "\u0CD0" }, 68817: { "value": "10CD1", "name": "OLD HUNGARIAN SMALL LETTER II", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C91", "lowercase_mapping": "", "titlecase_mapping": "10C91", "symbol": "\u0CD1" }, 68818: { "value": "10CD2", "name": "OLD HUNGARIAN SMALL LETTER EJ", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C92", "lowercase_mapping": "", "titlecase_mapping": "10C92", "symbol": "\u0CD2" }, 68819: { "value": "10CD3", "name": "OLD HUNGARIAN SMALL LETTER EK", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C93", "lowercase_mapping": "", "titlecase_mapping": "10C93", "symbol": "\u0CD3" }, 68820: { "value": "10CD4", "name": "OLD HUNGARIAN SMALL LETTER AK", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C94", "lowercase_mapping": "", "titlecase_mapping": "10C94", "symbol": "\u0CD4" }, 68821: { "value": "10CD5", "name": "OLD HUNGARIAN SMALL LETTER UNK", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C95", "lowercase_mapping": "", "titlecase_mapping": "10C95", "symbol": "\u0CD5" }, 68822: { "value": "10CD6", "name": "OLD HUNGARIAN SMALL LETTER EL", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C96", "lowercase_mapping": "", "titlecase_mapping": "10C96", "symbol": "\u0CD6" }, 68823: { "value": "10CD7", "name": "OLD HUNGARIAN SMALL LETTER ELY", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C97", "lowercase_mapping": "", "titlecase_mapping": "10C97", "symbol": "\u0CD7" }, 68824: { "value": "10CD8", "name": "OLD HUNGARIAN SMALL LETTER EM", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C98", "lowercase_mapping": "", "titlecase_mapping": "10C98", "symbol": "\u0CD8" }, 68825: { "value": "10CD9", "name": "OLD HUNGARIAN SMALL LETTER EN", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C99", "lowercase_mapping": "", "titlecase_mapping": "10C99", "symbol": "\u0CD9" }, 68826: { "value": "10CDA", "name": "OLD HUNGARIAN SMALL LETTER ENY", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C9A", "lowercase_mapping": "", "titlecase_mapping": "10C9A", "symbol": "\u0CDA" }, 68827: { "value": "10CDB", "name": "OLD HUNGARIAN SMALL LETTER O", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C9B", "lowercase_mapping": "", "titlecase_mapping": "10C9B", "symbol": "\u0CDB" }, 68828: { "value": "10CDC", "name": "OLD HUNGARIAN SMALL LETTER OO", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C9C", "lowercase_mapping": "", "titlecase_mapping": "10C9C", "symbol": "\u0CDC" }, 68829: { "value": "10CDD", "name": "OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C9D", "lowercase_mapping": "", "titlecase_mapping": "10C9D", "symbol": "\u0CDD" }, 68830: { "value": "10CDE", "name": "OLD HUNGARIAN SMALL LETTER RUDIMENTA OE", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C9E", "lowercase_mapping": "", "titlecase_mapping": "10C9E", "symbol": "\u0CDE" }, 68831: { "value": "10CDF", "name": "OLD HUNGARIAN SMALL LETTER OEE", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10C9F", "lowercase_mapping": "", "titlecase_mapping": "10C9F", "symbol": "\u0CDF" }, 68832: { "value": "10CE0", "name": "OLD HUNGARIAN SMALL LETTER EP", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10CA0", "lowercase_mapping": "", "titlecase_mapping": "10CA0", "symbol": "\u0CE0" }, 68833: { "value": "10CE1", "name": "OLD HUNGARIAN SMALL LETTER EMP", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10CA1", "lowercase_mapping": "", "titlecase_mapping": "10CA1", "symbol": "\u0CE1" }, 68834: { "value": "10CE2", "name": "OLD HUNGARIAN SMALL LETTER ER", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10CA2", "lowercase_mapping": "", "titlecase_mapping": "10CA2", "symbol": "\u0CE2" }, 68835: { "value": "10CE3", "name": "OLD HUNGARIAN SMALL LETTER SHORT ER", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10CA3", "lowercase_mapping": "", "titlecase_mapping": "10CA3", "symbol": "\u0CE3" }, 68836: { "value": "10CE4", "name": "OLD HUNGARIAN SMALL LETTER ES", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10CA4", "lowercase_mapping": "", "titlecase_mapping": "10CA4", "symbol": "\u0CE4" }, 68837: { "value": "10CE5", "name": "OLD HUNGARIAN SMALL LETTER ESZ", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10CA5", "lowercase_mapping": "", "titlecase_mapping": "10CA5", "symbol": "\u0CE5" }, 68838: { "value": "10CE6", "name": "OLD HUNGARIAN SMALL LETTER ET", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10CA6", "lowercase_mapping": "", "titlecase_mapping": "10CA6", "symbol": "\u0CE6" }, 68839: { "value": "10CE7", "name": "OLD HUNGARIAN SMALL LETTER ENT", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10CA7", "lowercase_mapping": "", "titlecase_mapping": "10CA7", "symbol": "\u0CE7" }, 68840: { "value": "10CE8", "name": "OLD HUNGARIAN SMALL LETTER ETY", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10CA8", "lowercase_mapping": "", "titlecase_mapping": "10CA8", "symbol": "\u0CE8" }, 68841: { "value": "10CE9", "name": "OLD HUNGARIAN SMALL LETTER ECH", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10CA9", "lowercase_mapping": "", "titlecase_mapping": "10CA9", "symbol": "\u0CE9" }, 68842: { "value": "10CEA", "name": "OLD HUNGARIAN SMALL LETTER U", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10CAA", "lowercase_mapping": "", "titlecase_mapping": "10CAA", "symbol": "\u0CEA" }, 68843: { "value": "10CEB", "name": "OLD HUNGARIAN SMALL LETTER UU", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10CAB", "lowercase_mapping": "", "titlecase_mapping": "10CAB", "symbol": "\u0CEB" }, 68844: { "value": "10CEC", "name": "OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10CAC", "lowercase_mapping": "", "titlecase_mapping": "10CAC", "symbol": "\u0CEC" }, 68845: { "value": "10CED", "name": "OLD HUNGARIAN SMALL LETTER RUDIMENTA UE", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10CAD", "lowercase_mapping": "", "titlecase_mapping": "10CAD", "symbol": "\u0CED" }, 68846: { "value": "10CEE", "name": "OLD HUNGARIAN SMALL LETTER EV", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10CAE", "lowercase_mapping": "", "titlecase_mapping": "10CAE", "symbol": "\u0CEE" }, 68847: { "value": "10CEF", "name": "OLD HUNGARIAN SMALL LETTER EZ", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10CAF", "lowercase_mapping": "", "titlecase_mapping": "10CAF", "symbol": "\u0CEF" }, 68848: { "value": "10CF0", "name": "OLD HUNGARIAN SMALL LETTER EZS", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10CB0", "lowercase_mapping": "", "titlecase_mapping": "10CB0", "symbol": "\u0CF0" }, 68849: { "value": "10CF1", "name": "OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10CB1", "lowercase_mapping": "", "titlecase_mapping": "10CB1", "symbol": "\u0CF1" }, 68850: { "value": "10CF2", "name": "OLD HUNGARIAN SMALL LETTER US", "category": "Ll", "class": "0", "bidirectional_category": "R", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "10CB2", "lowercase_mapping": "", "titlecase_mapping": "10CB2", "symbol": "\u0CF2" }, 71872: { "value": "118C0", "name": "WARANG CITI SMALL LETTER NGAA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118A0", "lowercase_mapping": "", "titlecase_mapping": "118A0", "symbol": "\u18C0" }, 71873: { "value": "118C1", "name": "WARANG CITI SMALL LETTER A", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118A1", "lowercase_mapping": "", "titlecase_mapping": "118A1", "symbol": "\u18C1" }, 71874: { "value": "118C2", "name": "WARANG CITI SMALL LETTER WI", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118A2", "lowercase_mapping": "", "titlecase_mapping": "118A2", "symbol": "\u18C2" }, 71875: { "value": "118C3", "name": "WARANG CITI SMALL LETTER YU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118A3", "lowercase_mapping": "", "titlecase_mapping": "118A3", "symbol": "\u18C3" }, 71876: { "value": "118C4", "name": "WARANG CITI SMALL LETTER YA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118A4", "lowercase_mapping": "", "titlecase_mapping": "118A4", "symbol": "\u18C4" }, 71877: { "value": "118C5", "name": "WARANG CITI SMALL LETTER YO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118A5", "lowercase_mapping": "", "titlecase_mapping": "118A5", "symbol": "\u18C5" }, 71878: { "value": "118C6", "name": "WARANG CITI SMALL LETTER II", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118A6", "lowercase_mapping": "", "titlecase_mapping": "118A6", "symbol": "\u18C6" }, 71879: { "value": "118C7", "name": "WARANG CITI SMALL LETTER UU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118A7", "lowercase_mapping": "", "titlecase_mapping": "118A7", "symbol": "\u18C7" }, 71880: { "value": "118C8", "name": "WARANG CITI SMALL LETTER E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118A8", "lowercase_mapping": "", "titlecase_mapping": "118A8", "symbol": "\u18C8" }, 71881: { "value": "118C9", "name": "WARANG CITI SMALL LETTER O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118A9", "lowercase_mapping": "", "titlecase_mapping": "118A9", "symbol": "\u18C9" }, 71882: { "value": "118CA", "name": "WARANG CITI SMALL LETTER ANG", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118AA", "lowercase_mapping": "", "titlecase_mapping": "118AA", "symbol": "\u18CA" }, 71883: { "value": "118CB", "name": "WARANG CITI SMALL LETTER GA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118AB", "lowercase_mapping": "", "titlecase_mapping": "118AB", "symbol": "\u18CB" }, 71884: { "value": "118CC", "name": "WARANG CITI SMALL LETTER KO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118AC", "lowercase_mapping": "", "titlecase_mapping": "118AC", "symbol": "\u18CC" }, 71885: { "value": "118CD", "name": "WARANG CITI SMALL LETTER ENY", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118AD", "lowercase_mapping": "", "titlecase_mapping": "118AD", "symbol": "\u18CD" }, 71886: { "value": "118CE", "name": "WARANG CITI SMALL LETTER YUJ", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118AE", "lowercase_mapping": "", "titlecase_mapping": "118AE", "symbol": "\u18CE" }, 71887: { "value": "118CF", "name": "WARANG CITI SMALL LETTER UC", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118AF", "lowercase_mapping": "", "titlecase_mapping": "118AF", "symbol": "\u18CF" }, 71888: { "value": "118D0", "name": "WARANG CITI SMALL LETTER ENN", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118B0", "lowercase_mapping": "", "titlecase_mapping": "118B0", "symbol": "\u18D0" }, 71889: { "value": "118D1", "name": "WARANG CITI SMALL LETTER ODD", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118B1", "lowercase_mapping": "", "titlecase_mapping": "118B1", "symbol": "\u18D1" }, 71890: { "value": "118D2", "name": "WARANG CITI SMALL LETTER TTE", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118B2", "lowercase_mapping": "", "titlecase_mapping": "118B2", "symbol": "\u18D2" }, 71891: { "value": "118D3", "name": "WARANG CITI SMALL LETTER NUNG", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118B3", "lowercase_mapping": "", "titlecase_mapping": "118B3", "symbol": "\u18D3" }, 71892: { "value": "118D4", "name": "WARANG CITI SMALL LETTER DA", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118B4", "lowercase_mapping": "", "titlecase_mapping": "118B4", "symbol": "\u18D4" }, 71893: { "value": "118D5", "name": "WARANG CITI SMALL LETTER AT", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118B5", "lowercase_mapping": "", "titlecase_mapping": "118B5", "symbol": "\u18D5" }, 71894: { "value": "118D6", "name": "WARANG CITI SMALL LETTER AM", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118B6", "lowercase_mapping": "", "titlecase_mapping": "118B6", "symbol": "\u18D6" }, 71895: { "value": "118D7", "name": "WARANG CITI SMALL LETTER BU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118B7", "lowercase_mapping": "", "titlecase_mapping": "118B7", "symbol": "\u18D7" }, 71896: { "value": "118D8", "name": "WARANG CITI SMALL LETTER PU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118B8", "lowercase_mapping": "", "titlecase_mapping": "118B8", "symbol": "\u18D8" }, 71897: { "value": "118D9", "name": "WARANG CITI SMALL LETTER HIYO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118B9", "lowercase_mapping": "", "titlecase_mapping": "118B9", "symbol": "\u18D9" }, 71898: { "value": "118DA", "name": "WARANG CITI SMALL LETTER HOLO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118BA", "lowercase_mapping": "", "titlecase_mapping": "118BA", "symbol": "\u18DA" }, 71899: { "value": "118DB", "name": "WARANG CITI SMALL LETTER HORR", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118BB", "lowercase_mapping": "", "titlecase_mapping": "118BB", "symbol": "\u18DB" }, 71900: { "value": "118DC", "name": "WARANG CITI SMALL LETTER HAR", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118BC", "lowercase_mapping": "", "titlecase_mapping": "118BC", "symbol": "\u18DC" }, 71901: { "value": "118DD", "name": "WARANG CITI SMALL LETTER SSUU", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118BD", "lowercase_mapping": "", "titlecase_mapping": "118BD", "symbol": "\u18DD" }, 71902: { "value": "118DE", "name": "WARANG CITI SMALL LETTER SII", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118BE", "lowercase_mapping": "", "titlecase_mapping": "118BE", "symbol": "\u18DE" }, 71903: { "value": "118DF", "name": "WARANG CITI SMALL LETTER VIYO", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "118BF", "lowercase_mapping": "", "titlecase_mapping": "118BF", "symbol": "\u18DF" }, 119834: { "value": "1D41A", "name": "MATHEMATICAL BOLD SMALL A", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0061", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD41A" }, 119835: { "value": "1D41B", "name": "MATHEMATICAL BOLD SMALL B", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0062", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD41B" }, 119836: { "value": "1D41C", "name": "MATHEMATICAL BOLD SMALL C", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0063", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD41C" }, 119837: { "value": "1D41D", "name": "MATHEMATICAL BOLD SMALL D", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0064", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD41D" }, 119838: { "value": "1D41E", "name": "MATHEMATICAL BOLD SMALL E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0065", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD41E" }, 119839: { "value": "1D41F", "name": "MATHEMATICAL BOLD SMALL F", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0066", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD41F" }, 119840: { "value": "1D420", "name": "MATHEMATICAL BOLD SMALL G", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0067", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD420" }, 119841: { "value": "1D421", "name": "MATHEMATICAL BOLD SMALL H", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0068", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD421" }, 119842: { "value": "1D422", "name": "MATHEMATICAL BOLD SMALL I", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0069", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD422" }, 119843: { "value": "1D423", "name": "MATHEMATICAL BOLD SMALL J", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD423" }, 119844: { "value": "1D424", "name": "MATHEMATICAL BOLD SMALL K", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006B", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD424" }, 119845: { "value": "1D425", "name": "MATHEMATICAL BOLD SMALL L", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD425" }, 119846: { "value": "1D426", "name": "MATHEMATICAL BOLD SMALL M", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006D", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD426" }, 119847: { "value": "1D427", "name": "MATHEMATICAL BOLD SMALL N", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006E", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD427" }, 119848: { "value": "1D428", "name": "MATHEMATICAL BOLD SMALL O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006F", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD428" }, 119849: { "value": "1D429", "name": "MATHEMATICAL BOLD SMALL P", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0070", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD429" }, 119850: { "value": "1D42A", "name": "MATHEMATICAL BOLD SMALL Q", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0071", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD42A" }, 119851: { "value": "1D42B", "name": "MATHEMATICAL BOLD SMALL R", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0072", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD42B" }, 119852: { "value": "1D42C", "name": "MATHEMATICAL BOLD SMALL S", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0073", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD42C" }, 119853: { "value": "1D42D", "name": "MATHEMATICAL BOLD SMALL T", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0074", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD42D" }, 119854: { "value": "1D42E", "name": "MATHEMATICAL BOLD SMALL U", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0075", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD42E" }, 119855: { "value": "1D42F", "name": "MATHEMATICAL BOLD SMALL V", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0076", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD42F" }, 119856: { "value": "1D430", "name": "MATHEMATICAL BOLD SMALL W", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0077", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD430" }, 119857: { "value": "1D431", "name": "MATHEMATICAL BOLD SMALL X", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0078", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD431" }, 119858: { "value": "1D432", "name": "MATHEMATICAL BOLD SMALL Y", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0079", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD432" }, 119859: { "value": "1D433", "name": "MATHEMATICAL BOLD SMALL Z", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 007A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD433" }, 119886: { "value": "1D44E", "name": "MATHEMATICAL ITALIC SMALL A", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0061", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD44E" }, 119887: { "value": "1D44F", "name": "MATHEMATICAL ITALIC SMALL B", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0062", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD44F" }, 119888: { "value": "1D450", "name": "MATHEMATICAL ITALIC SMALL C", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0063", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD450" }, 119889: { "value": "1D451", "name": "MATHEMATICAL ITALIC SMALL D", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0064", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD451" }, 119890: { "value": "1D452", "name": "MATHEMATICAL ITALIC SMALL E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0065", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD452" }, 119891: { "value": "1D453", "name": "MATHEMATICAL ITALIC SMALL F", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0066", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD453" }, 119892: { "value": "1D454", "name": "MATHEMATICAL ITALIC SMALL G", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0067", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD454" }, 119894: { "value": "1D456", "name": "MATHEMATICAL ITALIC SMALL I", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0069", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD456" }, 119895: { "value": "1D457", "name": "MATHEMATICAL ITALIC SMALL J", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD457" }, 119896: { "value": "1D458", "name": "MATHEMATICAL ITALIC SMALL K", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006B", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD458" }, 119897: { "value": "1D459", "name": "MATHEMATICAL ITALIC SMALL L", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD459" }, 119898: { "value": "1D45A", "name": "MATHEMATICAL ITALIC SMALL M", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006D", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD45A" }, 119899: { "value": "1D45B", "name": "MATHEMATICAL ITALIC SMALL N", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006E", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD45B" }, 119900: { "value": "1D45C", "name": "MATHEMATICAL ITALIC SMALL O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006F", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD45C" }, 119901: { "value": "1D45D", "name": "MATHEMATICAL ITALIC SMALL P", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0070", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD45D" }, 119902: { "value": "1D45E", "name": "MATHEMATICAL ITALIC SMALL Q", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0071", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD45E" }, 119903: { "value": "1D45F", "name": "MATHEMATICAL ITALIC SMALL R", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0072", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD45F" }, 119904: { "value": "1D460", "name": "MATHEMATICAL ITALIC SMALL S", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0073", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD460" }, 119905: { "value": "1D461", "name": "MATHEMATICAL ITALIC SMALL T", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0074", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD461" }, 119906: { "value": "1D462", "name": "MATHEMATICAL ITALIC SMALL U", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0075", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD462" }, 119907: { "value": "1D463", "name": "MATHEMATICAL ITALIC SMALL V", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0076", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD463" }, 119908: { "value": "1D464", "name": "MATHEMATICAL ITALIC SMALL W", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0077", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD464" }, 119909: { "value": "1D465", "name": "MATHEMATICAL ITALIC SMALL X", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0078", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD465" }, 119910: { "value": "1D466", "name": "MATHEMATICAL ITALIC SMALL Y", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0079", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD466" }, 119911: { "value": "1D467", "name": "MATHEMATICAL ITALIC SMALL Z", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 007A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD467" }, 119938: { "value": "1D482", "name": "MATHEMATICAL BOLD ITALIC SMALL A", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0061", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD482" }, 119939: { "value": "1D483", "name": "MATHEMATICAL BOLD ITALIC SMALL B", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0062", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD483" }, 119940: { "value": "1D484", "name": "MATHEMATICAL BOLD ITALIC SMALL C", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0063", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD484" }, 119941: { "value": "1D485", "name": "MATHEMATICAL BOLD ITALIC SMALL D", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0064", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD485" }, 119942: { "value": "1D486", "name": "MATHEMATICAL BOLD ITALIC SMALL E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0065", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD486" }, 119943: { "value": "1D487", "name": "MATHEMATICAL BOLD ITALIC SMALL F", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0066", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD487" }, 119944: { "value": "1D488", "name": "MATHEMATICAL BOLD ITALIC SMALL G", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0067", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD488" }, 119945: { "value": "1D489", "name": "MATHEMATICAL BOLD ITALIC SMALL H", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0068", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD489" }, 119946: { "value": "1D48A", "name": "MATHEMATICAL BOLD ITALIC SMALL I", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0069", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD48A" }, 119947: { "value": "1D48B", "name": "MATHEMATICAL BOLD ITALIC SMALL J", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD48B" }, 119948: { "value": "1D48C", "name": "MATHEMATICAL BOLD ITALIC SMALL K", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006B", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD48C" }, 119949: { "value": "1D48D", "name": "MATHEMATICAL BOLD ITALIC SMALL L", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD48D" }, 119950: { "value": "1D48E", "name": "MATHEMATICAL BOLD ITALIC SMALL M", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006D", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD48E" }, 119951: { "value": "1D48F", "name": "MATHEMATICAL BOLD ITALIC SMALL N", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006E", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD48F" }, 119952: { "value": "1D490", "name": "MATHEMATICAL BOLD ITALIC SMALL O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006F", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD490" }, 119953: { "value": "1D491", "name": "MATHEMATICAL BOLD ITALIC SMALL P", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0070", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD491" }, 119954: { "value": "1D492", "name": "MATHEMATICAL BOLD ITALIC SMALL Q", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0071", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD492" }, 119955: { "value": "1D493", "name": "MATHEMATICAL BOLD ITALIC SMALL R", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0072", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD493" }, 119956: { "value": "1D494", "name": "MATHEMATICAL BOLD ITALIC SMALL S", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0073", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD494" }, 119957: { "value": "1D495", "name": "MATHEMATICAL BOLD ITALIC SMALL T", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0074", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD495" }, 119958: { "value": "1D496", "name": "MATHEMATICAL BOLD ITALIC SMALL U", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0075", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD496" }, 119959: { "value": "1D497", "name": "MATHEMATICAL BOLD ITALIC SMALL V", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0076", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD497" }, 119960: { "value": "1D498", "name": "MATHEMATICAL BOLD ITALIC SMALL W", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0077", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD498" }, 119961: { "value": "1D499", "name": "MATHEMATICAL BOLD ITALIC SMALL X", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0078", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD499" }, 119962: { "value": "1D49A", "name": "MATHEMATICAL BOLD ITALIC SMALL Y", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0079", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD49A" }, 119963: { "value": "1D49B", "name": "MATHEMATICAL BOLD ITALIC SMALL Z", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 007A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD49B" }, 119990: { "value": "1D4B6", "name": "MATHEMATICAL SCRIPT SMALL A", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0061", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4B6" }, 119991: { "value": "1D4B7", "name": "MATHEMATICAL SCRIPT SMALL B", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0062", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4B7" }, 119992: { "value": "1D4B8", "name": "MATHEMATICAL SCRIPT SMALL C", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0063", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4B8" }, 119993: { "value": "1D4B9", "name": "MATHEMATICAL SCRIPT SMALL D", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0064", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4B9" }, 119995: { "value": "1D4BB", "name": "MATHEMATICAL SCRIPT SMALL F", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0066", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4BB" }, 119997: { "value": "1D4BD", "name": "MATHEMATICAL SCRIPT SMALL H", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0068", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4BD" }, 119998: { "value": "1D4BE", "name": "MATHEMATICAL SCRIPT SMALL I", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0069", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4BE" }, 119999: { "value": "1D4BF", "name": "MATHEMATICAL SCRIPT SMALL J", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4BF" }, 120000: { "value": "1D4C0", "name": "MATHEMATICAL SCRIPT SMALL K", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006B", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4C0" }, 120001: { "value": "1D4C1", "name": "MATHEMATICAL SCRIPT SMALL L", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4C1" }, 120002: { "value": "1D4C2", "name": "MATHEMATICAL SCRIPT SMALL M", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006D", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4C2" }, 120003: { "value": "1D4C3", "name": "MATHEMATICAL SCRIPT SMALL N", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006E", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4C3" }, 120005: { "value": "1D4C5", "name": "MATHEMATICAL SCRIPT SMALL P", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0070", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4C5" }, 120006: { "value": "1D4C6", "name": "MATHEMATICAL SCRIPT SMALL Q", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0071", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4C6" }, 120007: { "value": "1D4C7", "name": "MATHEMATICAL SCRIPT SMALL R", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0072", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4C7" }, 120008: { "value": "1D4C8", "name": "MATHEMATICAL SCRIPT SMALL S", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0073", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4C8" }, 120009: { "value": "1D4C9", "name": "MATHEMATICAL SCRIPT SMALL T", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0074", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4C9" }, 120010: { "value": "1D4CA", "name": "MATHEMATICAL SCRIPT SMALL U", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0075", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4CA" }, 120011: { "value": "1D4CB", "name": "MATHEMATICAL SCRIPT SMALL V", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0076", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4CB" }, 120012: { "value": "1D4CC", "name": "MATHEMATICAL SCRIPT SMALL W", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0077", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4CC" }, 120013: { "value": "1D4CD", "name": "MATHEMATICAL SCRIPT SMALL X", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0078", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4CD" }, 120014: { "value": "1D4CE", "name": "MATHEMATICAL SCRIPT SMALL Y", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0079", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4CE" }, 120015: { "value": "1D4CF", "name": "MATHEMATICAL SCRIPT SMALL Z", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 007A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4CF" }, 120042: { "value": "1D4EA", "name": "MATHEMATICAL BOLD SCRIPT SMALL A", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0061", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4EA" }, 120043: { "value": "1D4EB", "name": "MATHEMATICAL BOLD SCRIPT SMALL B", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0062", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4EB" }, 120044: { "value": "1D4EC", "name": "MATHEMATICAL BOLD SCRIPT SMALL C", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0063", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4EC" }, 120045: { "value": "1D4ED", "name": "MATHEMATICAL BOLD SCRIPT SMALL D", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0064", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4ED" }, 120046: { "value": "1D4EE", "name": "MATHEMATICAL BOLD SCRIPT SMALL E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0065", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4EE" }, 120047: { "value": "1D4EF", "name": "MATHEMATICAL BOLD SCRIPT SMALL F", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0066", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4EF" }, 120048: { "value": "1D4F0", "name": "MATHEMATICAL BOLD SCRIPT SMALL G", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0067", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4F0" }, 120049: { "value": "1D4F1", "name": "MATHEMATICAL BOLD SCRIPT SMALL H", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0068", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4F1" }, 120050: { "value": "1D4F2", "name": "MATHEMATICAL BOLD SCRIPT SMALL I", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0069", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4F2" }, 120051: { "value": "1D4F3", "name": "MATHEMATICAL BOLD SCRIPT SMALL J", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4F3" }, 120052: { "value": "1D4F4", "name": "MATHEMATICAL BOLD SCRIPT SMALL K", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006B", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4F4" }, 120053: { "value": "1D4F5", "name": "MATHEMATICAL BOLD SCRIPT SMALL L", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4F5" }, 120054: { "value": "1D4F6", "name": "MATHEMATICAL BOLD SCRIPT SMALL M", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006D", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4F6" }, 120055: { "value": "1D4F7", "name": "MATHEMATICAL BOLD SCRIPT SMALL N", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006E", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4F7" }, 120056: { "value": "1D4F8", "name": "MATHEMATICAL BOLD SCRIPT SMALL O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006F", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4F8" }, 120057: { "value": "1D4F9", "name": "MATHEMATICAL BOLD SCRIPT SMALL P", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0070", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4F9" }, 120058: { "value": "1D4FA", "name": "MATHEMATICAL BOLD SCRIPT SMALL Q", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0071", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4FA" }, 120059: { "value": "1D4FB", "name": "MATHEMATICAL BOLD SCRIPT SMALL R", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0072", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4FB" }, 120060: { "value": "1D4FC", "name": "MATHEMATICAL BOLD SCRIPT SMALL S", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0073", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4FC" }, 120061: { "value": "1D4FD", "name": "MATHEMATICAL BOLD SCRIPT SMALL T", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0074", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4FD" }, 120062: { "value": "1D4FE", "name": "MATHEMATICAL BOLD SCRIPT SMALL U", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0075", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4FE" }, 120063: { "value": "1D4FF", "name": "MATHEMATICAL BOLD SCRIPT SMALL V", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0076", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD4FF" }, 120064: { "value": "1D500", "name": "MATHEMATICAL BOLD SCRIPT SMALL W", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0077", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD500" }, 120065: { "value": "1D501", "name": "MATHEMATICAL BOLD SCRIPT SMALL X", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0078", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD501" }, 120066: { "value": "1D502", "name": "MATHEMATICAL BOLD SCRIPT SMALL Y", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0079", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD502" }, 120067: { "value": "1D503", "name": "MATHEMATICAL BOLD SCRIPT SMALL Z", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 007A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD503" }, 120094: { "value": "1D51E", "name": "MATHEMATICAL FRAKTUR SMALL A", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0061", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD51E" }, 120095: { "value": "1D51F", "name": "MATHEMATICAL FRAKTUR SMALL B", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0062", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD51F" }, 120096: { "value": "1D520", "name": "MATHEMATICAL FRAKTUR SMALL C", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0063", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD520" }, 120097: { "value": "1D521", "name": "MATHEMATICAL FRAKTUR SMALL D", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0064", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD521" }, 120098: { "value": "1D522", "name": "MATHEMATICAL FRAKTUR SMALL E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0065", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD522" }, 120099: { "value": "1D523", "name": "MATHEMATICAL FRAKTUR SMALL F", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0066", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD523" }, 120100: { "value": "1D524", "name": "MATHEMATICAL FRAKTUR SMALL G", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0067", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD524" }, 120101: { "value": "1D525", "name": "MATHEMATICAL FRAKTUR SMALL H", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0068", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD525" }, 120102: { "value": "1D526", "name": "MATHEMATICAL FRAKTUR SMALL I", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0069", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD526" }, 120103: { "value": "1D527", "name": "MATHEMATICAL FRAKTUR SMALL J", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD527" }, 120104: { "value": "1D528", "name": "MATHEMATICAL FRAKTUR SMALL K", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006B", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD528" }, 120105: { "value": "1D529", "name": "MATHEMATICAL FRAKTUR SMALL L", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD529" }, 120106: { "value": "1D52A", "name": "MATHEMATICAL FRAKTUR SMALL M", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006D", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD52A" }, 120107: { "value": "1D52B", "name": "MATHEMATICAL FRAKTUR SMALL N", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006E", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD52B" }, 120108: { "value": "1D52C", "name": "MATHEMATICAL FRAKTUR SMALL O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006F", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD52C" }, 120109: { "value": "1D52D", "name": "MATHEMATICAL FRAKTUR SMALL P", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0070", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD52D" }, 120110: { "value": "1D52E", "name": "MATHEMATICAL FRAKTUR SMALL Q", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0071", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD52E" }, 120111: { "value": "1D52F", "name": "MATHEMATICAL FRAKTUR SMALL R", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0072", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD52F" }, 120112: { "value": "1D530", "name": "MATHEMATICAL FRAKTUR SMALL S", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0073", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD530" }, 120113: { "value": "1D531", "name": "MATHEMATICAL FRAKTUR SMALL T", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0074", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD531" }, 120114: { "value": "1D532", "name": "MATHEMATICAL FRAKTUR SMALL U", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0075", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD532" }, 120115: { "value": "1D533", "name": "MATHEMATICAL FRAKTUR SMALL V", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0076", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD533" }, 120116: { "value": "1D534", "name": "MATHEMATICAL FRAKTUR SMALL W", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0077", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD534" }, 120117: { "value": "1D535", "name": "MATHEMATICAL FRAKTUR SMALL X", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0078", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD535" }, 120118: { "value": "1D536", "name": "MATHEMATICAL FRAKTUR SMALL Y", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0079", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD536" }, 120119: { "value": "1D537", "name": "MATHEMATICAL FRAKTUR SMALL Z", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 007A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD537" }, 120146: { "value": "1D552", "name": "MATHEMATICAL DOUBLE-STRUCK SMALL A", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0061", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD552" }, 120147: { "value": "1D553", "name": "MATHEMATICAL DOUBLE-STRUCK SMALL B", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0062", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD553" }, 120148: { "value": "1D554", "name": "MATHEMATICAL DOUBLE-STRUCK SMALL C", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0063", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD554" }, 120149: { "value": "1D555", "name": "MATHEMATICAL DOUBLE-STRUCK SMALL D", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0064", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD555" }, 120150: { "value": "1D556", "name": "MATHEMATICAL DOUBLE-STRUCK SMALL E", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0065", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD556" }, 120151: { "value": "1D557", "name": "MATHEMATICAL DOUBLE-STRUCK SMALL F", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0066", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD557" }, 120152: { "value": "1D558", "name": "MATHEMATICAL DOUBLE-STRUCK SMALL G", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0067", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD558" }, 120153: { "value": "1D559", "name": "MATHEMATICAL DOUBLE-STRUCK SMALL H", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0068", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD559" }, 120154: { "value": "1D55A", "name": "MATHEMATICAL DOUBLE-STRUCK SMALL I", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0069", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD55A" }, 120155: { "value": "1D55B", "name": "MATHEMATICAL DOUBLE-STRUCK SMALL J", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006A", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD55B" }, 120156: { "value": "1D55C", "name": "MATHEMATICAL DOUBLE-STRUCK SMALL K", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006B", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD55C" }, 120157: { "value": "1D55D", "name": "MATHEMATICAL DOUBLE-STRUCK SMALL L", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006C", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD55D" }, 120158: { "value": "1D55E", "name": "MATHEMATICAL DOUBLE-STRUCK SMALL M", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006D", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD55E" }, 120159: { "value": "1D55F", "name": "MATHEMATICAL DOUBLE-STRUCK SMALL N", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006E", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD55F" }, 120160: { "value": "1D560", "name": "MATHEMATICAL DOUBLE-STRUCK SMALL O", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 006F", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD560" }, 120161: { "value": "1D561", "name": "MATHEMATICAL DOUBLE-STRUCK SMALL P", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0070", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD561" }, 120162: { "value": "1D562", "name": "MATHEMATICAL DOUBLE-STRUCK SMALL Q", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0071", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD562" }, 120163: { "value": "1D563", "name": "MATHEMATICAL DOUBLE-STRUCK SMALL R", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0072", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD563" }, 120164: { "value": "1D564", "name": "MATHEMATICAL DOUBLE-STRUCK SMALL S", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0073", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD564" }, 120165: { "value": "1D565", "name": "MATHEMATICAL DOUBLE-STRUCK SMALL T", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": " 0074", "decimal_digit_value": "", "digit_value": "", "numeric_value": "", "mirrored": "N", "unicode_name": "", "comment": "", "uppercase_mapping": "", "lowercase_mapping": "", "titlecase_mapping": "", "symbol": "\uD565" }, 120166: { "value": "1D566", "name": "MATHEMATICAL DOUBLE-STRUCK SMALL U", "category": "Ll", "class": "0", "bidirectional_category": "L", "mapping": "