/**
* @license
* Copyright Google Inc. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
/**
* @param {?} message
* @return {?}
*/
export function digest(message) {
return sha1(serializeNodes(message.nodes).join('') + ("[" + message.meaning + "]"));
}
/**
* @param {?} message
* @return {?}
*/
export function decimalDigest(message) {
var /** @type {?} */ visitor = new _SerializerIgnoreIcuExpVisitor();
var /** @type {?} */ parts = message.nodes.map(function (a) { return a.visit(visitor, null); });
return computeMsgId(parts.join(''), message.meaning);
}
/**
* Serialize the i18n ast to something xml-like in order to generate an UID.
*
* The visitor is also used in the i18n parser tests
*
* \@internal
*/
var _SerializerVisitor = (function () {
function _SerializerVisitor() {
}
/**
* @param {?} text
* @param {?} context
* @return {?}
*/
_SerializerVisitor.prototype.visitText = function (text, context) { return text.value; };
/**
* @param {?} container
* @param {?} context
* @return {?}
*/
_SerializerVisitor.prototype.visitContainer = function (container, context) {
var _this = this;
return "[" + container.children.map(function (child) { return child.visit(_this); }).join(', ') + "]";
};
/**
* @param {?} icu
* @param {?} context
* @return {?}
*/
_SerializerVisitor.prototype.visitIcu = function (icu, context) {
var _this = this;
var /** @type {?} */ strCases = Object.keys(icu.cases).map(function (k) { return (k + " {" + icu.cases[k].visit(_this) + "}"); });
return "{" + icu.expression + ", " + icu.type + ", " + strCases.join(', ') + "}";
};
/**
* @param {?} ph
* @param {?} context
* @return {?}
*/
_SerializerVisitor.prototype.visitTagPlaceholder = function (ph, context) {
var _this = this;
return ph.isVoid ?
"" :
"" + ph.children.map(function (child) { return child.visit(_this); }).join(', ') + "";
};
/**
* @param {?} ph
* @param {?} context
* @return {?}
*/
_SerializerVisitor.prototype.visitPlaceholder = function (ph, context) {
return ph.value ? "" + ph.value + "" : "";
};
/**
* @param {?} ph
* @param {?=} context
* @return {?}
*/
_SerializerVisitor.prototype.visitIcuPlaceholder = function (ph, context) {
return "" + ph.value.visit(this) + "";
};
return _SerializerVisitor;
}());
var /** @type {?} */ serializerVisitor = new _SerializerVisitor();
/**
* @param {?} nodes
* @return {?}
*/
export function serializeNodes(nodes) {
return nodes.map(function (a) { return a.visit(serializerVisitor, null); });
}
/**
* Serialize the i18n ast to something xml-like in order to generate an UID.
*
* Ignore the ICU expressions so that message IDs stays identical if only the expression changes.
*
* \@internal
*/
var _SerializerIgnoreIcuExpVisitor = (function (_super) {
__extends(_SerializerIgnoreIcuExpVisitor, _super);
function _SerializerIgnoreIcuExpVisitor() {
_super.apply(this, arguments);
}
/**
* @param {?} icu
* @param {?} context
* @return {?}
*/
_SerializerIgnoreIcuExpVisitor.prototype.visitIcu = function (icu, context) {
var _this = this;
var /** @type {?} */ strCases = Object.keys(icu.cases).map(function (k) { return (k + " {" + icu.cases[k].visit(_this) + "}"); });
// Do not take the expression into account
return "{" + icu.type + ", " + strCases.join(', ') + "}";
};
return _SerializerIgnoreIcuExpVisitor;
}(_SerializerVisitor));
/**
* Compute the SHA1 of the given string
*
* see http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
*
* WARNING: this function has not been designed not tested with security in mind.
* DO NOT USE IT IN A SECURITY SENSITIVE CONTEXT.
* @param {?} str
* @return {?}
*/
export function sha1(str) {
var /** @type {?} */ utf8 = utf8Encode(str);
var /** @type {?} */ words32 = stringToWords32(utf8, Endian.Big);
var /** @type {?} */ len = utf8.length * 8;
var /** @type {?} */ w = new Array(80);
var _a = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0], a = _a[0], b = _a[1], c = _a[2], d = _a[3], e = _a[4];
words32[len >> 5] |= 0x80 << (24 - len % 32);
words32[((len + 64 >> 9) << 4) + 15] = len;
for (var /** @type {?} */ i = 0; i < words32.length; i += 16) {
var _b = [a, b, c, d, e], h0 = _b[0], h1 = _b[1], h2 = _b[2], h3 = _b[3], h4 = _b[4];
for (var /** @type {?} */ j = 0; j < 80; j++) {
if (j < 16) {
w[j] = words32[i + j];
}
else {
w[j] = rol32(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
}
var _c = fk(j, b, c, d), f = _c[0], k = _c[1];
var /** @type {?} */ temp = [rol32(a, 5), f, e, k, w[j]].reduce(add32);
_d = [d, c, rol32(b, 30), a, temp], e = _d[0], d = _d[1], c = _d[2], b = _d[3], a = _d[4];
}
_e = [add32(a, h0), add32(b, h1), add32(c, h2), add32(d, h3), add32(e, h4)], a = _e[0], b = _e[1], c = _e[2], d = _e[3], e = _e[4];
}
return byteStringToHexString(words32ToByteString([a, b, c, d, e]));
var _d, _e;
}
/**
* @param {?} index
* @param {?} b
* @param {?} c
* @param {?} d
* @return {?}
*/
function fk(index, b, c, d) {
if (index < 20) {
return [(b & c) | (~b & d), 0x5a827999];
}
if (index < 40) {
return [b ^ c ^ d, 0x6ed9eba1];
}
if (index < 60) {
return [(b & c) | (b & d) | (c & d), 0x8f1bbcdc];
}
return [b ^ c ^ d, 0xca62c1d6];
}
/**
* Compute the fingerprint of the given string
*
* The output is 64 bit number encoded as a decimal string
*
* based on:
* https://github.com/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/GoogleJsMessageIdGenerator.java
* @param {?} str
* @return {?}
*/
export function fingerprint(str) {
var /** @type {?} */ utf8 = utf8Encode(str);
var _a = [hash32(utf8, 0), hash32(utf8, 102072)], hi = _a[0], lo = _a[1];
if (hi == 0 && (lo == 0 || lo == 1)) {
hi = hi ^ 0x130f9bef;
lo = lo ^ -0x6b5f56d8;
}
return [hi, lo];
}
/**
* @param {?} msg
* @param {?} meaning
* @return {?}
*/
export function computeMsgId(msg, meaning) {
var _a = fingerprint(msg), hi = _a[0], lo = _a[1];
if (meaning) {
var _b = fingerprint(meaning), him = _b[0], lom = _b[1];
_c = add64(rol64([hi, lo], 1), [him, lom]), hi = _c[0], lo = _c[1];
}
return byteStringToDecString(words32ToByteString([hi & 0x7fffffff, lo]));
var _c;
}
/**
* @param {?} str
* @param {?} c
* @return {?}
*/
function hash32(str, c) {
var _a = [0x9e3779b9, 0x9e3779b9], a = _a[0], b = _a[1];
var /** @type {?} */ i;
var /** @type {?} */ len = str.length;
for (i = 0; i + 12 <= len; i += 12) {
a = add32(a, wordAt(str, i, Endian.Little));
b = add32(b, wordAt(str, i + 4, Endian.Little));
c = add32(c, wordAt(str, i + 8, Endian.Little));
_b = mix([a, b, c]), a = _b[0], b = _b[1], c = _b[2];
}
a = add32(a, wordAt(str, i, Endian.Little));
b = add32(b, wordAt(str, i + 4, Endian.Little));
// the first byte of c is reserved for the length
c = add32(c, len);
c = add32(c, wordAt(str, i + 8, Endian.Little) << 8);
return mix([a, b, c])[2];
var _b;
}
/**
* @param {?} __0
* @return {?}
*/
function mix(_a) {
var a = _a[0], b = _a[1], c = _a[2];
a = sub32(a, b);
a = sub32(a, c);
a ^= c >>> 13;
b = sub32(b, c);
b = sub32(b, a);
b ^= a << 8;
c = sub32(c, a);
c = sub32(c, b);
c ^= b >>> 13;
a = sub32(a, b);
a = sub32(a, c);
a ^= c >>> 12;
b = sub32(b, c);
b = sub32(b, a);
b ^= a << 16;
c = sub32(c, a);
c = sub32(c, b);
c ^= b >>> 5;
a = sub32(a, b);
a = sub32(a, c);
a ^= c >>> 3;
b = sub32(b, c);
b = sub32(b, a);
b ^= a << 10;
c = sub32(c, a);
c = sub32(c, b);
c ^= b >>> 15;
return [a, b, c];
}
var Endian = {};
Endian.Little = 0;
Endian.Big = 1;
Endian[Endian.Little] = "Little";
Endian[Endian.Big] = "Big";
/**
* @param {?} str
* @return {?}
*/
function utf8Encode(str) {
var /** @type {?} */ encoded = '';
for (var /** @type {?} */ index = 0; index < str.length; index++) {
var /** @type {?} */ codePoint = decodeSurrogatePairs(str, index);
if (codePoint <= 0x7f) {
encoded += String.fromCharCode(codePoint);
}
else if (codePoint <= 0x7ff) {
encoded += String.fromCharCode(0xc0 | codePoint >>> 6, 0x80 | codePoint & 0x3f);
}
else if (codePoint <= 0xffff) {
encoded += String.fromCharCode(0xe0 | codePoint >>> 12, 0x80 | codePoint >>> 6 & 0x3f, 0x80 | codePoint & 0x3f);
}
else if (codePoint <= 0x1fffff) {
encoded += String.fromCharCode(0xf0 | codePoint >>> 18, 0x80 | codePoint >>> 12 & 0x3f, 0x80 | codePoint >>> 6 & 0x3f, 0x80 | codePoint & 0x3f);
}
}
return encoded;
}
/**
* @param {?} str
* @param {?} index
* @return {?}
*/
function decodeSurrogatePairs(str, index) {
if (index < 0 || index >= str.length) {
throw new Error("index=" + index + " is out of range in \"" + str + "\"");
}
var /** @type {?} */ high = str.charCodeAt(index);
if (high >= 0xd800 && high <= 0xdfff && str.length > index + 1) {
var /** @type {?} */ low = byteAt(str, index + 1);
if (low >= 0xdc00 && low <= 0xdfff) {
return (high - 0xd800) * 0x400 + low - 0xdc00 + 0x10000;
}
}
return high;
}
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
function add32(a, b) {
return add32to64(a, b)[1];
}
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
function add32to64(a, b) {
var /** @type {?} */ low = (a & 0xffff) + (b & 0xffff);
var /** @type {?} */ high = (a >>> 16) + (b >>> 16) + (low >>> 16);
return [high >>> 16, (high << 16) | (low & 0xffff)];
}
/**
* @param {?} __0
* @param {?} __1
* @return {?}
*/
function add64(_a, _b) {
var ah = _a[0], al = _a[1];
var bh = _b[0], bl = _b[1];
var _c = add32to64(al, bl), carry = _c[0], l = _c[1];
var /** @type {?} */ h = add32(add32(ah, bh), carry);
return [h, l];
}
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
function sub32(a, b) {
var /** @type {?} */ low = (a & 0xffff) - (b & 0xffff);
var /** @type {?} */ high = (a >> 16) - (b >> 16) + (low >> 16);
return (high << 16) | (low & 0xffff);
}
/**
* @param {?} a
* @param {?} count
* @return {?}
*/
function rol32(a, count) {
return (a << count) | (a >>> (32 - count));
}
/**
* @param {?} __0
* @param {?} count
* @return {?}
*/
function rol64(_a, count) {
var hi = _a[0], lo = _a[1];
var /** @type {?} */ h = (hi << count) | (lo >>> (32 - count));
var /** @type {?} */ l = (lo << count) | (hi >>> (32 - count));
return [h, l];
}
/**
* @param {?} str
* @param {?} endian
* @return {?}
*/
function stringToWords32(str, endian) {
var /** @type {?} */ words32 = Array((str.length + 3) >>> 2);
for (var /** @type {?} */ i = 0; i < words32.length; i++) {
words32[i] = wordAt(str, i * 4, endian);
}
return words32;
}
/**
* @param {?} str
* @param {?} index
* @return {?}
*/
function byteAt(str, index) {
return index >= str.length ? 0 : str.charCodeAt(index) & 0xff;
}
/**
* @param {?} str
* @param {?} index
* @param {?} endian
* @return {?}
*/
function wordAt(str, index, endian) {
var /** @type {?} */ word = 0;
if (endian === Endian.Big) {
for (var /** @type {?} */ i = 0; i < 4; i++) {
word += byteAt(str, index + i) << (24 - 8 * i);
}
}
else {
for (var /** @type {?} */ i = 0; i < 4; i++) {
word += byteAt(str, index + i) << 8 * i;
}
}
return word;
}
/**
* @param {?} words32
* @return {?}
*/
function words32ToByteString(words32) {
return words32.reduce(function (str, word) { return str + word32ToByteString(word); }, '');
}
/**
* @param {?} word
* @return {?}
*/
function word32ToByteString(word) {
var /** @type {?} */ str = '';
for (var /** @type {?} */ i = 0; i < 4; i++) {
str += String.fromCharCode((word >>> 8 * (3 - i)) & 0xff);
}
return str;
}
/**
* @param {?} str
* @return {?}
*/
function byteStringToHexString(str) {
var /** @type {?} */ hex = '';
for (var /** @type {?} */ i = 0; i < str.length; i++) {
var /** @type {?} */ b = byteAt(str, i);
hex += (b >>> 4).toString(16) + (b & 0x0f).toString(16);
}
return hex.toLowerCase();
}
/**
* @param {?} str
* @return {?}
*/
function byteStringToDecString(str) {
var /** @type {?} */ decimal = '';
var /** @type {?} */ toThePower = '1';
for (var /** @type {?} */ i = str.length - 1; i >= 0; i--) {
decimal = addBigInt(decimal, numberTimesBigInt(byteAt(str, i), toThePower));
toThePower = numberTimesBigInt(256, toThePower);
}
return decimal.split('').reverse().join('');
}
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
function addBigInt(x, y) {
var /** @type {?} */ sum = '';
var /** @type {?} */ len = Math.max(x.length, y.length);
for (var /** @type {?} */ i = 0, /** @type {?} */ carry = 0; i < len || carry; i++) {
var /** @type {?} */ tmpSum = carry + +(x[i] || 0) + +(y[i] || 0);
if (tmpSum >= 10) {
carry = 1;
sum += tmpSum - 10;
}
else {
carry = 0;
sum += tmpSum;
}
}
return sum;
}
/**
* @param {?} num
* @param {?} b
* @return {?}
*/
function numberTimesBigInt(num, b) {
var /** @type {?} */ product = '';
var /** @type {?} */ bToThePower = b;
for (; num !== 0; num = num >>> 1) {
if (num & 1)
product = addBigInt(product, bToThePower);
bToThePower = addBigInt(bToThePower, bToThePower);
}
return product;
}
//# sourceMappingURL=digest.js.map