diff --git a/build.xml b/build.xml index c3ff012..169063d 100644 --- a/build.xml +++ b/build.xml @@ -31,10 +31,6 @@ - - - - diff --git a/contrib/closure-compiler/compiler.jar b/contrib/closure-compiler/compiler.jar index 4dfa5ad..9ab337c 100644 Binary files a/contrib/closure-compiler/compiler.jar and b/contrib/closure-compiler/compiler.jar differ diff --git a/contrib/closure-library/css/inlay/g-base.css b/contrib/closure-library/css/inlay/g-base.css new file mode 100644 index 0000000..3db72d3 --- /dev/null +++ b/contrib/closure-library/css/inlay/g-base.css @@ -0,0 +1,82 @@ +/* + * Copyright 2007 The Closure Library Authors. All Rights Reserved. + * + * Use of this source code is governed by the Apache License, Version 2.0. + * See the COPYING file for details. + */ + +/** + * CSS Inlay + * This is the minimum CSS required to use the markup/classname patterns. + * @author elsigh@google.com (Lindsey Simon) + * @author ddiaz@google.com (Dustin Diaz) + */ + +/** + * Document container designed for fluid width scaling. + * Alternative g-doc- fixed-width classes are in gui-fixed.css. + */ +.g-doc { + width: 100%; + text-align: left; +} + +/** + * g-section fundamentally has to clear floats. There are many ways to do this. + * This technique is nice because it doesn't rely on overflow: hidden, which + * has the potential to hide your content in situations where a fixed size + * node takes up too much space (like a big table, or a text input or image. + * Works in Webkit, IE8, and FF3. + */ +.g-section { + width: 100%; + vertical-align: top; + display: inline-block; +} + +/** + * IE7-only hack. Nicely IE7 will clear floats with just block display + * and hasLayout. + */ +*:first-child+html .g-section { + display: block; +} + +/** + * IE6 cannot hang with overflow: visible. If we use the IE7 display block + * trick in IE6 we get severe float drop in nested grids. + */ +* html .g-section { + overflow: hidden; +} + +/* FF2 can't actually hang with overflow: visible. */ +@-moz-document url-prefix() { + .g-section { + overflow: hidden; + } +} + +/** + * FF3 now needs to be reset after the previous block which affects it as well. + * We target the tt element in this hack because no one uses it. + */ +@-moz-document url-prefix() { + .g-section,tt:default { + overflow: visible; + } +} + +/* Forces "hasLayout" fixing a gamut of bugs in <= IE7. */ +.g-section, +.g-unit { + zoom: 1; +} + +/* Used for splitting a template's units text-alignment to the outer edges. */ +.g-split .g-unit { + text-align: right; +} +.g-split .g-first { + text-align: left; +} diff --git a/contrib/closure-library/css/inlay/g-fixed.css b/contrib/closure-library/css/inlay/g-fixed.css new file mode 100644 index 0000000..52ef5d1 --- /dev/null +++ b/contrib/closure-library/css/inlay/g-fixed.css @@ -0,0 +1,173 @@ +/* + * Copyright 2007 The Closure Library Authors. All Rights Reserved. + * + * Use of this source code is governed by the Apache License, Version 2.0. + * See the COPYING file for details. + */ + +/** + * CSS Inlay + * Fixed templates + * @author ddiaz@google.com (Dustin Diaz) + * @author elsigh@google.com (Lindsey Simon) + * @fileoverview + * The nature of these templates is to have one unit be a fixed width + * and the supplementary unit to take up the rest of the width + * of its parents' container. + * + * Sample Usage: +
+
+

+ Lorem Ipsum... +

+
+
+

+ Lorem Ipsum... +

+
+
+ */ + +/* Document container designed for 1024x768 */ +/* TODO(ux-webdev): convert this to a straight px value - em assumes reset. */ +.g-doc-1024 { + width: 73.074em; + min-width: 950px; /* min-width doesn't work in IE6 */ + margin: 0 auto; + text-align: left; +} +/* IE 6 */ +* html .g-doc-1024 { + width: 71.313em; +} +/* IE 7 */ +*+html .g-doc-1024 { + width: 71.313em; +} + +/* Document container designed for 800x600 */ +/* TODO(ux-webdev): convert this to a straight px value - em assumes reset. */ +.g-doc-800 { + width: 57.69em; + min-width: 750px; /* min-width doesn't work in IE6 */ + margin: 0 auto; + text-align: left; +} +/* IE 6 */ +* html .g-doc-800 { + width: 56.3em; +} +/* IE 7 */ +*+html .g-doc-800 { + width: 56.3em; +} + +/* 160px */ +.g-tpl-160 .g-unit, +.g-unit .g-tpl-160 .g-unit, +.g-unit .g-unit .g-tpl-160 .g-unit, +.g-unit .g-unit .g-unit .g-tpl-160 .g-unit { + margin: 0 0 0 160px; + width: auto; + float: none; +} +.g-unit .g-unit .g-unit .g-tpl-160 .g-first, +.g-unit .g-unit .g-tpl-160 .g-first, +.g-unit .g-tpl-160 .g-first, +.g-tpl-160 .g-first { + margin: 0; + width: 160px; + float: left; +} + +/* 160px alt */ +.g-tpl-160-alt .g-unit, +.g-unit .g-tpl-160-alt .g-unit, +.g-unit .g-unit .g-tpl-160-alt .g-unit, +.g-unit .g-unit .g-unit .g-tpl-160-alt .g-unit { + margin: 0 160px 0 0; + width: auto; + float: none; +} +.g-unit .g-unit .g-unit .g-tpl-160-alt .g-first, +.g-unit .g-unit .g-tpl-160-alt .g-first, +.g-unit .g-tpl-160-alt .g-first, +.g-tpl-160-alt .g-first { + margin: 0; + width: 160px; + float: right; +} + +/* 180px */ +.g-tpl-180 .g-unit, +.g-unit .g-tpl-180 .g-unit, +.g-unit .g-unit .g-tpl-180 .g-unit, +.g-unit .g-unit .g-unit .g-tpl-180 .g-unit { + margin: 0 0 0 180px; + width: auto; + float: none; +} +.g-unit .g-unit .g-unit .g-tpl-180 .g-first, +.g-unit .g-unit .g-tpl-180 .g-first, +.g-unit .g-tpl-180 .g-first, +.g-tpl-180 .g-first { + margin: 0; + width: 180px; + float: left; +} + +/* 180px alt */ +.g-tpl-180-alt .g-unit, +.g-unit .g-tpl-180-alt .g-unit, +.g-unit .g-unit .g-tpl-180-alt .g-unit, +.g-unit .g-unit .g-unit .g-tpl-180-alt .g-unit { + margin: 0 180px 0 0; + width: auto; + float: none; +} +.g-unit .g-unit .g-unit .g-tpl-180-alt .g-first, +.g-unit .g-unit .g-tpl-180-alt .g-first, +.g-unit .g-tpl-180-alt .g-first, +.g-tpl-180-alt .g-first { + margin: 0; + width: 180px; + float: right; +} + +/* 300px */ +.g-tpl-300 .g-unit, +.g-unit .g-tpl-300 .g-unit, +.g-unit .g-unit .g-tpl-300 .g-unit, +.g-unit .g-unit .g-unit .g-tpl-300 .g-unit { + margin: 0 0 0 300px; + width: auto; + float: none; +} +.g-unit .g-unit .g-unit .g-tpl-300 .g-first, +.g-unit .g-unit .g-tpl-300 .g-first, +.g-unit .g-tpl-300 .g-first, +.g-tpl-300 .g-first { + margin: 0; + width: 300px; + float: left; +} + +/* 300px alt */ +.g-tpl-300-alt .g-unit, +.g-unit .g-tpl-300-alt .g-unit, +.g-unit .g-unit .g-tpl-300-alt .g-unit, +.g-unit .g-unit .g-unit .g-tpl-300-alt .g-unit { + margin: 0 300px 0 0; + width: auto; + float: none; +} +.g-unit .g-unit .g-unit .g-tpl-300-alt .g-first, +.g-unit .g-unit .g-tpl-300-alt .g-first, +.g-unit .g-tpl-300-alt .g-first, +.g-tpl-300-alt .g-first { + margin: 0; + width: 300px; + float: right; +} \ No newline at end of file diff --git a/contrib/closure-library/css/inlay/g-ratio.css b/contrib/closure-library/css/inlay/g-ratio.css new file mode 100644 index 0000000..6017ec0 --- /dev/null +++ b/contrib/closure-library/css/inlay/g-ratio.css @@ -0,0 +1,253 @@ +/* + * Copyright 2007 The Closure Library Authors. All Rights Reserved. + * + * Use of this source code is governed by the Apache License, Version 2.0. + * See the COPYING file for details. + */ + +/** + * CSS Inlay + * Percentage based templates + * @author ddiaz@google.com (Dustin Diaz) + * @author elsigh@google.com (Lindsey Simon) + * @fileoverview + * The first ten templates are described using the following convention: + * tpl-LEFT%-RIGHT% and tpl-LEFT%-RIGHT%-alt, where alt switches render order. + * + * The rationale for the percentage values are pretty fascinating. + * Three nine's are needed for a miminal affordance in the gap between units + * for Opera, while two for IE 5.5 and down. + * Straight percentages seem to work fine otherwise, but the values here test + * well cross-browser. + * + * Sample Usage: +
+
+

+ Lorem Ipsum... +

+
+
+

+ Lorem Ipsum... +

+
+
+ */ + +/* 25/75 */ +.g-tpl-25-75 .g-unit, +.g-unit .g-tpl-25-75 .g-unit, +.g-unit .g-unit .g-tpl-25-75 .g-unit, +.g-unit .g-unit .g-unit .g-tpl-25-75 .g-unit { + width: 74.999%; + float: right; + margin: 0; +} +.g-unit .g-unit .g-unit .g-tpl-25-75 .g-first, +.g-unit .g-unit .g-tpl-25-75 .g-first, +.g-unit .g-tpl-25-75 .g-first, +.g-tpl-25-75 .g-first { + width: 24.999%; + float: left; + margin: 0; +} + +/* 25/75-alt */ +.g-tpl-25-75-alt .g-unit, +.g-unit .g-tpl-25-75-alt .g-unit, +.g-unit .g-unit .g-tpl-25-75-alt .g-unit, +.g-unit .g-unit .g-unit .g-tpl-25-75-alt .g-unit { + width: 24.999%; + float: left; + margin: 0; +} +.g-unit .g-unit .g-unit .g-tpl-25-75-alt .g-first, +.g-unit .g-unit .g-tpl-25-75-alt .g-first, +.g-unit .g-tpl-25-75-alt .g-first, +.g-tpl-25-75-alt .g-first { + width: 74.999%; + float: right; + margin: 0; +} + +/* 75/25 */ +.g-tpl-75-25 .g-unit, +.g-unit .g-tpl-75-25 .g-unit, +.g-unit .g-unit .g-tpl-75-25 .g-unit, +.g-unit .g-unit .g-unit .g-tpl-75-25 .g-unit { + width: 24.999%; + float: right; + margin: 0; +} +.g-unit .g-unit .g-unit .g-tpl-75-25 .g-first, +.g-unit .g-unit .g-tpl-75-25 .g-first, +.g-unit .g-tpl-75-25 .g-first, +.g-tpl-75-25 .g-first { + width: 74.999%; + float: left; + margin: 0; +} + +/* 75/25-alt */ +.g-tpl-75-25-alt .g-unit, +.g-unit .g-tpl-75-25-alt .g-unit, +.g-unit .g-unit .g-tpl-75-25-alt .g-unit, +.g-unit .g-unit .g-unit .g-tpl-75-25-alt .g-unit { + width: 74.999%; + float: left; + margin: 0; +} +.g-unit .g-unit .g-unit .g-tpl-75-25-alt .g-first, +.g-unit .g-unit .g-tpl-75-25-alt .g-first, +.g-unit .g-tpl-75-25-alt .g-first, +.g-tpl-75-25-alt .g-first { + width: 24.999%; + float: right; + margin: 0; +} + +/* 33/67 */ +.g-tpl-33-67 .g-unit, +.g-unit .g-tpl-33-67 .g-unit, +.g-unit .g-unit .g-tpl-33-67 .g-unit, +.g-unit .g-unit .g-unit .g-tpl-33-67 .g-unit { + width: 66.999%; + float: right; + margin: 0; +} +.g-unit .g-unit .g-unit .g-tpl-33-67 .g-first, +.g-unit .g-unit .g-tpl-33-67 .g-first, +.g-unit .g-tpl-33-67 .g-first, +.g-tpl-33-67 .g-first { + width: 32.999%; + float: left; + margin: 0; +} + +/* 33/67-alt */ +.g-tpl-33-67-alt .g-unit, +.g-unit .g-tpl-33-67-alt .g-unit, +.g-unit .g-unit .g-tpl-33-67-alt .g-unit, +.g-unit .g-unit .g-unit .g-tpl-33-67-alt .g-unit { + width: 32.999%; + float: left; + margin: 0; +} +.g-unit .g-unit .g-unit .g-tpl-33-67-alt .g-first, +.g-unit .g-unit .g-tpl-33-67-alt .g-first, +.g-unit .g-tpl-33-67-alt .g-first, +.g-tpl-33-67-alt .g-first { + width: 66.999%; + float: right; + margin: 0; +} +/* 67/33 */ +.g-tpl-67-33 .g-unit, +.g-unit .g-tpl-67-33 .g-unit, +.g-unit .g-unit .g-tpl-67-33 .g-unit, +.g-unit .g-unit .g-unit .g-tpl-67-33 .g-unit { + width: 32.999%; + float: right; + margin: 0; +} +.g-unit .g-unit .g-unit .g-tpl-67-33 .g-first, +.g-unit .g-unit .g-tpl-67-33 .g-first, +.g-unit .g-tpl-67-33 .g-first, +.g-tpl-67-33 .g-first { + width: 66.999%; + float: left; + margin: 0; +} + +/* 67/33-alt */ +.g-tpl-67-33-alt .g-unit, +.g-unit .g-tpl-67-33-alt .g-unit, +.g-unit .g-unit .g-tpl-67-33-alt .g-unit, +.g-unit .g-unit .g-unit .g-tpl-67-33-alt .g-unit { + width: 66.999%; + float: left; + margin: 0; +} +.g-unit .g-unit .g-unit .g-tpl-67-33-alt .g-first, +.g-unit .g-unit .g-tpl-67-33-alt .g-first, +.g-unit .g-tpl-67-33-alt .g-first, +.g-tpl-67-33-alt .g-first { + width: 32.999%; + float: right; + margin: 0; +} + +/* 50/50 */ +.g-tpl-50-50 .g-unit, +.g-unit .g-tpl-50-50 .g-unit, +.g-unit .g-unit .g-tpl-50-50 .g-unit, +.g-unit .g-unit .g-unit .g-tpl-50-50 .g-unit { + width: 49.999%; + float: right; + margin: 0; +} +.g-unit .g-unit .g-unit .g-tpl-50-50 .g-first, +.g-unit .g-unit .g-tpl-50-50 .g-first, +.g-unit .g-tpl-50-50 .g-first, +.g-tpl-50-50 .g-first { + width: 49.999%; + float: left; + margin: 0; +} + +/* 50/50-alt */ +.g-tpl-50-50-alt .g-unit, +.g-unit .g-tpl-50-50-alt .g-unit, +.g-unit .g-unit .g-tpl-50-50-alt .g-unit, +.g-unit .g-unit .g-unit .g-tpl-50-50-alt .g-unit { + width: 49.999%; + float: left; + margin: 0; +} +.g-unit .g-unit .g-unit .g-tpl-50-50-alt .g-first, +.g-unit .g-unit .g-tpl-50-50-alt .g-first, +.g-unit .g-tpl-50-50-alt .g-first, +.g-tpl-50-50-alt .g-first { + width: 49.999%; + float: right; + margin: 0; +} + +/** + * Nest templates contain floating g-units. + * For these, width needs to be reset from the 100% for inline-block + * to auto. This fixes an issue with horizontal scrollbars. + */ +.g-tpl-nest { + width: auto; +} +/** + * Making any g-sections inside of g-tpl-nests display inline instead + * of display block solves an issue where inner sections add up incrementally + * their widths to set the width of the outer g-unit. This causes all kinds of + * problems with float-drops and display:inline fixes this. + */ +.g-tpl-nest .g-section { + display: inline; +} + +/* g-tpl-nest for multi unit nesting (float left), say for a menu. */ +.g-tpl-nest .g-unit, +.g-unit .g-tpl-nest .g-unit, +.g-unit .g-unit .g-tpl-nest .g-unit, +.g-unit .g-unit .g-unit .g-tpl-nest .g-unit { + float: left; + width: auto; + margin: 0; +} + +/* g-tpl-nest-alt for multi unit nesting (float right), say for a menu. */ +.g-tpl-nest-alt .g-unit, +.g-unit .g-tpl-nest-alt .g-unit, +.g-unit .g-unit .g-tpl-nest-alt .g-unit, +.g-unit .g-unit .g-unit .g-tpl-nest-alt .g-unit { + float: right; + width: auto; + margin: 0; +} diff --git a/contrib/closure-library/goog/array/array.js b/contrib/closure-library/goog/array/array.js index c3aa197..174ece1 100644 --- a/contrib/closure-library/goog/array/array.js +++ b/contrib/closure-library/goog/array/array.js @@ -19,10 +19,25 @@ goog.provide('goog.array'); +goog.provide('goog.array.ArrayLike'); goog.require('goog.asserts'); +/** + * @define {boolean} NATIVE_ARRAY_PROTOTYPES indicates whether the code should + * rely on Array.prototype functions, if available. + * + * The Array.prototype functions can be defined by external libraries like + * Prototype and setting this flag to false forces closure to use its own + * goog.array implementation. + * + * If your javascript can be loaded by a third party site and you are wary about + * relying on the prototype functions, specify + * "--define goog.NATIVE_ARRAY_PROTOTYPES=false" to the JSCompiler. + */ +goog.NATIVE_ARRAY_PROTOTYPES = true; + /** * @typedef {Array|NodeList|Arguments|{length: number}} @@ -66,7 +81,8 @@ goog.array.ARRAY_PROTOTYPE_ = Array.prototype; * omitted the search starts at index 0. * @return {number} The index of the first matching array element. */ -goog.array.indexOf = goog.array.ARRAY_PROTOTYPE_.indexOf ? +goog.array.indexOf = goog.NATIVE_ARRAY_PROTOTYPES && + goog.array.ARRAY_PROTOTYPE_.indexOf ? function(arr, obj, opt_fromIndex) { goog.asserts.assert(arr.length != null); @@ -105,7 +121,8 @@ goog.array.indexOf = goog.array.ARRAY_PROTOTYPE_.indexOf ? * omitted the search starts at the end of the array. * @return {number} The index of the last matching array element. */ -goog.array.lastIndexOf = goog.array.ARRAY_PROTOTYPE_.lastIndexOf ? +goog.array.lastIndexOf = goog.NATIVE_ARRAY_PROTOTYPES && + goog.array.ARRAY_PROTOTYPE_.lastIndexOf ? function(arr, obj, opt_fromIndex) { goog.asserts.assert(arr.length != null); @@ -153,7 +170,8 @@ goog.array.lastIndexOf = goog.array.ARRAY_PROTOTYPE_.lastIndexOf ? * @param {Object=} opt_obj The object to be used as the value of 'this' * within f. */ -goog.array.forEach = goog.array.ARRAY_PROTOTYPE_.forEach ? +goog.array.forEach = goog.NATIVE_ARRAY_PROTOTYPES && + goog.array.ARRAY_PROTOTYPE_.forEach ? function(arr, f, opt_obj) { goog.asserts.assert(arr.length != null); @@ -208,7 +226,8 @@ goog.array.forEachRight = function(arr, f, opt_obj) { * @return {!Array} a new array in which only elements that passed the test are * present. */ -goog.array.filter = goog.array.ARRAY_PROTOTYPE_.filter ? +goog.array.filter = goog.NATIVE_ARRAY_PROTOTYPES && + goog.array.ARRAY_PROTOTYPE_.filter ? function(arr, f, opt_obj) { goog.asserts.assert(arr.length != null); @@ -245,7 +264,8 @@ goog.array.filter = goog.array.ARRAY_PROTOTYPE_.filter ? * within f. * @return {!Array} a new array with the results from f. */ -goog.array.map = goog.array.ARRAY_PROTOTYPE_.map ? +goog.array.map = goog.NATIVE_ARRAY_PROTOTYPES && + goog.array.ARRAY_PROTOTYPE_.map ? function(arr, f, opt_obj) { goog.asserts.assert(arr.length != null); @@ -355,7 +375,8 @@ goog.array.reduceRight = function(arr, f, val, opt_obj) { * within f. * @return {boolean} true if any element passes the test. */ -goog.array.some = goog.array.ARRAY_PROTOTYPE_.some ? +goog.array.some = goog.NATIVE_ARRAY_PROTOTYPES && + goog.array.ARRAY_PROTOTYPE_.some ? function(arr, f, opt_obj) { goog.asserts.assert(arr.length != null); @@ -388,7 +409,8 @@ goog.array.some = goog.array.ARRAY_PROTOTYPE_.some ? * within f. * @return {boolean} false if any element fails the test. */ -goog.array.every = goog.array.ARRAY_PROTOTYPE_.every ? +goog.array.every = goog.NATIVE_ARRAY_PROTOTYPES && + goog.array.ARRAY_PROTOTYPE_.every ? function(arr, f, opt_obj) { goog.asserts.assert(arr.length != null); @@ -811,17 +833,24 @@ goog.array.slice = function(arr, start, opt_end) { * array will remain unchanged. */ goog.array.removeDuplicates = function(arr, opt_rv) { - var rv = opt_rv || arr; + var returnArray = opt_rv || arr; + var seen = {}, cursorInsert = 0, cursorRead = 0; while (cursorRead < arr.length) { var current = arr[cursorRead++]; - var uid = goog.isObject(current) ? goog.getUid(current) : current; - if (!Object.prototype.hasOwnProperty.call(seen, uid)) { - seen[uid] = true; - rv[cursorInsert++] = current; + + // Prefix each type with a single character representing the type to + // prevent conflicting keys (e.g. true and 'true'). + var key = goog.isObject(current) ? + 'o' + goog.getUid(current) : + (typeof current).charAt(0) + current; + + if (!Object.prototype.hasOwnProperty.call(seen, key)) { + seen[key] = true; + returnArray[cursorInsert++] = current; } } - rv.length = cursorInsert; + returnArray.length = cursorInsert; }; @@ -842,7 +871,7 @@ goog.array.removeDuplicates = function(arr, opt_rv) { * @param {*} target The sought value. * @param {Function=} opt_compareFn Optional comparison function by which the * array is ordered. Should take 2 arguments to compare, and return a - * negative integer, zero, or a positive integer depending on whether the + * negative number, zero, or a positive number depending on whether the * first argument is less than, equal to, or greater than the second. * @return {number} Lowest index of the target value if found, otherwise * (-(insertion point) - 1). The insertion point is where the value should @@ -867,9 +896,9 @@ goog.array.binarySearch = function(arr, target, opt_compareFn) { * * @param {goog.array.ArrayLike} arr The array to be searched. * @param {Function} evaluator Evaluator function that receives 3 arguments - * (the element, the index and the array). Should return a negative - * integer, zero, or a positive integer depending on whether the - * desired index is before, at, or after the element passed to it. + * (the element, the index and the array). Should return a negative number, + * zero, or a positive number depending on whether the desired index is + * before, at, or after the element passed to it. * @param {Object=} opt_obj The object to be used as the value of 'this' * within evaluator. * @return {number} Index of the leftmost element matched by the evaluator, if @@ -954,7 +983,7 @@ goog.array.binarySearch_ = function(arr, compareFn, isEvaluator, opt_target, * @param {Array} arr The array to be sorted. * @param {Function=} opt_compareFn Optional comparison function by which the * array is to be ordered. Should take 2 arguments to compare, and return a - * negative integer, zero, or a positive integer depending on whether the + * negative number, zero, or a positive number depending on whether the * first argument is less than, equal to, or greater than the second. */ goog.array.sort = function(arr, opt_compareFn) { @@ -979,7 +1008,7 @@ goog.array.sort = function(arr, opt_compareFn) { * @param {Array} arr The array to be sorted. * @param {function(*, *): number=} opt_compareFn Optional comparison function * by which the array is to be ordered. Should take 2 arguments to compare, - * and return a negative integer, zero, or a positive integer depending on + * and return a negative number, zero, or a positive number depending on * whether the first argument is less than, equal to, or greater than the * second. */ @@ -1017,6 +1046,28 @@ goog.array.sortObjectsByKey = function(arr, key, opt_compareFn) { }; +/** + * Tells if the array is sorted. + * @param {!Array} arr The array. + * @param {Function=} opt_compareFn Function to compare the array elements. + * Should take 2 arguments to compare, and return a negative number, zero, + * or a positive number depending on whether the first argument is less + * than, equal to, or greater than the second. + * @param {boolean=} opt_strict If true no equal elements are allowed. + * @return {boolean} Whether the array is sorted. + */ +goog.array.isSorted = function(arr, opt_compareFn, opt_strict) { + var compare = opt_compareFn || goog.array.defaultCompare; + for (var i = 1; i < arr.length; i++) { + var compareResult = compare(arr[i - 1], arr[i]); + if (compareResult > 0 || compareResult == 0 && opt_strict) { + return false; + } + } + return true; +}; + + /** * Compares two arrays for equality. Two arrays are considered equal if they * have the same length and their corresponding elements are equal according to @@ -1063,9 +1114,8 @@ goog.array.compare = function(arr1, arr2, opt_equalsFn) { * operators. * @param {*} a The first object to be compared. * @param {*} b The second object to be compared. - * @return {number} a negative integer, zero, or a positive integer - * as the first argument is less than, equal to, or greater than the - * second. + * @return {number} A negative number, zero, or a positive number as the first + * argument is less than, equal to, or greater than the second. */ goog.array.defaultCompare = function(a, b) { return a > b ? 1 : a < b ? -1 : 0; @@ -1089,10 +1139,9 @@ goog.array.defaultCompareEquality = function(a, b) { * @param {Array} array The array to modify. * @param {*} value The object to insert. * @param {Function=} opt_compareFn Optional comparison function by which the - * array is ordered. Should take 2 arguments to compare, and - * return a negative integer, zero, or a positive integer depending on - * whether the first argument is less than, equal to, or greater than the - * second. + * array is ordered. Should take 2 arguments to compare, and return a + * negative number, zero, or a positive number depending on whether the + * first argument is less than, equal to, or greater than the second. * @return {boolean} True if an element was inserted. */ goog.array.binaryInsert = function(array, value, opt_compareFn) { @@ -1110,10 +1159,9 @@ goog.array.binaryInsert = function(array, value, opt_compareFn) { * @param {Array} array The array to modify. * @param {*} value The object to remove. * @param {Function=} opt_compareFn Optional comparison function by which the - * array is ordered. Should take 2 arguments to compare, and - * return a negative integer, zero, or a positive integer depending on - * whether the first argument is less than, equal to, or greater than the - * second. + * array is ordered. Should take 2 arguments to compare, and return a + * negative number, zero, or a positive number depending on whether the + * first argument is less than, equal to, or greater than the second. * @return {boolean} True if an element was removed. */ goog.array.binaryRemove = function(array, value, opt_compareFn) { @@ -1245,3 +1293,30 @@ goog.array.zip = function(var_args) { result.push(value); } }; + + +/** + * Shuffles the values in the specified array using the Fisher-Yates in-place + * shuffle (also known as the Knuth Shuffle). By default, calls Math.random() + * and so resets the state of that random number generator. Similarly, may reset + * the state of the any other specified random number generator. + * + * Runtime: O(n) + * + * @param {!Array} arr The array to be shuffled. + * @param {Function=} opt_randFn Optional random function to use for shuffling. + * Takes no arguments, and returns a random number on the interval [0, 1). + * Defaults to Math.random() using JavaScript's built-in Math library. + */ +goog.array.shuffle = function(arr, opt_randFn) { + var randFn = opt_randFn || Math.random; + + for (var i = arr.length - 1; i > 0; i--) { + // Choose a random array index in [0, i] (inclusive with i). + var j = Math.floor(randFn() * (i + 1)); + + var tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; + } +}; diff --git a/contrib/closure-library/goog/array/array_test.html b/contrib/closure-library/goog/array/array_test.html index e31ffa2..2238783 100644 --- a/contrib/closure-library/goog/array/array_test.html +++ b/contrib/closure-library/goog/array/array_test.html @@ -3,7 +3,7 @@ @@ -20,17 +20,6 @@ diff --git a/contrib/closure-library/goog/asserts/asserts.js b/contrib/closure-library/goog/asserts/asserts.js index c9e4eae..021e80d 100644 --- a/contrib/closure-library/goog/asserts/asserts.js +++ b/contrib/closure-library/goog/asserts/asserts.js @@ -39,12 +39,14 @@ goog.provide('goog.asserts.AssertionError'); goog.require('goog.debug.Error'); goog.require('goog.string'); + /** * @define {boolean} Whether to strip out asserts or to leave them in. */ goog.asserts.ENABLE_ASSERTS = goog.DEBUG; + /** * Error object for failed assertions. * @param {string} messagePattern The pattern that was used to form message. diff --git a/contrib/closure-library/goog/asserts/asserts_test.html b/contrib/closure-library/goog/asserts/asserts_test.html index 99b502f..6e773db 100644 --- a/contrib/closure-library/goog/asserts/asserts_test.html +++ b/contrib/closure-library/goog/asserts/asserts_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/async/conditionaldelay_test.html b/contrib/closure-library/goog/async/conditionaldelay_test.html index 98171fe..ce33dfd 100644 --- a/contrib/closure-library/goog/async/conditionaldelay_test.html +++ b/contrib/closure-library/goog/async/conditionaldelay_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/async/delay.js b/contrib/closure-library/goog/async/delay.js index fcd4ab6..253b10b 100644 --- a/contrib/closure-library/goog/async/delay.js +++ b/contrib/closure-library/goog/async/delay.js @@ -43,6 +43,8 @@ goog.require('goog.Timer'); * @extends {goog.Disposable} */ goog.async.Delay = function(listener, opt_interval, opt_handler) { + goog.Disposable.call(this); + /** * The function that will be invoked after a delay. * @type {Function} @@ -75,6 +77,7 @@ goog.async.Delay = function(listener, opt_interval, opt_handler) { goog.inherits(goog.async.Delay, goog.Disposable); + /** * A deprecated alias. * @deprecated Use goog.async.Delay instead. diff --git a/contrib/closure-library/goog/async/delay_test.html b/contrib/closure-library/goog/async/delay_test.html index 2154215..91b2583 100644 --- a/contrib/closure-library/goog/async/delay_test.html +++ b/contrib/closure-library/goog/async/delay_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/async/throttle.js b/contrib/closure-library/goog/async/throttle.js index d219128..f26d01b 100644 --- a/contrib/closure-library/goog/async/throttle.js +++ b/contrib/closure-library/goog/async/throttle.js @@ -72,6 +72,7 @@ goog.async.Throttle = function(listener, interval, opt_handler) { goog.inherits(goog.async.Throttle, goog.Disposable); + /** * A deprecated alias. * @deprecated Use goog.async.Throttle instead. diff --git a/contrib/closure-library/goog/async/throttle_test.html b/contrib/closure-library/goog/async/throttle_test.html index 47caa08..fb653ca 100644 --- a/contrib/closure-library/goog/async/throttle_test.html +++ b/contrib/closure-library/goog/async/throttle_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/base.js b/contrib/closure-library/goog/base.js index 6d11d4f..e1e353d 100644 --- a/contrib/closure-library/goog/base.js +++ b/contrib/closure-library/goog/base.js @@ -21,6 +21,7 @@ * */ + /** * @define {boolean} Overridden to true by the compiler when --closure_pass * or --mark_as_compiled is specified. @@ -35,7 +36,7 @@ var COMPILED = false; * * @const */ -var goog = goog || {}; +var goog = goog || {}; // Identifies this file as the Closure base. /** @@ -78,20 +79,13 @@ goog.LOCALE = 'en'; // default to en /** - * Indicates whether or not we can call 'eval' directly to eval code in the - * global scope. Set to a Boolean by the first call to goog.globalEval (which - * empirically tests whether eval works for globals). @see goog.globalEval - * @type {?boolean} - * @private - */ -goog.evalWorksForGlobals_ = null; - - -/** - * Creates object stubs for a namespace. When present in a file, goog.provide - * also indicates that the file defines the indicated object. Calls to - * goog.provide are resolved by the compiler if --closure_pass is set. - * @param {string} name name of the object that this file defines. + * Creates object stubs for a namespace. The presence of one or more + * goog.provide() calls indicate that the file defines the given + * objects/namespaces. Build tools also scan for provide/require statements + * to discern dependencies, build dependency files (see deps.js), etc. + * @see goog.require + * @param {string} name Namespace provided by this file in the form + * "goog.package.part". */ goog.provide = function(name) { if (!COMPILED) { @@ -100,12 +94,16 @@ goog.provide = function(name) { // declaration. And when JSCompiler transforms goog.provide into a real // variable declaration, the compiled JS should work the same as the raw // JS--even when the raw JS uses goog.provide incorrectly. - if (goog.getObjectByName(name) && !goog.implicitNamespaces_[name]) { + if (goog.isProvided_(name)) { throw Error('Namespace "' + name + '" already declared.'); } + delete goog.implicitNamespaces_[name]; var namespace = name; while ((namespace = namespace.substring(0, namespace.lastIndexOf('.')))) { + if (goog.getObjectByName(namespace)) { + break; + } goog.implicitNamespaces_[namespace] = true; } } @@ -130,6 +128,18 @@ goog.setTestOnly = function(opt_message) { if (!COMPILED) { + + /** + * Check if the given name has been goog.provided. This will return false for + * names that are available only as implicit namespaces. + * @param {string} name name of the object to look for. + * @return {boolean} Whether the name has been provided. + * @private + */ + goog.isProvided_ = function(name) { + return !goog.implicitNamespaces_[name] && !!goog.getObjectByName(name); + }; + /** * Namespaces implicitly defined by goog.provide. For example, * goog.provide('goog.events.Event') implicitly declares @@ -198,7 +208,7 @@ goog.getObjectByName = function(name, opt_obj) { var parts = name.split('.'); var cur = opt_obj || goog.global; for (var part; part = parts.shift(); ) { - if (cur[part]) { + if (goog.isDefAndNotNull(cur[part])) { cur = cur[part]; } else { return null; @@ -254,14 +264,49 @@ goog.addDependency = function(relPath, provides, requires) { }; + + +// NOTE(user): The debug DOM loader was included in base.js as an orignal +// way to do "debug-mode" development. The dependency system can sometimes +// be confusing, as can the debug DOM loader's asyncronous nature. +// +// With the DOM loader, a call to goog.require() is not blocking -- the +// script will not load until some point after the current script. If a +// namespace is needed at runtime, it needs to be defined in a previous +// script, or loaded via require() with its registered dependencies. +// User-defined namespaces may need their own deps file. See http://go/js_deps, +// http://go/genjsdeps, or, externally, DepsWriter. +// http://code.google.com/closure/library/docs/depswriter.html +// +// Because of legacy clients, the DOM loader can't be easily removed from +// base.js. Work is being done to make it disableable or replaceable for +// different environments (DOM-less JavaScript interpreters like Rhino or V8, +// for example). See bootstrap/ for more information. + + +/** + * @define {boolean} Whether to enable the debug loader. + * + * If enabled, a call to goog.require() will attempt to load the namespace by + * appending a script tag to the DOM (if the namespace has been registered). + * + * If disabled, goog.require() will simply assert that the namespace has been + * provided (and depend on the fact that some outside tool correctly ordered + * the script). + */ +goog.ENABLE_DEBUG_LOADER = true; + + /** * Implements a system for the dynamic resolution of dependencies * that works in parallel with the BUILD system. Note that all calls * to goog.require will be stripped by the JSCompiler when the * --closure_pass option is used. - * @param {string} rule Rule to include, in the form goog.package.part. + * @see goog.provide + * @param {string} name Namespace to include (as was given in goog.provide()) + * in the form "goog.package.part". */ -goog.require = function(rule) { +goog.require = function(name) { // if the object already exists we do not need do do anything // TODO(user): If we start to support require based on file name this has @@ -270,21 +315,27 @@ goog.require = function(rule) { // TODO(user): If we implement dynamic load after page load we should probably // not remove this code for the compiled output if (!COMPILED) { - if (goog.getObjectByName(rule)) { + if (goog.isProvided_(name)) { return; } - var path = goog.getPathFromDeps_(rule); - if (path) { - goog.included_[path] = true; - goog.writeScripts_(); - } else { - var errorMessage = 'goog.require could not find: ' + rule; - if (goog.global.console) { - goog.global.console['error'](errorMessage); + + if (goog.ENABLE_DEBUG_LOADER) { + var path = goog.getPathFromDeps_(name); + if (path) { + goog.included_[path] = true; + goog.writeScripts_(); + return; } + } - throw Error(errorMessage); + var errorMessage = 'goog.require could not find: ' + name; + if (goog.global.console) { + goog.global.console['error'](errorMessage); } + + + throw Error(errorMessage); + } }; @@ -311,6 +362,18 @@ goog.global.CLOSURE_BASE_PATH; goog.global.CLOSURE_NO_DEPS; +/** + * A function to import a single script. This is meant to be overridden when + * Closure is being run in non-HTML contexts, such as web workers. It's defined + * in the global scope so that it can be set before base.js is loaded, which + * allows deps.js to be imported properly. + * + * The function is passed the script source, which is a relative URI. It should + * return true if the script was imported, false otherwise. + */ +goog.global.CLOSURE_IMPORT_SCRIPT; + + /** * Null function used for default values of callbacks, etc. * @return {void} Nothing. @@ -364,7 +427,7 @@ goog.addSingletonGetter = function(ctor) { }; -if (!COMPILED) { +if (!COMPILED && goog.ENABLE_DEBUG_LOADER) { /** * Object used to keep track of urls that have already been added. This * record allows the prevention of circular dependencies. @@ -408,21 +471,21 @@ if (!COMPILED) { * @private */ goog.findBasePath_ = function() { - if (!goog.inHtmlDocument_()) { - return; - } - var doc = goog.global.document; if (goog.global.CLOSURE_BASE_PATH) { goog.basePath = goog.global.CLOSURE_BASE_PATH; return; + } else if (!goog.inHtmlDocument_()) { + return; } + var doc = goog.global.document; var scripts = doc.getElementsByTagName('script'); // Search backwards since the current script is in almost all cases the one // that has base.js. for (var i = scripts.length - 1; i >= 0; --i) { var src = scripts[i].src; - var l = src.length; - if (src.substr(l - 7) == 'base.js') { + var qmark = src.lastIndexOf('?'); + var l = qmark == -1 ? src.length : qmark; + if (src.substr(l - 7, 7) == 'base.js') { goog.basePath = src.substr(0, l - 7); return; } @@ -431,25 +494,43 @@ if (!COMPILED) { /** - * Writes a script tag if, and only if, that script hasn't already been added - * to the document. (Must be called at execution time) + * Imports a script if, and only if, that script hasn't already been imported. + * (Must be called at execution time) * @param {string} src Script source. * @private */ - goog.writeScriptTag_ = function(src) { - if (goog.inHtmlDocument_() && - !goog.dependencies_.written[src]) { + goog.importScript_ = function(src) { + var importScript = goog.global.CLOSURE_IMPORT_SCRIPT || + goog.writeScriptTag_; + if (!goog.dependencies_.written[src] && importScript(src)) { goog.dependencies_.written[src] = true; + } + }; + + + /** + * The default implementation of the import function. Writes a script tag to + * import the script. + * + * @param {string} src The script source. + * @return {boolean} True if the script was imported, false otherwise. + * @private + */ + goog.writeScriptTag_ = function(src) { + if (goog.inHtmlDocument_()) { var doc = goog.global.document; - doc.write(' @@ -67,9 +69,12 @@ diff --git a/contrib/closure-library/goog/bootstrap/webworkers.js b/contrib/closure-library/goog/bootstrap/webworkers.js new file mode 100644 index 0000000..7799a0a --- /dev/null +++ b/contrib/closure-library/goog/bootstrap/webworkers.js @@ -0,0 +1,37 @@ +// Copyright 2010 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview A bootstrap for dynamically requiring Closure within an HTML5 + * Web Worker context. To use this, first set CLOSURE_BASE_PATH to the directory + * containing base.js (relative to the main script), then use importScripts to + * load this file and base.js (in that order). After this you can use + * goog.require for further imports. + * + * @nocompile + */ + + +/** + * Imports a script using the Web Worker importScript API. + * + * @param {string} src The script source. + * @return {boolean} True if the script was imported, false otherwise. + */ +this.CLOSURE_IMPORT_SCRIPT = (function(global) { + return function(src) { + global['importScripts'](src); + return true; + }; +})(this); diff --git a/contrib/closure-library/goog/color/alpha_test.html b/contrib/closure-library/goog/color/alpha_test.html index 1cccb89..2396633 100644 --- a/contrib/closure-library/goog/color/alpha_test.html +++ b/contrib/closure-library/goog/color/alpha_test.html @@ -3,7 +3,7 @@ @@ -17,6 +17,7 @@ goog.require('goog.testing.jsunit'); + - - - diff --git a/contrib/closure-library/goog/color/color.js b/contrib/closure-library/goog/color/color.js index 541e5cd..43a4a02 100644 --- a/contrib/closure-library/goog/color/color.js +++ b/contrib/closure-library/goog/color/color.js @@ -212,6 +212,7 @@ goog.color.rgbArrayToHsl = function(rgb) { return goog.color.rgbToHsl(rgb[0], rgb[1], rgb[2]); }; + /** * Helper for hslToRgb. * @param {number} v1 Helper variable 1. @@ -291,6 +292,7 @@ goog.color.hslArrayToRgb = function(hsl) { */ goog.color.validHexColorRe_ = /^#(?:[0-9a-f]{3}){1,2}$/i; + /** * Checks if a string is a valid hex color. We expect strings of the format * #RRGGBB (ex: #1b3d5f) or #RGB (ex: #3CA == #33CCAA). @@ -302,6 +304,7 @@ goog.color.isValidHexColor_ = function(str) { return goog.color.validHexColorRe_.test(str); }; + /** * Helper for isNormalizedHexColor_. * @type {RegExp} @@ -309,6 +312,7 @@ goog.color.isValidHexColor_ = function(str) { */ goog.color.normalizedHexColorRe_ = /^#[0-9a-f]{6}$/; + /** * Checks if a string is a normalized hex color. * We expect strings of the format #RRGGBB (ex: #1b3d5f) @@ -331,6 +335,7 @@ goog.color.isNormalizedHexColor_ = function(str) { goog.color.rgbColorRe_ = /^(?:rgb)?\((0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2})\)$/i; + /** * Checks if a string is a valid rgb color. We expect strings of the format * '(r, g, b)', or 'rgb(r, g, b)', where each color component is an int in @@ -398,7 +403,7 @@ goog.color.rgbStyle_ = function(rgb) { /** * Converts an HSV triplet to an RGB array. V is brightness because b is * reserved for blue in RGB. - * @param {number} h Hue value in [0, 1]. + * @param {number} h Hue value in [0, 360]. * @param {number} s Saturation value in [0, 1]. * @param {number} brightness brightness in [0, 255]. * @return {!Array.} Array of r,g,b values. @@ -455,6 +460,7 @@ goog.color.hsvToRgb = function(h, s, brightness) { return [Math.floor(red), Math.floor(green), Math.floor(blue)]; }; + /** * Converts from RGB values to an array of HSV values. * @param {number} red Red value. @@ -495,6 +501,7 @@ goog.color.rgbToHsv = function(red, green, blue) { return [hue, saturation, value]; }; + /** * Converts from r,g,b values to an array of HSV values * @param {Array.} rgb RGB array. @@ -504,6 +511,7 @@ goog.color.rgbArrayToHsv = function(rgb) { return goog.color.rgbToHsv(rgb[0], rgb[1], rgb[2]); }; + /** * Converts an HSV triplet to an RGB array * @param {Array.} hsv Array of HSV values. @@ -513,6 +521,7 @@ goog.color.hsvArrayToRgb = function(hsv) { return goog.color.hsvToRgb(hsv[0], hsv[1], hsv[2]); }; + /** * Converts a hex representation of a color to HSL. * @param {string} hex Color to convert. @@ -524,6 +533,7 @@ goog.color.hexToHsl = function(hex) { return goog.color.rgbToHsl(rgb[0], rgb[1], rgb[2]); }; + /** * Converts from h,s,l values to a hex string * @param {number} h Hue, in [0, 360]. @@ -535,6 +545,7 @@ goog.color.hslToHex = function(h, s, l) { return goog.color.rgbArrayToHex(goog.color.hslToRgb(h, s, l)); }; + /** * Converts from an hsl array to a hex string * @param {Array.} hsl Array of [h, s, l], in @@ -545,6 +556,7 @@ goog.color.hslArrayToHex = function(hsl) { return goog.color.rgbArrayToHex(goog.color.hslToRgb(hsl[0], hsl[1], hsl[2])); }; + /** * Converts a hex representation of a color to HSV * @param {string} hex Color to convert. @@ -554,9 +566,10 @@ goog.color.hexToHsv = function(hex) { return goog.color.rgbArrayToHsv(goog.color.hexToRgb(hex)); }; + /** * Converts from h,s,v values to a hex string - * @param {number} h Hue, in [0, 1]. + * @param {number} h Hue, in [0, 360]. * @param {number} s Saturation, in [0, 1]. * @param {number} v Value, in [0, 255]. * @return {string} hex representation of the color. @@ -565,9 +578,10 @@ goog.color.hsvToHex = function(h, s, v) { return goog.color.rgbArrayToHex(goog.color.hsvToRgb(h, s, v)); }; + /** * Converts from an HSV array to a hex string - * @param {Array} hsv Array of [h, s, v] in [[0, 1], [0, 1], [0, 255]]. + * @param {Array} hsv Array of [h, s, v] in [[0, 360], [0, 1], [0, 255]]. * @return {string} hex representation of the color. */ goog.color.hsvArrayToHex = function(hsv) { diff --git a/contrib/closure-library/goog/color/color_test.html b/contrib/closure-library/goog/color/color_test.html index e8c653e..921e660 100644 --- a/contrib/closure-library/goog/color/color_test.html +++ b/contrib/closure-library/goog/color/color_test.html @@ -3,7 +3,7 @@ @@ -65,16 +65,8 @@ var badColors = ['rgb(01, 1, 23)', '(256, 256, 256)', '#ffeeddaa']; for (var i = 0; i < badColors.length; i++) { - try { - goog.color.parse(badColors[i]); - fail("Shouldn't reach here since " + badColors[i] + " is not a valid " + - "color string"); - } catch (e) { - if(!e.message) throw e; - if(e.message.indexOf("is not a valid color string") == -1) { - fail("Error processing " + badColors[i] + " : " + e.message); - } - } + var e = assertThrows(goog.partial(goog.color.parse, badColors[i])); + assertContains('is not a valid color string', e.message); } } @@ -95,11 +87,8 @@ var badColors = ['', '#g00', 'some words']; for (var i = 0; i < badColors.length; i++) { - try { - } catch (e) { - assertEquals("'" + badColors[i] + "' is not a valid hex color", - e.message); - } + var e = assertThrows(goog.partial(goog.color.hexToRgb, badColors[i])); + assertEquals("'" + badColors[i] + "' is not a valid hex color", e.message); } } @@ -110,14 +99,9 @@ assertEquals('rgb(51,204,170)', goog.color.hexToRgbStyle('#3CA')); var badHexColors = ['#1234', null, undefined, '#.1234567890']; for (var i = 0; i < badHexColors.length; ++i) { - try { - goog.color.hexToRgbStyle(badHexColors[i]); - fail("Shouldn't make it here since " + badHexColors[i] + " is an " + - "invalid hex color"); - } catch (e) { - assertEquals("'" + badHexColors[i] + "' is not a valid hex color", - e.message); - } + var badHexColor = badHexColors[i]; + var e = assertThrows(goog.partial(goog.color.hexToRgbStyle, badHexColor)); + assertEquals("'" + badHexColor + "' is not a valid hex color", e.message); } } @@ -127,13 +111,8 @@ assertEquals('#af13ff', goog.color.rgbToHex(175, 19, 255)); var badRgb = [[-1, -1, -1], [256, 0, 0], ['a', 'b', 'c'], [undefined, 5, 5]]; for (var i = 0; i < badRgb.length; ++i) { - try { - goog.color.rgbArrayToHex(badRgb[i]); - fail("Shouldn't make it here since " + badRgb[i] + "is not a valid " + - "rgb color"); - } catch (e) { - assertTrue(e.message.indexOf("is not a valid RGB color") > -1); - } + var e = assertThrows(goog.partial(goog.color.rgbArrayToHex, badRgb[i])); + assertContains('is not a valid RGB color', e.message); } } diff --git a/contrib/closure-library/goog/crypt/arc4.js b/contrib/closure-library/goog/crypt/arc4.js index 6ae659d..33fe0fc 100644 --- a/contrib/closure-library/goog/crypt/arc4.js +++ b/contrib/closure-library/goog/crypt/arc4.js @@ -111,16 +111,13 @@ goog.crypt.Arc4.prototype.discard = function(n) { /** * En- or decrypt (same operation for streamciphers like ARC4) - * @param {Array.} data The data to be xor-ed in place. + * @param {Array.|Uint8Array} data The data to be xor-ed in place. * @param {number=} opt_length The number of bytes to crypt. */ goog.crypt.Arc4.prototype.crypt = function(data, opt_length) { if (!opt_length) { opt_length = data.length; } - - goog.asserts.assertArray(data, 'Data parameter must be a byte array'); - var i = this.index1_; var j = this.index2_; var state = this.state_; diff --git a/contrib/closure-library/goog/crypt/arc4_test.html b/contrib/closure-library/goog/crypt/arc4_test.html index 2f4a058..5e5b7f7 100644 --- a/contrib/closure-library/goog/crypt/arc4_test.html +++ b/contrib/closure-library/goog/crypt/arc4_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/crypt/base64.js b/contrib/closure-library/goog/crypt/base64.js index 014f518..273f11b 100644 --- a/contrib/closure-library/goog/crypt/base64.js +++ b/contrib/closure-library/goog/crypt/base64.js @@ -20,11 +20,12 @@ */ goog.provide('goog.crypt.base64'); - goog.require('goog.crypt'); +goog.require('goog.userAgent'); // Static lookup maps, lazily populated by init_() + /** * Maps bytes to characters. * @type {Object} @@ -84,6 +85,20 @@ goog.crypt.base64.ENCODED_VALS_WEBSAFE = goog.crypt.base64.ENCODED_VALS_BASE + '-_.'; +/** + * Whether this browser supports the atob and btoa functions. This extension + * started at Mozilla but is now implemented by many browsers. We use the + * ASSUME_* variables to avoid pulling in the full useragent detection library + * but still allowing the standard per-browser compilations. + * + * @type {boolean} + */ +goog.crypt.base64.HAS_NATIVE_SUPPORT = goog.userAgent.GECKO || + goog.userAgent.WEBKIT || + goog.userAgent.OPERA || + typeof(goog.global.atob) == 'function'; + + /** * Base64-encode an array of bytes. * @@ -147,7 +162,7 @@ goog.crypt.base64.encodeByteArray = function(input, opt_webSafe) { goog.crypt.base64.encodeString = function(input, opt_webSafe) { // Shortcut for Mozilla browsers that implement // a native base64 encoder in the form of "btoa/atob" - if (typeof goog.global.btoa == 'function' && !opt_webSafe) { + if (goog.crypt.base64.HAS_NATIVE_SUPPORT && !opt_webSafe) { return goog.global.btoa(input); } return goog.crypt.base64.encodeByteArray( @@ -166,7 +181,7 @@ goog.crypt.base64.encodeString = function(input, opt_webSafe) { goog.crypt.base64.decodeString = function(input, opt_webSafe) { // Shortcut for Mozilla browsers that implement // a native base64 encoder in the form of "btoa/atob" - if (typeof goog.global.atob == 'function' && !opt_webSafe) { + if (goog.crypt.base64.HAS_NATIVE_SUPPORT && !opt_webSafe) { return goog.global.atob(input); } return goog.crypt.byteArrayToString( @@ -177,17 +192,12 @@ goog.crypt.base64.decodeString = function(input, opt_webSafe) { /** * Base64-decode a string. * - * @param {string} input to decode. + * @param {string} input to decode (length not required to be a multiple of 4). * @param {boolean=} opt_webSafe True if we should use the * alternative alphabet. * @return {Array} bytes representing the decoded value. */ goog.crypt.base64.decodeStringToByteArray = function(input, opt_webSafe) { - - if (input.length % 4) { - throw Error('Length of b64-encoded data must be zero mod four'); - } - goog.crypt.base64.init_(); var charToByteMap = opt_webSafe ? @@ -196,12 +206,20 @@ goog.crypt.base64.decodeStringToByteArray = function(input, opt_webSafe) { var output = []; - for (var i = 0; i < input.length; i += 4) { + for (var i = 0; i < input.length; ) { + var byte1 = charToByteMap[input.charAt(i++)]; + + var haveByte2 = i < input.length; + var byte2 = haveByte2 ? charToByteMap[input.charAt(i)] : 0; + ++i; + + var haveByte3 = i < input.length; + var byte3 = haveByte3 ? charToByteMap[input.charAt(i)] : 0; + ++i; - var byte1 = charToByteMap[input.charAt(i)]; - var byte2 = charToByteMap[input.charAt(i + 1)]; - var byte3 = charToByteMap[input.charAt(i + 2)]; - var byte4 = charToByteMap[input.charAt(i + 3)]; + var haveByte4 = i < input.length; + var byte4 = haveByte4 ? charToByteMap[input.charAt(i)] : 0; + ++i; if (byte1 == null || byte2 == null || byte3 == null || byte4 == null) { diff --git a/contrib/closure-library/goog/crypt/base64_test.html b/contrib/closure-library/goog/crypt/base64_test.html index 21dcc9a..dccbb32 100644 --- a/contrib/closure-library/goog/crypt/base64_test.html +++ b/contrib/closure-library/goog/crypt/base64_test.html @@ -3,7 +3,7 @@ @@ -46,6 +46,18 @@ } } +function testOddLengthByteArrayEncoding() { + var buffer = [0, 0, 0]; + var encodedBuffer = goog.crypt.base64.encodeByteArray(buffer); + assertEquals('AAAA', encodedBuffer); + + var decodedBuffer = goog.crypt.base64.decodeStringToByteArray(encodedBuffer); + assertEquals(decodedBuffer.length, buffer.length); + for (i = 0; i < buffer.length; i++) { + assertEquals(buffer[i], decodedBuffer[i]); + } +} + function testShortcutPathEncoding() { // Test the higher-level API (tests the btoa/atob shortcut path) for (var i = 0; i < tests.length; i += 2) { @@ -68,7 +80,6 @@ var encoded = goog.crypt.base64.encodeByteArray(input); var decoded = goog.crypt.base64.decodeStringToByteArray(encoded); - assert("Encoded length not a multiple of 4?", !(encoded.length % 4)); assertEquals("Decoded length not equal to input length?", input.length, decoded.length); @@ -97,13 +108,9 @@ assertEquals("Websafe decoding broken", test, dec); // Test parsing malformed characters - var caught = false; - try { + assertThrows("Didn't throw on malformed input", function() { goog.crypt.base64.decodeStringToByteArray("foooooo+oooo", true /*websafe*/); - } catch(e) { - caught = true; - } - assertTrue("Didn't throw on malformed input", caught); + }); } diff --git a/contrib/closure-library/goog/crypt/basen_test.html b/contrib/closure-library/goog/crypt/basen_test.html index a6f3989..0d12d8c 100644 --- a/contrib/closure-library/goog/crypt/basen_test.html +++ b/contrib/closure-library/goog/crypt/basen_test.html @@ -3,7 +3,7 @@ @@ -114,29 +114,24 @@ } function testEmptyBases() { - try { + var e = assertThrows(function() { goog.crypt.baseN.recodeString('1230', '', '0123'); - fail('Exception "Number contains a character not found in base" expected'); - } catch(e) { - assertEquals('Number 1230 contains a character not found in ' + - 'base , which is 0', e.message); - } - try { + }); + assertEquals('Exception message', 'Number 1230 contains a character ' + + 'not found in base , which is 0', e.message); + + e = assertThrows(function() { goog.crypt.baseN.recodeString('1230', '0123', ''); - fail('Exception "Empty output base" expected'); - } catch(e) { - assertEquals('Empty output base', e.message); - } + }); + assertEquals('Exception message', 'Empty output base', e.message); } function testInvalidDigits() { - try { + var e = assertThrows(function() { goog.crypt.baseN.recodeString('123x456', '01234567', '01234567'); - fail('Exception "Number contains a character not found in base" expected'); - } catch(e) { - assertEquals('Number 123x456 contains a character not found in ' + - 'base 01234567, which is x', e.message); - } + }); + assertEquals('Exception message', 'Number 123x456 contains a character ' + + 'not found in base 01234567, which is x', e.message); } function makeHugeBase() { diff --git a/contrib/closure-library/goog/crypt/blobhasher.js b/contrib/closure-library/goog/crypt/blobhasher.js new file mode 100644 index 0000000..257d9ce --- /dev/null +++ b/contrib/closure-library/goog/crypt/blobhasher.js @@ -0,0 +1,229 @@ +// Copyright 2011 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Asynchronous hash computer for the Blob interface. + * + * The Blob interface, part of the HTML5 File API, is supported on Chrome 7+, + * Firefox 4.0 and Opera 11. No Blob interface implementation is expected on + * Internet Explorer 10. Chrome 11, Firefox 5.0 and the subsequent release of + * Opera are supposed to use vendor prefixes due to evolving API, see + * http://dev.w3.org/2006/webapi/FileAPI/ for details. + * + * This implementation currently uses upcoming Chrome and Firefox prefixes, + * plus the original Blob.slice specification, as implemented on Chrome 10 + * and Firefox 4.0. + * + */ + +goog.provide('goog.crypt.BlobHasher'); +goog.provide('goog.crypt.BlobHasher.EventType'); + +goog.require('goog.asserts'); +goog.require('goog.crypt'); +goog.require('goog.crypt.Hash'); +goog.require('goog.debug.Logger'); +goog.require('goog.events.EventTarget'); +goog.require('goog.fs'); + + + +/** + * Construct the hash computer. + * + * @param {goog.crypt.Hash} hashFn The hash function to use. + * @param {number=} opt_blockSize Processing block size. + * @constructor + * @extends {goog.events.EventTarget} + */ +goog.crypt.BlobHasher = function(hashFn, opt_blockSize) { + goog.base(this); + + /** + * The actual hash function. + * @type {goog.crypt.Hash} + * @private + */ + this.hashFn_ = hashFn; + + /** + * The blob being processed. + * @type {Blob} + * @private + */ + this.blob_ = null; + + /** + * Computed hash value. + * @type {Array.} + * @private + */ + this.hashVal_ = null; + + /** + * Number of bytes already processed. + * @type {number} + * @private + */ + this.bytesProcessed_ = 0; + + /** + * Processing block size. + * @type {number} + * @private + */ + this.blockSize_ = opt_blockSize || 5000000; + + /** + * File reader object. + * @type {FileReader} + * @private + */ + this.fileReader_ = null; + + /** + * The logger used by this object. + * @type {goog.debug.Logger} + * @private + */ + this.logger_ = goog.debug.Logger.getLogger('goog.crypt.BlobHasher'); +}; +goog.inherits(goog.crypt.BlobHasher, goog.events.EventTarget); + + +/** + * Event names for hash computation events + * @enum {string} + */ +goog.crypt.BlobHasher.EventType = { + STARTED: 'started', + PROGRESS: 'progress', + COMPLETE: 'complete', + ABORT: 'abort', + ERROR: 'error' +}; + + +/** + * Start the hash computation. + * @param {Blob} blob The blob of data to compute the hash for. + */ +goog.crypt.BlobHasher.prototype.hash = function(blob) { + this.abort(); + this.hashFn_.reset(); + this.blob_ = blob; + this.hashVal_ = null; + this.bytesProcessed_ = 0; + this.dispatchEvent(goog.crypt.BlobHasher.EventType.STARTED); + + this.processNextBlock_(); +}; + + +/** + * Abort hash computation. + */ +goog.crypt.BlobHasher.prototype.abort = function() { + if (this.fileReader_ && + this.fileReader_.readyState != this.fileReader_.DONE) { + this.fileReader_.abort(); + } +}; + + +/** + * @return {number} Number of bytes processed so far. + */ +goog.crypt.BlobHasher.prototype.getBytesProcessed = function() { + return this.bytesProcessed_; +}; + + +/** + * @return {?Array.} The computed hash value or null if not ready. + */ +goog.crypt.BlobHasher.prototype.getHash = function() { + return this.hashVal_; +}; + + +/** + * Helper function setting up the processing for the next block, or finalizing + * the computation if all blocks were processed. + * @private + */ +goog.crypt.BlobHasher.prototype.processNextBlock_ = function() { + goog.asserts.assert(this.blob_, 'The blob has disappeared during processing'); + if (this.bytesProcessed_ < this.blob_.size) { + // We have to reset the FileReader every time, otherwise it fails on + // Chrome, including the latest Chrome 12 beta. + // http://code.google.com/p/chromium/issues/detail?id=82346 + this.fileReader_ = new FileReader(); + this.fileReader_.onload = goog.bind(this.onLoad_, this); + this.fileReader_.onabort = goog.bind(this.dispatchEvent, this, + goog.crypt.BlobHasher.EventType.ABORT); + this.fileReader_.onerror = goog.bind(this.dispatchEvent, this, + goog.crypt.BlobHasher.EventType.ERROR); + + var size = Math.min(this.blob_.size - this.bytesProcessed_, + this.blockSize_); + var chunk = goog.fs.sliceBlob(this.blob_, this.bytesProcessed_, + this.bytesProcessed_ + size); + if (!chunk || chunk.size != size) { + this.logger_.severe('Failed slicing the blob'); + this.dispatchEvent(goog.crypt.BlobHasher.EventType.ERROR); + return; + } + + if (this.fileReader_.readAsArrayBuffer) { + this.fileReader_.readAsArrayBuffer(chunk); + } else if (this.fileReader_.readAsBinaryString) { + this.fileReader_.readAsBinaryString(chunk); + } else { + this.logger_.severe('Failed calling the chunk reader'); + this.dispatchEvent(goog.crypt.BlobHasher.EventType.ERROR); + } + } else { + this.hashVal_ = this.hashFn_.digest(); + this.dispatchEvent(goog.crypt.BlobHasher.EventType.COMPLETE); + } +}; + + +/** + * Handle processing block loaded. + * @private + */ +goog.crypt.BlobHasher.prototype.onLoad_ = function() { + this.logger_.info('Successfully loaded a chunk'); + + var array = null; + if (this.fileReader_.result instanceof Array || + goog.isString(this.fileReader_.result)) { + array = this.fileReader_.result; + } else if (goog.global['ArrayBuffer'] && goog.global['Uint8Array'] && + this.fileReader_.result instanceof ArrayBuffer) { + array = new Uint8Array(this.fileReader_.result); + } + if (!array) { + this.logger_.severe('Failed reading the chunk'); + this.dispatchEvent(goog.crypt.BlobHasher.EventType.ERROR); + return; + } + this.hashFn_.update(array); + this.bytesProcessed_ += array.length; + this.dispatchEvent(goog.crypt.BlobHasher.EventType.PROGRESS); + + this.processNextBlock_(); +}; diff --git a/contrib/closure-library/goog/crypt/blobhasher_test.html b/contrib/closure-library/goog/crypt/blobhasher_test.html new file mode 100644 index 0000000..221a5e4 --- /dev/null +++ b/contrib/closure-library/goog/crypt/blobhasher_test.html @@ -0,0 +1,240 @@ + + + + + +Closure Unit Tests - goog.crypt.BlobHasher + + + + + + + + diff --git a/contrib/closure-library/goog/crypt/crypt.js b/contrib/closure-library/goog/crypt/crypt.js index 8b485dc..67f3b56 100644 --- a/contrib/closure-library/goog/crypt/crypt.js +++ b/contrib/closure-library/goog/crypt/crypt.js @@ -18,6 +18,7 @@ goog.provide('goog.crypt'); +goog.require('goog.array'); /** @@ -52,6 +53,20 @@ goog.crypt.byteArrayToString = function(array) { }; +/** + * Turns an array of numbers into the hex string given by the concatenation of + * the hex values to which the numbers correspond. + * @param {Array} array Array of numbers representing characters. + * @return {string} Hex string. + */ +goog.crypt.byteArrayToHex = function(array) { + return goog.array.map(array, function(numByte) { + var hexByte = numByte.toString(16); + return hexByte.length > 1 ? hexByte : '0' + hexByte; + }).join(''); +}; + + /** * Converts a JS string to a UTF-8 "byte" array. * @param {string} str 16-bit unicode string. diff --git a/contrib/closure-library/goog/crypt/crypt_perf.html b/contrib/closure-library/goog/crypt/crypt_perf.html new file mode 100644 index 0000000..5f07375 --- /dev/null +++ b/contrib/closure-library/goog/crypt/crypt_perf.html @@ -0,0 +1,85 @@ + + + + + + + Closure Performance Tests - UTF8 encoding and decoding + + + + + +

Closure Performance Tests - UTF8 encoding and decoding

+

+ User-agent: + +

+
+
+ + + + diff --git a/contrib/closure-library/goog/crypt/crypt_test.html b/contrib/closure-library/goog/crypt/crypt_test.html index c48e1a3..effbe48 100644 --- a/contrib/closure-library/goog/crypt/crypt_test.html +++ b/contrib/closure-library/goog/crypt/crypt_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/crypt/hash.js b/contrib/closure-library/goog/crypt/hash.js new file mode 100644 index 0000000..713e4a1 --- /dev/null +++ b/contrib/closure-library/goog/crypt/hash.js @@ -0,0 +1,54 @@ +// Copyright 2011 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Abstract cryptographic hash interface. + * + * See goog.crypt.Sha1 and goog.crypt.Md5 for sample implementations. + * + */ + +goog.provide('goog.crypt.Hash'); + + + +/** + * Create a cryptographic hash instance. + * + * @constructor + */ +goog.crypt.Hash = function() {}; + + +/** + * Resets the internal accumulator. + */ +goog.crypt.Hash.prototype.reset = goog.abstractMethod; + + +/** + * Adds a byte array (array with values in [0-255] range) or a string (might + * only contain 8-bit, i.e., Latin1 characters) to the internal accumulator. + * + * @param {Array.|Uint8Array|string} bytes Data used for the update. + * @param {number=} opt_length Number of bytes to use. + */ +goog.crypt.Hash.prototype.update = goog.abstractMethod; + + +/** + * @return {Array.} The finalized hash computed + * from the internal accumulator. + */ +goog.crypt.Hash.prototype.digest = goog.abstractMethod; diff --git a/contrib/closure-library/goog/crypt/hash32_test.html b/contrib/closure-library/goog/crypt/hash32_test.html index 32423cc..67062c4 100644 --- a/contrib/closure-library/goog/crypt/hash32_test.html +++ b/contrib/closure-library/goog/crypt/hash32_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/crypt/hash_test.js b/contrib/closure-library/goog/crypt/hash_test.js new file mode 100644 index 0000000..bbd0fd6 --- /dev/null +++ b/contrib/closure-library/goog/crypt/hash_test.js @@ -0,0 +1,83 @@ +// Copyright 2011 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Unit tests for the abstract cryptographic hash interface. + * + */ + +goog.provide('goog.crypt.hash_test'); + +goog.require('goog.testing.asserts'); +goog.setTestOnly('hash_test'); + + +goog.crypt.hash_test.runBasicTests = function(hash) { + // Compute some hash. + hash.update([97, 158]); + var golden = hash.digest(); + + // Recompute the hash. + hash.reset(); + hash.update([97, 158]); + assertArrayEquals('The reset did not produce the initial state', + golden, hash.digest()); + + // Check for a trivial collision. + hash.reset(); + hash.update([158, 97]); + assertTrue('Swapping bytes resulted in a hash collision', + !!goog.testing.asserts.findDifferences(golden, hash.digest())); + + // Compute in parts. + hash.reset(); + hash.update([97]); + hash.update([158]); + assertArrayEquals('Partial updates resulted in a different hash', + golden, hash.digest()); + + // Test update with specified length. + hash.reset(); + hash.update([97, 158], 0); + hash.update([97, 158, 32], 2); + assertArrayEquals('Updating with an explicit buffer length did not work', + golden, hash.digest()); + + // Test array and string inputs. + hash.reset(); + hash.update([97, 66]); + golden = hash.digest(); + hash.reset(); + hash.update('aB'); + assertArrayEquals('String and array inputs should give the same result', + golden, hash.digest()); + + // Empty hash. + hash.reset(); + var empty = hash.digest(); + assertTrue('Empty hash collided with a non-trivial one', + !!goog.testing.asserts.findDifferences(golden, empty)); + + // Zero-length array update. + hash.reset(); + hash.update([]); + assertArrayEquals('Updating with an empty array did not give an empty hash', + empty, hash.digest()); + + // Zero-length string update. + hash.reset(); + hash.update(''); + assertArrayEquals('Updating with an empty string did not give an empty hash', + empty, hash.digest()); +}; diff --git a/contrib/closure-library/goog/crypt/hmac.js b/contrib/closure-library/goog/crypt/hmac.js new file mode 100644 index 0000000..6b3e7cf --- /dev/null +++ b/contrib/closure-library/goog/crypt/hmac.js @@ -0,0 +1,163 @@ +// Copyright 2011 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Implementation of HMAC in JavaScript. + * + * Usage: + * var hmac = new goog.crypt.Hmac(new goog.crypt.sha1(), key, 64); + * var digest = hmac.getHmac(bytes); + * + */ + + +goog.provide('goog.crypt.Hmac'); + +goog.require('goog.asserts'); +goog.require('goog.crypt.Hash'); + + + +/** + * @constructor + * @param {!goog.crypt.Hash} hasher An object to serve as a hash function. + * @param {Array.} key The secret key to use to calculate the hmac. + * Should be an array of not more than {@code blockSize} integers in + {0, 255}. + * @param {number=} opt_blockSize Optional. The block size {@code hasher} uses. + * If not specified, 16. + * @extends {goog.crypt.Hash} + */ +goog.crypt.Hmac = function(hasher, key, opt_blockSize) { + goog.base(this); + + /** + * The underlying hasher to calculate hash. + * + * @type {!goog.crypt.Hash} + * @private + */ + this.hasher_ = hasher; + + /** + * The block size. + * + * @type {number} + * @private + */ + this.blockSize_ = opt_blockSize || 16; + + /** + * The outer padding array of hmac + * + * @type {!Array.} + * @private + */ + this.keyO_ = new Array(this.blockSize_); + + /** + * The inner padding array of hmac + * + * @type {!Array.} + * @private + */ + this.keyI_ = new Array(this.blockSize_); + + this.initialize_(key); +}; +goog.inherits(goog.crypt.Hmac, goog.crypt.Hash); + + +/** + * Outer padding byte of HMAC algorith, per http://en.wikipedia.org/wiki/HMAC + * + * @type {number} + * @private + */ +goog.crypt.Hmac.OPAD_ = 0x5c; + + +/** + * Inner padding byte of HMAC algorith, per http://en.wikipedia.org/wiki/HMAC + * + * @type {number} + * @private + */ +goog.crypt.Hmac.IPAD_ = 0x36; + + +/** + * Initializes Hmac by precalculating the inner and outer paddings. + * + * @param {Array.} key The secret key to use to calculate the hmac. + * Should be an array of not more than {@code blockSize} integers in + {0, 255}. + * @private + */ +goog.crypt.Hmac.prototype.initialize_ = function(key) { + if (key.length > this.blockSize_) { + this.hasher_.update(key); + key = this.hasher_.digest(); + } + // Precalculate padded and xor'd keys. + var keyByte; + for (var i = 0; i < this.blockSize_; i++) { + if (i < key.length) { + keyByte = key[i]; + } else { + keyByte = 0; + } + this.keyO_[i] = keyByte ^ goog.crypt.Hmac.OPAD_; + this.keyI_[i] = keyByte ^ goog.crypt.Hmac.IPAD_; + } + // Be ready for an immediate update. + this.hasher_.update(this.keyI_); +}; + + +/** @inheritDoc */ +goog.crypt.Hmac.prototype.reset = function() { + this.hasher_.reset(); + this.hasher_.update(this.keyI_); +}; + + +/** @inheritDoc */ +goog.crypt.Hmac.prototype.update = function(bytes, opt_length) { + this.hasher_.update(bytes, opt_length); +}; + + +/** @inheritDoc */ +goog.crypt.Hmac.prototype.digest = function() { + var temp = this.hasher_.digest(); + this.hasher_.reset(); + this.hasher_.update(this.keyO_); + this.hasher_.update(temp); + return this.hasher_.digest(); +}; + + +/** + * Calculates an HMAC for a given message. + * + * @param {Array.} message An array of integers in {0, 255}. + * @return {Array} the digest of the given message. + */ +goog.crypt.Hmac.prototype.getHmac = function(message) { + this.reset(); + this.update(message); + return this.digest(); +}; + diff --git a/contrib/closure-library/goog/crypt/hmac_test.html b/contrib/closure-library/goog/crypt/hmac_test.html new file mode 100644 index 0000000..80ddfe9 --- /dev/null +++ b/contrib/closure-library/goog/crypt/hmac_test.html @@ -0,0 +1,113 @@ + + + + + +Closure Unit Tests - goog.crypt.sha1 + + + + + + + diff --git a/contrib/closure-library/goog/crypt/md5.js b/contrib/closure-library/goog/crypt/md5.js new file mode 100644 index 0000000..0a13324 --- /dev/null +++ b/contrib/closure-library/goog/crypt/md5.js @@ -0,0 +1,402 @@ +// Copyright 2011 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview MD5 cryptographic hash. + * Implementation of http://tools.ietf.org/html/rfc1321 with common + * optimizations and tweaks (see http://en.wikipedia.org/wiki/MD5). + * + * Usage: + * var md5 = new goog.crypt.Md5(); + * md5.update(bytes); + * var hash = md5.digest(); + * + * Performance: + * Chrome 10/11 ~100 Mbit/s + * Firefox 4.0 ~16 Mbit/s + * IE9 ~20 Mbit/s + * + */ + +goog.provide('goog.crypt.Md5'); + +goog.require('goog.crypt.Hash'); + + + +/** + * MD5 cryptographic hash constructor. + * @constructor + * @extends {goog.crypt.Hash} + */ +goog.crypt.Md5 = function() { + goog.base(this); + + /** + * Holds the current values of accumulated A-D variables (MD buffer). + * @type {Array.} + * @private + */ + this.chain_ = new Array(4); + + /** + * A buffer holding the data until the whole block can be processed. + * @type {Array.} + * @private + */ + this.block_ = new Array(64); + + /** + * The length of yet-unprocessed data as collected in the block. + * @type {number} + * @private + */ + this.blockLength_ = 0; + + /** + * The total length of the message so far. + * @type {number} + * @private + */ + this.totalLength_ = 0; + + this.reset(); +}; +goog.inherits(goog.crypt.Md5, goog.crypt.Hash); + + +/** + * Integer rotation constants used by the abbreviated implementation. + * They are hardcoded in the unrolled implementation, so it is left + * here commented out. + * @type {Array.} + * @private + * +goog.crypt.Md5.S_ = [ + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 +]; + */ + +/** + * Sine function constants used by the abbreviated implementation. + * They are hardcoded in the unrolled implementation, so it is left + * here commented out. + * @type {Array.} + * @private + * +goog.crypt.Md5.T_ = [ + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 +]; + */ + + +/** @inheritDoc */ +goog.crypt.Md5.prototype.reset = function() { + this.chain_[0] = 0x67452301; + this.chain_[1] = 0xefcdab89; + this.chain_[2] = 0x98badcfe; + this.chain_[3] = 0x10325476; + + this.blockLength_ = 0; + this.totalLength_ = 0; +}; + + +/** + * Internal compress helper function. It takes a block of data (64 bytes) + * and updates the accumulator. + * @param {Array.} buf Buffer with the block to compress. + * @param {number=} opt_offset Offset of the block in the buffer. + * @private + */ +goog.crypt.Md5.prototype.compress_ = function(buf, opt_offset) { + if (!opt_offset) { + opt_offset = 0; + } + + // We allocate the array every time, but it's cheap in practice. + var X = new Array(16); + + // Get 16 little endian words. It is not worth unrolling this for Chrome 11. + for (var i = opt_offset; i < opt_offset + 64; i += 4) { + X[i / 4] = (buf[i]) | + (buf[i + 1] << 8) | + (buf[i + 2] << 16) | + (buf[i + 3] << 24); + } + + var A = this.chain_[0]; + var B = this.chain_[1]; + var C = this.chain_[2]; + var D = this.chain_[3]; + var sum = 0; + + /* + * This is an abbreviated implementation, it is left here commented out for + * reference purposes. See below for an unrolled version in use. + * + var f, n, tmp; + for (var i = 0; i < 64; ++i) { + + if (i < 16) { + f = (D ^ (B & (C ^ D))); + n = i; + } else if (i < 32) { + f = (C ^ (D & (B ^ C))); + n = (5 * i + 1) % 16; + } else if (i < 48) { + f = (B ^ C ^ D); + n = (3 * i + 5) % 16; + } else { + f = (C ^ (B | (~D))); + n = (7 * i) % 16; + } + + tmp = D; + D = C; + C = B; + sum = (A + f + goog.crypt.Md5.T_[i] + X[n]) & 0xffffffff; + B += ((sum << goog.crypt.Md5.S_[i]) & 0xffffffff) | + (sum >>> (32 - goog.crypt.Md5.S_[i])); + A = tmp; + } + */ + + /* + * This is an unrolled MD5 implementation, which gives ~30% speedup compared + * to the abbreviated implementation above, as measured on Chrome 11. It is + * important to keep 32-bit croppings to minimum and inline the integer + * rotation. + */ + sum = (A + (D ^ (B & (C ^ D))) + X[0] + 0xd76aa478) & 0xffffffff; + A = B + (((sum << 7) & 0xffffffff) | (sum >>> 25)); + sum = (D + (C ^ (A & (B ^ C))) + X[1] + 0xe8c7b756) & 0xffffffff; + D = A + (((sum << 12) & 0xffffffff) | (sum >>> 20)); + sum = (C + (B ^ (D & (A ^ B))) + X[2] + 0x242070db) & 0xffffffff; + C = D + (((sum << 17) & 0xffffffff) | (sum >>> 15)); + sum = (B + (A ^ (C & (D ^ A))) + X[3] + 0xc1bdceee) & 0xffffffff; + B = C + (((sum << 22) & 0xffffffff) | (sum >>> 10)); + sum = (A + (D ^ (B & (C ^ D))) + X[4] + 0xf57c0faf) & 0xffffffff; + A = B + (((sum << 7) & 0xffffffff) | (sum >>> 25)); + sum = (D + (C ^ (A & (B ^ C))) + X[5] + 0x4787c62a) & 0xffffffff; + D = A + (((sum << 12) & 0xffffffff) | (sum >>> 20)); + sum = (C + (B ^ (D & (A ^ B))) + X[6] + 0xa8304613) & 0xffffffff; + C = D + (((sum << 17) & 0xffffffff) | (sum >>> 15)); + sum = (B + (A ^ (C & (D ^ A))) + X[7] + 0xfd469501) & 0xffffffff; + B = C + (((sum << 22) & 0xffffffff) | (sum >>> 10)); + sum = (A + (D ^ (B & (C ^ D))) + X[8] + 0x698098d8) & 0xffffffff; + A = B + (((sum << 7) & 0xffffffff) | (sum >>> 25)); + sum = (D + (C ^ (A & (B ^ C))) + X[9] + 0x8b44f7af) & 0xffffffff; + D = A + (((sum << 12) & 0xffffffff) | (sum >>> 20)); + sum = (C + (B ^ (D & (A ^ B))) + X[10] + 0xffff5bb1) & 0xffffffff; + C = D + (((sum << 17) & 0xffffffff) | (sum >>> 15)); + sum = (B + (A ^ (C & (D ^ A))) + X[11] + 0x895cd7be) & 0xffffffff; + B = C + (((sum << 22) & 0xffffffff) | (sum >>> 10)); + sum = (A + (D ^ (B & (C ^ D))) + X[12] + 0x6b901122) & 0xffffffff; + A = B + (((sum << 7) & 0xffffffff) | (sum >>> 25)); + sum = (D + (C ^ (A & (B ^ C))) + X[13] + 0xfd987193) & 0xffffffff; + D = A + (((sum << 12) & 0xffffffff) | (sum >>> 20)); + sum = (C + (B ^ (D & (A ^ B))) + X[14] + 0xa679438e) & 0xffffffff; + C = D + (((sum << 17) & 0xffffffff) | (sum >>> 15)); + sum = (B + (A ^ (C & (D ^ A))) + X[15] + 0x49b40821) & 0xffffffff; + B = C + (((sum << 22) & 0xffffffff) | (sum >>> 10)); + sum = (A + (C ^ (D & (B ^ C))) + X[1] + 0xf61e2562) & 0xffffffff; + A = B + (((sum << 5) & 0xffffffff) | (sum >>> 27)); + sum = (D + (B ^ (C & (A ^ B))) + X[6] + 0xc040b340) & 0xffffffff; + D = A + (((sum << 9) & 0xffffffff) | (sum >>> 23)); + sum = (C + (A ^ (B & (D ^ A))) + X[11] + 0x265e5a51) & 0xffffffff; + C = D + (((sum << 14) & 0xffffffff) | (sum >>> 18)); + sum = (B + (D ^ (A & (C ^ D))) + X[0] + 0xe9b6c7aa) & 0xffffffff; + B = C + (((sum << 20) & 0xffffffff) | (sum >>> 12)); + sum = (A + (C ^ (D & (B ^ C))) + X[5] + 0xd62f105d) & 0xffffffff; + A = B + (((sum << 5) & 0xffffffff) | (sum >>> 27)); + sum = (D + (B ^ (C & (A ^ B))) + X[10] + 0x02441453) & 0xffffffff; + D = A + (((sum << 9) & 0xffffffff) | (sum >>> 23)); + sum = (C + (A ^ (B & (D ^ A))) + X[15] + 0xd8a1e681) & 0xffffffff; + C = D + (((sum << 14) & 0xffffffff) | (sum >>> 18)); + sum = (B + (D ^ (A & (C ^ D))) + X[4] + 0xe7d3fbc8) & 0xffffffff; + B = C + (((sum << 20) & 0xffffffff) | (sum >>> 12)); + sum = (A + (C ^ (D & (B ^ C))) + X[9] + 0x21e1cde6) & 0xffffffff; + A = B + (((sum << 5) & 0xffffffff) | (sum >>> 27)); + sum = (D + (B ^ (C & (A ^ B))) + X[14] + 0xc33707d6) & 0xffffffff; + D = A + (((sum << 9) & 0xffffffff) | (sum >>> 23)); + sum = (C + (A ^ (B & (D ^ A))) + X[3] + 0xf4d50d87) & 0xffffffff; + C = D + (((sum << 14) & 0xffffffff) | (sum >>> 18)); + sum = (B + (D ^ (A & (C ^ D))) + X[8] + 0x455a14ed) & 0xffffffff; + B = C + (((sum << 20) & 0xffffffff) | (sum >>> 12)); + sum = (A + (C ^ (D & (B ^ C))) + X[13] + 0xa9e3e905) & 0xffffffff; + A = B + (((sum << 5) & 0xffffffff) | (sum >>> 27)); + sum = (D + (B ^ (C & (A ^ B))) + X[2] + 0xfcefa3f8) & 0xffffffff; + D = A + (((sum << 9) & 0xffffffff) | (sum >>> 23)); + sum = (C + (A ^ (B & (D ^ A))) + X[7] + 0x676f02d9) & 0xffffffff; + C = D + (((sum << 14) & 0xffffffff) | (sum >>> 18)); + sum = (B + (D ^ (A & (C ^ D))) + X[12] + 0x8d2a4c8a) & 0xffffffff; + B = C + (((sum << 20) & 0xffffffff) | (sum >>> 12)); + sum = (A + (B ^ C ^ D) + X[5] + 0xfffa3942) & 0xffffffff; + A = B + (((sum << 4) & 0xffffffff) | (sum >>> 28)); + sum = (D + (A ^ B ^ C) + X[8] + 0x8771f681) & 0xffffffff; + D = A + (((sum << 11) & 0xffffffff) | (sum >>> 21)); + sum = (C + (D ^ A ^ B) + X[11] + 0x6d9d6122) & 0xffffffff; + C = D + (((sum << 16) & 0xffffffff) | (sum >>> 16)); + sum = (B + (C ^ D ^ A) + X[14] + 0xfde5380c) & 0xffffffff; + B = C + (((sum << 23) & 0xffffffff) | (sum >>> 9)); + sum = (A + (B ^ C ^ D) + X[1] + 0xa4beea44) & 0xffffffff; + A = B + (((sum << 4) & 0xffffffff) | (sum >>> 28)); + sum = (D + (A ^ B ^ C) + X[4] + 0x4bdecfa9) & 0xffffffff; + D = A + (((sum << 11) & 0xffffffff) | (sum >>> 21)); + sum = (C + (D ^ A ^ B) + X[7] + 0xf6bb4b60) & 0xffffffff; + C = D + (((sum << 16) & 0xffffffff) | (sum >>> 16)); + sum = (B + (C ^ D ^ A) + X[10] + 0xbebfbc70) & 0xffffffff; + B = C + (((sum << 23) & 0xffffffff) | (sum >>> 9)); + sum = (A + (B ^ C ^ D) + X[13] + 0x289b7ec6) & 0xffffffff; + A = B + (((sum << 4) & 0xffffffff) | (sum >>> 28)); + sum = (D + (A ^ B ^ C) + X[0] + 0xeaa127fa) & 0xffffffff; + D = A + (((sum << 11) & 0xffffffff) | (sum >>> 21)); + sum = (C + (D ^ A ^ B) + X[3] + 0xd4ef3085) & 0xffffffff; + C = D + (((sum << 16) & 0xffffffff) | (sum >>> 16)); + sum = (B + (C ^ D ^ A) + X[6] + 0x04881d05) & 0xffffffff; + B = C + (((sum << 23) & 0xffffffff) | (sum >>> 9)); + sum = (A + (B ^ C ^ D) + X[9] + 0xd9d4d039) & 0xffffffff; + A = B + (((sum << 4) & 0xffffffff) | (sum >>> 28)); + sum = (D + (A ^ B ^ C) + X[12] + 0xe6db99e5) & 0xffffffff; + D = A + (((sum << 11) & 0xffffffff) | (sum >>> 21)); + sum = (C + (D ^ A ^ B) + X[15] + 0x1fa27cf8) & 0xffffffff; + C = D + (((sum << 16) & 0xffffffff) | (sum >>> 16)); + sum = (B + (C ^ D ^ A) + X[2] + 0xc4ac5665) & 0xffffffff; + B = C + (((sum << 23) & 0xffffffff) | (sum >>> 9)); + sum = (A + (C ^ (B | (~D))) + X[0] + 0xf4292244) & 0xffffffff; + A = B + (((sum << 6) & 0xffffffff) | (sum >>> 26)); + sum = (D + (B ^ (A | (~C))) + X[7] + 0x432aff97) & 0xffffffff; + D = A + (((sum << 10) & 0xffffffff) | (sum >>> 22)); + sum = (C + (A ^ (D | (~B))) + X[14] + 0xab9423a7) & 0xffffffff; + C = D + (((sum << 15) & 0xffffffff) | (sum >>> 17)); + sum = (B + (D ^ (C | (~A))) + X[5] + 0xfc93a039) & 0xffffffff; + B = C + (((sum << 21) & 0xffffffff) | (sum >>> 11)); + sum = (A + (C ^ (B | (~D))) + X[12] + 0x655b59c3) & 0xffffffff; + A = B + (((sum << 6) & 0xffffffff) | (sum >>> 26)); + sum = (D + (B ^ (A | (~C))) + X[3] + 0x8f0ccc92) & 0xffffffff; + D = A + (((sum << 10) & 0xffffffff) | (sum >>> 22)); + sum = (C + (A ^ (D | (~B))) + X[10] + 0xffeff47d) & 0xffffffff; + C = D + (((sum << 15) & 0xffffffff) | (sum >>> 17)); + sum = (B + (D ^ (C | (~A))) + X[1] + 0x85845dd1) & 0xffffffff; + B = C + (((sum << 21) & 0xffffffff) | (sum >>> 11)); + sum = (A + (C ^ (B | (~D))) + X[8] + 0x6fa87e4f) & 0xffffffff; + A = B + (((sum << 6) & 0xffffffff) | (sum >>> 26)); + sum = (D + (B ^ (A | (~C))) + X[15] + 0xfe2ce6e0) & 0xffffffff; + D = A + (((sum << 10) & 0xffffffff) | (sum >>> 22)); + sum = (C + (A ^ (D | (~B))) + X[6] + 0xa3014314) & 0xffffffff; + C = D + (((sum << 15) & 0xffffffff) | (sum >>> 17)); + sum = (B + (D ^ (C | (~A))) + X[13] + 0x4e0811a1) & 0xffffffff; + B = C + (((sum << 21) & 0xffffffff) | (sum >>> 11)); + sum = (A + (C ^ (B | (~D))) + X[4] + 0xf7537e82) & 0xffffffff; + A = B + (((sum << 6) & 0xffffffff) | (sum >>> 26)); + sum = (D + (B ^ (A | (~C))) + X[11] + 0xbd3af235) & 0xffffffff; + D = A + (((sum << 10) & 0xffffffff) | (sum >>> 22)); + sum = (C + (A ^ (D | (~B))) + X[2] + 0x2ad7d2bb) & 0xffffffff; + C = D + (((sum << 15) & 0xffffffff) | (sum >>> 17)); + sum = (B + (D ^ (C | (~A))) + X[9] + 0xeb86d391) & 0xffffffff; + B = C + (((sum << 21) & 0xffffffff) | (sum >>> 11)); + + this.chain_[0] = (this.chain_[0] + A) & 0xffffffff; + this.chain_[1] = (this.chain_[1] + B) & 0xffffffff; + this.chain_[2] = (this.chain_[2] + C) & 0xffffffff; + this.chain_[3] = (this.chain_[3] + D) & 0xffffffff; +}; + + +/** @inheritDoc */ +goog.crypt.Md5.prototype.update = function(bytes, opt_length) { + if (!goog.isDef(opt_length)) { + opt_length = bytes.length; + } + + // Copy some object properties to local variables in order to save on access + // time from inside the loop (~10% speedup was observed on Chrome 11). + var block = this.block_; + var blockLength = this.blockLength_; + var i = 0; + + // Strangely enough, it is faster to copy the data than to pass over the + // buffer and an offset. Copying in a loop is also as fast as array slicing. + // This was tested on Chrome 11 and Firefox 3.6. Please do not optimize + // the following without careful profiling. + if (goog.isString(bytes)) { + while (i < opt_length) { + block[blockLength++] = bytes.charCodeAt(i++); + if (blockLength == 64) { + this.compress_(block); + blockLength = 0; + } + } + } else { + while (i < opt_length) { + block[blockLength++] = bytes[i++]; + if (blockLength == 64) { + this.compress_(block); + blockLength = 0; + } + } + } + + this.blockLength_ = blockLength; + this.totalLength_ += opt_length; +}; + + +/** @inheritDoc */ +goog.crypt.Md5.prototype.digest = function() { + // This must accommodate at least 1 padding byte (0x80), 8 bytes of + // total bitlength, and must end at a 64-byte boundary. + var pad = new Array((this.blockLength_ < 56 ? 64 : 128) - this.blockLength_); + + // Add padding: 0x80 0x00* + pad[0] = 0x80; + for (var i = 1; i < pad.length - 8; ++i) { + pad[i] = 0; + } + // Add the total number of bits, little endian 64-bit integer. + var totalBits = this.totalLength_ * 8; + for (var i = pad.length - 8; i < pad.length; ++i) { + pad[i] = totalBits & 0xff; + totalBits /= 0x100; // Don't use bit-shifting here! + } + this.update(pad); + + var digest = new Array(16); + var n = 0; + for (var i = 0; i < 4; ++i) { + for (var j = 0; j < 32; j += 8) { + digest[n++] = (this.chain_[i] >>> j) & 0xff; + } + } + return digest; +}; diff --git a/contrib/closure-library/goog/crypt/md5_perf.html b/contrib/closure-library/goog/crypt/md5_perf.html new file mode 100644 index 0000000..8977a5f --- /dev/null +++ b/contrib/closure-library/goog/crypt/md5_perf.html @@ -0,0 +1,62 @@ + + + + + +Closure Performance Tests - goog.crypt.Md5 + + + + + +

Closure Performance Tests - goog.crypt.Md5

+

+User-agent: + +

+
+
+ + + diff --git a/contrib/closure-library/goog/crypt/md5_test.html b/contrib/closure-library/goog/crypt/md5_test.html new file mode 100644 index 0000000..4c276f4 --- /dev/null +++ b/contrib/closure-library/goog/crypt/md5_test.html @@ -0,0 +1,175 @@ + + + + + +Closure Unit Tests - goog.crypt.Md5 + + + + + + + diff --git a/contrib/closure-library/goog/crypt/sha1.js b/contrib/closure-library/goog/crypt/sha1.js index 3b111d8..8da3c60 100644 --- a/contrib/closure-library/goog/crypt/sha1.js +++ b/contrib/closure-library/goog/crypt/sha1.js @@ -26,13 +26,20 @@ goog.provide('goog.crypt.Sha1'); +goog.require('goog.crypt.Hash'); + + + /** * SHA-1 cryptographic hash constructor. * * The properties declared here are discussed in the above algorithm document. * @constructor + * @extends {goog.crypt.Hash} */ goog.crypt.Sha1 = function() { + goog.base(this); + /** * Holds the previous values of accumulated variables a-e in the compress_ * function. @@ -70,11 +77,10 @@ goog.crypt.Sha1 = function() { this.reset(); }; +goog.inherits(goog.crypt.Sha1, goog.crypt.Hash); -/** - * Resets the internal accumulator. - */ +/** @inheritDoc */ goog.crypt.Sha1.prototype.reset = function() { this.chain_[0] = 0x67452301; this.chain_[1] = 0xefcdab89; @@ -87,28 +93,21 @@ goog.crypt.Sha1.prototype.reset = function() { }; -/** - * Internal helper performing 32 bit left rotate. - * @param {number} w 32-bit integer to rotate. - * @param {number} r Bits to rotate left by. - * @return {number} w rotated left by r bits. - * @private - */ -goog.crypt.Sha1.prototype.rotl_ = function(w, r) { - return ((w << r) | (w >>> (32 - r))) & 0xffffffff; -}; - - /** * Internal compress helper function. - * @param {Array} buf containing block to compress. + * @param {Array.} buf Buffer with the block to compress. + * @param {number=} opt_offset Offset of the block in the buffer. * @private */ -goog.crypt.Sha1.prototype.compress_ = function(buf) { +goog.crypt.Sha1.prototype.compress_ = function(buf, opt_offset) { + if (!opt_offset) { + opt_offset = 0; + } + var W = this.W_; // get 16 big endian words - for (var i = 0; i < 64; i += 4) { + for (var i = opt_offset; i < opt_offset + 64; i += 4) { var w = (buf[i] << 24) | (buf[i + 1] << 16) | (buf[i + 2] << 8) | @@ -118,7 +117,8 @@ goog.crypt.Sha1.prototype.compress_ = function(buf) { // expand to 80 words for (var i = 16; i < 80; i++) { - W[i] = this.rotl_(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1); + var t = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; + W[i] = ((t << 1) | (t >>> 31)) & 0xffffffff; } var a = this.chain_[0]; @@ -128,6 +128,7 @@ goog.crypt.Sha1.prototype.compress_ = function(buf) { var e = this.chain_[4]; var f, k; + // TODO(user): Try to unroll this loop to speed up the computation. for (var i = 0; i < 80; i++) { if (i < 40) { if (i < 20) { @@ -147,10 +148,10 @@ goog.crypt.Sha1.prototype.compress_ = function(buf) { } } - var t = (this.rotl_(a, 5) + f + e + k + W[i]) & 0xffffffff; + var t = (((a << 5) | (a >>> 27)) + f + e + k + W[i]) & 0xffffffff; e = d; d = c; - c = this.rotl_(b, 30); + c = ((b << 30) | (b >>> 2)) & 0xffffffff; b = a; a = t; } @@ -163,49 +164,44 @@ goog.crypt.Sha1.prototype.compress_ = function(buf) { }; -/** - * Adds a byte array to internal accumulator. - * @param {Array.} bytes to add to digest. - * @param {number=} opt_length is # of bytes to compress. - */ +/** @inheritDoc */ goog.crypt.Sha1.prototype.update = function(bytes, opt_length) { - if (!opt_length) { + if (!goog.isDef(opt_length)) { opt_length = bytes.length; } + var buf = this.buf_; + var inbuf = this.inbuf_; var n = 0; - // Optimize for 64 byte chunks at 64 byte boundaries. - if (this.inbuf_ == 0) { - while (n + 64 < opt_length) { - this.compress_(bytes.slice(n, n + 64)); - n += 64; - this.total_ += 64; + // Strangely enough, it is faster to copy the data than to pass over the + // buffer and an offset. Copying in a loop is also as fast as array slicing. + // This was tested on Chrome 11 and Firefox 3.6. Please do not optimize + // the following without careful profiling. + if (goog.isString(bytes)) { + while (n < opt_length) { + buf[inbuf++] = bytes.charCodeAt(n++); + if (inbuf == 64) { + this.compress_(buf); + inbuf = 0; + } } - } - - while (n < opt_length) { - this.buf_[this.inbuf_++] = bytes[n++]; - this.total_++; - - if (this.inbuf_ == 64) { - this.inbuf_ = 0; - this.compress_(this.buf_); - - // Pick up 64 byte chunks. - while (n + 64 < opt_length) { - this.compress_(bytes.slice(n, n + 64)); - n += 64; - this.total_ += 64; + } else { + while (n < opt_length) { + buf[inbuf++] = bytes[n++]; + if (inbuf == 64) { + this.compress_(buf); + inbuf = 0; } } } + + this.inbuf_ = inbuf; + this.total_ += opt_length; }; -/** - * @return {Array} byte[20] containing finalized hash. - */ +/** @inheritDoc */ goog.crypt.Sha1.prototype.digest = function() { var digest = []; var totalBits = this.total_ * 8; @@ -220,7 +216,7 @@ goog.crypt.Sha1.prototype.digest = function() { // Add # bits. for (var i = 63; i >= 56; i--) { this.buf_[i] = totalBits & 255; - totalBits >>>= 8; + totalBits /= 256; // Don't use bit-shifting here! } this.compress_(this.buf_); diff --git a/contrib/closure-library/goog/crypt/sha1_perf.html b/contrib/closure-library/goog/crypt/sha1_perf.html new file mode 100644 index 0000000..f2fe75c --- /dev/null +++ b/contrib/closure-library/goog/crypt/sha1_perf.html @@ -0,0 +1,62 @@ + + + + + +Closure Performance Tests - goog.crypt.Sha1 + + + + + +

Closure Performance Tests - goog.crypt.Sha1

+

+User-agent: + +

+
+
+ + + diff --git a/contrib/closure-library/goog/crypt/sha1_test.html b/contrib/closure-library/goog/crypt/sha1_test.html index c074aaf..beffc55 100644 --- a/contrib/closure-library/goog/crypt/sha1_test.html +++ b/contrib/closure-library/goog/crypt/sha1_test.html @@ -3,7 +3,7 @@ @@ -11,8 +11,11 @@ Closure Unit Tests - goog.crypt.sha1 @@ -21,25 +24,56 @@ /** * Helper function to convert a byte array to a hex string */ -function bytesToHex(bytes) { - var hexchars = '0123456789abcdef'; - var hexrep = new Array(bytes.length * 2); - for (var i = 0; i < bytes.length; ++i) { - hexrep[i * 2] = hexchars.charAt((bytes[i] >> 4) & 15); - hexrep[i * 2 + 1] = hexchars.charAt(bytes[i] & 15); - } - return hexrep.join(''); +function testBasicOperations() { + var sha1 = new goog.crypt.Sha1(); + goog.crypt.hash_test.runBasicTests(sha1); } function testHashing() { - // Test basic hashing. - var byteArray = [0x61, 0x62, 0x63] + // Empty stream. var sha1 = new goog.crypt.Sha1(); - sha1.update(byteArray); + assertEquals('da39a3ee5e6b4b0d3255bfef95601890afd80709', + goog.crypt.byteArrayToHex(sha1.digest())); + // Empty stream with an empty update. + sha1.reset(); + sha1.update([]); + assertEquals('da39a3ee5e6b4b0d3255bfef95601890afd80709', + goog.crypt.byteArrayToHex(sha1.digest())); + + // Test one-block message. + sha1.reset(); + sha1.update([0x61, 0x62, 0x63]); assertEquals('a9993e364706816aba3e25717850c26c9cd0d89d', - bytesToHex(sha1.digest())); + goog.crypt.byteArrayToHex(sha1.digest())); + + // Test multi-block message. + sha1.reset(); + sha1.update('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'); + assertEquals('84983e441c3bd26ebaae4aa1f95129e5e54670f1', + goog.crypt.byteArrayToHex(sha1.digest())); + + // The following test might cause timeouts on IE7. + if (!goog.userAgent.IE || goog.userAgent.isVersion('8')) { + // Test long message. + var thousandAs = []; + for (var i = 0; i < 1000; ++i) { + thousandAs[i] = 0x61; + } + sha1.reset(); + for (var i = 0; i < 1000; ++i) { + sha1.update(thousandAs); + } + assertEquals('34aa973cd4c4daa4f61eeb2bdbad27316534016f', + goog.crypt.byteArrayToHex(sha1.digest())); + } + + // Test standard message. + sha1.reset(); + sha1.update('The quick brown fox jumps over the lazy dog'); + assertEquals('2fd4e1c67a2d28fced849ee1bb76e7391b93eb12', + goog.crypt.byteArrayToHex(sha1.digest())); } diff --git a/contrib/closure-library/goog/css/autocomplete.css b/contrib/closure-library/goog/css/autocomplete.css old mode 100755 new mode 100644 index 387b4be..081d729 --- a/contrib/closure-library/goog/css/autocomplete.css +++ b/contrib/closure-library/goog/css/autocomplete.css @@ -1,7 +1,7 @@ /* * Copyright 2009 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/bubble.css b/contrib/closure-library/goog/css/bubble.css old mode 100755 new mode 100644 index 4b7f612..4e8d612 --- a/contrib/closure-library/goog/css/bubble.css +++ b/contrib/closure-library/goog/css/bubble.css @@ -1,7 +1,7 @@ /* * Copyright 2010 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ @@ -11,7 +11,7 @@ } .goog-bubble-close-button { - background-image:url(../images/bubble_close.jpg); + background-image:url(//ssl.gstatic.com/closure/bubble_close.jpg); background-color: white; background-position: top right; background-repeat: no-repeat; @@ -20,21 +20,21 @@ } .goog-bubble-left { - background-image:url(../images/bubble_left.gif); + background-image:url(//ssl.gstatic.com/closure/bubble_left.gif); background-position:left; background-repeat:repeat-y; width: 4px; } .goog-bubble-right { - background-image:url(../images/bubble_right.gif); + background-image:url(//ssl.gstatic.com/closure/bubble_right.gif); background-position: right; background-repeat: repeat-y; width: 4px; } .goog-bubble-top-right-anchor { - background-image:url(../images/right_anchor_bubble_top.gif); + background-image:url(//ssl.gstatic.com/closure/right_anchor_bubble_top.gif); background-position: center; background-repeat: no-repeat; width: 147px; @@ -42,7 +42,7 @@ } .goog-bubble-top-left-anchor { - background-image:url(../images/left_anchor_bubble_top.gif); + background-image:url(//ssl.gstatic.com/closure/left_anchor_bubble_top.gif); background-position: center; background-repeat: no-repeat; width: 147px; @@ -50,7 +50,7 @@ } .goog-bubble-top-no-anchor { - background-image:url(../images/no_anchor_bubble_top.gif); + background-image:url(//ssl.gstatic.com/closure/no_anchor_bubble_top.gif); background-position: center; background-repeat: no-repeat; width: 147px; @@ -58,7 +58,7 @@ } .goog-bubble-bottom-right-anchor { - background-image:url(../images/right_anchor_bubble_bot.gif); + background-image:url(//ssl.gstatic.com/closure/right_anchor_bubble_bot.gif); background-position: center; background-repeat: no-repeat; width: 147px; @@ -66,7 +66,7 @@ } .goog-bubble-bottom-left-anchor { - background-image:url(../images/left_anchor_bubble_bot.gif); + background-image:url(//ssl.gstatic.com/closure/left_anchor_bubble_bot.gif); background-position: center; background-repeat: no-repeat; width: 147px; @@ -74,7 +74,7 @@ } .goog-bubble-bottom-no-anchor { - background-image:url(../images/no_anchor_bubble_bot.gif); + background-image:url(//ssl.gstatic.com/closure/no_anchor_bubble_bot.gif); background-position: center; background-repeat: no-repeat; width: 147px; diff --git a/contrib/closure-library/goog/css/button.css b/contrib/closure-library/goog/css/button.css index 46ac437..b80a92f 100644 --- a/contrib/closure-library/goog/css/button.css +++ b/contrib/closure-library/goog/css/button.css @@ -1,7 +1,7 @@ /* * Copyright 2009 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/charpicker.css b/contrib/closure-library/goog/css/charpicker.css old mode 100755 new mode 100644 index f8ace4d..9121453 --- a/contrib/closure-library/goog/css/charpicker.css +++ b/contrib/closure-library/goog/css/charpicker.css @@ -1,7 +1,7 @@ /* * Copyright 2009 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/checkbox.css b/contrib/closure-library/goog/css/checkbox.css index fd6712e..2aed8b5 100644 --- a/contrib/closure-library/goog/css/checkbox.css +++ b/contrib/closure-library/goog/css/checkbox.css @@ -1,7 +1,7 @@ /* * Copyright 2009 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ @@ -11,7 +11,6 @@ .goog-checkbox { border: 1px solid #1C5180; - cursor: pointer; display: -moz-inline-box; display: inline-block; font-size: 1px; /* Fixes the height in IE6 */ @@ -22,11 +21,11 @@ } .goog-checkbox-checked { - background: #fff url('../images/check-sprite.gif') no-repeat 2px center; + background: #fff url(//ssl.gstatic.com/closure/check-sprite.gif) no-repeat 2px center; } .goog-checkbox-undetermined { - background: #bbb url('../images/check-sprite.gif') no-repeat 2px center; + background: #bbb url(//ssl.gstatic.com/closure/check-sprite.gif) no-repeat 2px center; } .goog-checkbox-unchecked { @@ -35,6 +34,5 @@ .goog-checkbox-disabled { border: 1px solid lightgray; - cursor: default !important; background-position: -7px; } diff --git a/contrib/closure-library/goog/css/colormenubutton.css b/contrib/closure-library/goog/css/colormenubutton.css index e47f4f7..83655dd 100644 --- a/contrib/closure-library/goog/css/colormenubutton.css +++ b/contrib/closure-library/goog/css/colormenubutton.css @@ -1,7 +1,7 @@ /* * Copyright 2009 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/colorpalette.css b/contrib/closure-library/goog/css/colorpalette.css index e44d208..17bed42 100644 --- a/contrib/closure-library/goog/css/colorpalette.css +++ b/contrib/closure-library/goog/css/colorpalette.css @@ -1,7 +1,7 @@ /* * Copyright 2009 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ @@ -29,7 +29,7 @@ .goog-palette-cell-selected .goog-palette-colorswatch { /* Client apps may override the URL at which they serve the sprite. */ - background: url(https://ssl.gstatic.com/editor/editortoolbar.png) no-repeat -368px 0; + background: url(//ssl.gstatic.com/editor/editortoolbar.png) no-repeat -368px 0; border: 1px solid #333; color: #fff; font-weight: bold; diff --git a/contrib/closure-library/goog/css/colorpicker-simplegrid.css b/contrib/closure-library/goog/css/colorpicker-simplegrid.css index 103f057..3864640 100644 --- a/contrib/closure-library/goog/css/colorpicker-simplegrid.css +++ b/contrib/closure-library/goog/css/colorpicker-simplegrid.css @@ -1,7 +1,7 @@ /* * Copyright 2007 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/combobox.css b/contrib/closure-library/goog/css/combobox.css index f8e5470..dd1571a 100644 --- a/contrib/closure-library/goog/css/combobox.css +++ b/contrib/closure-library/goog/css/combobox.css @@ -1,35 +1,32 @@ /* * Copyright 2007 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ /* Author: pupius@google.com (Daniel Pupius) */ +/* Author: pallosp@google.com (Peter Pallos) */ -/* Styles for goog.ui.ComboBox and its derivatives. - Note: these styles need some work to get them working properly at various - font sized other than the default. */ +/* Styles for goog.ui.ComboBox and its derivatives. */ .goog-combobox { + background: #ddd url(//ssl.gstatic.com/closure/button-bg.gif) repeat-x scroll left top; border: 1px solid #b5b6b5; - background: #ddd url(../images/button-bg.gif) repeat-x scroll left top; - padding-right: 2.8ex; font: normal small arial, sans-serif; - cursor: pointer; } .goog-combobox input { - vertical-align: bottom; /* override demo.css */ - margin: 0; + background-color: #fff; border: 0; border-right: 1px solid #b5b6b5; - padding: 0 0 0 .1ex; color: #000; - background-color: #fff; font: normal small arial, sans-serif; - width: 30ex; + margin: 0; + padding: 0 0 0 2px; + vertical-align: bottom; /* override demo.css */ + width: 200px; } .goog-combobox input.label-input-label { @@ -38,20 +35,20 @@ } .goog-combobox .goog-menu { - width: 33.2ex; margin-top: -1px; + width: 219px; /* input width + button width + 3 * 1px border */ z-index: 1000; } -html>body .goog-combobox .goog-menu { - /* Non-IE hack */ - width: 32.8ex; -} - .goog-combobox-button { + cursor: pointer; + display: inline-block; font-size: 10px; + text-align: center; + width: 16px; } -.use-arrow .goog-combobox { - padding-right: 0.6ex; +/* IE6 only hack */ +* html .goog-combobox-button { + padding: 0 3px; } diff --git a/contrib/closure-library/goog/css/common.css b/contrib/closure-library/goog/css/common.css index 02d7073..de140b8 100644 --- a/contrib/closure-library/goog/css/common.css +++ b/contrib/closure-library/goog/css/common.css @@ -1,7 +1,7 @@ /* * Copyright 2009 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/css3button.css b/contrib/closure-library/goog/css/css3button.css index 3ff16f4..13d171f 100644 --- a/contrib/closure-library/goog/css/css3button.css +++ b/contrib/closure-library/goog/css/css3button.css @@ -1,7 +1,7 @@ /* * Copyright 2010 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/css3menubutton.css b/contrib/closure-library/goog/css/css3menubutton.css index ef3a6c0..a020700 100644 --- a/contrib/closure-library/goog/css/css3menubutton.css +++ b/contrib/closure-library/goog/css/css3menubutton.css @@ -1,7 +1,7 @@ /* * Copyright 2010 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ @@ -17,7 +17,7 @@ height: 16px; width: 7px; /* Client apps may override the URL at which they serve the sprite. */ - background: url(https://ssl.gstatic.com/editor/editortoolbar.png) no-repeat -388px 0; + background: url(//ssl.gstatic.com/editor/editortoolbar.png) no-repeat -388px 0; vertical-align: top; margin-left: 3px; } diff --git a/contrib/closure-library/goog/css/custombutton.css b/contrib/closure-library/goog/css/custombutton.css index 56e9350..c4ce856 100644 --- a/contrib/closure-library/goog/css/custombutton.css +++ b/contrib/closure-library/goog/css/custombutton.css @@ -1,7 +1,7 @@ /* * Copyright 2009 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ @@ -18,7 +18,7 @@ font-family: Arial, sans-serif; color: #000; /* Client apps may override the URL at which they serve the image. */ - background: #ddd url(https://ssl.gstatic.com/editor/button-bg.png) repeat-x top left; + background: #ddd url(//ssl.gstatic.com/editor/button-bg.png) repeat-x top left; text-decoration: none; list-style: none; vertical-align: middle; diff --git a/contrib/closure-library/goog/css/datepicker.css b/contrib/closure-library/goog/css/datepicker.css index 8b90c92..f1c7c6e 100644 --- a/contrib/closure-library/goog/css/datepicker.css +++ b/contrib/closure-library/goog/css/datepicker.css @@ -1,7 +1,7 @@ /* * Copyright 2009 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/dialog.css b/contrib/closure-library/goog/css/dialog.css index 1a022c7..6bf9020 100644 --- a/contrib/closure-library/goog/css/dialog.css +++ b/contrib/closure-library/goog/css/dialog.css @@ -1,7 +1,7 @@ /* * Copyright 2009 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ @@ -41,14 +41,17 @@ cursor: pointer; font-size: 120%; font-weight: bold; - padding: 8px 15px 8px 8px; + + /* Add padding on the right to ensure the close button has room. */ + padding: 8px 31px 8px 8px; + position: relative; _zoom: 1; /* Ensures proper width in IE6 RTL. */ } .modal-dialog-title-close { /* Client apps may override the URL at which they serve the sprite. */ - background: #e0edfe url(https://ssl.gstatic.com/editor/editortoolbar.png) no-repeat -528px 0; + background: #e0edfe url(//ssl.gstatic.com/editor/editortoolbar.png) no-repeat -528px 0; cursor: default; height: 15px; position: absolute; diff --git a/contrib/closure-library/goog/css/dimensionpicker.css b/contrib/closure-library/goog/css/dimensionpicker.css index 9aa5756..5c51ab8 100644 --- a/contrib/closure-library/goog/css/dimensionpicker.css +++ b/contrib/closure-library/goog/css/dimensionpicker.css @@ -1,7 +1,7 @@ /* * Copyright 2008 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/dragdropdetector.css b/contrib/closure-library/goog/css/dragdropdetector.css index 312a01d..88266d6 100644 --- a/contrib/closure-library/goog/css/dragdropdetector.css +++ b/contrib/closure-library/goog/css/dragdropdetector.css @@ -1,7 +1,7 @@ /* * Copyright 2007 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/editor/bubble.css b/contrib/closure-library/goog/css/editor/bubble.css index 07ca39d..c76f98f 100644 --- a/contrib/closure-library/goog/css/editor/bubble.css +++ b/contrib/closure-library/goog/css/editor/bubble.css @@ -1,4 +1,9 @@ -/* Copyright 2005 The Closure Library Authors. All Rights Reserved.*/ +/* + * Copyright 2005 The Closure Library Authors. All Rights Reserved. + * + * Use of this source code is governed by the Apache License, Version 2.0. + * See the COPYING file for details. + */ /* * Bubble styles. @@ -38,7 +43,7 @@ div.tr_bubble { .tr_bubble_closebox { position: absolute; cursor: default; - background: url(https://ssl.gstatic.com/editor/bubble_closebox.gif) top left no-repeat; + background: url(//ssl.gstatic.com/editor/bubble_closebox.gif) top left no-repeat; padding: 0; margin: 0; width: 10px; diff --git a/contrib/closure-library/goog/css/editor/dialog.css b/contrib/closure-library/goog/css/editor/dialog.css index ab91bb9..8868a10 100644 --- a/contrib/closure-library/goog/css/editor/dialog.css +++ b/contrib/closure-library/goog/css/editor/dialog.css @@ -1,4 +1,9 @@ -/* Copyright 2007 The Closure Library Authors. All Rights Reserved.*/ +/* + * Copyright 2007 The Closure Library Authors. All Rights Reserved. + * + * Use of this source code is governed by the Apache License, Version 2.0. + * See the COPYING file for details. + */ /* * Styles for Editor dialogs and their sub-components. diff --git a/contrib/closure-library/goog/css/editor/linkdialog.css b/contrib/closure-library/goog/css/editor/linkdialog.css index 204b5f8..a58a4b2 100644 --- a/contrib/closure-library/goog/css/editor/linkdialog.css +++ b/contrib/closure-library/goog/css/editor/linkdialog.css @@ -1,4 +1,9 @@ -/* Copyright 2007 The Closure Library Authors. All Rights Reserved.*/ +/* + * Copyright 2007 The Closure Library Authors. All Rights Reserved. + * + * Use of this source code is governed by the Apache License, Version 2.0. + * See the COPYING file for details. + */ /** * Styles for the Editor's Edit Link dialog. diff --git a/contrib/closure-library/goog/css/editortoolbar.css b/contrib/closure-library/goog/css/editortoolbar.css index 70b5f7c..1e26f4f 100644 --- a/contrib/closure-library/goog/css/editortoolbar.css +++ b/contrib/closure-library/goog/css/editortoolbar.css @@ -1,7 +1,7 @@ /* * Copyright 2008 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ @@ -16,7 +16,7 @@ .tr-icon { width: 16px; height: 16px; - background: url(https://ssl.gstatic.com/editor/editortoolbar.png) no-repeat; + background: url(//ssl.gstatic.com/editor/editortoolbar.png) no-repeat; vertical-align: middle; } diff --git a/contrib/closure-library/goog/css/filteredmenu.css b/contrib/closure-library/goog/css/filteredmenu.css index a4d0f32..b43a113 100644 --- a/contrib/closure-library/goog/css/filteredmenu.css +++ b/contrib/closure-library/goog/css/filteredmenu.css @@ -1,7 +1,7 @@ /* * Copyright 2007 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/filterobservingmenuitem.css b/contrib/closure-library/goog/css/filterobservingmenuitem.css index 43b9533..d48a609 100644 --- a/contrib/closure-library/goog/css/filterobservingmenuitem.css +++ b/contrib/closure-library/goog/css/filterobservingmenuitem.css @@ -1,7 +1,7 @@ /* * Copyright 2007 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/flatbutton.css b/contrib/closure-library/goog/css/flatbutton.css index 521badf..d6a5a25 100644 --- a/contrib/closure-library/goog/css/flatbutton.css +++ b/contrib/closure-library/goog/css/flatbutton.css @@ -1,7 +1,7 @@ /* * Copyright 2009 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/flatmenubutton.css b/contrib/closure-library/goog/css/flatmenubutton.css index 7e6380e..5778217 100644 --- a/contrib/closure-library/goog/css/flatmenubutton.css +++ b/contrib/closure-library/goog/css/flatmenubutton.css @@ -1,7 +1,7 @@ /* * Copyright 2009 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ @@ -54,7 +54,7 @@ .goog-flat-menu-button-dropdown { /* Client apps may override the URL at which they serve the sprite. */ - background: url(https://ssl.gstatic.com/editor/editortoolbar.png) no-repeat -388px 0; + background: url(//ssl.gstatic.com/editor/editortoolbar.png) no-repeat -388px 0; position: absolute; right: 2px; top: 0; diff --git a/contrib/closure-library/goog/css/hovercard.css b/contrib/closure-library/goog/css/hovercard.css index df9efbe..2d64e4f 100644 --- a/contrib/closure-library/goog/css/hovercard.css +++ b/contrib/closure-library/goog/css/hovercard.css @@ -1,7 +1,7 @@ /* * Copyright 2008 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/hsvapalette.css b/contrib/closure-library/goog/css/hsvapalette.css index a756e29..ec52e39 100644 --- a/contrib/closure-library/goog/css/hsvapalette.css +++ b/contrib/closure-library/goog/css/hsvapalette.css @@ -1,7 +1,7 @@ /* * Copyright 2008 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ @@ -65,7 +65,7 @@ .goog-hsva-palette-v-handle, .goog-hsva-palette-a-handle, .goog-hsva-palette-swatch-backdrop { - background-image: url(../images/hsva-sprite.png); + background-image: url(//ssl.gstatic.com/closure/hsva-sprite.png); } .goog-hsva-palette-noalpha .goog-hsva-palette-hs-image, @@ -75,7 +75,7 @@ .goog-hsva-palette-noalpha .goog-hsva-palette-v-handle, .goog-hsva-palette-noalpha .goog-hsva-palette-a-handle, .goog-hsva-palette-noalpha .goog-hsva-palette-swatch-backdrop { - background-image: url(../images/hsva-sprite.gif); + background-image: url(//ssl.gstatic.com/closure/hsva-sprite.gif); } .goog-hsva-palette-sm-hs-image, @@ -85,7 +85,7 @@ .goog-hsva-palette-sm-v-handle, .goog-hsva-palette-sm-a-handle, .goog-hsva-palette-sm-swatch-backdrop { - background-image: url(../images/hsva-sprite-sm.png); + background-image: url(//ssl.gstatic.com/closure/hsva-sprite-sm.png); } .goog-hsva-palette-noalpha .goog-hsva-palette-sm-hs-image, @@ -95,7 +95,7 @@ .goog-hsva-palette-noalpha .goog-hsva-palette-sm-v-handle, .goog-hsva-palette-noalpha .goog-hsva-palette-sm-a-handle, .goog-hsva-palette-noalpha .goog-hsva-palette-swatch-backdrop { - background-image: url(../images/hsva-sprite-sm.gif); + background-image: url(//ssl.gstatic.com/closure/hsva-sprite-sm.gif); } .goog-hsva-palette-hs-image, diff --git a/contrib/closure-library/goog/css/hsvpalette.css b/contrib/closure-library/goog/css/hsvpalette.css index d3ae7f6..8449ed5 100644 --- a/contrib/closure-library/goog/css/hsvpalette.css +++ b/contrib/closure-library/goog/css/hsvpalette.css @@ -1,7 +1,7 @@ /* * Copyright 2008 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ @@ -62,28 +62,28 @@ .goog-hsv-palette-v-image, .goog-hsv-palette-hs-handle, .goog-hsv-palette-v-handle { - background-image: url(../images/hsv-sprite.png); + background-image: url(//ssl.gstatic.com/closure/hsv-sprite.png); } .goog-hsv-palette-noalpha .goog-hsv-palette-hs-image, .goog-hsv-palette-noalpha .goog-hsv-palette-v-image, .goog-hsv-palette-noalpha .goog-hsv-palette-hs-handle, .goog-hsv-palette-noalpha .goog-hsv-palette-v-handle { - background-image: url(../images/hsv-sprite.gif); + background-image: url(//ssl.gstatic.com/closure/hsv-sprite.gif); } .goog-hsv-palette-sm-hs-image, .goog-hsv-palette-sm-v-image, .goog-hsv-palette-sm-hs-handle, .goog-hsv-palette-sm-v-handle { - background-image: url(../images/hsv-sprite-sm.png); + background-image: url(//ssl.gstatic.com/closure/hsv-sprite-sm.png); } .goog-hsv-palette-noalpha .goog-hsv-palette-sm-hs-image, .goog-hsv-palette-noalpha .goog-hsv-palette-sm-v-image, .goog-hsv-palette-noalpha .goog-hsv-palette-sm-hs-handle, .goog-hsv-palette-noalpha .goog-hsv-palette-sm-v-handle { - background-image: url(../images/hsv-sprite-sm.gif); + background-image: url(//ssl.gstatic.com/closure/hsv-sprite-sm.gif); } .goog-hsv-palette-hs-image, diff --git a/contrib/closure-library/goog/css/imagelessbutton.css b/contrib/closure-library/goog/css/imagelessbutton.css old mode 100755 new mode 100644 index e5497a7..23c7fee --- a/contrib/closure-library/goog/css/imagelessbutton.css +++ b/contrib/closure-library/goog/css/imagelessbutton.css @@ -1,7 +1,7 @@ /* * Copyright 2008 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/imagelessmenubutton.css b/contrib/closure-library/goog/css/imagelessmenubutton.css index 924a652..0c8b6fd 100644 --- a/contrib/closure-library/goog/css/imagelessmenubutton.css +++ b/contrib/closure-library/goog/css/imagelessmenubutton.css @@ -1,7 +1,7 @@ /* * Copyright 2010 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ @@ -17,7 +17,7 @@ height: 16px; width: 7px; /* Client apps may override the URL at which they serve the sprite. */ - background: url(https://ssl.gstatic.com/editor/editortoolbar.png) no-repeat -388px 0; + background: url(//ssl.gstatic.com/editor/editortoolbar.png) no-repeat -388px 0; vertical-align: top; margin-right: 2px; } diff --git a/contrib/closure-library/goog/css/inputdatepicker.css b/contrib/closure-library/goog/css/inputdatepicker.css old mode 100755 new mode 100644 index d2f8a91..4f93182 --- a/contrib/closure-library/goog/css/inputdatepicker.css +++ b/contrib/closure-library/goog/css/inputdatepicker.css @@ -1,7 +1,7 @@ /* * Copyright 2008 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/linkbutton.css b/contrib/closure-library/goog/css/linkbutton.css index 93a446b..9f9ec3a 100644 --- a/contrib/closure-library/goog/css/linkbutton.css +++ b/contrib/closure-library/goog/css/linkbutton.css @@ -1,7 +1,7 @@ /* * Copyright 2010 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/menu.css b/contrib/closure-library/goog/css/menu.css index 3259f68..da66222 100644 --- a/contrib/closure-library/goog/css/menu.css +++ b/contrib/closure-library/goog/css/menu.css @@ -1,7 +1,7 @@ /* * Copyright 2009 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/menubutton.css b/contrib/closure-library/goog/css/menubutton.css index 349e66c..82c94b2 100644 --- a/contrib/closure-library/goog/css/menubutton.css +++ b/contrib/closure-library/goog/css/menubutton.css @@ -1,7 +1,7 @@ /* * Copyright 2009 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ @@ -15,7 +15,7 @@ /* State: resting. */ .goog-menu-button { /* Client apps may override the URL at which they serve the image. */ - background: #ddd url(https://ssl.gstatic.com/editor/button-bg.png) repeat-x top left; + background: #ddd url(//ssl.gstatic.com/editor/button-bg.png) repeat-x top left; border: 0; color: #000; cursor: pointer; @@ -141,7 +141,7 @@ height: 15px; width: 7px; /* Client apps may override the URL at which they serve the sprite. */ - background: url(https://ssl.gstatic.com/editor/editortoolbar.png) no-repeat -388px 0; + background: url(//ssl.gstatic.com/editor/editortoolbar.png) no-repeat -388px 0; vertical-align: top; } diff --git a/contrib/closure-library/goog/css/menuitem.css b/contrib/closure-library/goog/css/menuitem.css index 4308ee6..517fa9e 100644 --- a/contrib/closure-library/goog/css/menuitem.css +++ b/contrib/closure-library/goog/css/menuitem.css @@ -1,7 +1,7 @@ /* * Copyright 2009 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ @@ -80,7 +80,7 @@ .goog-option-selected .goog-menuitem-checkbox, .goog-option-selected .goog-menuitem-icon { /* Client apps may override the URL at which they serve the sprite. */ - background: url(https://ssl.gstatic.com/editor/editortoolbar.png) no-repeat -512px 0; + background: url(//ssl.gstatic.com/editor/editortoolbar.png) no-repeat -512px 0; } /* Keyboard shortcut ("accelerator") style. */ diff --git a/contrib/closure-library/goog/css/menuseparator.css b/contrib/closure-library/goog/css/menuseparator.css index 3b71c32..de1354f 100644 --- a/contrib/closure-library/goog/css/menuseparator.css +++ b/contrib/closure-library/goog/css/menuseparator.css @@ -1,7 +1,7 @@ /* * Copyright 2009 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/multitestrunner.css b/contrib/closure-library/goog/css/multitestrunner.css index 296465d..2cdffea 100644 --- a/contrib/closure-library/goog/css/multitestrunner.css +++ b/contrib/closure-library/goog/css/multitestrunner.css @@ -1,7 +1,7 @@ /* * Copyright 2008 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/offline.css b/contrib/closure-library/goog/css/offline.css index 4a551d2..82d3a64 100644 --- a/contrib/closure-library/goog/css/offline.css +++ b/contrib/closure-library/goog/css/offline.css @@ -1,7 +1,7 @@ /* * Copyright 2007 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ @@ -23,27 +23,27 @@ } .goog-offlinestatus-offline { - background: url("../images/gears_offline.gif") no-repeat 50% 50%; + background: url(//ssl.gstatic.com/closure/gears_offline.gif) no-repeat 50% 50%; text-decoration: none; } .goog-offlinestatus-online { - background: url("../images/gears_online.gif") no-repeat 50% 50%; + background: url(//ssl.gstatic.com/closure/gears_online.gif) no-repeat 50% 50%; text-decoration: none; } .goog-offlinestatus-paused { - background: url("../images/gears_paused.gif") no-repeat 50% 50%; + background: url(//ssl.gstatic.com/closure/gears_paused.gif) no-repeat 50% 50%; text-decoration: none; } .goog-offlinestatus-syncing { - background: url("../images/gears_syncing.gif") no-repeat 50% 50%; + background: url(//ssl.gstatic.com/closure/gears_syncing.gif) no-repeat 50% 50%; text-decoration: none; } .goog-offlinestatus-error { - background: url("../images/gears_syncing.gif") no-repeat 50% 50%; + background: url(//ssl.gstatic.com/closure/gears_syncing.gif) no-repeat 50% 50%; text-decoration: none; } @@ -91,7 +91,7 @@ cursor: pointer; width: 11px; height: 11px; - background-image: url("../images/close_box.gif"); + background-image: url(//ssl.gstatic.com/closure/close_box.gif); } @@ -112,7 +112,7 @@ color: #ffffff; font-weight: bold; padding: 10px; - background: url("../images/gears_bluedot.gif") no-repeat 50% 50%; + background: url(//ssl.gstatic.com/closure/gears_bluedot.gif) no-repeat 50% 50%; } .goog-offlinedialog-step-description { diff --git a/contrib/closure-library/goog/css/palette.css b/contrib/closure-library/goog/css/palette.css index 8e5b6f5..8360afc 100644 --- a/contrib/closure-library/goog/css/palette.css +++ b/contrib/closure-library/goog/css/palette.css @@ -1,7 +1,7 @@ /* * Copyright 2009 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/popupdatepicker.css b/contrib/closure-library/goog/css/popupdatepicker.css index a57c14b..133173a 100644 --- a/contrib/closure-library/goog/css/popupdatepicker.css +++ b/contrib/closure-library/goog/css/popupdatepicker.css @@ -1,7 +1,7 @@ /* * Copyright 2009 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/roundedpanel.css b/contrib/closure-library/goog/css/roundedpanel.css index 0e4d849..d931e41 100644 --- a/contrib/closure-library/goog/css/roundedpanel.css +++ b/contrib/closure-library/goog/css/roundedpanel.css @@ -1,7 +1,7 @@ /* * Copyright 2010 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/roundedtab.css b/contrib/closure-library/goog/css/roundedtab.css index e68a8ed..17fe155 100644 --- a/contrib/closure-library/goog/css/roundedtab.css +++ b/contrib/closure-library/goog/css/roundedtab.css @@ -1,7 +1,7 @@ /* * Copyright 2008 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/submenu.css b/contrib/closure-library/goog/css/submenu.css index 225e137..f141e3d 100644 --- a/contrib/closure-library/goog/css/submenu.css +++ b/contrib/closure-library/goog/css/submenu.css @@ -1,7 +1,7 @@ /* * Copyright 2009 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/tab.css b/contrib/closure-library/goog/css/tab.css index 032b975..6c7dfe2 100644 --- a/contrib/closure-library/goog/css/tab.css +++ b/contrib/closure-library/goog/css/tab.css @@ -1,7 +1,7 @@ /* * Copyright 2008 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ @@ -13,34 +13,42 @@ * Styles used by goog.ui.TabRenderer. */ .goog-tab { - background: #ddd; - border: 1px solid #369; - color: #333; - cursor: default; - padding: 4px 8px; position: relative; + padding: 4px 8px; + color: #00c; + text-decoration: underline; + cursor: default; } .goog-tab-bar-top .goog-tab { + margin: 1px 4px 0 0; border-bottom: 0; float: left; - margin: 1px 4px 0 0; +} + +.goog-tab-bar-top:after, +.goog-tab-bar-bottom:after { + content: " "; + display: block; + height: 0; + clear: both; + visibility: hidden; } .goog-tab-bar-bottom .goog-tab { + margin: 0 4px 1px 0; border-top: 0; float: left; - margin: 0 4px 1px 0; } .goog-tab-bar-start .goog-tab { - border-right: 0; margin: 0 0 4px 1px; + border-right: 0; } .goog-tab-bar-end .goog-tab { - border-left: 0; margin: 0 1px 4px 0; + border-left: 0; } /* State: Hover */ @@ -50,32 +58,38 @@ /* State: Disabled */ .goog-tab-disabled { - background: #ccc; - border-color: #ccc; - color: #fff; + color: #666; } /* State: Selected */ .goog-tab-selected { - background: #fff !important; /* Selected trumps hover. */ + color: #000; + background: #fff; + text-decoration: none; + font-weight: bold; + border: 1px solid #6b90da; } - +.goog-tab-bar-top { + padding-top: 5px !important; + padding-left: 5px !important; + border-bottom: 1px solid #6b90da !important; +} /* * Shift selected tabs 1px towards the contents (and compensate via margin and * padding) to visually merge the borders of the tab with the borders of the * content area. */ .goog-tab-bar-top .goog-tab-selected { + top: 1px; margin-top: 0; padding-bottom: 5px; - top: 1px; } .goog-tab-bar-bottom .goog-tab-selected { + top: -1px; margin-bottom: 0; padding-top: 5px; - top: -1px; } .goog-tab-bar-start .goog-tab-selected { diff --git a/contrib/closure-library/goog/css/tabbar.css b/contrib/closure-library/goog/css/tabbar.css index 5f43efb..514aa9b 100644 --- a/contrib/closure-library/goog/css/tabbar.css +++ b/contrib/closure-library/goog/css/tabbar.css @@ -1,7 +1,7 @@ /* * Copyright 2008 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ @@ -13,13 +13,13 @@ * Styles used by goog.ui.TabBarRenderer. */ .goog-tab-bar { + margin: 0; border: 0; - cursor: default; + padding: 0; list-style: none; - margin: 0; + cursor: default; outline: none; - padding: 0; - position: relative; + background: #ebeff9; } .goog-tab-bar-clear { diff --git a/contrib/closure-library/goog/css/tablesorter.css b/contrib/closure-library/goog/css/tablesorter.css index 00f0df3..126f007 100644 --- a/contrib/closure-library/goog/css/tablesorter.css +++ b/contrib/closure-library/goog/css/tablesorter.css @@ -1,7 +1,7 @@ /* * Copyright 2008 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/toolbar.css b/contrib/closure-library/goog/css/toolbar.css index d016197..5c39dde 100644 --- a/contrib/closure-library/goog/css/toolbar.css +++ b/contrib/closure-library/goog/css/toolbar.css @@ -1,7 +1,7 @@ /* * Copyright 2009 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ @@ -18,7 +18,7 @@ .goog-toolbar { /* Client apps may override the URL at which they serve the image. */ - background: #fafafa url(https://ssl.gstatic.com/editor/toolbar-bg.png) repeat-x bottom left; + background: #fafafa url(//ssl.gstatic.com/editor/toolbar-bg.png) repeat-x bottom left; border-bottom: 1px solid #d5d5d5; cursor: default; font: normal 12px Arial, sans-serif; @@ -353,7 +353,7 @@ .goog-toolbar-menu-button-dropdown { width: 7px; /* Client apps may override the URL at which they serve the sprite. */ - background: url(https://ssl.gstatic.com/editor/editortoolbar.png) no-repeat -388px 0; + background: url(//ssl.gstatic.com/editor/editortoolbar.png) no-repeat -388px 0; vertical-align: middle; } diff --git a/contrib/closure-library/goog/css/tooltip.css b/contrib/closure-library/goog/css/tooltip.css index f9ac3ab..0264583 100644 --- a/contrib/closure-library/goog/css/tooltip.css +++ b/contrib/closure-library/goog/css/tooltip.css @@ -1,7 +1,7 @@ /* * Copyright 2010 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/css/tree.css b/contrib/closure-library/goog/css/tree.css index 7a4f6c9..faf6d0b 100644 --- a/contrib/closure-library/goog/css/tree.css +++ b/contrib/closure-library/goog/css/tree.css @@ -1,7 +1,7 @@ /* * Copyright 2007 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ @@ -34,7 +34,7 @@ .goog-tree-children { background-repeat: repeat-y; - background-image: url("../images/tree/I.png") !important; + background-image: url(//ssl.gstatic.com/closure/tree/I.png) !important; background-position-y: 1px !important; /* IE only */ font: icon; } @@ -44,7 +44,7 @@ } .goog-tree-icon { - background-image: url("../images/tree/tree.png"); + background-image: url(//ssl.gstatic.com/closure/tree/tree.png); } .goog-tree-expand-icon { diff --git a/contrib/closure-library/goog/css/tristatemenuitem.css b/contrib/closure-library/goog/css/tristatemenuitem.css index 9ed2374..8c98448 100644 --- a/contrib/closure-library/goog/css/tristatemenuitem.css +++ b/contrib/closure-library/goog/css/tristatemenuitem.css @@ -1,7 +1,7 @@ /* * Copyright 2007 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ @@ -31,13 +31,13 @@ } .goog-tristatemenuitem-partially-checked { - background-image: url(../images/check-outline.gif); + background-image: url(//ssl.gstatic.com/closure/check-outline.gif); background-position: 4px 50%; background-repeat: no-repeat; } .goog-tristatemenuitem-fully-checked { - background-image: url(../images/check.gif); + background-image: url(//ssl.gstatic.com/closure/check.gif); background-position: 4px 50%; background-repeat: no-repeat; } diff --git a/contrib/closure-library/goog/cssom/cssom.js b/contrib/closure-library/goog/cssom/cssom.js index 75db833..bc2a1ad 100644 --- a/contrib/closure-library/goog/cssom/cssom.js +++ b/contrib/closure-library/goog/cssom/cssom.js @@ -204,7 +204,7 @@ goog.cssom.getCssTextFromCssRule = function(cssRule) { goog.cssom.getCssRuleIndexInParentStyleSheet = function(cssRule, opt_parentStyleSheet) { // Look for our special style.ruleIndex property from getAllCss. - if (cssRule.style['-closure-rule-index']) { + if (cssRule.style && cssRule.style['-closure-rule-index']) { return cssRule.style['-closure-rule-index']; } @@ -264,7 +264,7 @@ goog.cssom.replaceCssRule = function(cssRule, cssText, opt_parentStyleSheet, if (parentStyleSheet) { var index = opt_index >= 0 ? opt_index : goog.cssom.getCssRuleIndexInParentStyleSheet(cssRule, parentStyleSheet); - if (index) { + if (index >= 0) { goog.cssom.removeCssRule(parentStyleSheet, index); goog.cssom.addCssRule(parentStyleSheet, cssText, index); } else { @@ -353,8 +353,8 @@ goog.cssom.addCssText = function(cssText, opt_domHelper) { cssNode.styleSheet.cssText = cssText; } else { // W3C. - cssText = document.createTextNode(cssText); - cssNode.appendChild(cssText); + var cssTextNode = document.createTextNode(cssText); + cssNode.appendChild(cssTextNode); } return cssNode; }; diff --git a/contrib/closure-library/goog/cssom/cssom_test.html b/contrib/closure-library/goog/cssom/cssom_test.html new file mode 100644 index 0000000..eef9fa4 --- /dev/null +++ b/contrib/closure-library/goog/cssom/cssom_test.html @@ -0,0 +1,343 @@ + + + + + + + Closure Unit Tests - CSS Object Model helper + + + + + + + + + + + diff --git a/contrib/closure-library/goog/cssom/cssom_test_import_1.css b/contrib/closure-library/goog/cssom/cssom_test_import_1.css new file mode 100644 index 0000000..566f907 --- /dev/null +++ b/contrib/closure-library/goog/cssom/cssom_test_import_1.css @@ -0,0 +1,11 @@ +/* + * Copyright 2010 The Closure Library Authors. All Rights Reserved. + * + * Use of this source code is governed by the Apache License, Version 2.0. + * See the COPYING file for details. + */ + +@import "cssom_test_import_2.css"; +.css-import-1 { + display: block; +} diff --git a/contrib/closure-library/goog/cssom/cssom_test_import_2.css b/contrib/closure-library/goog/cssom/cssom_test_import_2.css new file mode 100644 index 0000000..dc31c96 --- /dev/null +++ b/contrib/closure-library/goog/cssom/cssom_test_import_2.css @@ -0,0 +1,10 @@ +/* + * Copyright 2010 The Closure Library Authors. All Rights Reserved. + * + * Use of this source code is governed by the Apache License, Version 2.0. + * See the COPYING file for details. + */ + +.css-import-2 { + display: block; +} diff --git a/contrib/closure-library/goog/cssom/cssom_test_link_1.css b/contrib/closure-library/goog/cssom/cssom_test_link_1.css new file mode 100644 index 0000000..832a8e3 --- /dev/null +++ b/contrib/closure-library/goog/cssom/cssom_test_link_1.css @@ -0,0 +1,10 @@ +/* + * Copyright 2010 The Closure Library Authors. All Rights Reserved. + * + * Use of this source code is governed by the Apache License, Version 2.0. + * See the COPYING file for details. + */ + +.css-link-1 { + display: block; +} diff --git a/contrib/closure-library/goog/cssom/iframe/style.js b/contrib/closure-library/goog/cssom/iframe/style.js index 6bf890c..558f8e0 100644 --- a/contrib/closure-library/goog/cssom/iframe/style.js +++ b/contrib/closure-library/goog/cssom/iframe/style.js @@ -53,6 +53,7 @@ goog.require('goog.cssom'); goog.require('goog.dom'); goog.require('goog.dom.NodeType'); goog.require('goog.dom.classes'); +goog.require('goog.string'); goog.require('goog.style'); goog.require('goog.userAgent'); @@ -98,6 +99,7 @@ goog.cssom.iframe.style.DECLARATION_START_DELIMITER_ = '{'; goog.cssom.iframe.style.DECLARATION_END_DELIMITER_ = '}\n'; + /** * Class representing a CSS rule set. A rule set is something like this: * h1, h2 { font-family: Arial; color: red; } @@ -284,6 +286,7 @@ goog.cssom.iframe.style.makeColorRuleImportant_ = function(cssText) { }; + /** * Represents a single CSS selector, as described in * http://www.w3.org/TR/REC-CSS2/selector.html @@ -404,6 +407,7 @@ goog.cssom.iframe.style.CssSelector_.prototype.matchElementAncestry = }; + /** * Represents one part of a CSS Selector. For example in the selector * 'body #foo .bar', body, #foo, and .bar would be considered selector parts. @@ -490,15 +494,17 @@ goog.cssom.iframe.style.CssSelectorPart_.prototype.testElement = }; + /** * Represents an element and all its parent/ancestor nodes. * This class exists as an optimization so we run tests on an element * hierarchy multiple times without walking the dom each time. - * @param {Element} node The DOM element whose ancestry should be stored. + * @param {Element} el The DOM element whose ancestry should be stored. * @constructor * @private */ -goog.cssom.iframe.style.NodeAncestry_ = function(node) { +goog.cssom.iframe.style.NodeAncestry_ = function(el) { + var node = el; var nodeUid = goog.getUid(node); // Return an existing object from the cache if one exits for this node. @@ -786,7 +792,7 @@ goog.cssom.iframe.style.getElementContext = function( for (var i = 0, prop; prop = goog.cssom.iframe.style.inheritedProperties_[i]; i++) { - defaultProperties[prop] = computedStyle[goog.style.toCamelCase(prop)]; + defaultProperties[prop] = computedStyle[goog.string.toCamelCase(prop)]; } defaultPropertiesRuleSet.setDeclarationTextFromObject(defaultProperties); ruleSets.push(defaultPropertiesRuleSet); @@ -807,7 +813,7 @@ goog.cssom.iframe.style.getElementContext = function( // Text formatting property values, to keep text nodes directly under BODY // looking right. for (i = 0, prop; prop = goog.cssom.iframe.style.textProperties_[i]; i++) { - bodyProperties[prop] = computedStyle[goog.style.toCamelCase(prop)]; + bodyProperties[prop] = computedStyle[goog.string.toCamelCase(prop)]; } if (opt_copyBackgroundContext && goog.cssom.iframe.style.isTransparentValue_( diff --git a/contrib/closure-library/goog/cssom/iframe/style_test.html b/contrib/closure-library/goog/cssom/iframe/style_test.html index 0e6f6cd..26dfedc 100644 --- a/contrib/closure-library/goog/cssom/iframe/style_test.html +++ b/contrib/closure-library/goog/cssom/iframe/style_test.html @@ -2,7 +2,7 @@ diff --git a/contrib/closure-library/goog/cssom/iframe/style_test_import.css b/contrib/closure-library/goog/cssom/iframe/style_test_import.css index 87a7f87..d2c603f 100644 --- a/contrib/closure-library/goog/cssom/iframe/style_test_import.css +++ b/contrib/closure-library/goog/cssom/iframe/style_test_import.css @@ -1,7 +1,7 @@ /* * Copyright 2010 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/datasource/datamanager.js b/contrib/closure-library/goog/datasource/datamanager.js index 22e1efb..78832fb 100644 --- a/contrib/closure-library/goog/datasource/datamanager.js +++ b/contrib/closure-library/goog/datasource/datamanager.js @@ -35,6 +35,7 @@ goog.require('goog.structs'); goog.require('goog.structs.Map'); + /** * Create a DataManger * @extends {goog.ds.DataNode} @@ -488,6 +489,7 @@ goog.ds.DataManager.prototype.getListenerCount = function() { return count; }; + /** * Disables the sending of all data events during the execution of the given * callback. This provides a way to avoid useless notifications of small changes diff --git a/contrib/closure-library/goog/datasource/datasource.js b/contrib/closure-library/goog/datasource/datasource.js index e1cf61a..104b952 100644 --- a/contrib/closure-library/goog/datasource/datasource.js +++ b/contrib/closure-library/goog/datasource/datasource.js @@ -15,7 +15,8 @@ /** * @fileoverview Generic rich data access API. * - * See http://wiki/Main/ClientDataSource + * Abstraction for data sources that allows listening for changes at different + * levels of the data tree and updating the data via XHR requests * */ @@ -34,6 +35,7 @@ goog.require('goog.array'); goog.require('goog.debug.Logger'); + /** * Interface for node in rich data tree. * @@ -52,6 +54,7 @@ goog.ds.DataNode = function() {}; */ goog.ds.DataNode.prototype.get = goog.nullFunction; + /** * Set the value of the node * @param {Object} value The new value of the node. @@ -152,6 +155,7 @@ goog.ds.LoadState = { }; + /** * Base class for data node functionality, has default implementations for * many of the functions. diff --git a/contrib/closure-library/goog/datasource/datasource_test.html b/contrib/closure-library/goog/datasource/datasource_test.html index fbaad10..7b6e28e 100644 --- a/contrib/closure-library/goog/datasource/datasource_test.html +++ b/contrib/closure-library/goog/datasource/datasource_test.html @@ -3,7 +3,7 @@ @@ -28,7 +28,7 @@ var xmltext ='some data'; var doc = goog.dom.xml.loadXml(xmltext); xmlDs = new goog.ds.XmlDataSource(doc.documentElement, null, null); - + var jsObj = { node: { '@value': 5, '#text': 'some data', name: 'bob', age: 35, alive: true, aliases: ['bobbo', 'robbo']} }; jsDs = new goog.ds.JsDataSource(jsObj, 'JSDS', null); @@ -42,7 +42,7 @@ var age = child.getChildNode('age'); var alive = child.getChildNode('alive'); var aliases = child.getChildNode('aliases'); - + assertEquals('Attribute get', attr.get(), 5); assertEquals('Text get', text.get(), 'some data'); assertEquals('string node get', name.get(), 'bob'); @@ -50,46 +50,44 @@ assertEquals('Boolean get', alive.get(), true); assertEquals('Array value', aliases.get().getByIndex(1).get(), 'robbo'); assertEquals('Array length', aliases.get().getCount(), 2); - + assertEquals('Datasource name', jsDs.getDataName(), 'JSDS'); } - + function testXmlDataSource(){ var child = xmlDs.getChildNode('node'); var attr = child.getChildNode('@value'); var text = child.getChildNode('#text'); - + assertEquals('Attribute get', attr.get(), '5'); assertEquals('Text get', text.get(), 'some data'); assertEquals('Attr child node value', child.getChildNodeValue('@value'), '5'); } - + function testChildNodeValue() { var child = jsDs.getChildNode('node'); assertEquals('Child node value', child.getChildNodeValue('age'), 35); } - + function testJsSet() { assertNull('Get new child node is null', jsDs.getChildNode('Newt')); - + jsDs.setChildNode('Newt', 'A newt'); assertEquals('New string child node', jsDs.getChildNode('Newt').get(), 'A newt'); - + jsDs.setChildNode('Number', 35); assertEquals('New number child node', jsDs.getChildNodeValue('Number'), 35); - + var numNode = jsDs.getChildNode('Number'); jsDs.getChildNode('Number').set(38); assertEquals('Changed number child node', numNode.get(), 38); - - try { + + assertThrows('Shouldn\'t be able to set a group node yet', function() { jsDs.set(5); - fail('Shouldn\'t be able to set a group node yet'); - } catch (e) { - } + }); } - + function testDataManager() { var dm = goog.ds.DataManager.getInstance(); assertNotNull('DataManager exists', dm); @@ -100,7 +98,7 @@ '$JSDS', dm.getChildNodes().getByIndex(0).getDataName()); } - + /** * Constructs an array of data nodes from a javascript array. */ @@ -114,23 +112,23 @@ } return dataNodesArray; } - - + + function testSortedNodeListConstruction() { - + var dataNodesArray = createDataNodesArrayFromJs( [{'Value': 2, 'id': "C"}, {'Value': 0, 'id': "A"}, {'Value': 1, 'id': "B"}, {'Value': 3, 'id': "D"}] ); - + var sortedNodeList = new goog.ds.SortedNodeList( valueSort, dataNodesArray); - + assertEquals( "SortedNodeList count", 4, sortedNodeList.getCount()); - + var expectedValues = [0, 1, 2, 3]; for (var i = 0; i < expectedValues.length; i++) { assertEquals( @@ -139,10 +137,10 @@ sortedNodeList.getByIndex(i).getChildNode('Value').get()); } } - - + + function testSortedNodeListAdd() { - + var sortedNodeList = new goog.ds.SortedNodeList(valueSort); var dataNodesArray = createDataNodesArrayFromJs( @@ -158,7 +156,7 @@ assertEquals( "SortedNodeList count", 4, sortedNodeList.getCount()); - + var expectedValues = [0, 1, 2, 3]; for (var i = 0; i < expectedValues.length; i++) { assertEquals( @@ -167,8 +165,8 @@ sortedNodeList.getByIndex(i).getChildNode('Value').get()); } } - - + + function testSortedNodeListAppend() { var sortedNodeList = new goog.ds.SortedNodeList(valueSort); @@ -182,12 +180,12 @@ for (var i = 0; i < dataNodesArray.length; i++) { sortedNodeList.append(dataNodesArray[i]); } - + assertEquals( - "SortedNodeList count", - dataNodesArray.length, + "SortedNodeList count", + dataNodesArray.length, sortedNodeList.getCount()); - + var expectedValues = [2, 0, 1, 3]; for (var i = 0; i < expectedValues.length; i++) { assertEquals( @@ -197,7 +195,7 @@ } } - + function testSortedNodeListSet() { var dataNodesArray = createDataNodesArrayFromJs( [{'Value': 4, 'id': "C"}, @@ -205,10 +203,10 @@ {'Value': 2, 'id': "B"}, {'Value': 6, 'id': "D"}] ); - + var sortedNodeList = new goog.ds.SortedNodeList( valueSort, dataNodesArray); - + assertEquals( "SortedNodeList count", 4, sortedNodeList.getCount()); @@ -222,15 +220,15 @@ "SortedNodeList replacement node correct", replaceNode, sortedNodeList.get("B")); - + var expectedValues = [0,4,5,6]; for (var i = 0; i < expectedValues.length; i++) { assertEquals( "SortedNodeList position after set", expectedValues[i], sortedNodeList.getByIndex(i).getChildNode('Value').get()); - } - + } + // test a set that adds a new node var addedNode = createDataNodesArrayFromJs([{'Value': 1, 'id': "E"}])[0]; sortedNodeList.setNode("E", addedNode); @@ -241,24 +239,24 @@ "SortedNodeList added node correct", addedNode, sortedNodeList.get("E")); - + var expectedValues = [0, 1, 4, 5, 6]; for (var i = 0; i < expectedValues.length; i++) { assertEquals( "SortedNodeList position after set", expectedValues[i], sortedNodeList.getByIndex(i).getChildNode('Value').get()); - } + } } - - + + function valueSort(a,b) { var valueA = a.getChildNode('Value').get(); var valueB = b.getChildNode('Value').get(); - + return (valueA - valueB); } - + diff --git a/contrib/closure-library/goog/datasource/expr.js b/contrib/closure-library/goog/datasource/expr.js index 195a870..869c9e3 100644 --- a/contrib/closure-library/goog/datasource/expr.js +++ b/contrib/closure-library/goog/datasource/expr.js @@ -39,6 +39,7 @@ goog.require('goog.ds.EmptyNodeList'); goog.require('goog.string'); + /** * Create a new expression. An expression uses a string expression language, and * from this string and a passed in DataNode can evaluate to a value, DataNode, @@ -193,11 +194,6 @@ goog.ds.Expr.prototype.getValue = function(opt_ds) { if (opt_ds == null) { opt_ds = goog.ds.DataManager.getInstance(); } else if (this.isAbsolute_) { - - // TODO(user): Remove once JSCompiler's undefined properties warnings - // don't error for guarded properties. - var magicProps = {getDataRoot: 0}; - opt_ds = opt_ds.getDataRoot ? opt_ds.getDataRoot() : goog.ds.DataManager.getInstance(); } @@ -496,12 +492,14 @@ goog.ds.Expr.String_ = { * Standard expressions */ + /** * The current node */ goog.ds.Expr.CURRENT = goog.ds.Expr.create( goog.ds.Expr.String_.CURRENT_NODE_EXPR); + /** * For DOM interop - all DOM child nodes (text + element). * Text nodes have dataName #text @@ -509,12 +507,14 @@ goog.ds.Expr.CURRENT = goog.ds.Expr.create( goog.ds.Expr.ALL_CHILD_NODES = goog.ds.Expr.create(goog.ds.Expr.String_.ALL_CHILD_NODES_EXPR); + /** * For DOM interop - all DOM element child nodes */ goog.ds.Expr.ALL_ELEMENTS = goog.ds.Expr.create(goog.ds.Expr.String_.ALL_ELEMENTS_EXPR); + /** * For DOM interop - all DOM attribute nodes * Attribute nodes have dataName starting with "@" @@ -522,16 +522,19 @@ goog.ds.Expr.ALL_ELEMENTS = goog.ds.Expr.ALL_ATTRIBUTES = goog.ds.Expr.create(goog.ds.Expr.String_.ALL_ATTRIBUTES_EXPR); + /** * Get the dataName of a node */ goog.ds.Expr.NAME = goog.ds.Expr.create(goog.ds.Expr.String_.NAME_EXPR); + /** * Get the count of nodes matching an expression */ goog.ds.Expr.COUNT = goog.ds.Expr.create(goog.ds.Expr.String_.COUNT_EXPR); + /** * Get the position of the "current" node in the current node list * This will only apply for datasources that support the concept of a current diff --git a/contrib/closure-library/goog/datasource/expr_test.html b/contrib/closure-library/goog/datasource/expr_test.html index 72d4cce..abd9c01 100644 --- a/contrib/closure-library/goog/datasource/expr_test.html +++ b/contrib/closure-library/goog/datasource/expr_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/datasource/fastdatanode.js b/contrib/closure-library/goog/datasource/fastdatanode.js index 3067acd..dae10fe 100644 --- a/contrib/closure-library/goog/datasource/fastdatanode.js +++ b/contrib/closure-library/goog/datasource/fastdatanode.js @@ -105,6 +105,7 @@ goog.ds.AbstractFastDataNode.prototype.getDataPath = function() { }; + /** * Creates a new fast data node, using the properties of root. * @param {Object} root JSON-like object to initialize data node from. @@ -308,6 +309,7 @@ goog.ds.FastDataNode.prototype.clone = function() { * Implementation of goog.ds.DataNodeList for FastDataNode. */ + /** * Adds a child to this data node. * @param {goog.ds.DataNode} value Child node to add. @@ -393,6 +395,7 @@ goog.ds.FastDataNode.prototype.removeNode = function(name) { }; + /** * Creates a new data node wrapping a primitive value. * @param {number|boolean|string} value Value the value to wrap. @@ -672,6 +675,7 @@ goog.ds.FastListNode.prototype.getJsObject = function() { * Implementation of goog.ds.DataNodeList for FastListNode. */ + /** * Adds a child to this data node * @param {goog.ds.DataNode} value Child node to add. diff --git a/contrib/closure-library/goog/datasource/fastdatanode_test.html b/contrib/closure-library/goog/datasource/fastdatanode_test.html index c9a45e0..3e42b0a 100644 --- a/contrib/closure-library/goog/datasource/fastdatanode_test.html +++ b/contrib/closure-library/goog/datasource/fastdatanode_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/datasource/jsondatasource.js b/contrib/closure-library/goog/datasource/jsondatasource.js index ee0240d..33e5cbf 100644 --- a/contrib/closure-library/goog/datasource/jsondatasource.js +++ b/contrib/closure-library/goog/datasource/jsondatasource.js @@ -28,6 +28,7 @@ goog.require('goog.ds.LoadState'); goog.require('goog.ds.logger'); + /** * Data source whose backing is a JSON-like service, in which * retreiving the resource specified by URL with the additional parameter diff --git a/contrib/closure-library/goog/datasource/jsxmlhttpdatasource.js b/contrib/closure-library/goog/datasource/jsxmlhttpdatasource.js index d899b0e..f6d1913 100644 --- a/contrib/closure-library/goog/datasource/jsxmlhttpdatasource.js +++ b/contrib/closure-library/goog/datasource/jsxmlhttpdatasource.js @@ -35,6 +35,8 @@ goog.require('goog.events'); goog.require('goog.net.EventType'); goog.require('goog.net.XhrIo'); + + /** * Similar to JsonDataSource, with using XMLHttpRequest for transport * Currently requires the result be a JS object that can be evaluated and diff --git a/contrib/closure-library/goog/datasource/jsxmlhttpdatasource_test.html b/contrib/closure-library/goog/datasource/jsxmlhttpdatasource_test.html index d2986f1..33e3d2b 100644 --- a/contrib/closure-library/goog/datasource/jsxmlhttpdatasource_test.html +++ b/contrib/closure-library/goog/datasource/jsxmlhttpdatasource_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/datasource/xmldatasource.js b/contrib/closure-library/goog/datasource/xmldatasource.js index 2a92786..867a30b 100644 --- a/contrib/closure-library/goog/datasource/xmldatasource.js +++ b/contrib/closure-library/goog/datasource/xmldatasource.js @@ -108,6 +108,7 @@ goog.ds.XmlDataSource.prototype.createChildNodes_ = function() { this.childNodeList_ = childNodeList; }; + /** * Creates the DataNodeList with the attributes for the element * Allows for only building list as needed. @@ -212,6 +213,7 @@ goog.ds.XmlDataSource.prototype.getDataName = function() { return this.dataName_; }; + /** * Setthe name of the node relative to the parent node * @param {string} name The name of the node. @@ -280,6 +282,7 @@ goog.ds.XmlDataSource.createChildlessDocument_ = function() { }; + /** * Data source whose backing is an XMLHttpRequest, * @@ -303,6 +306,7 @@ goog.ds.XmlHttpDataSource = function(uri, name) { }; goog.inherits(goog.ds.XmlHttpDataSource, goog.ds.XmlDataSource); + /** * Default load state is NOT_LOADED * @private diff --git a/contrib/closure-library/goog/date/date.js b/contrib/closure-library/goog/date/date.js index efe0034..7838eff 100644 --- a/contrib/closure-library/goog/date/date.js +++ b/contrib/closure-library/goog/date/date.js @@ -26,6 +26,7 @@ goog.provide('goog.date.weekDay'); goog.require('goog.asserts'); goog.require('goog.date.DateLike'); +goog.require('goog.i18n.DateTimeSymbols'); goog.require('goog.string'); @@ -180,8 +181,8 @@ goog.date.getNumberOfDaysInMonth = function(year, month) { /** * Returns true if the 2 dates are in the same day. - * @param {Date} date The time to check. - * @param {Date=} opt_now The current time. + * @param {goog.date.DateLike} date The time to check. + * @param {goog.date.DateLike=} opt_now The current time. * @return {boolean} Whether the dates are on the same day. */ goog.date.isSameDay = function(date, opt_now) { @@ -193,8 +194,8 @@ goog.date.isSameDay = function(date, opt_now) { /** * Returns true if the 2 dates are in the same month. - * @param {Date} date The time to check. - * @param {Date=} opt_now The current time. + * @param {goog.date.DateLike} date The time to check. + * @param {goog.date.DateLike=} opt_now The current time. * @return {boolean} Whether the dates are in the same calendar month. */ goog.date.isSameMonth = function(date, opt_now) { @@ -206,8 +207,8 @@ goog.date.isSameMonth = function(date, opt_now) { /** * Returns true if the 2 dates are in the same year. - * @param {Date} date The time to check. - * @param {Date=} opt_now The current time. + * @param {goog.date.DateLike} date The time to check. + * @param {goog.date.DateLike=} opt_now The current time. * @return {boolean} Whether the dates are in the same calendar year. */ goog.date.isSameYear = function(date, opt_now) { @@ -724,13 +725,13 @@ goog.date.Date = function(opt_year, opt_month, opt_date) { }; -// TODO(anatol): It should use DateTimeSymbols /** * First day of week. 0 = Mon, 6 = Sun. * @type {number} * @private */ -goog.date.Date.prototype.firstDayOfWeek_ = goog.date.weekDay.MON; +goog.date.Date.prototype.firstDayOfWeek_ = + goog.i18n.DateTimeSymbols.FIRSTDAYOFWEEK; /** @@ -738,7 +739,8 @@ goog.date.Date.prototype.firstDayOfWeek_ = goog.date.weekDay.MON; * @type {number} * @private */ -goog.date.Date.prototype.firstWeekCutOffDay_ = goog.date.weekDay.THU; +goog.date.Date.prototype.firstWeekCutOffDay_ = + goog.i18n.DateTimeSymbols.FIRSTWEEKCUTOFFDAY; /** @@ -1223,6 +1225,19 @@ goog.date.Date.prototype.valueOf = function() { }; +/** + * Compares two dates. May be used as a sorting function. + * @see goog.array.sort + * @param {!goog.date.DateLike} date1 Date to compare. + * @param {!goog.date.DateLike} date2 Date to compare. + * @return {number} Comparison result. 0 if dates are the same, less than 0 if + * date1 is earlier than date2, greater than 0 if date1 is later than date2. + */ +goog.date.Date.compare = function(date1, date2) { + return date1.getTime() - date2.getTime(); +}; + + /** * Class representing a date and time. Defaults to current date and time if none diff --git a/contrib/closure-library/goog/date/date_test.html b/contrib/closure-library/goog/date/date_test.html index 2e86031..51577e9 100644 --- a/contrib/closure-library/goog/date/date_test.html +++ b/contrib/closure-library/goog/date/date_test.html @@ -3,7 +3,7 @@ @@ -11,6 +11,7 @@ Closure Unit Tests - goog.date diff --git a/contrib/closure-library/goog/date/daterange.js b/contrib/closure-library/goog/date/daterange.js index 3f5e186..a673e96 100644 --- a/contrib/closure-library/goog/date/daterange.js +++ b/contrib/closure-library/goog/date/daterange.js @@ -23,17 +23,17 @@ goog.provide('goog.date.DateRange.Iterator'); goog.provide('goog.date.DateRange.StandardDateRangeKeys'); goog.require('goog.date.Date'); -goog.require('goog.date.DateLike'); goog.require('goog.date.Interval'); goog.require('goog.iter.Iterator'); goog.require('goog.iter.StopIteration'); + /** * Constructs a date range. * @constructor - * @param {goog.date.DateLike} startDate The start date of the range. - * @param {goog.date.DateLike} endDate The end date of the range. + * @param {goog.date.Date} startDate The start date of the range. + * @param {goog.date.Date} endDate The end date of the range. */ goog.date.DateRange = function(startDate, endDate) { /** @@ -41,14 +41,14 @@ goog.date.DateRange = function(startDate, endDate) { * @type {goog.date.Date} * @private */ - this.startDate_ = new goog.date.Date(startDate); + this.startDate_ = startDate; /** * The end date. * @type {goog.date.Date} * @private */ - this.endDate_ = new goog.date.Date(endDate); + this.endDate_ = endDate; }; @@ -113,13 +113,13 @@ goog.date.DateRange.equals = function(a, b) { /** * Calculates a date that is a number of days after a date. Does not modify its * input. - * @param {goog.date.DateLike} date The input date. + * @param {goog.date.Date} date The input date. * @param {number} offset Number of days. * @return {goog.date.Date} The date that is |offset| days after |date|. * @private */ goog.date.DateRange.offsetInDays_ = function(date, offset) { - var newDate = new goog.date.Date(date); + var newDate = date.clone(); newDate.add(new goog.date.Interval(goog.date.Interval.DAYS, offset)); return newDate; }; @@ -128,13 +128,13 @@ goog.date.DateRange.offsetInDays_ = function(date, offset) { /** * Calculates the Monday before a date. If the input is a Monday, returns the * input. Does not modify its input. - * @param {goog.date.DateLike} date The input date. + * @param {goog.date.Date} date The input date. * @return {goog.date.Date} If |date| is a Monday, return |date|; otherwise * return the Monday before |date|. * @private */ goog.date.DateRange.currentOrLastMonday_ = function(date) { - var newDate = new goog.date.Date(date); + var newDate = date.clone(); newDate.add(new goog.date.Interval(goog.date.Interval.DAYS, -newDate.getIsoWeekday())); return newDate; @@ -144,14 +144,14 @@ goog.date.DateRange.currentOrLastMonday_ = function(date) { /** * Calculates a date that is a number of months after the first day in the * month that contains its input. Does not modify its input. - * @param {goog.date.DateLike} date The input date. + * @param {goog.date.Date} date The input date. * @param {number} offset Number of months. * @return {goog.date.Date} The date that is |offset| months after the first * day in the month that contains |date|. * @private */ goog.date.DateRange.offsetInMonths_ = function(date, offset) { - var newDate = new goog.date.Date(date); + var newDate = date.clone(); newDate.setDate(1); newDate.add(new goog.date.Interval(goog.date.Interval.MONTHS, offset)); return newDate; @@ -160,12 +160,12 @@ goog.date.DateRange.offsetInMonths_ = function(date, offset) { /** * Returns the range from yesterday to yesterday. - * @param {goog.date.DateLike=} opt_today The date to consider today. + * @param {goog.date.Date=} opt_today The date to consider today. * Defaults to today. * @return {goog.date.DateRange} The range that includes only yesterday. */ goog.date.DateRange.yesterday = function(opt_today) { - var today = new goog.date.Date(opt_today); + var today = goog.date.DateRange.cloneOrCreate_(opt_today); var yesterday = goog.date.DateRange.offsetInDays_(today, -1); return new goog.date.DateRange(yesterday, yesterday); }; @@ -173,25 +173,25 @@ goog.date.DateRange.yesterday = function(opt_today) { /** * Returns the range from today to today. - * @param {goog.date.DateLike=} opt_today The date to consider today. + * @param {goog.date.Date=} opt_today The date to consider today. * Defaults to today. * @return {goog.date.DateRange} The range that includes only today. */ goog.date.DateRange.today = function(opt_today) { - var today = new goog.date.Date(opt_today); + var today = goog.date.DateRange.cloneOrCreate_(opt_today); return new goog.date.DateRange(today, today); }; /** * Returns the range that includes the seven days that end yesterday. - * @param {goog.date.DateLike=} opt_today The date to consider today. + * @param {goog.date.Date=} opt_today The date to consider today. * Defaults to today. * @return {goog.date.DateRange} The range that includes the seven days that * end yesterday. */ goog.date.DateRange.last7Days = function(opt_today) { - var today = new goog.date.Date(opt_today); + var today = goog.date.DateRange.cloneOrCreate_(opt_today); var yesterday = goog.date.DateRange.offsetInDays_(today, -1); return new goog.date.DateRange(goog.date.DateRange.offsetInDays_(today, -7), yesterday); @@ -201,13 +201,13 @@ goog.date.DateRange.last7Days = function(opt_today) { /** * Returns the range that starts the first of this month and ends the last day * of this month. - * @param {goog.date.DateLike=} opt_today The date to consider today. + * @param {goog.date.Date=} opt_today The date to consider today. * Defaults to today. * @return {goog.date.DateRange} The range that starts the first of this month * and ends the last day of this month. */ goog.date.DateRange.thisMonth = function(opt_today) { - var today = new goog.date.Date(opt_today); + var today = goog.date.DateRange.cloneOrCreate_(opt_today); return new goog.date.DateRange( goog.date.DateRange.offsetInMonths_(today, 0), goog.date.DateRange.offsetInDays_( @@ -219,13 +219,13 @@ goog.date.DateRange.thisMonth = function(opt_today) { /** * Returns the range that starts the first of last month and ends the last day * of last month. - * @param {goog.date.DateLike=} opt_today The date to consider today. + * @param {goog.date.Date=} opt_today The date to consider today. * Defaults to today. * @return {goog.date.DateRange} The range that starts the first of last month * and ends the last day of last month. */ goog.date.DateRange.lastMonth = function(opt_today) { - var today = new goog.date.Date(opt_today); + var today = goog.date.DateRange.cloneOrCreate_(opt_today); return new goog.date.DateRange( goog.date.DateRange.offsetInMonths_(today, -1), goog.date.DateRange.offsetInDays_( @@ -235,34 +235,37 @@ goog.date.DateRange.lastMonth = function(opt_today) { /** - * Returns the range that starts the Monday on or before today and ends the - * Sunday on or after today. - * @param {goog.date.DateLike=} opt_today The date to consider today. + * Returns the seven-day range that starts on the first day of the week + * (see {@link goog.i18n.DateTimeSymbols.FIRSTDAYOFWEEK}) on or before today. + * @param {goog.date.Date=} opt_today The date to consider today. * Defaults to today. * @return {goog.date.DateRange} The range that starts the Monday on or before * today and ends the Sunday on or after today. */ goog.date.DateRange.thisWeek = function(opt_today) { - var today = new goog.date.Date(opt_today); - var start = goog.date.DateRange.offsetInDays_(today, -today.getIsoWeekday()); + var today = goog.date.DateRange.cloneOrCreate_(opt_today); + var iso = today.getIsoWeekday(); + var firstDay = today.getFirstDayOfWeek(); + var i18nFirstDay = (iso >= firstDay) ? iso - firstDay : iso + (7 - firstDay); + var start = goog.date.DateRange.offsetInDays_(today, -i18nFirstDay); var end = goog.date.DateRange.offsetInDays_(start, 6); return new goog.date.DateRange(start, end); }; /** - * Returns the range that starts seven days before the Monday on or before - * today and ends the Sunday on or before yesterday. - * @param {goog.date.DateLike=} opt_today The date to consider today. + * Returns the seven-day range that ends the day before the first day of + * the week (see {@link goog.i18n.DateTimeSymbols.FIRSTDAYOFWEEK}) that + * contains today. + * @param {goog.date.Date=} opt_today The date to consider today. * Defaults to today. * @return {goog.date.DateRange} The range that starts seven days before the * Monday on or before today and ends the Sunday on or before yesterday. */ goog.date.DateRange.lastWeek = function(opt_today) { - var today = new goog.date.Date(opt_today); - var start = goog.date.DateRange.offsetInDays_(today, - - 7 - today.getIsoWeekday()); - var end = goog.date.DateRange.offsetInDays_(start, 6); + var thisWeek = goog.date.DateRange.thisWeek(opt_today); + var start = goog.date.DateRange.offsetInDays_(thisWeek.getStartDate(), -7); + var end = goog.date.DateRange.offsetInDays_(thisWeek.getEndDate(), -7); return new goog.date.DateRange(start, end); }; @@ -270,13 +273,14 @@ goog.date.DateRange.lastWeek = function(opt_today) { /** * Returns the range that starts seven days before the Monday on or before * today and ends the Friday before today. - * @param {goog.date.DateLike=} opt_today The date to consider today. + * @param {goog.date.Date=} opt_today The date to consider today. * Defaults to today. * @return {goog.date.DateRange} The range that starts seven days before the * Monday on or before today and ends the Friday before today. */ goog.date.DateRange.lastBusinessWeek = function(opt_today) { - var today = new goog.date.Date(opt_today); + // TODO(user): should be i18nized. + var today = goog.date.DateRange.cloneOrCreate_(opt_today); var start = goog.date.DateRange.offsetInDays_(today, - 7 - today.getIsoWeekday()); var end = goog.date.DateRange.offsetInDays_(start, 4); @@ -287,7 +291,7 @@ goog.date.DateRange.lastBusinessWeek = function(opt_today) { /** * Returns the range that includes all days between January 1, 1900 and * December 31, 9999. - * @param {goog.date.DateLike=} opt_today The date to consider today. + * @param {goog.date.Date=} opt_today The date to consider today. * Defaults to today. * @return {goog.date.DateRange} The range that includes all days between * January 1, 1900 and December 31, 9999. @@ -320,7 +324,7 @@ goog.date.DateRange.StandardDateRangeKeys = { /** * @param {string} dateRangeKey A standard date range key. - * @param {goog.date.DateLike=} opt_today The date to consider today. + * @param {goog.date.Date=} opt_today The date to consider today. * Defaults to today. * @return {goog.date.DateRange} The date range that corresponds to that key. * @throws {Error} If no standard date range with that key exists. @@ -360,6 +364,18 @@ goog.date.DateRange.standardDateRange = function(dateRangeKey, opt_today) { }; +/** + * Clones or creates new. + * @param {goog.date.Date=} opt_today The date to consider today. + * Defaults to today. + * @return {!goog.date.Date} cloned or new. + * @private + */ +goog.date.DateRange.cloneOrCreate_ = function(opt_today) { + return opt_today ? opt_today.clone() : new goog.date.Date(); +}; + + /** * Creates an iterator over the dates in a {@link goog.date.DateRange}. diff --git a/contrib/closure-library/goog/date/daterange_test.html b/contrib/closure-library/goog/date/daterange_test.html index cf63c5a..ed25f5c 100644 --- a/contrib/closure-library/goog/date/daterange_test.html +++ b/contrib/closure-library/goog/date/daterange_test.html @@ -3,7 +3,7 @@ @@ -99,8 +99,6 @@ var s = new gd(2008, 9, 12); var e = new gd(2008, 9, 12); assertStartEnd('yesterday', s, e, gdr.yesterday(d)); - assertStartEnd('yesterday with regular Date', s, e, - gdr.yesterday(new Date(d.getTime()))); } function testToday() { @@ -113,8 +111,6 @@ var s = new gd(2008, 9, 6); var e = new gd(2008, 9, 12); assertStartEnd('last7Days', s, e, gdr.last7Days(d)); - assertStartEnd('last7Days with regular Date', s, e, - gdr.last7Days(new Date(d.getTime()))); assertStartEnd('last7Days by key', s, e, gdr.standardDateRange(gdr.StandardDateRangeKeys.LAST_7_DAYS, d)); } @@ -124,8 +120,6 @@ var s = new gd(2008, 9, 1); var e = new gd(2008, 9, 31); assertStartEnd('thisMonth', s, e, gdr.thisMonth(d)); - assertStartEnd('thisMonth with regular Date', s, e, - gdr.thisMonth(new Date(d.getTime()))); assertStartEnd('thisMonth by key', s, e, gdr.standardDateRange(gdr.StandardDateRangeKeys.THIS_MONTH, d)); } @@ -135,32 +129,80 @@ var s = new gd(2008, 8, 1); var e = new gd(2008, 8, 30); assertStartEnd('lastMonth', s, e, gdr.lastMonth(d)); - assertStartEnd('lastMonth with regular Date', s, e, - gdr.lastMonth(new Date(d.getTime()))); assertStartEnd('lastMonth by key', s, e, gdr.standardDateRange(gdr.StandardDateRangeKeys.LAST_MONTH, d)); } function testThisWeek() { - var d = new gd(2008, 9, 13); - var s = new gd(2008, 9, 13); - var e = new gd(2008, 9, 19); - assertStartEnd('thisWeek', s, e, gdr.thisWeek(d)); - assertStartEnd('thisWeek with regular Date', s, e, - gdr.thisWeek(new Date(d.getTime()))); - assertStartEnd('thisWeek by key', s, e, - gdr.standardDateRange(gdr.StandardDateRangeKeys.THIS_WEEK, d)); + var startDates = [ + new gd(2011, 2, 28), + new gd(2011, 2, 29), + new gd(2011, 2, 30), + new gd(2011, 2, 31), + new gd(2011, 3, 1), + new gd(2011, 2, 26), + new gd(2011, 2, 27) + ]; + + var endDates = [ + new gd(2011, 3, 3), + new gd(2011, 3, 4), + new gd(2011, 3, 5), + new gd(2011, 3, 6), + new gd(2011, 3, 7), + new gd(2011, 3, 1), + new gd(2011, 3, 2) + ]; + + // 0 - is Monday, 6 is Sunday. + for (var i = 0; i < 7; i++){ + var date = new gd(2011, 3, 1); + date.setFirstDayOfWeek(i); + assertStartEnd('thisWeek, ' + i, startDates[i], endDates[i], + gdr.thisWeek(date)); + } + + assertStartEnd('thisWeek by key ', + startDates[goog.i18n.DateTimeSymbols.FIRSTDAYOFWEEK], + endDates[goog.i18n.DateTimeSymbols.FIRSTDAYOFWEEK], + gdr.standardDateRange(gdr.StandardDateRangeKeys.THIS_WEEK, + new gd(2011, 3, 1))); } function testLastWeek() { - var d = new gd(2008, 9, 13); - var s = new gd(2008, 9, 6); - var e = new gd(2008, 9, 12); - assertStartEnd('lastWeek', s, e, gdr.lastWeek(d)); - assertStartEnd('lastWeek with regular Date', s, e, - gdr.lastWeek(new Date(d.getTime()))); - assertStartEnd('lastWeek by key', s, e, - gdr.standardDateRange(gdr.StandardDateRangeKeys.LAST_WEEK, d)); + var startDates = [ + new gd(2011, 2, 21), + new gd(2011, 2, 22), + new gd(2011, 2, 23), + new gd(2011, 2, 24), + new gd(2011, 2, 25), + new gd(2011, 2, 19), + new gd(2011, 2, 20) + ]; + + var endDates = [ + new gd(2011, 2, 27), + new gd(2011, 2, 28), + new gd(2011, 2, 29), + new gd(2011, 2, 30), + new gd(2011, 2, 31), + new gd(2011, 2, 25), + new gd(2011, 2, 26) + ]; + + // 0 - is Monday, 6 is Sunday. + for (var i = 0; i < 7; i++){ + var date = new gd(2011, 3, 1); + date.setFirstDayOfWeek(i); + assertStartEnd('lastWeek, ' + i, startDates[i], endDates[i], + gdr.lastWeek(date)); + } + + assertStartEnd('lastWeek by key', + startDates[goog.i18n.DateTimeSymbols.FIRSTDAYOFWEEK], + endDates[goog.i18n.DateTimeSymbols.FIRSTDAYOFWEEK], + gdr.standardDateRange(gdr.StandardDateRangeKeys.LAST_WEEK, + new gd(2011, 3, 1))); } function testLastBusinessWeek() { @@ -168,8 +210,6 @@ var s = new gd(2008, 9, 6); var e = new gd(2008, 9, 10); assertStartEnd('lastBusinessWeek', s, e, gdr.lastBusinessWeek(d)); - assertStartEnd('lastBusinessWeek with regular Date', s, e, - gdr.lastBusinessWeek(new Date(d.getTime()))); assertStartEnd('lastBusinessWeek by key', s, e, gdr.standardDateRange(gdr.StandardDateRangeKeys.LAST_BUSINESS_WEEK, d)); } diff --git a/contrib/closure-library/goog/date/relative_test.html b/contrib/closure-library/goog/date/relative_test.html index 45c3fd7..8d7f9e9 100644 --- a/contrib/closure-library/goog/date/relative_test.html +++ b/contrib/closure-library/goog/date/relative_test.html @@ -7,7 +7,7 @@ diff --git a/contrib/closure-library/goog/date/utcdatetime_test.html b/contrib/closure-library/goog/date/utcdatetime_test.html index 2df3ac3..9e73b4b 100644 --- a/contrib/closure-library/goog/date/utcdatetime_test.html +++ b/contrib/closure-library/goog/date/utcdatetime_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/debug/console.js b/contrib/closure-library/goog/debug/console.js index 8089005..82fc89d 100644 --- a/contrib/closure-library/goog/debug/console.js +++ b/contrib/closure-library/goog/debug/console.js @@ -27,23 +27,38 @@ goog.require('goog.debug.Logger.Level'); goog.require('goog.debug.TextFormatter'); + /** * Create and install a log handler that logs to window.console if available * @constructor */ goog.debug.Console = function() { this.publishHandler_ = goog.bind(this.addLogRecord, this); + + /** + * Formatter for formatted output. + * @type {!goog.debug.TextFormatter} + * @private + */ this.formatter_ = new goog.debug.TextFormatter(); this.formatter_.showAbsoluteTime = false; this.formatter_.showExceptionText = false; + this.isCapturing_ = false; this.logBuffer_ = ''; + + /** + * Loggers that we shouldn't output. + * @type {!Object.} + * @private + */ + this.filteredLoggers_ = {}; }; /** * Returns the text formatter used by this console - * @return {goog.debug.TextFormatter} The text formatter. + * @return {!goog.debug.TextFormatter} The text formatter. */ goog.debug.Console.prototype.getFormatter = function() { return this.formatter_; @@ -76,27 +91,34 @@ goog.debug.Console.prototype.setCapturing = function(capturing) { * @param {goog.debug.LogRecord} logRecord The log entry. */ goog.debug.Console.prototype.addLogRecord = function(logRecord) { + + // Check to see if the log record is filtered or not. + if (this.filteredLoggers_[logRecord.getLoggerName()]) { + return; + } + var record = this.formatter_.formatRecord(logRecord); - if (window.console && window.console['firebug']) { + var console = goog.debug.Console.console_; + if (console && console['firebug']) { // NOTE(user): info, error, warn and debug aren't in the externs and are // only available to FireBug, so we need to reference them by array // notation to stop the compiler complaining. switch (logRecord.getLevel()) { case goog.debug.Logger.Level.SHOUT: - window.console['info'](record); + console['info'](record); break; case goog.debug.Logger.Level.SEVERE: - window.console['error'](record); + console['error'](record); break; case goog.debug.Logger.Level.WARNING: - window.console['warn'](record); + console['warn'](record); break; default: - window.console['debug'](record); + console['debug'](record); break; } - } else if (window.console) { - window.console.log(record); + } else if (console) { + console.log(record); } else if (window.opera) { // window.opera.postError is considered an undefined property reference // by JSCompiler, so it has to be referenced using array notation instead. @@ -107,6 +129,24 @@ goog.debug.Console.prototype.addLogRecord = function(logRecord) { }; +/** + * Adds a logger name to be filtered. + * @param {string} loggerName the logger name to add. + */ +goog.debug.Console.prototype.addFilter = function(loggerName) { + this.filteredLoggers_[loggerName] = true; +}; + + +/** + * Removes a logger name to be filtered. + * @param {string} loggerName the logger name to remove. + */ +goog.debug.Console.prototype.removeFilter = function(loggerName) { + delete this.filteredLoggers_[loggerName]; +}; + + /** * Global console logger instance * @type {goog.debug.Console} @@ -114,6 +154,15 @@ goog.debug.Console.prototype.addLogRecord = function(logRecord) { goog.debug.Console.instance = null; +/** + * The console to which to log. This is a property so it can be mocked out in + * unit testing. + * @type {!Object} + * @private + */ +goog.debug.Console.console_ = window.console; + + /** * Install the console and start capturing if "Debug=true" is in the page URL */ diff --git a/contrib/closure-library/goog/debug/console_test.html b/contrib/closure-library/goog/debug/console_test.html new file mode 100644 index 0000000..eb6c776 --- /dev/null +++ b/contrib/closure-library/goog/debug/console_test.html @@ -0,0 +1,104 @@ + + + + + +Closure Unit Tests - goog.debug.Console + + + + + + + diff --git a/contrib/closure-library/goog/debug/debug.js b/contrib/closure-library/goog/debug/debug.js index 14df6d1..1cd1ad9 100644 --- a/contrib/closure-library/goog/debug/debug.js +++ b/contrib/closure-library/goog/debug/debug.js @@ -199,28 +199,50 @@ goog.debug.exposeException = function(err, opt_fn) { */ goog.debug.normalizeErrorObject = function(err) { var href = goog.getObjectByName('window.location.href'); - return (typeof err == 'string') ? - { - 'message': err, - 'name': 'Unknown error', - 'lineNumber': 'Not available', - 'fileName': href, - 'stack': 'Not available' - } : - - // The IE Error object contains only the name and the message - // The Safari Error object uses the line and sourceURL fields - (!err.lineNumber || !err.fileName || !err.stack) ? - { - 'message': err.message, - 'name': err.name, - 'lineNumber': err.lineNumber || err.line || 'Not available', - 'fileName': err.fileName || err.filename || err.sourceURL || href, - 'stack': err.stack || 'Not available' - } : - - // Standards error object - err; + if (goog.isString(err)) { + return { + 'message': err, + 'name': 'Unknown error', + 'lineNumber': 'Not available', + 'fileName': href, + 'stack': 'Not available' + }; + } + + var lineNumber, fileName; + var threwError = false; + + try { + lineNumber = err.lineNumber || err.line || 'Not available'; + } catch (e) { + // Firefox 2 sometimes throws an error when accessing 'lineNumber': + // Message: Permission denied to get property UnnamedClass.lineNumber + lineNumber = 'Not available'; + threwError = true; + } + + try { + fileName = err.fileName || err.filename || err.sourceURL || href; + } catch (e) { + // Firefox 2 may also throw an error when accessing 'filename'. + fileName = 'Not available'; + threwError = true; + } + + // The IE Error object contains only the name and the message. + // The Safari Error object uses the line and sourceURL fields. + if (threwError || !err.lineNumber || !err.fileName || !err.stack) { + return { + 'message': err.message, + 'name': err.name, + 'lineNumber': lineNumber, + 'fileName': fileName, + 'stack': err.stack || 'Not available' + }; + } + + // Standards error object + return err; }; @@ -385,12 +407,34 @@ goog.debug.getStacktraceHelper_ = function(fn, visited) { }; +/** + * Set a custom function name resolver. + * @param {function(Function): string} resolver Resolves functions to their + * names. + */ +goog.debug.setFunctionResolver = function(resolver) { + goog.debug.fnNameResolver_ = resolver; +}; + + /** * Gets a function name * @param {Function} fn Function to get name of. * @return {string} Function's name. */ goog.debug.getFunctionName = function(fn) { + if (goog.debug.fnNameCache_[fn]) { + return goog.debug.fnNameCache_[fn]; + } + if (goog.debug.fnNameResolver_) { + var name = goog.debug.fnNameResolver_(fn); + if (name) { + goog.debug.fnNameCache_[fn] = name; + return name; + } + } + + // Heuristically determine function name based on code. var functionSource = String(fn); if (!goog.debug.fnNameCache_[functionSource]) { var matches = /function ([^\(]+)/.exec(functionSource); @@ -428,3 +472,11 @@ goog.debug.makeWhitespaceVisible = function(string) { * @private */ goog.debug.fnNameCache_ = {}; + + +/** + * Resolves functions to their names. Resolved function names will be cached. + * @type {function(Function):string} + * @private + */ +goog.debug.fnNameResolver_; diff --git a/contrib/closure-library/goog/debug/debug_test.html b/contrib/closure-library/goog/debug/debug_test.html index 0b52218..079e20b 100644 --- a/contrib/closure-library/goog/debug/debug_test.html +++ b/contrib/closure-library/goog/debug/debug_test.html @@ -3,7 +3,7 @@ @@ -12,6 +12,7 @@ @@ -27,6 +28,41 @@ 'Hello World!\r\n\r\n\f\fI am\t\there!\r\n')); } +function testGetFunctionName() { + // Trivial resolver that matches just a few names: a static function, a + // constructor, and a member function. + var resolver = function(f) { + if (f === goog.debug.getFunctionName) { + return 'goog.debug.getFunctionName'; + } else if (f === goog.structs.Set) { + return 'goog.structs.Set'; + } else if (f === goog.structs.Set.prototype.getCount) { + return 'goog.structs.Set.getCount'; + } else { + return null; + } + }; + goog.debug.setFunctionResolver(resolver); + + assertEquals( + 'goog.debug.getFunctionName', + goog.debug.getFunctionName(goog.debug.getFunctionName)); + assertEquals( + 'goog.structs.Set', + goog.debug.getFunctionName(goog.structs.Set)); + var set = new goog.structs.Set(); + assertEquals( + 'goog.structs.Set.getCount', + goog.debug.getFunctionName(set.getCount)); + + // This function is matched by the fallback heuristic. + assertEquals( + 'testGetFunctionName', + goog.debug.getFunctionName(testGetFunctionName)); + + goog.debug.setFunctionResolver(null); +} + diff --git a/contrib/closure-library/goog/debug/debugwindow.js b/contrib/closure-library/goog/debug/debugwindow.js index 12ee72e..e791f9c 100644 --- a/contrib/closure-library/goog/debug/debugwindow.js +++ b/contrib/closure-library/goog/debug/debugwindow.js @@ -132,6 +132,15 @@ goog.debug.DebugWindow.COOKIE_TIME = 30 * 24 * 60 * 60 * 1000; // 30-days */ goog.debug.DebugWindow.prototype.welcomeMessage = 'LOGGING'; + +/** + * Whether to force enable the window on a severe log. + * @type {boolean} + * @private + */ +goog.debug.DebugWindow.prototype.enableOnSevere_ = false; + + /** * Reference to debug window * @type {Window} @@ -140,6 +149,7 @@ goog.debug.DebugWindow.prototype.welcomeMessage = 'LOGGING'; */ goog.debug.DebugWindow.prototype.win_ = null; + /** * In the process of opening the window * @type {boolean} @@ -147,6 +157,7 @@ goog.debug.DebugWindow.prototype.win_ = null; */ goog.debug.DebugWindow.prototype.winOpening_ = false; + /** * Whether we are currently capturing logger output. * @@ -236,6 +247,17 @@ goog.debug.DebugWindow.prototype.setEnabled = function(enable) { }; +/** + * Sets whether the debug window should be force enabled when a severe log is + * encountered. + * @param {boolean} enableOnSevere Whether to enable on severe logs.. + */ +goog.debug.DebugWindow.prototype.setForceEnableOnSevere = + function(enableOnSevere) { + this.enableOnSevere_ = enableOnSevere; +}; + + /** * Whether we are currently capturing logger output. * @return {boolean} whether we are currently capturing logger output. @@ -323,6 +345,10 @@ goog.debug.DebugWindow.prototype.addLogRecord = function(logRecord) { } var html = this.formatter_.formatRecord(logRecord); this.write_(html); + if (this.enableOnSevere_ && + logRecord.getLevel().value >= goog.debug.Logger.Level.SEVERE.value) { + this.setEnabled(true); + } }; @@ -344,6 +370,7 @@ goog.debug.DebugWindow.prototype.write_ = function(html) { } }; + /** * Write to the buffer. If a message hasn't been sent for more than 750ms just * write, otherwise delay for a minimum of 250ms. @@ -493,7 +520,8 @@ goog.debug.DebugWindow.prototype.writeInitialDocument_ = function() { */ goog.debug.DebugWindow.prototype.setCookie_ = function(key, value) { key += this.identifier_; - document.cookie = key + '=' + encodeURIComponent(value) + ';expires=' + + document.cookie = key + '=' + encodeURIComponent(value) + + ';path=/;expires=' + (new Date(goog.now() + goog.debug.DebugWindow.COOKIE_TIME)).toUTCString(); }; diff --git a/contrib/closure-library/goog/debug/devcss/devcss.js b/contrib/closure-library/goog/debug/devcss/devcss.js new file mode 100644 index 0000000..e374cbc --- /dev/null +++ b/contrib/closure-library/goog/debug/devcss/devcss.js @@ -0,0 +1,436 @@ +// Copyright 2008 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +goog.provide('goog.debug.DevCss'); +goog.provide('goog.debug.DevCss.UserAgent'); + +goog.require('goog.cssom'); +goog.require('goog.dom.classes'); +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('goog.string'); +goog.require('goog.userAgent'); + + + +/** + * A class for solving development CSS issues/emulating the CSS Compiler. + * @param {goog.debug.DevCss.UserAgent=} opt_userAgent The user agent, if not + * passed in, will be determined using goog.userAgent. + * @param {number|string=} opt_userAgentVersion The user agent's version. + * If not passed in, will be determined using goog.userAgent. + * @throws {Error} When userAgent detection fails. + * @constructor + */ +goog.debug.DevCss = function(opt_userAgent, opt_userAgentVersion) { + if (!opt_userAgent) { + // Walks through the known goog.userAgents. + if (goog.userAgent.IE) { + opt_userAgent = goog.debug.DevCss.UserAgent.IE; + } else if (goog.userAgent.GECKO) { + opt_userAgent = goog.debug.DevCss.UserAgent.GECKO; + } else if (goog.userAgent.WEBKIT) { + opt_userAgent = goog.debug.DevCss.UserAgent.WEBKIT; + } else if (goog.userAgent.MOBILE) { + opt_userAgent = goog.debug.DevCss.UserAgent.MOBILE; + } else if (goog.userAgent.OPERA) { + opt_userAgent = goog.debug.DevCss.UserAgent.OPERA; + } + } + switch (opt_userAgent) { + case goog.debug.DevCss.UserAgent.OPERA: + case goog.debug.DevCss.UserAgent.IE: + case goog.debug.DevCss.UserAgent.GECKO: + case goog.debug.DevCss.UserAgent.FIREFOX: + case goog.debug.DevCss.UserAgent.WEBKIT: + case goog.debug.DevCss.UserAgent.SAFARI: + case goog.debug.DevCss.UserAgent.MOBILE: + break; + default: + throw Error('Could not determine the user agent from known UserAgents'); + } + + /** + * One of goog.debug.DevCss.UserAgent. + * @type {string} + * @private + */ + this.userAgent_ = opt_userAgent; + + /** + * @type {number|string} + * @private + */ + this.userAgentVersion_ = opt_userAgentVersion || goog.userAgent.VERSION; + this.generateUserAgentTokens_(); + + /** + * @type {boolean} + * @private + */ + this.isIe6OrLess_ = this.userAgent_ == goog.debug.DevCss.UserAgent.IE && + goog.string.compareVersions('7', this.userAgentVersion_) > 0; + + if (this.isIe6OrLess_) { + /** + * @type {Array.<{classNames,combinedClassName,els}>} + * @private + */ + this.ie6CombinedMatches_ = []; + } +}; + + +/** + * Rewrites the CSSOM as needed to activate any useragent-specific selectors. + * @param {boolean=} opt_enableIe6ReadyHandler If true(the default), and the + * userAgent is ie6, we set a document "ready" event handler to walk the DOM + * and make combined selector className changes. Having this parameter also + * aids unit testing. + */ +goog.debug.DevCss.prototype.activateBrowserSpecificCssRules = function( + opt_enableIe6ReadyHandler) { + var enableIe6EventHandler = goog.isDef(opt_enableIe6ReadyHandler) ? + opt_enableIe6ReadyHandler : true; + var cssRules = goog.cssom.getAllCssStyleRules(); + + for (var i = 0, cssRule; cssRule = cssRules[i]; i++) { + this.replaceBrowserSpecificClassNames_(cssRule); + } + + // Since we may have manipulated the rules above, we'll have to do a + // complete sweep again if we're in IE6. Luckily performance doesn't + // matter for this tool. + if (this.isIe6OrLess_) { + cssRules = goog.cssom.getAllCssStyleRules(); + for (var i = 0, cssRule; cssRule = cssRules[i]; i++) { + this.replaceIe6CombinedSelectors_(cssRule); + } + } + + // Add an event listener for document ready to rewrite any necessary + // combined classnames in IE6. + if (this.isIe6OrLess_ && enableIe6EventHandler) { + goog.events.listen(document, goog.events.EventType.LOAD, goog.bind( + this.addIe6CombinedClassNames_, this)); + } +}; + + +/** + * @type {Object} + * @private + */ +goog.debug.DevCss.prototype.userAgentTokens_ = {}; + + +/** + * A list of possible user agent strings. + * @enum {string} + */ +goog.debug.DevCss.UserAgent = { + OPERA: 'OPERA', + IE: 'IE', + GECKO: 'GECKO', + FIREFOX: 'GECKO', + WEBKIT: 'WEBKIT', + SAFARI: 'WEBKIT', + MOBILE: 'MOBILE' +}; + + +/** + * A list of strings that may be used for matching in CSS files/development. + * @enum {string} + * @private + */ +goog.debug.DevCss.CssToken_ = { + USERAGENT: 'USERAGENT', + SEPARATOR: '-', + LESS_THAN: 'LT', + GREATER_THAN: 'GT', + LESS_THAN_OR_EQUAL: 'LTE', + GREATER_THAN_OR_EQUAL: 'GTE', + IE6_SELECTOR_TEXT: 'goog-ie6-selector', + IE6_COMBINED_GLUE: '_' +}; + + +/** + * Generates user agent token match strings with comparison and version bits. + * For example: + * userAgentTokens_.ANY will be like 'GECKO' + * userAgentTokens_.LESS_THAN will be like 'GECKO-LT3' etc... + * @private + */ +goog.debug.DevCss.prototype.generateUserAgentTokens_ = function() { + this.userAgentTokens_.ANY = goog.debug.DevCss.CssToken_.USERAGENT + + goog.debug.DevCss.CssToken_.SEPARATOR + this.userAgent_; + this.userAgentTokens_.EQUALS = this.userAgentTokens_.ANY + + goog.debug.DevCss.CssToken_.SEPARATOR; + this.userAgentTokens_.LESS_THAN = this.userAgentTokens_.ANY + + goog.debug.DevCss.CssToken_.SEPARATOR + + goog.debug.DevCss.CssToken_.LESS_THAN; + this.userAgentTokens_.LESS_THAN_OR_EQUAL = this.userAgentTokens_.ANY + + goog.debug.DevCss.CssToken_.SEPARATOR + + goog.debug.DevCss.CssToken_.LESS_THAN_OR_EQUAL; + this.userAgentTokens_.GREATER_THAN = this.userAgentTokens_.ANY + + goog.debug.DevCss.CssToken_.SEPARATOR + + goog.debug.DevCss.CssToken_.GREATER_THAN; + this.userAgentTokens_.GREATER_THAN_OR_EQUAL = this.userAgentTokens_.ANY + + goog.debug.DevCss.CssToken_.SEPARATOR + + goog.debug.DevCss.CssToken_.GREATER_THAN_OR_EQUAL; +}; + + +/** + * Gets the version number bit from a selector matching userAgentToken. + * @param {string} selectorText The selector text of a CSS rule. + * @param {string} userAgentToken Includes the LTE/GTE bit to see if it matches. + * @return {string|undefined} The version number. + * @private + */ +goog.debug.DevCss.prototype.getVersionNumberFromSelectorText_ = function( + selectorText, userAgentToken) { + var regex = new RegExp(userAgentToken + '([\\d\\.]+)'); + var matches = regex.exec(selectorText); + if (matches && matches.length == 2) { + return matches[1]; + } +}; + + +/** + * Extracts a rule version from the selector text, and if it finds one, calls + * compareVersions against it and the passed in token string to provide the + * value needed to determine if we have a match or not. + * @param {CSSRule} cssRule The rule to test against. + * @param {string} token The match token to test against the rule. + * @return {Array|undefined} A tuple with the result of the compareVersions call + * and the matched ruleVersion. + * @private + */ +goog.debug.DevCss.prototype.getRuleVersionAndCompare_ = function(cssRule, + token) { + if (!cssRule.selectorText.match(token)) { + return; + } + var ruleVersion = this.getVersionNumberFromSelectorText_( + cssRule.selectorText, token); + if (!ruleVersion) { + return; + } + + var comparison = goog.string.compareVersions(this.userAgentVersion_, + ruleVersion); + return [comparison, ruleVersion]; +}; + + +/** + * Replaces a CSS selector if we have matches based on our useragent/version. + * Example: With a selector like ".USERAGENT-IE-LTE6 .class { prop: value }" if + * we are running IE6 we'll end up with ".class { prop: value }", thereby + * "activating" the selector. + * @param {CSSRule} cssRule The cssRule to potentially replace. + * @private + */ +goog.debug.DevCss.prototype.replaceBrowserSpecificClassNames_ = function( + cssRule) { + + // If we don't match the browser token, we can stop now. + if (!cssRule.selectorText.match(this.userAgentTokens_.ANY)) { + return; + } + + // We know it will begin as a classname. + var additionalRegexString; + + // Tests "Less than or equals". + var compared = this.getRuleVersionAndCompare_(cssRule, + this.userAgentTokens_.LESS_THAN_OR_EQUAL); + if (compared && compared.length) { + if (compared[0] > 0) { + return; + } + additionalRegexString = this.userAgentTokens_.LESS_THAN_OR_EQUAL + + compared[1]; + } + + // Tests "Less than". + compared = this.getRuleVersionAndCompare_(cssRule, + this.userAgentTokens_.LESS_THAN); + if (compared && compared.length) { + if (compared[0] > -1) { + return; + } + additionalRegexString = this.userAgentTokens_.LESS_THAN + compared[1]; + } + + // Tests "Greater than or equals". + compared = this.getRuleVersionAndCompare_(cssRule, + this.userAgentTokens_.GREATER_THAN_OR_EQUAL); + if (compared && compared.length) { + if (compared[0] < 0) { + return; + } + additionalRegexString = this.userAgentTokens_.GREATER_THAN_OR_EQUAL + + compared[1]; + } + + // Tests "Greater than". + compared = this.getRuleVersionAndCompare_(cssRule, + this.userAgentTokens_.GREATER_THAN); + if (compared && compared.length) { + if (compared[0] < 1) { + return; + } + additionalRegexString = this.userAgentTokens_.GREATER_THAN + compared[1]; + } + + // Tests "Equals". + compared = this.getRuleVersionAndCompare_(cssRule, + this.userAgentTokens_.EQUALS); + if (compared && compared.length) { + if (compared[0] != 0) { + return; + } + additionalRegexString = this.userAgentTokens_.EQUALS + compared[1]; + } + + // If we got to here without generating the additionalRegexString, then + // we did not match any of our comparison token strings, and we want a + // general browser token replacement. + if (!additionalRegexString) { + additionalRegexString = this.userAgentTokens_.ANY; + } + + // We need to match at least a single whitespace character to know that + // we are matching the entire useragent string token. + var regexString = '\\.' + additionalRegexString + '\\s+'; + var re = new RegExp(regexString, 'g'); + + var currentCssText = goog.cssom.getCssTextFromCssRule(cssRule); + + // Replacing the token with '' activates the selector for this useragent. + var newCssText = currentCssText.replace(re, ''); + + if (newCssText != currentCssText) { + goog.cssom.replaceCssRule(cssRule, newCssText); + } +}; + + +/** + * Replaces IE6 combined selector rules with a workable development alternative. + * IE6 actually parses .class1.class2 {} to simply .class2 {} which is nasty. + * To fully support combined selectors in IE6 this function needs to be paired + * with a call to replace the relevant DOM elements classNames as well. + * @see {this.addIe6CombinedClassNames_} + * @param {CSSRule} cssRule The rule to potentially fix. + * @private + */ +goog.debug.DevCss.prototype.replaceIe6CombinedSelectors_ = function(cssRule) { + // This match only ever works in IE because other UA's won't have our + // IE6_SELECTOR_TEXT in the cssText property. + if (cssRule.style.cssText && + cssRule.style.cssText.match( + goog.debug.DevCss.CssToken_.IE6_SELECTOR_TEXT)) { + var cssText = goog.cssom.getCssTextFromCssRule(cssRule); + var combinedSelectorText = this.getIe6CombinedSelectorText_(cssText); + if (combinedSelectorText) { + var newCssText = combinedSelectorText + '{' + cssRule.style.cssText + '}'; + goog.cssom.replaceCssRule(cssRule, newCssText); + } + } +}; + + +/** + * Gets the appropriate new combined selector text for IE6. + * Also adds an entry onto ie6CombinedMatches_ with relevant info for the + * likely following call to walk the DOM and rewrite the class attribute. + * Example: With a selector like + * ".class2 { -goog-ie6-selector: .class1.class2; prop: value }". + * this function will return: + * ".class1_class2 { prop: value }". + * @param {string} cssText The CSS selector text and css rule text combined. + * @return {?string} The rewritten css rule text. + * @private + */ +goog.debug.DevCss.prototype.getIe6CombinedSelectorText_ = function(cssText) { + var regex = new RegExp(goog.debug.DevCss.CssToken_.IE6_SELECTOR_TEXT + + '\\s*:\\s*\\"([^\\"]+)\\"', 'gi'); + var matches = regex.exec(cssText); + if (matches) { + var combinedSelectorText = matches[1]; + // To aid in later fixing the DOM, we need to split up the possible + // selector groups by commas. + var groupedSelectors = combinedSelectorText.split(/\s*\,\s*/); + for (var i = 0, selector; selector = groupedSelectors[i]; i++) { + // Strips off the leading ".". + var combinedClassName = selector.substr(1); + var classNames = combinedClassName.split( + goog.debug.DevCss.CssToken_.IE6_COMBINED_GLUE); + var entry = { + classNames: classNames, + combinedClassName: combinedClassName, + els: [] + }; + this.ie6CombinedMatches_.push(entry); + } + return combinedSelectorText; + } + return null; +}; + + +/** + * Adds combined selectors with underscores to make them "work" in IE6. + * @see {this.replaceIe6CombinedSelectors_} + * @private + */ +goog.debug.DevCss.prototype.addIe6CombinedClassNames_ = function() { + if (!this.ie6CombinedMatches_.length) { + return; + } + var allEls = document.getElementsByTagName('*'); + var matches = []; + // Match nodes for all classNames. + for (var i = 0, classNameEntry; classNameEntry = + this.ie6CombinedMatches_[i]; i++) { + for (var j = 0, el; el = allEls[j]; j++) { + var classNamesLength = classNameEntry.classNames.length; + for (var k = 0, className; className = classNameEntry.classNames[k]; + k++) { + if (!goog.dom.classes.has(el, className)) { + break; + } + if (k == classNamesLength - 1) { + classNameEntry.els.push(el); + } + } + } + // Walks over our matching nodes and fixes them. + if (classNameEntry.els.length) { + for (var j = 0, el; el = classNameEntry.els[j]; j++) { + if (!goog.dom.classes.has(el, classNameEntry.combinedClassName)) { + goog.dom.classes.add(el, classNameEntry.combinedClassName); + } + } + } + } +}; + diff --git a/contrib/closure-library/goog/debug/devcss/devcss_test.html b/contrib/closure-library/goog/debug/devcss/devcss_test.html new file mode 100644 index 0000000..f5f7f80 --- /dev/null +++ b/contrib/closure-library/goog/debug/devcss/devcss_test.html @@ -0,0 +1,365 @@ + + + + + + + Closure Unit Tests - CSS Object Model helper + + + + + + + + + +
+
    +
  • + Should end up background-color:rgb(255, 192, 203) aka pink. +
  • +
  • + Should end up with margin-top: 20px; margin-left: 15px; +
  • +
+
+ +

+ +
+
    +
  • + Should end up background-color:rgb(255, 192, 203) aka pink, not black or purple. +
  • +
+
+ + + +

+ +
+ This element should be pink for IE8. +
+
+ This element should also be pink for IE8. +
+ +

+ +
+ This element should be pink for Gecko. +
+
+ This element should also be pink for Gecko. +
+ +

+ +
+ This (class="compound1") should have no bg. +
+
+ This (class="compound2") should have no bg. +
+
+ This (class="compound1 compound2 compound1_compound2") should have + a pink bg for IE6. +
+ +

+ + + + + + + + + diff --git a/contrib/closure-library/goog/debug/devcss/devcssrunner.js b/contrib/closure-library/goog/debug/devcss/devcssrunner.js new file mode 100644 index 0000000..cfe4f39 --- /dev/null +++ b/contrib/closure-library/goog/debug/devcss/devcssrunner.js @@ -0,0 +1,26 @@ +// Copyright 2008 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Development CSS Compiler runtime execution. + */ + +goog.provide('goog.debug.devCssRunner'); + +goog.require('goog.debug.DevCss'); + +(function() { + var devCssInstance = new goog.debug.DevCss(); + devCssInstance.activateBrowserSpecificCssRules(); +})(); diff --git a/contrib/closure-library/goog/debug/divconsole.js b/contrib/closure-library/goog/debug/divconsole.js index 7399ac9..c5e0efa 100644 --- a/contrib/closure-library/goog/debug/divconsole.js +++ b/contrib/closure-library/goog/debug/divconsole.js @@ -24,6 +24,7 @@ goog.require('goog.debug.LogManager'); goog.require('goog.style'); + /** * A class for visualising logger calls in a div element. * @param {Element} element The element to append to. diff --git a/contrib/closure-library/goog/debug/enhanceerror_test.html b/contrib/closure-library/goog/debug/enhanceerror_test.html index 9be0f0d..8dc1d45 100644 --- a/contrib/closure-library/goog/debug/enhanceerror_test.html +++ b/contrib/closure-library/goog/debug/enhanceerror_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/debug/entrypointregistry_test.html b/contrib/closure-library/goog/debug/entrypointregistry_test.html index 5e1e06e..4a74813 100644 --- a/contrib/closure-library/goog/debug/entrypointregistry_test.html +++ b/contrib/closure-library/goog/debug/entrypointregistry_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/debug/errorhandler.js b/contrib/closure-library/goog/debug/errorhandler.js index c01d41f..496400e 100644 --- a/contrib/closure-library/goog/debug/errorhandler.js +++ b/contrib/closure-library/goog/debug/errorhandler.js @@ -43,6 +43,8 @@ goog.require('goog.debug.Trace'); * @implements {goog.debug.EntryPointMonitor} */ goog.debug.ErrorHandler = function(handler) { + goog.base(this); + /** * Handler for exceptions, which can do logging, reporting, etc. * @type {Function} diff --git a/contrib/closure-library/goog/debug/errorhandler_async_test.html b/contrib/closure-library/goog/debug/errorhandler_async_test.html index 178953e..b369c9a 100644 --- a/contrib/closure-library/goog/debug/errorhandler_async_test.html +++ b/contrib/closure-library/goog/debug/errorhandler_async_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/debug/logger.js b/contrib/closure-library/goog/debug/logger.js index b3f8a0e..169a030 100644 --- a/contrib/closure-library/goog/debug/logger.js +++ b/contrib/closure-library/goog/debug/logger.js @@ -30,6 +30,8 @@ goog.require('goog.debug'); goog.require('goog.debug.LogBuffer'); goog.require('goog.debug.LogRecord'); + + /** * The Logger is an object used for logging debug messages. Loggers are * normally named, using a hierarchical dot-separated namespace. Logger names @@ -114,6 +116,7 @@ if (!goog.debug.Logger.ENABLE_HIERARCHY) { } + /** * The Level class defines a set of standard logging levels that * can be used to control logging output. The logging Level objects @@ -172,6 +175,7 @@ goog.debug.Logger.Level.prototype.toString = function() { goog.debug.Logger.Level.OFF = new goog.debug.Logger.Level('OFF', Infinity); + /** * SHOUT is a message level for extra debugging loudness. * This level is initialized to 1200. @@ -179,6 +183,7 @@ goog.debug.Logger.Level.OFF = */ goog.debug.Logger.Level.SHOUT = new goog.debug.Logger.Level('SHOUT', 1200); + /** * SEVERE is a message level indicating a serious failure. * This level is initialized to 1000. @@ -186,6 +191,7 @@ goog.debug.Logger.Level.SHOUT = new goog.debug.Logger.Level('SHOUT', 1200); */ goog.debug.Logger.Level.SEVERE = new goog.debug.Logger.Level('SEVERE', 1000); + /** * WARNING is a message level indicating a potential problem. * This level is initialized to 900. @@ -217,6 +223,7 @@ goog.debug.Logger.Level.CONFIG = new goog.debug.Logger.Level('CONFIG', 700); */ goog.debug.Logger.Level.FINE = new goog.debug.Logger.Level('FINE', 500); + /** * FINER indicates a fairly detailed tracing message. * This level is initialized to 400. @@ -232,6 +239,7 @@ goog.debug.Logger.Level.FINER = new goog.debug.Logger.Level('FINER', 400); goog.debug.Logger.Level.FINEST = new goog.debug.Logger.Level('FINEST', 300); + /** * ALL indicates that all messages should be logged. * This level is initialized to Number.MIN_VALUE. @@ -617,12 +625,26 @@ goog.debug.Logger.prototype.logRecord = function(logRecord) { }; +/** + * Logs the message to speed tracer, if it is available. + * {@see http://code.google.com/webtoolkit/speedtracer/logging-api.html} + * @param {string} msg The message to log. + * @private + */ +goog.debug.Logger.prototype.logToSpeedTracer_ = function(msg) { + if (goog.global['console'] && goog.global['console']['markTimeline']) { + goog.global['console']['markTimeline'](msg); + } +}; + + /** * Log a LogRecord. * @param {goog.debug.LogRecord} logRecord A log record to log. * @private */ goog.debug.Logger.prototype.doLogRecord_ = function(logRecord) { + this.logToSpeedTracer_('log:' + logRecord.getMessage()); if (goog.debug.Logger.ENABLE_HIERARCHY) { var target = this; while (target) { @@ -679,6 +701,7 @@ goog.debug.Logger.prototype.addChild_ = function(name, logger) { */ goog.debug.LogManager = {}; + /** * Map of logger names to logger objects * @@ -687,6 +710,7 @@ goog.debug.LogManager = {}; */ goog.debug.LogManager.loggers_ = {}; + /** * The root logger which is the root of the logger tree. * @type {goog.debug.Logger} @@ -694,6 +718,7 @@ goog.debug.LogManager.loggers_ = {}; */ goog.debug.LogManager.rootLogger_ = null; + /** * Initialize the LogManager if not already initialized */ @@ -705,6 +730,7 @@ goog.debug.LogManager.initialize = function() { } }; + /** * Returns all the loggers * @return {!Object} Map of logger names to logger objects. diff --git a/contrib/closure-library/goog/debug/logger_test.html b/contrib/closure-library/goog/debug/logger_test.html index f27494f..50fc70c 100644 --- a/contrib/closure-library/goog/debug/logger_test.html +++ b/contrib/closure-library/goog/debug/logger_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/debug/logrecord.js b/contrib/closure-library/goog/debug/logrecord.js index 4c7a891..5b578e0 100644 --- a/contrib/closure-library/goog/debug/logrecord.js +++ b/contrib/closure-library/goog/debug/logrecord.js @@ -21,6 +21,8 @@ goog.provide('goog.debug.LogRecord'); + + /** * LogRecord objects are used to pass logging requests between * the logging framework and individual log Handlers. @@ -71,7 +73,6 @@ goog.debug.LogRecord.prototype.msg_; goog.debug.LogRecord.prototype.loggerName_; - /** * Sequence number for the LogRecord. Each record has a unique sequence number * that is greater than all log records created before it. diff --git a/contrib/closure-library/goog/debug/reflect.js b/contrib/closure-library/goog/debug/reflect.js new file mode 100644 index 0000000..2d9efda --- /dev/null +++ b/contrib/closure-library/goog/debug/reflect.js @@ -0,0 +1,163 @@ +// Copyright 2011 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview JavaScript reflection tools. They should only be used for + * debugging non-compiled code or tests, because there is no guarantee that + * they work consistently in all browsers. + * + */ + +goog.provide('goog.debug.reflect'); + + +/** + * Maps the unique id of the known constructors to their full names. + * Initialized lazily. + * @type {Object.} + * @private + */ +goog.debug.reflect.typeMap_ = null; + + +/** + * List of all known constructors. Initialized lazily. + * @type {Array.} + * @private + */ +goog.debug.reflect.constructors_ = null; + + +/** + * Copy of {@code Object.prototype.toString} to use if it is overridden later. + * Although saving the original {@code toString} somewhat protects against + * third-party libraries which touch {@code Object.prototype}, the actual goal + * of this assignment is to allow overriding that method, thus more debug + * information can be exposed about objects. + * See {@link goog.debug.reflect.typeOf}. + * @private + */ +goog.debug.reflect.toString_ = Object.prototype.toString; + + +/** + * Registers a type which will be recognized by goog.debug.reflect.typeOf. + * @param {string} name Full name of the type. + * @param {!Function} ctor The constructor. + * @private + */ +goog.debug.reflect.registerType_ = function(name, ctor) { + goog.debug.reflect.constructors_.push(ctor); + goog.debug.reflect.typeMap_[goog.getUid(ctor)] = name; +}; + + +/** + * Adds all known constructors to the type registry. + * @private + */ +goog.debug.reflect.init_ = function() { + if (goog.debug.reflect.typeMap_) { + return; + } + + goog.debug.reflect.typeMap_ = {}; + goog.debug.reflect.constructors_ = []; + var implicitNs = goog.getObjectByName('goog.implicitNamespaces_') || {}; + + for (var ns in implicitNs) { + if (implicitNs.hasOwnProperty(ns)) { + var nsObj = goog.getObjectByName(ns); + for (var name in nsObj) { + if (nsObj.hasOwnProperty(name) && goog.isFunction(nsObj[name])) { + goog.debug.reflect.registerType_(ns + '.' + name, nsObj[name]); + } + } + } + } + + goog.debug.reflect.registerType_('Array', Array); + goog.debug.reflect.registerType_('Boolean', Boolean); + goog.debug.reflect.registerType_('Date', Date); + goog.debug.reflect.registerType_('Error', Error); + goog.debug.reflect.registerType_('Function', Function); + goog.debug.reflect.registerType_('Number', Number); + goog.debug.reflect.registerType_('Object', Object); + goog.debug.reflect.registerType_('String', String); + + // The compiler gets upset if we alias regexp directly, because + // then it can't optimize regexps as well. Just be sneaky about it, + // because this is only for debugging. + goog.debug.reflect.registerType_('RegExp', goog.global['RegExp']); +}; + + +/** + * Guesses the real type of the object, even if its {@code toString} method is + * overridden. Gives exact result for all goog.provided classes in non-compiled + * code, and some often used native classes in compiled code too. Not tested in + * multi-frame environment. + * + * Example use case to get better type information in the Watch tab of FireBug: + *
+ * Object.prototype.toString = function() {
+ *   return goog.debug.reflect.typeOf(this);
+ * };
+ * 
+ * + * @param {*} obj An arbitrary variable to get the type of. + * @return {string} The namespaced type of the argument or 'Object' if didn't + * manage to determine it. Warning: in IE7 ActiveX (including DOM) objects + * don't expose their type to JavaScript. Their {@code constructor} + * property is undefined and they are not even the instances of the + * {@code Object} type. This method will recognize them as 'ActiveXObject'. + */ +goog.debug.reflect.typeOf = function(obj) { + // Check primitive types. + if (!obj || goog.isNumber(obj) || goog.isString(obj) || goog.isBoolean(obj)) { + return goog.typeOf(obj); + } + + // Check if the type is present in the registry. + goog.debug.reflect.init_(); + if (obj.constructor) { + // Some DOM objects such as document don't have constructor in IE7. + var type = goog.debug.reflect.typeMap_[goog.getUid(obj.constructor)]; + if (type) { + return type; + } + } + + // In IE8 the internal 'class' property of ActiveXObjects is Object, but + // String(obj) tells their real type. + var isActiveXObject = goog.global.ActiveXObject && + obj instanceof ActiveXObject; + var typeString = isActiveXObject ? String(obj) : + goog.debug.reflect.toString_.call(/** @type {Object} */ (obj)); + var match = typeString.match(/^\[object (\w+)\]$/); + if (match) { + var name = match[1]; + var ctor = goog.global[name]; + try { + if (obj instanceof ctor) { + return name; + } + } catch (e) { + // instanceof may fail if the guessed name is not a real type. + } + } + + // Fall back to Object or ActiveXObject. + return isActiveXObject ? 'ActiveXObject' : 'Object'; +}; diff --git a/contrib/closure-library/goog/debug/reflect_test.html b/contrib/closure-library/goog/debug/reflect_test.html new file mode 100644 index 0000000..b442708 --- /dev/null +++ b/contrib/closure-library/goog/debug/reflect_test.html @@ -0,0 +1,81 @@ + + + + + +Closure Unit Tests - goog.debug.reflect + + + + + + + diff --git a/contrib/closure-library/goog/debug/relativetimeprovider.js b/contrib/closure-library/goog/debug/relativetimeprovider.js index 3b0b013..065a4c4 100644 --- a/contrib/closure-library/goog/debug/relativetimeprovider.js +++ b/contrib/closure-library/goog/debug/relativetimeprovider.js @@ -19,6 +19,8 @@ goog.provide('goog.debug.RelativeTimeProvider'); + + /** * A simple object to keep track of a timestamp considered the start of * something. The main use is for the logger system to maintain a start time @@ -64,6 +66,7 @@ goog.debug.RelativeTimeProvider.prototype.reset = function() { this.set(goog.now()); }; + /** * @return {number} The start time. */ diff --git a/contrib/closure-library/goog/debug/tracer.js b/contrib/closure-library/goog/debug/tracer.js index cd9a66b..0cce6aa 100644 --- a/contrib/closure-library/goog/debug/tracer.js +++ b/contrib/closure-library/goog/debug/tracer.js @@ -27,6 +27,7 @@ goog.require('goog.structs.Map'); goog.require('goog.structs.SimplePool'); + /** * Class used for singleton goog.debug.Trace. Used for timing slow points in * the code. Based on the java Tracer class but optimized for javascript. @@ -149,6 +150,7 @@ goog.debug.Trace_ = function() { this.defaultThreshold_ = 3; }; + /** * Logger for the tracer * @type {goog.debug.Logger} @@ -187,6 +189,7 @@ goog.debug.Trace_.EventType = { }; + /** * Class to keep track of a stat of a single tracer type. Stores the count * and cumulative time. @@ -228,6 +231,7 @@ goog.debug.Trace_.Stat_.prototype.toString = function() { }; + /** * Private class used to encapsulate a single event, either the start or stop * of a tracer. @@ -310,6 +314,7 @@ goog.debug.Trace_.prototype.initCurrentTrace = function(defaultThreshold) { this.reset(defaultThreshold); }; + /** * Clears the current trace */ @@ -356,7 +361,6 @@ goog.debug.Trace_.prototype.reset = function(defaultThreshold) { }; - /** * Starts a tracer * @param {string} comment A comment used to identify the tracer. Does not @@ -495,6 +499,7 @@ goog.debug.Trace_.prototype.stopTracer = function(id, opt_silenceThreshold) { return elapsed; }; + /** * Sets the ActiveX object that can be used to get GC tracing in IE6. * @param {Object} gcTracer GCTracer ActiveX object. @@ -589,6 +594,7 @@ goog.debug.Trace_.prototype.getStat_ = function(type) { return /** @type {goog.debug.Trace_.Stat_} */(stat); }; + /** * Returns a formatted string for the current trace * @return {string} A formatted string that shows the timings of the current @@ -708,6 +714,7 @@ goog.debug.Trace_.longToPaddedString_ = function(v) { return space + v; }; + /** * Return the sec.ms part of time (if time = "20:06:11.566", "11.566 * @param {number} time The time in MS. diff --git a/contrib/closure-library/goog/debug/tracer_test.html b/contrib/closure-library/goog/debug/tracer_test.html index 444c62a..42ee34b 100644 --- a/contrib/closure-library/goog/debug/tracer_test.html +++ b/contrib/closure-library/goog/debug/tracer_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/advancedtooltip.html b/contrib/closure-library/goog/demos/advancedtooltip.html index 199906c..290febd 100644 --- a/contrib/closure-library/goog/demos/advancedtooltip.html +++ b/contrib/closure-library/goog/demos/advancedtooltip.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/animationqueue.html b/contrib/closure-library/goog/demos/animationqueue.html index 0f7a51c..451836a 100644 --- a/contrib/closure-library/goog/demos/animationqueue.html +++ b/contrib/closure-library/goog/demos/animationqueue.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/autocomplete-basic.html b/contrib/closure-library/goog/demos/autocomplete-basic.html index da9f4fc..46eb45a 100644 --- a/contrib/closure-library/goog/demos/autocomplete-basic.html +++ b/contrib/closure-library/goog/demos/autocomplete-basic.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/autocompleteremote.html b/contrib/closure-library/goog/demos/autocompleteremote.html index 0b0ede1..91c0042 100644 --- a/contrib/closure-library/goog/demos/autocompleteremote.html +++ b/contrib/closure-library/goog/demos/autocompleteremote.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/blobhasher.html b/contrib/closure-library/goog/demos/blobhasher.html new file mode 100644 index 0000000..58c73d2 --- /dev/null +++ b/contrib/closure-library/goog/demos/blobhasher.html @@ -0,0 +1,62 @@ + + + + +goog.crypt.BlobHasher + + + + + + +

goog.crypt.BlobHasher

+ + + +
File: + + +
MD5:
+ + + diff --git a/contrib/closure-library/goog/demos/bubble.html b/contrib/closure-library/goog/demos/bubble.html index ddd9d0a..e10bb0e 100644 --- a/contrib/closure-library/goog/demos/bubble.html +++ b/contrib/closure-library/goog/demos/bubble.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/charcounter.html b/contrib/closure-library/goog/demos/charcounter.html index cfcd576..a37c321 100644 --- a/contrib/closure-library/goog/demos/charcounter.html +++ b/contrib/closure-library/goog/demos/charcounter.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/charpicker.html b/contrib/closure-library/goog/demos/charpicker.html index f315f30..b1e4236 100644 --- a/contrib/closure-library/goog/demos/charpicker.html +++ b/contrib/closure-library/goog/demos/charpicker.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/checkbox.html b/contrib/closure-library/goog/demos/checkbox.html index 9cee53c..56ce9c3 100644 --- a/contrib/closure-library/goog/demos/checkbox.html +++ b/contrib/closure-library/goog/demos/checkbox.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/color-contrast.html b/contrib/closure-library/goog/demos/color-contrast.html index 9d77e30..58eeac7 100644 --- a/contrib/closure-library/goog/demos/color-contrast.html +++ b/contrib/closure-library/goog/demos/color-contrast.html @@ -4,7 +4,7 @@ diff --git a/contrib/closure-library/goog/demos/colormenubutton.html b/contrib/closure-library/goog/demos/colormenubutton.html index 26aaec1..c9221c3 100644 --- a/contrib/closure-library/goog/demos/colormenubutton.html +++ b/contrib/closure-library/goog/demos/colormenubutton.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/colorpicker.html b/contrib/closure-library/goog/demos/colorpicker.html index dd663ac..67a02f4 100644 --- a/contrib/closure-library/goog/demos/colorpicker.html +++ b/contrib/closure-library/goog/demos/colorpicker.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/combobox.html b/contrib/closure-library/goog/demos/combobox.html index 4a891d0..44cc4f7 100644 --- a/contrib/closure-library/goog/demos/combobox.html +++ b/contrib/closure-library/goog/demos/combobox.html @@ -3,7 +3,7 @@ @@ -96,7 +96,7 @@

goog.ui.ComboBox

cb2.setDefaultText('Select a color...'); cb2.addItem(new goog.ui.ComboBoxItem('Red')); cb2.addItem(new goog.ui.ComboBoxItem('Maroon')); - cb2.addItem(new goog.ui.ComboBoxItem('Gre<en')); + cb2.addItem(new goog.ui.ComboBoxItem('Gre diff --git a/contrib/closure-library/goog/demos/control.html b/contrib/closure-library/goog/demos/control.html index 5323240..39b31a3 100644 --- a/contrib/closure-library/goog/demos/control.html +++ b/contrib/closure-library/goog/demos/control.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/css/demo.css b/contrib/closure-library/goog/demos/css/demo.css index a47f068..6eb82e8 100644 --- a/contrib/closure-library/goog/demos/css/demo.css +++ b/contrib/closure-library/goog/demos/css/demo.css @@ -1,7 +1,7 @@ /* * Copyright 2007 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/demos/css/emojipicker.css b/contrib/closure-library/goog/demos/css/emojipicker.css index bd36a7c..826d5bd 100644 --- a/contrib/closure-library/goog/demos/css/emojipicker.css +++ b/contrib/closure-library/goog/demos/css/emojipicker.css @@ -1,7 +1,7 @@ /* * Copyright 2007 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/demos/css/emojisprite.css b/contrib/closure-library/goog/demos/css/emojisprite.css index c047dd5..fe1a2cc 100644 --- a/contrib/closure-library/goog/demos/css/emojisprite.css +++ b/contrib/closure-library/goog/demos/css/emojisprite.css @@ -1,7 +1,7 @@ /* * Copyright 2010 The Closure Library Authors. All Rights Reserved. * - * Use of this source code is governed by an Apache 2.0 License. + * Use of this source code is governed by the Apache License, Version 2.0. * See the COPYING file for details. */ diff --git a/contrib/closure-library/goog/demos/css3button.html b/contrib/closure-library/goog/demos/css3button.html index a5588bb..e58bc60 100644 --- a/contrib/closure-library/goog/demos/css3button.html +++ b/contrib/closure-library/goog/demos/css3button.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/css3menubutton.html b/contrib/closure-library/goog/demos/css3menubutton.html index b7026ea..0fd2c58 100644 --- a/contrib/closure-library/goog/demos/css3menubutton.html +++ b/contrib/closure-library/goog/demos/css3menubutton.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/cssspriteanimation.html b/contrib/closure-library/goog/demos/cssspriteanimation.html index 072a908..d4c160a 100644 --- a/contrib/closure-library/goog/demos/cssspriteanimation.html +++ b/contrib/closure-library/goog/demos/cssspriteanimation.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/datepicker.html b/contrib/closure-library/goog/demos/datepicker.html index 333b990..6ed69a2 100644 --- a/contrib/closure-library/goog/demos/datepicker.html +++ b/contrib/closure-library/goog/demos/datepicker.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/debug.html b/contrib/closure-library/goog/demos/debug.html index 961ab7f..82cdab8 100644 --- a/contrib/closure-library/goog/demos/debug.html +++ b/contrib/closure-library/goog/demos/debug.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/depsgraph.html b/contrib/closure-library/goog/demos/depsgraph.html index 8bd1573..a1f5962 100644 --- a/contrib/closure-library/goog/demos/depsgraph.html +++ b/contrib/closure-library/goog/demos/depsgraph.html @@ -4,7 +4,7 @@ @@ -64,7 +64,6 @@

Closure Dependency Graph

+ + +

goog.fx.DragScrollSupport

+ +List 1 in a scrollable area. +
+
    +
  • Item 1.1 ----------
  • +
  • Item 1.2 ----------
  • +
  • Item 1.3 ----------
  • +
  • Item 1.4 ----------
  • +
  • Item 1.5 ----------
  • +
  • Item 1.6 ----------
  • +
  • Item 1.7 ----------
  • +
  • Item 1.8 ----------
  • +
  • Item 1.9 ----------
  • +
  • Item 1.10 ----------
  • +
  • Item 1.11 ----------
  • +
  • Item 1.12 ----------
  • +
  • Item 1.13 ----------
  • +
  • Item 1.14 ----------
  • +
  • Item 1.15 ----------
  • +
+
+ + + + diff --git a/contrib/closure-library/goog/demos/drilldownrow.html b/contrib/closure-library/goog/demos/drilldownrow.html index 372c263..cc8d87a 100644 --- a/contrib/closure-library/goog/demos/drilldownrow.html +++ b/contrib/closure-library/goog/demos/drilldownrow.html @@ -4,7 +4,7 @@ diff --git a/contrib/closure-library/goog/demos/editor/editor.html b/contrib/closure-library/goog/demos/editor/editor.html index d136640..24aba99 100644 --- a/contrib/closure-library/goog/demos/editor/editor.html +++ b/contrib/closure-library/goog/demos/editor/editor.html @@ -2,7 +2,7 @@ diff --git a/contrib/closure-library/goog/demos/editor/helloworld.html b/contrib/closure-library/goog/demos/editor/helloworld.html index 6e44f3e..6ce5d99 100644 --- a/contrib/closure-library/goog/demos/editor/helloworld.html +++ b/contrib/closure-library/goog/demos/editor/helloworld.html @@ -6,7 +6,7 @@ diff --git a/contrib/closure-library/goog/demos/editor/helloworld_test.html b/contrib/closure-library/goog/demos/editor/helloworld_test.html index 580c7f6..f6f8354 100644 --- a/contrib/closure-library/goog/demos/editor/helloworld_test.html +++ b/contrib/closure-library/goog/demos/editor/helloworld_test.html @@ -9,7 +9,7 @@ diff --git a/contrib/closure-library/goog/demos/editor/helloworlddialog_test.html b/contrib/closure-library/goog/demos/editor/helloworlddialog_test.html index 5d2cd5f..8f4d0df 100644 --- a/contrib/closure-library/goog/demos/editor/helloworlddialog_test.html +++ b/contrib/closure-library/goog/demos/editor/helloworlddialog_test.html @@ -6,7 +6,7 @@ diff --git a/contrib/closure-library/goog/demos/editor/helloworlddialogplugin_test.html b/contrib/closure-library/goog/demos/editor/helloworlddialogplugin_test.html index 97a2045..3bcb29c 100644 --- a/contrib/closure-library/goog/demos/editor/helloworlddialogplugin_test.html +++ b/contrib/closure-library/goog/demos/editor/helloworlddialogplugin_test.html @@ -6,7 +6,7 @@ diff --git a/contrib/closure-library/goog/demos/editor/seamlessfield.html b/contrib/closure-library/goog/demos/editor/seamlessfield.html index a496e25..64265df 100644 --- a/contrib/closure-library/goog/demos/editor/seamlessfield.html +++ b/contrib/closure-library/goog/demos/editor/seamlessfield.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/effects.html b/contrib/closure-library/goog/demos/effects.html index f377a02..30367ed 100644 --- a/contrib/closure-library/goog/demos/effects.html +++ b/contrib/closure-library/goog/demos/effects.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/event-propagation.html b/contrib/closure-library/goog/demos/event-propagation.html index 09da9ed..47eac15 100644 --- a/contrib/closure-library/goog/demos/event-propagation.html +++ b/contrib/closure-library/goog/demos/event-propagation.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/events.html b/contrib/closure-library/goog/demos/events.html index 932c621..39240a6 100644 --- a/contrib/closure-library/goog/demos/events.html +++ b/contrib/closure-library/goog/demos/events.html @@ -2,7 +2,7 @@ diff --git a/contrib/closure-library/goog/demos/eventtarget.html b/contrib/closure-library/goog/demos/eventtarget.html index 66510aa..b26250e 100644 --- a/contrib/closure-library/goog/demos/eventtarget.html +++ b/contrib/closure-library/goog/demos/eventtarget.html @@ -2,7 +2,7 @@ diff --git a/contrib/closure-library/goog/demos/filedrophandler.html b/contrib/closure-library/goog/demos/filedrophandler.html index 095345c..0167df9 100644 --- a/contrib/closure-library/goog/demos/filedrophandler.html +++ b/contrib/closure-library/goog/demos/filedrophandler.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/filteredmenu.html b/contrib/closure-library/goog/demos/filteredmenu.html index cb98ebb..b07a58b 100644 --- a/contrib/closure-library/goog/demos/filteredmenu.html +++ b/contrib/closure-library/goog/demos/filteredmenu.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/focushandler.html b/contrib/closure-library/goog/demos/focushandler.html index fe14b25..b29bc10 100644 --- a/contrib/closure-library/goog/demos/focushandler.html +++ b/contrib/closure-library/goog/demos/focushandler.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/gauge.html b/contrib/closure-library/goog/demos/gauge.html index 30ab0c4..cc7ac08 100644 --- a/contrib/closure-library/goog/demos/gauge.html +++ b/contrib/closure-library/goog/demos/gauge.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/graphics/advancedcoordinates.html b/contrib/closure-library/goog/demos/graphics/advancedcoordinates.html index c4cc512..6274fda 100644 --- a/contrib/closure-library/goog/demos/graphics/advancedcoordinates.html +++ b/contrib/closure-library/goog/demos/graphics/advancedcoordinates.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/graphics/advancedcoordinates2.html b/contrib/closure-library/goog/demos/graphics/advancedcoordinates2.html index 4d3de00..f05323f 100644 --- a/contrib/closure-library/goog/demos/graphics/advancedcoordinates2.html +++ b/contrib/closure-library/goog/demos/graphics/advancedcoordinates2.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/graphics/basicelements.html b/contrib/closure-library/goog/demos/graphics/basicelements.html index 41abc3c..d55645a 100644 --- a/contrib/closure-library/goog/demos/graphics/basicelements.html +++ b/contrib/closure-library/goog/demos/graphics/basicelements.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/graphics/events.html b/contrib/closure-library/goog/demos/graphics/events.html index 780d242..c0139fc 100644 --- a/contrib/closure-library/goog/demos/graphics/events.html +++ b/contrib/closure-library/goog/demos/graphics/events.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/graphics/modifyelements.html b/contrib/closure-library/goog/demos/graphics/modifyelements.html index d527e73..c30f9ca 100644 --- a/contrib/closure-library/goog/demos/graphics/modifyelements.html +++ b/contrib/closure-library/goog/demos/graphics/modifyelements.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/graphics/subpixel.html b/contrib/closure-library/goog/demos/graphics/subpixel.html index 7297a4f..947eae2 100644 --- a/contrib/closure-library/goog/demos/graphics/subpixel.html +++ b/contrib/closure-library/goog/demos/graphics/subpixel.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/graphics/tiger.html b/contrib/closure-library/goog/demos/graphics/tiger.html index 2400baa..64deebc 100644 --- a/contrib/closure-library/goog/demos/graphics/tiger.html +++ b/contrib/closure-library/goog/demos/graphics/tiger.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/history1.html b/contrib/closure-library/goog/demos/history1.html index 007f7d9..05f4ce4 100644 --- a/contrib/closure-library/goog/demos/history1.html +++ b/contrib/closure-library/goog/demos/history1.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/history2.html b/contrib/closure-library/goog/demos/history2.html index d0c8ff2..0037d13 100644 --- a/contrib/closure-library/goog/demos/history2.html +++ b/contrib/closure-library/goog/demos/history2.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/history3.html b/contrib/closure-library/goog/demos/history3.html index 03d899f..7bc53ea 100644 --- a/contrib/closure-library/goog/demos/history3.html +++ b/contrib/closure-library/goog/demos/history3.html @@ -5,7 +5,7 @@ diff --git a/contrib/closure-library/goog/demos/history3js.html b/contrib/closure-library/goog/demos/history3js.html index a83c69d..954ea45 100644 --- a/contrib/closure-library/goog/demos/history3js.html +++ b/contrib/closure-library/goog/demos/history3js.html @@ -5,7 +5,7 @@ diff --git a/contrib/closure-library/goog/demos/history_blank.html b/contrib/closure-library/goog/demos/history_blank.html index bab2b60..7bee06c 100644 --- a/contrib/closure-library/goog/demos/history_blank.html +++ b/contrib/closure-library/goog/demos/history_blank.html @@ -2,10 +2,8 @@

Welcome to Closure!

diff --git a/contrib/closure-library/goog/demos/inline_block_quirks.html b/contrib/closure-library/goog/demos/inline_block_quirks.html index 74a48c4..75202b8 100644 --- a/contrib/closure-library/goog/demos/inline_block_quirks.html +++ b/contrib/closure-library/goog/demos/inline_block_quirks.html @@ -2,7 +2,7 @@ diff --git a/contrib/closure-library/goog/demos/inline_block_standards.html b/contrib/closure-library/goog/demos/inline_block_standards.html index af0235d..5f43048 100644 --- a/contrib/closure-library/goog/demos/inline_block_standards.html +++ b/contrib/closure-library/goog/demos/inline_block_standards.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/inputdatepicker.html b/contrib/closure-library/goog/demos/inputdatepicker.html index 926de79..1e6c25f 100644 --- a/contrib/closure-library/goog/demos/inputdatepicker.html +++ b/contrib/closure-library/goog/demos/inputdatepicker.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/inputhandler.html b/contrib/closure-library/goog/demos/inputhandler.html index eb0ecad..380d0d4 100644 --- a/contrib/closure-library/goog/demos/inputhandler.html +++ b/contrib/closure-library/goog/demos/inputhandler.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/jsonprettyprinter.html b/contrib/closure-library/goog/demos/jsonprettyprinter.html index 6d66a57..369d748 100644 --- a/contrib/closure-library/goog/demos/jsonprettyprinter.html +++ b/contrib/closure-library/goog/demos/jsonprettyprinter.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/keyboardshortcuts.html b/contrib/closure-library/goog/demos/keyboardshortcuts.html index 5007134..2baec7b 100644 --- a/contrib/closure-library/goog/demos/keyboardshortcuts.html +++ b/contrib/closure-library/goog/demos/keyboardshortcuts.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/keyhandler.html b/contrib/closure-library/goog/demos/keyhandler.html index b848604..004bb9e 100644 --- a/contrib/closure-library/goog/demos/keyhandler.html +++ b/contrib/closure-library/goog/demos/keyhandler.html @@ -3,7 +3,7 @@ @@ -11,12 +11,12 @@ diff --git a/contrib/closure-library/goog/demos/labelinput.html b/contrib/closure-library/goog/demos/labelinput.html index 4763541..a760b66 100644 --- a/contrib/closure-library/goog/demos/labelinput.html +++ b/contrib/closure-library/goog/demos/labelinput.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/menu.html b/contrib/closure-library/goog/demos/menu.html index 55a763b..1fbc722 100644 --- a/contrib/closure-library/goog/demos/menu.html +++ b/contrib/closure-library/goog/demos/menu.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/menubutton.html b/contrib/closure-library/goog/demos/menubutton.html index 7c1eedd..bfb685d 100644 --- a/contrib/closure-library/goog/demos/menubutton.html +++ b/contrib/closure-library/goog/demos/menubutton.html @@ -3,7 +3,7 @@ @@ -45,6 +45,12 @@ .format-icon { background-position: -64px; } + + .positioning-frame { + height: 250px; + overflow: auto; + width: 100%; + } @@ -133,6 +139,25 @@

goog.ui.MenuButton


+
+ + These MenuButtons demonstrate + menu positioning options: +   + +
+ + + + + +
+
@@ -311,6 +336,43 @@

goog.ui.MenuButton

goog.events.listen(cbmb1, EVENTS, logEvent); + // Create two buttons with menus for the positioning demo inside the + // positioning iframe. + var positioningFrame = goog.dom.getElement('positioning-frame'); + var shortPosButton, longPosButton; + goog.events.listen(positioningFrame, 'load', function() { + var frameDocument = goog.dom.getFrameContentDocument(positioningFrame); + var frameDomHelper = new goog.dom.DomHelper(frameDocument); + + var shortMenu = new goog.ui.Menu(frameDomHelper); + shortMenu.setId('PositionMenuShort'); + for (var i = 1; i <= 5; i++) { + shortMenu.addItem(new goog.ui.MenuItem('Item ' + i + '...')); + } + shortPosButton = new goog.ui.MenuButton('Short Menu', shortMenu); + shortPosButton.setId('PositingButtonShort'); + shortPosButton.render(frameDocument.body); + shortMenu.getElement().style.overflowY = 'auto'; + + var longMenu = new goog.ui.Menu(frameDomHelper); + longMenu.setId('PositionMenuLong'); + for (var i = 1; i <= 15; i++) { + longMenu.addItem(new goog.ui.MenuItem('Item ' + i + '...')); + } + longPosButton = new goog.ui.MenuButton('Long Menu', longMenu); + longPosButton.setId('PositingButtonLong'); + longPosButton.render(frameDocument.body); + longMenu.getElement().style.overflowY = 'auto'; + }); + function updateScrollOption() { + var checked = goog.dom.getElement('pos_option_scroll').checked; + shortPosButton.setScrollOnOverflow(checked); + longPosButton.setScrollOnOverflow(checked); + } + goog.events.listen(goog.dom.getElement('pos_option_scroll'), 'click', + updateScrollOption); + + goog.dom.setTextContent(goog.dom.getElement('perf'), (goog.now() - timer) + 'ms'); diff --git a/contrib/closure-library/goog/demos/menubutton_frame.html b/contrib/closure-library/goog/demos/menubutton_frame.html new file mode 100644 index 0000000..7f01363 --- /dev/null +++ b/contrib/closure-library/goog/demos/menubutton_frame.html @@ -0,0 +1,27 @@ + + + + + goog.ui.MenuButton Positioning Frame Demo + + + + + + + + + + + + diff --git a/contrib/closure-library/goog/demos/mousewheelhandler.html b/contrib/closure-library/goog/demos/mousewheelhandler.html index fd996d8..ebbc6c4 100644 --- a/contrib/closure-library/goog/demos/mousewheelhandler.html +++ b/contrib/closure-library/goog/demos/mousewheelhandler.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/offline.html b/contrib/closure-library/goog/demos/offline.html index d64ac16..0420604 100644 --- a/contrib/closure-library/goog/demos/offline.html +++ b/contrib/closure-library/goog/demos/offline.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/onlinehandler.html b/contrib/closure-library/goog/demos/onlinehandler.html index b85bee7..d0997a5 100644 --- a/contrib/closure-library/goog/demos/onlinehandler.html +++ b/contrib/closure-library/goog/demos/onlinehandler.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/pastehandler.html b/contrib/closure-library/goog/demos/pastehandler.html index 2c66f7b..252ee31 100644 --- a/contrib/closure-library/goog/demos/pastehandler.html +++ b/contrib/closure-library/goog/demos/pastehandler.html @@ -4,7 +4,7 @@ diff --git a/contrib/closure-library/goog/demos/plaintextspellchecker.html b/contrib/closure-library/goog/demos/plaintextspellchecker.html index 01fb0c4..21ec049 100644 --- a/contrib/closure-library/goog/demos/plaintextspellchecker.html +++ b/contrib/closure-library/goog/demos/plaintextspellchecker.html @@ -4,7 +4,7 @@ diff --git a/contrib/closure-library/goog/demos/popup.html b/contrib/closure-library/goog/demos/popup.html index a24a31b..da09372 100644 --- a/contrib/closure-library/goog/demos/popup.html +++ b/contrib/closure-library/goog/demos/popup.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/popupcolorpicker.html b/contrib/closure-library/goog/demos/popupcolorpicker.html index dda9188..a52d820 100644 --- a/contrib/closure-library/goog/demos/popupcolorpicker.html +++ b/contrib/closure-library/goog/demos/popupcolorpicker.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/popupdatepicker.html b/contrib/closure-library/goog/demos/popupdatepicker.html index 2189f24..f83ea40 100644 --- a/contrib/closure-library/goog/demos/popupdatepicker.html +++ b/contrib/closure-library/goog/demos/popupdatepicker.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/popupemojipicker.html b/contrib/closure-library/goog/demos/popupemojipicker.html index 75c7a90..486fd5e 100644 --- a/contrib/closure-library/goog/demos/popupemojipicker.html +++ b/contrib/closure-library/goog/demos/popupemojipicker.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/popupmenu.html b/contrib/closure-library/goog/demos/popupmenu.html index a86878d..ca00649 100644 --- a/contrib/closure-library/goog/demos/popupmenu.html +++ b/contrib/closure-library/goog/demos/popupmenu.html @@ -3,15 +3,16 @@ goog.ui.PopupMenu @@ -19,6 +20,20 @@ +

goog.ui.PopupMenu

@@ -27,6 +42,10 @@

goog.ui.PopupMenu



+
+ Event log +
+
Hello there I'm italic! @@ -76,12 +95,20 @@

goog.ui.PopupMenu

goog.positioning.Corner.BOTTOM_LEFT, goog.positioning.Corner.TOP_LEFT); + function logEvent(e) { + var entry = goog.dom.createDom('div', null, + 'type: ' + e.type + + ', target: ' + goog.debug.reflect.typeOf(e.target) + + (e.target.getCaption ? ', caption: ' + e.target.getCaption() : '')); + var eventLog = goog.dom.getElement('event-log'); + eventLog.appendChild(entry); + // Scroll to the bottom. + eventLog.scrollTop = eventLog.scrollHeight; + } - goog.events.listen(pm, 'action', function(e) { - alert(e.target.getCaption()); - }); - goog.events.listen(pm2, 'action', function(e) { - alert(e.target.getCaption()); + goog.object.forEach(goog.ui.Component.EventType, function(type) { + goog.events.listen(pm, type, logEvent); + goog.events.listen(pm2, type, logEvent); }); diff --git a/contrib/closure-library/goog/demos/progressbar.html b/contrib/closure-library/goog/demos/progressbar.html index 1f9522b..246db3a 100644 --- a/contrib/closure-library/goog/demos/progressbar.html +++ b/contrib/closure-library/goog/demos/progressbar.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/prompt.html b/contrib/closure-library/goog/demos/prompt.html index db81e2e..700dccb 100644 --- a/contrib/closure-library/goog/demos/prompt.html +++ b/contrib/closure-library/goog/demos/prompt.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/quadtree.html b/contrib/closure-library/goog/demos/quadtree.html index bc67409..e17e6dc 100644 --- a/contrib/closure-library/goog/demos/quadtree.html +++ b/contrib/closure-library/goog/demos/quadtree.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/ratings.html b/contrib/closure-library/goog/demos/ratings.html index 4c9a746..eff4c99 100644 --- a/contrib/closure-library/goog/demos/ratings.html +++ b/contrib/closure-library/goog/demos/ratings.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/richtextspellchecker.html b/contrib/closure-library/goog/demos/richtextspellchecker.html index 8297de8..008d9fd 100644 --- a/contrib/closure-library/goog/demos/richtextspellchecker.html +++ b/contrib/closure-library/goog/demos/richtextspellchecker.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/roundedpanel.html b/contrib/closure-library/goog/demos/roundedpanel.html index 7b5000f..c11b111 100644 --- a/contrib/closure-library/goog/demos/roundedpanel.html +++ b/contrib/closure-library/goog/demos/roundedpanel.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/samplecomponent.js b/contrib/closure-library/goog/demos/samplecomponent.js index a08d7c3..6e25f3b 100644 --- a/contrib/closure-library/goog/demos/samplecomponent.js +++ b/contrib/closure-library/goog/demos/samplecomponent.js @@ -28,6 +28,7 @@ goog.require('goog.events.KeyHandler.EventType'); goog.require('goog.ui.Component'); + /** * A simple box that changes colour when clicked. This class demonstrates the * goog.ui.Component API, and is keyboard accessible, as per @@ -103,7 +104,7 @@ goog.demos.SampleComponent.prototype.createDom = function() { /** * Decorates an existing HTML DIV element as a SampleComponent. * - * @param {HTMLElement} element The DIV element to decorate. The element's + * @param {Element} element The DIV element to decorate. The element's * text, if any will be used as the component's label. */ goog.demos.SampleComponent.prototype.decorateInternal = function(element) { diff --git a/contrib/closure-library/goog/demos/scrollfloater.html b/contrib/closure-library/goog/demos/scrollfloater.html index ff61d14..8e9831b 100644 --- a/contrib/closure-library/goog/demos/scrollfloater.html +++ b/contrib/closure-library/goog/demos/scrollfloater.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/selectionmenubutton.html b/contrib/closure-library/goog/demos/selectionmenubutton.html index 3e768e5..22c92dc 100644 --- a/contrib/closure-library/goog/demos/selectionmenubutton.html +++ b/contrib/closure-library/goog/demos/selectionmenubutton.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/serverchart.html b/contrib/closure-library/goog/demos/serverchart.html index 73ad253..1684ec2 100644 --- a/contrib/closure-library/goog/demos/serverchart.html +++ b/contrib/closure-library/goog/demos/serverchart.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/silverlightclipboardbutton.html b/contrib/closure-library/goog/demos/silverlightclipboardbutton.html new file mode 100644 index 0000000..ebe6280 --- /dev/null +++ b/contrib/closure-library/goog/demos/silverlightclipboardbutton.html @@ -0,0 +1,71 @@ + + + + + goog.silverlight.ClipboardButton + + + + + + + + +

goog.silverlight.ClipboardButton

+ +
Click 'Paste' to alert the contents on your clipboard:
+
+ +

+

Click 'Copy' to put the contents of + this textarea on your clipboard:
+
+ + + + + diff --git a/contrib/closure-library/goog/demos/slider.html b/contrib/closure-library/goog/demos/slider.html index 427a064..1247991 100644 --- a/contrib/closure-library/goog/demos/slider.html +++ b/contrib/closure-library/goog/demos/slider.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/splitbehavior.html b/contrib/closure-library/goog/demos/splitbehavior.html index a56f34f..24fa73a 100644 --- a/contrib/closure-library/goog/demos/splitbehavior.html +++ b/contrib/closure-library/goog/demos/splitbehavior.html @@ -1,9 +1,9 @@ diff --git a/contrib/closure-library/goog/demos/splitpane.html b/contrib/closure-library/goog/demos/splitpane.html index 1dbc5a9..366df63 100644 --- a/contrib/closure-library/goog/demos/splitpane.html +++ b/contrib/closure-library/goog/demos/splitpane.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/stopevent.html b/contrib/closure-library/goog/demos/stopevent.html index 4f9667b..83cbd7c 100644 --- a/contrib/closure-library/goog/demos/stopevent.html +++ b/contrib/closure-library/goog/demos/stopevent.html @@ -2,7 +2,7 @@ diff --git a/contrib/closure-library/goog/demos/submenus.html b/contrib/closure-library/goog/demos/submenus.html index 607db74..7f71067 100644 --- a/contrib/closure-library/goog/demos/submenus.html +++ b/contrib/closure-library/goog/demos/submenus.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/submenus2.html b/contrib/closure-library/goog/demos/submenus2.html index 4c22e54..fd41b20 100644 --- a/contrib/closure-library/goog/demos/submenus2.html +++ b/contrib/closure-library/goog/demos/submenus2.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/tabbar.html b/contrib/closure-library/goog/demos/tabbar.html index 594d42c..6c21f9b 100644 --- a/contrib/closure-library/goog/demos/tabbar.html +++ b/contrib/closure-library/goog/demos/tabbar.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/tablesorter.html b/contrib/closure-library/goog/demos/tablesorter.html index 965836c..57d621c 100644 --- a/contrib/closure-library/goog/demos/tablesorter.html +++ b/contrib/closure-library/goog/demos/tablesorter.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/tabpane.html b/contrib/closure-library/goog/demos/tabpane.html index a7822bf..20aaf5d 100644 --- a/contrib/closure-library/goog/demos/tabpane.html +++ b/contrib/closure-library/goog/demos/tabpane.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/textarea.html b/contrib/closure-library/goog/demos/textarea.html index dc3be51..a71a3c0 100644 --- a/contrib/closure-library/goog/demos/textarea.html +++ b/contrib/closure-library/goog/demos/textarea.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/timers.html b/contrib/closure-library/goog/demos/timers.html index b42b64f..1938178 100644 --- a/contrib/closure-library/goog/demos/timers.html +++ b/contrib/closure-library/goog/demos/timers.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/toolbar.html b/contrib/closure-library/goog/demos/toolbar.html index 10386e6..d4e8f98 100644 --- a/contrib/closure-library/goog/demos/toolbar.html +++ b/contrib/closure-library/goog/demos/toolbar.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/tooltip.html b/contrib/closure-library/goog/demos/tooltip.html index ec61b0c..7b6f743 100644 --- a/contrib/closure-library/goog/demos/tooltip.html +++ b/contrib/closure-library/goog/demos/tooltip.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/tracer.html b/contrib/closure-library/goog/demos/tracer.html index ef9cb14..b145353 100644 --- a/contrib/closure-library/goog/demos/tracer.html +++ b/contrib/closure-library/goog/demos/tracer.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/tree/demo.html b/contrib/closure-library/goog/demos/tree/demo.html index ef337bf..5562cf8 100644 --- a/contrib/closure-library/goog/demos/tree/demo.html +++ b/contrib/closure-library/goog/demos/tree/demo.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/tweakui.html b/contrib/closure-library/goog/demos/tweakui.html new file mode 100644 index 0000000..6a88e93 --- /dev/null +++ b/contrib/closure-library/goog/demos/tweakui.html @@ -0,0 +1,121 @@ + + + + + goog.tweak.TweakUi + + + + + +

goog.ui.TweakUi

+The goog.tweak package provides a convenient and flexible way to add +configurable settings to an app. These settings: +
    +
  • can be set at compile time +
  • can be set in code (using goog.tweak.overrideDefaultValue) +
  • can be set by query parameters +
  • can be set through the TweakUi interface +
+Tweaks IDs are checked by the compiler and tweaks can be fully removed when +tweakProcessing=STRIP. Tweaks are great for toggling debugging facilities. + +

A collapsible menu

+

An expanded menu

+
    +
  • When "Apply Tweaks" is clicked, all non-default values are encoded into + query parameters and the page is refreshed. +
  • Blue entries are ones where the value of the tweak will change without + clicking apply tweaks (the value of goog.tweak.get*() will change) +
+ + + diff --git a/contrib/closure-library/goog/demos/twothumbslider.html b/contrib/closure-library/goog/demos/twothumbslider.html index 2860ad8..6c1d113 100644 --- a/contrib/closure-library/goog/demos/twothumbslider.html +++ b/contrib/closure-library/goog/demos/twothumbslider.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/useragent.html b/contrib/closure-library/goog/demos/useragent.html index 1705b81..2e992be 100644 --- a/contrib/closure-library/goog/demos/useragent.html +++ b/contrib/closure-library/goog/demos/useragent.html @@ -3,7 +3,7 @@ @@ -24,6 +24,11 @@ text-align: center; } + .container { + margin: 1em 3em 1em 0; + vertical-align: top; + } + .section { font-weight: bold; font-size: 1.2em; @@ -49,17 +54,30 @@ goog.require('goog.userAgent.adobeReader'); goog.require('goog.userAgent.flash'); goog.require('goog.userAgent.iphoto'); + goog.require('goog.userAgent.jscript'); goog.require('goog.userAgent.picasa'); + goog.require('goog.userAgent.product'); + goog.require('goog.userAgent.product.isVersion');

goog.userAgent

- - - -
+
+ + + +
+
+ +
+ + + +
+
+ diff --git a/contrib/closure-library/goog/demos/viewportsizemonitor.html b/contrib/closure-library/goog/demos/viewportsizemonitor.html index f9a4da5..f958f5d 100644 --- a/contrib/closure-library/goog/demos/viewportsizemonitor.html +++ b/contrib/closure-library/goog/demos/viewportsizemonitor.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/xpc/blank.html b/contrib/closure-library/goog/demos/xpc/blank.html index b3315f4..5108baa 100644 --- a/contrib/closure-library/goog/demos/xpc/blank.html +++ b/contrib/closure-library/goog/demos/xpc/blank.html @@ -2,6 +2,6 @@ diff --git a/contrib/closure-library/goog/demos/xpc/index.html b/contrib/closure-library/goog/demos/xpc/index.html index 7d24ada..e516ef2 100644 --- a/contrib/closure-library/goog/demos/xpc/index.html +++ b/contrib/closure-library/goog/demos/xpc/index.html @@ -2,7 +2,7 @@ diff --git a/contrib/closure-library/goog/demos/xpc/inner.html b/contrib/closure-library/goog/demos/xpc/inner.html index bd5390d..02e1788 100644 --- a/contrib/closure-library/goog/demos/xpc/inner.html +++ b/contrib/closure-library/goog/demos/xpc/inner.html @@ -2,7 +2,7 @@ diff --git a/contrib/closure-library/goog/demos/xpc/minimal/blank.html b/contrib/closure-library/goog/demos/xpc/minimal/blank.html index b3315f4..5108baa 100644 --- a/contrib/closure-library/goog/demos/xpc/minimal/blank.html +++ b/contrib/closure-library/goog/demos/xpc/minimal/blank.html @@ -2,6 +2,6 @@ diff --git a/contrib/closure-library/goog/demos/xpc/minimal/index.html b/contrib/closure-library/goog/demos/xpc/minimal/index.html index 28cdda5..75dfb36 100644 --- a/contrib/closure-library/goog/demos/xpc/minimal/index.html +++ b/contrib/closure-library/goog/demos/xpc/minimal/index.html @@ -2,7 +2,7 @@ diff --git a/contrib/closure-library/goog/demos/xpc/minimal/inner.html b/contrib/closure-library/goog/demos/xpc/minimal/inner.html index 599b3b4..b35773a 100644 --- a/contrib/closure-library/goog/demos/xpc/minimal/inner.html +++ b/contrib/closure-library/goog/demos/xpc/minimal/inner.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/demos/xpc/minimal/relay.html b/contrib/closure-library/goog/demos/xpc/minimal/relay.html index b7511d2..7cc7002 100644 --- a/contrib/closure-library/goog/demos/xpc/minimal/relay.html +++ b/contrib/closure-library/goog/demos/xpc/minimal/relay.html @@ -2,6 +2,6 @@ diff --git a/contrib/closure-library/goog/demos/xpc/relay.html b/contrib/closure-library/goog/demos/xpc/relay.html index 1c31eb6..d294335 100644 --- a/contrib/closure-library/goog/demos/xpc/relay.html +++ b/contrib/closure-library/goog/demos/xpc/relay.html @@ -1,7 +1,16 @@ - + + + + + + + + diff --git a/contrib/closure-library/goog/demos/zippy.html b/contrib/closure-library/goog/demos/zippy.html index a6fa18b..3733b87 100644 --- a/contrib/closure-library/goog/demos/zippy.html +++ b/contrib/closure-library/goog/demos/zippy.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/deps.js b/contrib/closure-library/goog/deps.js index 07211e1..054ac9b 100644 --- a/contrib/closure-library/goog/deps.js +++ b/contrib/closure-library/goog/deps.js @@ -1,4 +1,4 @@ -// Copyright 2010 The Closure Library Authors. All Rights Reserved. +// Copyright 2011 The Closure Library Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ // // This file has been auto-generated by GenJsDeps, please do not edit. -goog.addDependency('array/array.js', ['goog.array'], ['goog.asserts']); +goog.addDependency('array/array.js', ['goog.array', 'goog.array.ArrayLike'], ['goog.asserts']); goog.addDependency('asserts/asserts.js', ['goog.asserts', 'goog.asserts.AssertionError'], ['goog.debug.Error', 'goog.string']); goog.addDependency('async/conditionaldelay.js', ['goog.async.ConditionalDelay'], ['goog.Disposable', 'goog.async.Delay']); goog.addDependency('async/delay.js', ['goog.Delay', 'goog.async.Delay'], ['goog.Disposable', 'goog.Timer']); @@ -24,13 +24,18 @@ goog.addDependency('color/alpha.js', ['goog.color.alpha'], ['goog.color']); goog.addDependency('color/color.js', ['goog.color'], ['goog.color.names', 'goog.math']); goog.addDependency('color/names.js', ['goog.color.names'], []); goog.addDependency('crypt/arc4.js', ['goog.crypt.Arc4'], ['goog.asserts']); -goog.addDependency('crypt/base64.js', ['goog.crypt.base64'], ['goog.crypt']); +goog.addDependency('crypt/base64.js', ['goog.crypt.base64'], ['goog.crypt', 'goog.userAgent']); goog.addDependency('crypt/basen.js', ['goog.crypt.baseN'], []); -goog.addDependency('crypt/crypt.js', ['goog.crypt'], []); +goog.addDependency('crypt/blobhasher.js', ['goog.crypt.BlobHasher', 'goog.crypt.BlobHasher.EventType'], ['goog.asserts', 'goog.crypt', 'goog.crypt.Hash', 'goog.debug.Logger', 'goog.events.EventTarget', 'goog.fs']); +goog.addDependency('crypt/crypt.js', ['goog.crypt'], ['goog.array']); +goog.addDependency('crypt/hash.js', ['goog.crypt.Hash'], []); goog.addDependency('crypt/hash32.js', ['goog.crypt.hash32'], ['goog.crypt']); -goog.addDependency('crypt/sha1.js', ['goog.crypt.Sha1'], []); +goog.addDependency('crypt/hash_test.js', ['goog.crypt.hash_test'], ['goog.testing.asserts']); +goog.addDependency('crypt/hmac.js', ['goog.crypt.Hmac'], ['goog.asserts', 'goog.crypt.Hash']); +goog.addDependency('crypt/md5.js', ['goog.crypt.Md5'], ['goog.crypt.Hash']); +goog.addDependency('crypt/sha1.js', ['goog.crypt.Sha1'], ['goog.crypt.Hash']); goog.addDependency('cssom/cssom.js', ['goog.cssom', 'goog.cssom.CssRuleType'], ['goog.array', 'goog.dom']); -goog.addDependency('cssom/iframe/style.js', ['goog.cssom.iframe.style'], ['goog.cssom', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.classes', 'goog.style', 'goog.userAgent']); +goog.addDependency('cssom/iframe/style.js', ['goog.cssom.iframe.style'], ['goog.cssom', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.classes', 'goog.string', 'goog.style', 'goog.userAgent']); goog.addDependency('datasource/datamanager.js', ['goog.ds.DataManager'], ['goog.ds.BasicNodeList', 'goog.ds.DataNode', 'goog.ds.Expr', 'goog.string', 'goog.structs', 'goog.structs.Map']); goog.addDependency('datasource/datasource.js', ['goog.ds.BaseDataNode', 'goog.ds.BasicNodeList', 'goog.ds.DataNode', 'goog.ds.DataNodeList', 'goog.ds.EmptyNodeList', 'goog.ds.LoadState', 'goog.ds.SortedNodeList', 'goog.ds.Util', 'goog.ds.logger'], ['goog.array', 'goog.debug.Logger']); goog.addDependency('datasource/expr.js', ['goog.ds.Expr'], ['goog.ds.BasicNodeList', 'goog.ds.EmptyNodeList', 'goog.string']); @@ -39,9 +44,9 @@ goog.addDependency('datasource/jsdatasource.js', ['goog.ds.JsDataSource', 'goog. goog.addDependency('datasource/jsondatasource.js', ['goog.ds.JsonDataSource'], ['goog.Uri', 'goog.dom', 'goog.ds.DataManager', 'goog.ds.JsDataSource', 'goog.ds.LoadState', 'goog.ds.logger']); goog.addDependency('datasource/jsxmlhttpdatasource.js', ['goog.ds.JsXmlHttpDataSource'], ['goog.Uri', 'goog.ds.DataManager', 'goog.ds.FastDataNode', 'goog.ds.LoadState', 'goog.ds.logger', 'goog.events', 'goog.net.EventType', 'goog.net.XhrIo']); goog.addDependency('datasource/xmldatasource.js', ['goog.ds.XmlDataSource', 'goog.ds.XmlHttpDataSource'], ['goog.Uri', 'goog.dom.NodeType', 'goog.dom.xml', 'goog.ds.BasicNodeList', 'goog.ds.DataManager', 'goog.ds.LoadState', 'goog.ds.logger', 'goog.net.XhrIo', 'goog.string']); -goog.addDependency('date/date.js', ['goog.date', 'goog.date.Date', 'goog.date.DateTime', 'goog.date.Interval', 'goog.date.month', 'goog.date.weekDay'], ['goog.asserts', 'goog.date.DateLike', 'goog.string']); +goog.addDependency('date/date.js', ['goog.date', 'goog.date.Date', 'goog.date.DateTime', 'goog.date.Interval', 'goog.date.month', 'goog.date.weekDay'], ['goog.asserts', 'goog.date.DateLike', 'goog.i18n.DateTimeSymbols', 'goog.string']); goog.addDependency('date/datelike.js', ['goog.date.DateLike'], []); -goog.addDependency('date/daterange.js', ['goog.date.DateRange', 'goog.date.DateRange.Iterator', 'goog.date.DateRange.StandardDateRangeKeys'], ['goog.date.Date', 'goog.date.DateLike', 'goog.date.Interval', 'goog.iter.Iterator', 'goog.iter.StopIteration']); +goog.addDependency('date/daterange.js', ['goog.date.DateRange', 'goog.date.DateRange.Iterator', 'goog.date.DateRange.StandardDateRangeKeys'], ['goog.date.Date', 'goog.date.Interval', 'goog.iter.Iterator', 'goog.iter.StopIteration']); goog.addDependency('date/relative.js', ['goog.date.relative'], ['goog.i18n.DateTimeFormat']); goog.addDependency('date/utcdatetime.js', ['goog.date.UtcDateTime'], ['goog.date', 'goog.date.Date', 'goog.date.DateTime', 'goog.date.Interval']); goog.addDependency('debug/console.js', ['goog.debug.Console'], ['goog.debug.LogManager', 'goog.debug.Logger.Level', 'goog.debug.TextFormatter']); @@ -54,17 +59,19 @@ goog.addDependency('debug/entrypointregistry.js', ['goog.debug.EntryPointMonitor goog.addDependency('debug/error.js', ['goog.debug.Error'], []); goog.addDependency('debug/errorhandler.js', ['goog.debug.ErrorHandler'], ['goog.debug', 'goog.debug.EntryPointMonitor', 'goog.debug.Trace']); goog.addDependency('debug/errorhandlerweakdep.js', ['goog.debug.errorHandlerWeakDep'], []); -goog.addDependency('debug/errorreporter.js', ['goog.debug.ErrorReporter', 'goog.debug.ErrorReporter.ExceptionEvent'], ['goog.debug', 'goog.debug.ErrorHandler', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.net.XhrIo', 'goog.object', 'goog.string', 'goog.uri.utils']); +goog.addDependency('debug/errorreporter.js', ['goog.debug.ErrorReporter', 'goog.debug.ErrorReporter.ExceptionEvent'], ['goog.debug', 'goog.debug.ErrorHandler', 'goog.debug.Logger', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.net.XhrIo', 'goog.object', 'goog.string', 'goog.uri.utils']); goog.addDependency('debug/fancywindow.js', ['goog.debug.FancyWindow'], ['goog.debug.DebugWindow', 'goog.debug.LogManager', 'goog.debug.Logger', 'goog.debug.Logger.Level', 'goog.dom.DomHelper', 'goog.object', 'goog.userAgent']); goog.addDependency('debug/formatter.js', ['goog.debug.Formatter', 'goog.debug.HtmlFormatter', 'goog.debug.TextFormatter'], ['goog.debug.RelativeTimeProvider', 'goog.string']); goog.addDependency('debug/gcdiagnostics.js', ['goog.debug.GcDiagnostics'], ['goog.debug.Logger', 'goog.debug.Trace', 'goog.userAgent']); goog.addDependency('debug/logbuffer.js', ['goog.debug.LogBuffer'], ['goog.asserts', 'goog.debug.LogRecord']); goog.addDependency('debug/logger.js', ['goog.debug.LogManager', 'goog.debug.Logger', 'goog.debug.Logger.Level'], ['goog.array', 'goog.asserts', 'goog.debug', 'goog.debug.LogBuffer', 'goog.debug.LogRecord']); goog.addDependency('debug/logrecord.js', ['goog.debug.LogRecord'], []); +goog.addDependency('debug/reflect.js', ['goog.debug.reflect'], []); goog.addDependency('debug/relativetimeprovider.js', ['goog.debug.RelativeTimeProvider'], []); goog.addDependency('debug/tracer.js', ['goog.debug.Trace'], ['goog.array', 'goog.debug.Logger', 'goog.iter', 'goog.structs.Map', 'goog.structs.SimplePool']); -goog.addDependency('disposable/disposable.js', ['goog.Disposable', 'goog.dispose'], []); -goog.addDependency('dom/a11y.js', ['goog.dom.a11y', 'goog.dom.a11y.Role', 'goog.dom.a11y.State'], ['goog.dom', 'goog.userAgent']); +goog.addDependency('disposable/disposable.js', ['goog.Disposable', 'goog.dispose'], ['goog.disposable.IDisposable']); +goog.addDependency('disposable/idisposable.js', ['goog.disposable.IDisposable'], []); +goog.addDependency('dom/a11y.js', ['goog.dom.a11y', 'goog.dom.a11y.Role', 'goog.dom.a11y.State'], ['goog.dom']); goog.addDependency('dom/abstractmultirange.js', ['goog.dom.AbstractMultiRange'], ['goog.array', 'goog.dom', 'goog.dom.AbstractRange']); goog.addDependency('dom/abstractrange.js', ['goog.dom.AbstractRange', 'goog.dom.RangeIterator', 'goog.dom.RangeType'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.SavedCaretRange', 'goog.dom.TagIterator', 'goog.userAgent']); goog.addDependency('dom/annotate.js', ['goog.dom.annotate'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.string']); @@ -78,6 +85,7 @@ goog.addDependency('dom/browserrange/w3crange.js', ['goog.dom.browserrange.W3cRa goog.addDependency('dom/browserrange/webkitrange.js', ['goog.dom.browserrange.WebKitRange'], ['goog.dom.RangeEndpoint', 'goog.dom.browserrange.W3cRange', 'goog.userAgent']); goog.addDependency('dom/classes.js', ['goog.dom.classes'], ['goog.array']); goog.addDependency('dom/controlrange.js', ['goog.dom.ControlRange', 'goog.dom.ControlRangeIterator'], ['goog.array', 'goog.dom', 'goog.dom.AbstractMultiRange', 'goog.dom.AbstractRange', 'goog.dom.RangeIterator', 'goog.dom.RangeType', 'goog.dom.SavedRange', 'goog.dom.TagWalkType', 'goog.dom.TextRange', 'goog.iter.StopIteration', 'goog.userAgent']); +goog.addDependency('dom/dataset.js', ['goog.dom.dataset'], ['goog.string']); goog.addDependency('dom/dom.js', ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.NodeType'], ['goog.array', 'goog.dom.BrowserFeature', 'goog.dom.TagName', 'goog.dom.classes', 'goog.math.Coordinate', 'goog.math.Size', 'goog.object', 'goog.string', 'goog.userAgent']); goog.addDependency('dom/dom_test.js', ['goog.dom.dom_test'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.testing.asserts', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion']); goog.addDependency('dom/fontsizemonitor.js', ['goog.dom.FontSizeMonitor', 'goog.dom.FontSizeMonitor.EventType'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.userAgent']); @@ -150,7 +158,7 @@ goog.addDependency('editor/style.js', ['goog.editor.style'], ['goog.dom', 'goog. goog.addDependency('editor/table.js', ['goog.editor.Table', 'goog.editor.TableCell', 'goog.editor.TableRow'], ['goog.debug.Logger', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.string.Unicode', 'goog.style']); goog.addDependency('events/actioneventwrapper.js', ['goog.events.actionEventWrapper'], ['goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.EventWrapper', 'goog.events.KeyCodes']); goog.addDependency('events/actionhandler.js', ['goog.events.ActionEvent', 'goog.events.ActionHandler', 'goog.events.ActionHandler.EventType', 'goog.events.BeforeActionEvent'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.userAgent']); -goog.addDependency('events/browserevent.js', ['goog.events.BrowserEvent', 'goog.events.BrowserEvent.MouseButton'], ['goog.events.BrowserFeature', 'goog.events.Event', 'goog.events.EventType', 'goog.userAgent']); +goog.addDependency('events/browserevent.js', ['goog.events.BrowserEvent', 'goog.events.BrowserEvent.MouseButton'], ['goog.events.BrowserFeature', 'goog.events.Event', 'goog.events.EventType', 'goog.reflect', 'goog.userAgent']); goog.addDependency('events/browserfeature.js', ['goog.events.BrowserFeature'], ['goog.userAgent']); goog.addDependency('events/event.js', ['goog.events.Event'], ['goog.Disposable']); goog.addDependency('events/eventhandler.js', ['goog.events.EventHandler'], ['goog.Disposable', 'goog.events', 'goog.events.EventWrapper', 'goog.object', 'goog.structs.SimplePool']); @@ -174,16 +182,22 @@ goog.addDependency('format/emailaddress.js', ['goog.format.EmailAddress'], ['goo goog.addDependency('format/format.js', ['goog.format'], ['goog.i18n.GraphemeBreak', 'goog.string', 'goog.userAgent']); goog.addDependency('format/htmlprettyprinter.js', ['goog.format.HtmlPrettyPrinter', 'goog.format.HtmlPrettyPrinter.Buffer'], ['goog.object', 'goog.string.StringBuffer']); goog.addDependency('format/jsonprettyprinter.js', ['goog.format.JsonPrettyPrinter', 'goog.format.JsonPrettyPrinter.HtmlDelimiters', 'goog.format.JsonPrettyPrinter.TextDelimiters'], ['goog.json', 'goog.json.Serializer', 'goog.string', 'goog.string.StringBuffer', 'goog.string.format']); +goog.addDependency('fs/entry.js', ['goog.fs.DirectoryEntry', 'goog.fs.DirectoryEntry.Behavior', 'goog.fs.Entry', 'goog.fs.FileEntry'], ['goog.array', 'goog.async.Deferred', 'goog.fs.Error', 'goog.fs.FileWriter', 'goog.functions', 'goog.string']); +goog.addDependency('fs/error.js', ['goog.fs.Error', 'goog.fs.Error.ErrorCode'], ['goog.debug.Error', 'goog.string']); +goog.addDependency('fs/filesaver.js', ['goog.fs.FileSaver', 'goog.fs.FileSaver.EventType', 'goog.fs.FileSaver.ProgressEvent', 'goog.fs.FileSaver.ReadyState'], ['goog.events.Event', 'goog.events.EventTarget', 'goog.fs.Error']); +goog.addDependency('fs/filesystem.js', ['goog.fs.FileSystem'], ['goog.fs.DirectoryEntry']); +goog.addDependency('fs/filewriter.js', ['goog.fs.FileWriter'], ['goog.fs.Error', 'goog.fs.FileSaver']); +goog.addDependency('fs/fs.js', ['goog.fs'], ['goog.async.Deferred', 'goog.events', 'goog.fs.Error', 'goog.fs.FileSystem']); goog.addDependency('functions/functions.js', ['goog.functions'], []); -goog.addDependency('fx/abstractdragdrop.js', ['goog.fx.AbstractDragDrop', 'goog.fx.DragDropEvent', 'goog.fx.DragDropItem'], ['goog.dom', 'goog.dom.classes', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.fx.Dragger.EventType', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style']); +goog.addDependency('fx/abstractdragdrop.js', ['goog.fx.AbstractDragDrop', 'goog.fx.AbstractDragDrop.EventType', 'goog.fx.DragDropEvent', 'goog.fx.DragDropItem'], ['goog.dom', 'goog.dom.classes', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.fx.Dragger.EventType', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style']); goog.addDependency('fx/animation.js', ['goog.fx.Animation', 'goog.fx.Animation.EventType', 'goog.fx.Animation.State', 'goog.fx.AnimationEvent'], ['goog.Timer', 'goog.array', 'goog.events.Event', 'goog.events.EventTarget', 'goog.object']); goog.addDependency('fx/animationqueue.js', ['goog.fx.AnimationParallelQueue', 'goog.fx.AnimationQueue', 'goog.fx.AnimationSerialQueue'], ['goog.array', 'goog.events.EventHandler', 'goog.fx.Animation', 'goog.fx.Animation.EventType']); goog.addDependency('fx/cssspriteanimation.js', ['goog.fx.CssSpriteAnimation'], ['goog.fx.Animation']); goog.addDependency('fx/dom.js', ['goog.fx.dom', 'goog.fx.dom.BgColorTransform', 'goog.fx.dom.ColorTransform', 'goog.fx.dom.Fade', 'goog.fx.dom.FadeIn', 'goog.fx.dom.FadeInAndShow', 'goog.fx.dom.FadeOut', 'goog.fx.dom.FadeOutAndHide', 'goog.fx.dom.PredefinedEffect', 'goog.fx.dom.Resize', 'goog.fx.dom.ResizeHeight', 'goog.fx.dom.ResizeWidth', 'goog.fx.dom.Scroll', 'goog.fx.dom.Slide', 'goog.fx.dom.SlideFrom', 'goog.fx.dom.Swipe'], ['goog.color', 'goog.events', 'goog.fx.Animation', 'goog.fx.Animation.EventType', 'goog.style']); goog.addDependency('fx/dragdrop.js', ['goog.fx.DragDrop'], ['goog.fx.AbstractDragDrop', 'goog.fx.DragDropItem']); -goog.addDependency('fx/dragdropgroup.js', ['goog.fx.DragDropGroup'], ['goog.fx.AbstractDragDrop', 'goog.fx.DragDropItem']); +goog.addDependency('fx/dragdropgroup.js', ['goog.fx.DragDropGroup'], ['goog.dom', 'goog.fx.AbstractDragDrop', 'goog.fx.DragDropItem']); goog.addDependency('fx/dragger.js', ['goog.fx.DragEvent', 'goog.fx.Dragger', 'goog.fx.Dragger.EventType'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent.MouseButton', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.userAgent']); -goog.addDependency('fx/draglistgroup.js', ['goog.fx.DragListDirection', 'goog.fx.DragListGroup', 'goog.fx.DragListGroup.EventType', 'goog.fx.DragListGroupEvent'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.classes', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.fx.Dragger.EventType', 'goog.math.Coordinate', 'goog.style']); +goog.addDependency('fx/draglistgroup.js', ['goog.fx.DragListDirection', 'goog.fx.DragListGroup', 'goog.fx.DragListGroup.EventType', 'goog.fx.DragListGroupEvent'], ['goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.classes', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.fx.Dragger.EventType', 'goog.math.Coordinate', 'goog.style']); goog.addDependency('fx/dragscrollsupport.js', ['goog.fx.DragScrollSupport'], ['goog.Disposable', 'goog.Timer', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.style']); goog.addDependency('fx/easing.js', ['goog.fx.easing'], []); goog.addDependency('fx/fx.js', ['goog.fx'], ['goog.asserts', 'goog.fx.Animation', 'goog.fx.Animation.EventType', 'goog.fx.Animation.State', 'goog.fx.AnimationEvent', 'goog.fx.easing']); @@ -200,15 +214,15 @@ goog.addDependency('gears/multipartformdata.js', ['goog.gears.MultipartFormData' goog.addDependency('gears/statustype.js', ['goog.gears.StatusType'], []); goog.addDependency('gears/urlcapture.js', ['goog.gears.UrlCapture', 'goog.gears.UrlCapture.Event', 'goog.gears.UrlCapture.EventType'], ['goog.Uri', 'goog.debug.Logger', 'goog.events.Event', 'goog.events.EventTarget', 'goog.gears']); goog.addDependency('gears/worker.js', ['goog.gears.Worker', 'goog.gears.Worker.EventType', 'goog.gears.WorkerEvent'], ['goog.events.Event', 'goog.events.EventTarget']); -goog.addDependency('gears/workerchannel.js', ['goog.gears.WorkerChannel'], ['goog.Disposable', 'goog.debug', 'goog.debug.Logger', 'goog.events', 'goog.gears.Worker', 'goog.gears.Worker.EventType', 'goog.gears.WorkerEvent', 'goog.json', 'goog.messaging.MessageChannel']); +goog.addDependency('gears/workerchannel.js', ['goog.gears.WorkerChannel'], ['goog.Disposable', 'goog.debug', 'goog.debug.Logger', 'goog.events', 'goog.gears.Worker', 'goog.gears.Worker.EventType', 'goog.gears.WorkerEvent', 'goog.json', 'goog.messaging.AbstractChannel']); goog.addDependency('gears/workerpool.js', ['goog.gears.WorkerPool', 'goog.gears.WorkerPool.Event', 'goog.gears.WorkerPool.EventType'], ['goog.events.Event', 'goog.events.EventTarget', 'goog.gears', 'goog.gears.Worker']); goog.addDependency('graphics/abstractgraphics.js', ['goog.graphics.AbstractGraphics'], ['goog.graphics.Path', 'goog.math.Coordinate', 'goog.math.Size', 'goog.style', 'goog.ui.Component']); goog.addDependency('graphics/affinetransform.js', ['goog.graphics.AffineTransform'], ['goog.math']); -goog.addDependency('graphics/canvaselement.js', ['goog.graphics.CanvasEllipseElement', 'goog.graphics.CanvasGroupElement', 'goog.graphics.CanvasImageElement', 'goog.graphics.CanvasPathElement', 'goog.graphics.CanvasRectElement', 'goog.graphics.CanvasTextElement'], ['goog.array', 'goog.dom', 'goog.graphics.EllipseElement', 'goog.graphics.GroupElement', 'goog.graphics.ImageElement', 'goog.graphics.Path', 'goog.graphics.PathElement', 'goog.graphics.RectElement', 'goog.graphics.TextElement']); +goog.addDependency('graphics/canvaselement.js', ['goog.graphics.CanvasEllipseElement', 'goog.graphics.CanvasGroupElement', 'goog.graphics.CanvasImageElement', 'goog.graphics.CanvasPathElement', 'goog.graphics.CanvasRectElement', 'goog.graphics.CanvasTextElement'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.graphics.EllipseElement', 'goog.graphics.GroupElement', 'goog.graphics.ImageElement', 'goog.graphics.Path', 'goog.graphics.PathElement', 'goog.graphics.RectElement', 'goog.graphics.TextElement']); goog.addDependency('graphics/canvasgraphics.js', ['goog.graphics.CanvasGraphics'], ['goog.dom', 'goog.events.EventType', 'goog.graphics.AbstractGraphics', 'goog.graphics.CanvasEllipseElement', 'goog.graphics.CanvasGroupElement', 'goog.graphics.CanvasImageElement', 'goog.graphics.CanvasPathElement', 'goog.graphics.CanvasRectElement', 'goog.graphics.CanvasTextElement', 'goog.graphics.Font', 'goog.graphics.LinearGradient', 'goog.graphics.SolidFill', 'goog.graphics.Stroke', 'goog.math.Size']); goog.addDependency('graphics/element.js', ['goog.graphics.Element'], ['goog.events', 'goog.events.EventTarget', 'goog.graphics.AffineTransform', 'goog.math']); goog.addDependency('graphics/ellipseelement.js', ['goog.graphics.EllipseElement'], ['goog.graphics.StrokeAndFillElement']); -goog.addDependency('graphics/ext/coordinates.js', ['goog.graphics.ext.coordinates'], []); +goog.addDependency('graphics/ext/coordinates.js', ['goog.graphics.ext.coordinates'], ['goog.string']); goog.addDependency('graphics/ext/element.js', ['goog.graphics.ext.Element'], ['goog.events', 'goog.events.EventTarget', 'goog.functions', 'goog.graphics', 'goog.graphics.ext.coordinates']); goog.addDependency('graphics/ext/ellipse.js', ['goog.graphics.ext.Ellipse'], ['goog.graphics.ext.StrokeAndFillElement']); goog.addDependency('graphics/ext/ext.js', ['goog.graphics.ext'], ['goog.graphics.ext.Ellipse', 'goog.graphics.ext.Graphics', 'goog.graphics.ext.Group', 'goog.graphics.ext.Image', 'goog.graphics.ext.Rectangle', 'goog.graphics.ext.Shape', 'goog.graphics.ext.coordinates']); @@ -224,7 +238,7 @@ goog.addDependency('graphics/font.js', ['goog.graphics.Font'], []); goog.addDependency('graphics/graphics.js', ['goog.graphics'], ['goog.graphics.CanvasGraphics', 'goog.graphics.SvgGraphics', 'goog.graphics.VmlGraphics', 'goog.userAgent']); goog.addDependency('graphics/groupelement.js', ['goog.graphics.GroupElement'], ['goog.graphics.Element']); goog.addDependency('graphics/imageelement.js', ['goog.graphics.ImageElement'], ['goog.graphics.Element']); -goog.addDependency('graphics/lineargradient.js', ['goog.graphics.LinearGradient'], ['goog.graphics.Fill']); +goog.addDependency('graphics/lineargradient.js', ['goog.graphics.LinearGradient'], ['goog.asserts', 'goog.graphics.Fill']); goog.addDependency('graphics/path.js', ['goog.graphics.Path', 'goog.graphics.Path.Segment'], ['goog.array', 'goog.math']); goog.addDependency('graphics/pathelement.js', ['goog.graphics.PathElement'], ['goog.graphics.StrokeAndFillElement']); goog.addDependency('graphics/paths.js', ['goog.graphics.paths'], ['goog.graphics.Path', 'goog.math.Coordinate']); @@ -233,35 +247,36 @@ goog.addDependency('graphics/solidfill.js', ['goog.graphics.SolidFill'], ['goog. goog.addDependency('graphics/stroke.js', ['goog.graphics.Stroke'], []); goog.addDependency('graphics/strokeandfillelement.js', ['goog.graphics.StrokeAndFillElement'], ['goog.graphics.Element']); goog.addDependency('graphics/svgelement.js', ['goog.graphics.SvgEllipseElement', 'goog.graphics.SvgGroupElement', 'goog.graphics.SvgImageElement', 'goog.graphics.SvgPathElement', 'goog.graphics.SvgRectElement', 'goog.graphics.SvgTextElement'], ['goog.dom', 'goog.graphics.EllipseElement', 'goog.graphics.GroupElement', 'goog.graphics.ImageElement', 'goog.graphics.PathElement', 'goog.graphics.RectElement', 'goog.graphics.TextElement']); -goog.addDependency('graphics/svggraphics.js', ['goog.graphics.SvgGraphics'], ['goog.Timer', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.graphics.AbstractGraphics', 'goog.graphics.Font', 'goog.graphics.LinearGradient', 'goog.graphics.SolidFill', 'goog.graphics.Stroke', 'goog.graphics.SvgEllipseElement', 'goog.graphics.SvgGroupElement', 'goog.graphics.SvgImageElement', 'goog.graphics.SvgPathElement', 'goog.graphics.SvgRectElement', 'goog.graphics.SvgTextElement', 'goog.math.Size', 'goog.userAgent']); +goog.addDependency('graphics/svggraphics.js', ['goog.graphics.SvgGraphics'], ['goog.Timer', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.graphics.AbstractGraphics', 'goog.graphics.Font', 'goog.graphics.LinearGradient', 'goog.graphics.SolidFill', 'goog.graphics.Stroke', 'goog.graphics.SvgEllipseElement', 'goog.graphics.SvgGroupElement', 'goog.graphics.SvgImageElement', 'goog.graphics.SvgPathElement', 'goog.graphics.SvgRectElement', 'goog.graphics.SvgTextElement', 'goog.math.Size', 'goog.style', 'goog.userAgent']); goog.addDependency('graphics/textelement.js', ['goog.graphics.TextElement'], ['goog.graphics.StrokeAndFillElement']); goog.addDependency('graphics/vmlelement.js', ['goog.graphics.VmlEllipseElement', 'goog.graphics.VmlGroupElement', 'goog.graphics.VmlImageElement', 'goog.graphics.VmlPathElement', 'goog.graphics.VmlRectElement', 'goog.graphics.VmlTextElement'], ['goog.dom', 'goog.graphics.EllipseElement', 'goog.graphics.GroupElement', 'goog.graphics.ImageElement', 'goog.graphics.PathElement', 'goog.graphics.RectElement', 'goog.graphics.TextElement']); -goog.addDependency('graphics/vmlgraphics.js', ['goog.graphics.VmlGraphics'], ['goog.array', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.graphics.AbstractGraphics', 'goog.graphics.Font', 'goog.graphics.LinearGradient', 'goog.graphics.SolidFill', 'goog.graphics.Stroke', 'goog.graphics.VmlEllipseElement', 'goog.graphics.VmlGroupElement', 'goog.graphics.VmlImageElement', 'goog.graphics.VmlPathElement', 'goog.graphics.VmlRectElement', 'goog.graphics.VmlTextElement', 'goog.math.Size', 'goog.string']); +goog.addDependency('graphics/vmlgraphics.js', ['goog.graphics.VmlGraphics'], ['goog.array', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.graphics.AbstractGraphics', 'goog.graphics.Font', 'goog.graphics.LinearGradient', 'goog.graphics.SolidFill', 'goog.graphics.Stroke', 'goog.graphics.VmlEllipseElement', 'goog.graphics.VmlGroupElement', 'goog.graphics.VmlImageElement', 'goog.graphics.VmlPathElement', 'goog.graphics.VmlRectElement', 'goog.graphics.VmlTextElement', 'goog.math.Size', 'goog.string', 'goog.style']); goog.addDependency('history/event.js', ['goog.history.Event'], ['goog.events.Event', 'goog.history.EventType']); goog.addDependency('history/eventtype.js', ['goog.history.EventType'], []); goog.addDependency('history/history.js', ['goog.History', 'goog.History.Event', 'goog.History.EventType'], ['goog.Timer', 'goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.history.Event', 'goog.history.EventType', 'goog.string', 'goog.userAgent']); -goog.addDependency('history/html5history.js', ['goog.history.Html5History'], ['goog.asserts', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.history.Event', 'goog.history.EventType']); +goog.addDependency('history/html5history.js', ['goog.history.Html5History', 'goog.history.Html5History.TokenTransformer'], ['goog.asserts', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.history.Event', 'goog.history.EventType']); goog.addDependency('i18n/bidi.js', ['goog.i18n.bidi'], []); goog.addDependency('i18n/bidiformatter.js', ['goog.i18n.BidiFormatter'], ['goog.i18n.bidi', 'goog.string']); goog.addDependency('i18n/charlistdecompressor.js', ['goog.i18n.CharListDecompressor'], ['goog.array', 'goog.i18n.uChar']); goog.addDependency('i18n/charpickerdata.js', ['goog.i18n.CharPickerData'], []); goog.addDependency('i18n/currency.js', ['goog.i18n.currency'], []); goog.addDependency('i18n/currencycodemap.js', ['goog.i18n.currencyCodeMap'], []); -goog.addDependency('i18n/datetimeformat.js', ['goog.i18n.DateTimeFormat'], ['goog.asserts', 'goog.date.DateLike', 'goog.i18n.DateTimeSymbols', 'goog.i18n.TimeZone', 'goog.string']); +goog.addDependency('i18n/datetimeformat.js', ['goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeFormat.Format'], ['goog.asserts', 'goog.date.DateLike', 'goog.i18n.DateTimeSymbols', 'goog.i18n.TimeZone', 'goog.string']); goog.addDependency('i18n/datetimeparse.js', ['goog.i18n.DateTimeParse'], ['goog.date.DateLike', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeSymbols']); -goog.addDependency('i18n/datetimepatterns.js', ['goog.i18n.DateTimePatterns', 'goog.i18n.DateTimePatterns_am', 'goog.i18n.DateTimePatterns_ar', 'goog.i18n.DateTimePatterns_bg', 'goog.i18n.DateTimePatterns_bn', 'goog.i18n.DateTimePatterns_ca', 'goog.i18n.DateTimePatterns_cs', 'goog.i18n.DateTimePatterns_da', 'goog.i18n.DateTimePatterns_de', 'goog.i18n.DateTimePatterns_de_AT', 'goog.i18n.DateTimePatterns_de_CH', 'goog.i18n.DateTimePatterns_el', 'goog.i18n.DateTimePatterns_en', 'goog.i18n.DateTimePatterns_en_AU', 'goog.i18n.DateTimePatterns_en_GB', 'goog.i18n.DateTimePatterns_en_IE', 'goog.i18n.DateTimePatterns_en_IN', 'goog.i18n.DateTimePatterns_en_SG', 'goog.i18n.DateTimePatterns_en_US', 'goog.i18n.DateTimePatterns_en_ZA', 'goog.i18n.DateTimePatterns_es', 'goog.i18n.DateTimePatterns_et', 'goog.i18n.DateTimePatterns_eu', 'goog.i18n.DateTimePatterns_fa', 'goog.i18n.DateTimePatterns_fi', 'goog.i18n.DateTimePatterns_fil', 'goog.i18n.DateTimePatterns_fr', 'goog.i18n.DateTimePatterns_fr_CA', 'goog.i18n.DateTimePatterns_gl', 'goog.i18n.DateTimePatterns_gsw', 'goog.i18n.DateTimePatterns_gu', 'goog.i18n.DateTimePatterns_he', 'goog.i18n.DateTimePatterns_hi', 'goog.i18n.DateTimePatterns_hr', 'goog.i18n.DateTimePatterns_hu', 'goog.i18n.DateTimePatterns_id', 'goog.i18n.DateTimePatterns_is', 'goog.i18n.DateTimePatterns_it', 'goog.i18n.DateTimePatterns_ja', 'goog.i18n.DateTimePatterns_kn', 'goog.i18n.DateTimePatterns_ko', 'goog.i18n.DateTimePatterns_lt', 'goog.i18n.DateTimePatterns_lv', 'goog.i18n.DateTimePatterns_ml', 'goog.i18n.DateTimePatterns_mr', 'goog.i18n.DateTimePatterns_ms', 'goog.i18n.DateTimePatterns_mt', 'goog.i18n.DateTimePatterns_nl', 'goog.i18n.DateTimePatterns_or', 'goog.i18n.DateTimePatterns_pl', 'goog.i18n.DateTimePatterns_pt', 'goog.i18n.DateTimePatterns_pt_BR', 'goog.i18n.DateTimePatterns_pt_PT', 'goog.i18n.DateTimePatterns_ro', 'goog.i18n.DateTimePatterns_ru', 'goog.i18n.DateTimePatterns_sk', 'goog.i18n.DateTimePatterns_sl', 'goog.i18n.DateTimePatterns_sq', 'goog.i18n.DateTimePatterns_sr', 'goog.i18n.DateTimePatterns_sv', 'goog.i18n.DateTimePatterns_sw', 'goog.i18n.DateTimePatterns_ta', 'goog.i18n.DateTimePatterns_te', 'goog.i18n.DateTimePatterns_th', 'goog.i18n.DateTimePatterns_tr', 'goog.i18n.DateTimePatterns_uk', 'goog.i18n.DateTimePatterns_ur', 'goog.i18n.DateTimePatterns_vi', 'goog.i18n.DateTimePatterns_zh'], []); -goog.addDependency('i18n/datetimepatternsext.js', ['goog.i18n.DateTimePatternsExt', 'goog.i18n.DateTimePatterns_af', 'goog.i18n.DateTimePatterns_af_NA', 'goog.i18n.DateTimePatterns_af_ZA', 'goog.i18n.DateTimePatterns_ak', 'goog.i18n.DateTimePatterns_ak_GH', 'goog.i18n.DateTimePatterns_am_ET', 'goog.i18n.DateTimePatterns_ar_AE', 'goog.i18n.DateTimePatterns_ar_BH', 'goog.i18n.DateTimePatterns_ar_DZ', 'goog.i18n.DateTimePatterns_ar_EG', 'goog.i18n.DateTimePatterns_ar_IQ', 'goog.i18n.DateTimePatterns_ar_JO', 'goog.i18n.DateTimePatterns_ar_KW', 'goog.i18n.DateTimePatterns_ar_LB', 'goog.i18n.DateTimePatterns_ar_LY', 'goog.i18n.DateTimePatterns_ar_MA', 'goog.i18n.DateTimePatterns_ar_OM', 'goog.i18n.DateTimePatterns_ar_QA', 'goog.i18n.DateTimePatterns_ar_SA', 'goog.i18n.DateTimePatterns_ar_SD', 'goog.i18n.DateTimePatterns_ar_SY', 'goog.i18n.DateTimePatterns_ar_TN', 'goog.i18n.DateTimePatterns_ar_YE', 'goog.i18n.DateTimePatterns_as', 'goog.i18n.DateTimePatterns_as_IN', 'goog.i18n.DateTimePatterns_asa', 'goog.i18n.DateTimePatterns_asa_TZ', 'goog.i18n.DateTimePatterns_az', 'goog.i18n.DateTimePatterns_az_Cyrl', 'goog.i18n.DateTimePatterns_az_Cyrl_AZ', 'goog.i18n.DateTimePatterns_az_Latn', 'goog.i18n.DateTimePatterns_az_Latn_AZ', 'goog.i18n.DateTimePatterns_be', 'goog.i18n.DateTimePatterns_be_BY', 'goog.i18n.DateTimePatterns_bem', 'goog.i18n.DateTimePatterns_bem_ZM', 'goog.i18n.DateTimePatterns_bez', 'goog.i18n.DateTimePatterns_bez_TZ', 'goog.i18n.DateTimePatterns_bg_BG', 'goog.i18n.DateTimePatterns_bm', 'goog.i18n.DateTimePatterns_bm_ML', 'goog.i18n.DateTimePatterns_bn_BD', 'goog.i18n.DateTimePatterns_bn_IN', 'goog.i18n.DateTimePatterns_bo', 'goog.i18n.DateTimePatterns_bo_CN', 'goog.i18n.DateTimePatterns_bo_IN', 'goog.i18n.DateTimePatterns_ca_ES', 'goog.i18n.DateTimePatterns_cgg', 'goog.i18n.DateTimePatterns_cgg_UG', 'goog.i18n.DateTimePatterns_chr', 'goog.i18n.DateTimePatterns_chr_US', 'goog.i18n.DateTimePatterns_cs_CZ', 'goog.i18n.DateTimePatterns_cy', 'goog.i18n.DateTimePatterns_cy_GB', 'goog.i18n.DateTimePatterns_da_DK', 'goog.i18n.DateTimePatterns_dav', 'goog.i18n.DateTimePatterns_dav_KE', 'goog.i18n.DateTimePatterns_de_BE', 'goog.i18n.DateTimePatterns_de_DE', 'goog.i18n.DateTimePatterns_de_LI', 'goog.i18n.DateTimePatterns_de_LU', 'goog.i18n.DateTimePatterns_ebu', 'goog.i18n.DateTimePatterns_ebu_KE', 'goog.i18n.DateTimePatterns_ee', 'goog.i18n.DateTimePatterns_ee_GH', 'goog.i18n.DateTimePatterns_ee_TG', 'goog.i18n.DateTimePatterns_el_CY', 'goog.i18n.DateTimePatterns_el_GR', 'goog.i18n.DateTimePatterns_en_BE', 'goog.i18n.DateTimePatterns_en_BW', 'goog.i18n.DateTimePatterns_en_BZ', 'goog.i18n.DateTimePatterns_en_CA', 'goog.i18n.DateTimePatterns_en_HK', 'goog.i18n.DateTimePatterns_en_JM', 'goog.i18n.DateTimePatterns_en_MH', 'goog.i18n.DateTimePatterns_en_MT', 'goog.i18n.DateTimePatterns_en_MU', 'goog.i18n.DateTimePatterns_en_NA', 'goog.i18n.DateTimePatterns_en_NZ', 'goog.i18n.DateTimePatterns_en_PH', 'goog.i18n.DateTimePatterns_en_PK', 'goog.i18n.DateTimePatterns_en_TT', 'goog.i18n.DateTimePatterns_en_US_POSIX', 'goog.i18n.DateTimePatterns_en_VI', 'goog.i18n.DateTimePatterns_en_ZW', 'goog.i18n.DateTimePatterns_eo', 'goog.i18n.DateTimePatterns_es_AR', 'goog.i18n.DateTimePatterns_es_BO', 'goog.i18n.DateTimePatterns_es_CL', 'goog.i18n.DateTimePatterns_es_CO', 'goog.i18n.DateTimePatterns_es_CR', 'goog.i18n.DateTimePatterns_es_DO', 'goog.i18n.DateTimePatterns_es_EC', 'goog.i18n.DateTimePatterns_es_ES', 'goog.i18n.DateTimePatterns_es_GQ', 'goog.i18n.DateTimePatterns_es_GT', 'goog.i18n.DateTimePatterns_es_HN', 'goog.i18n.DateTimePatterns_es_MX', 'goog.i18n.DateTimePatterns_es_NI', 'goog.i18n.DateTimePatterns_es_PA', 'goog.i18n.DateTimePatterns_es_PE', 'goog.i18n.DateTimePatterns_es_PR', 'goog.i18n.DateTimePatterns_es_PY', 'goog.i18n.DateTimePatterns_es_SV', 'goog.i18n.DateTimePatterns_es_US', 'goog.i18n.DateTimePatterns_es_UY', 'goog.i18n.DateTimePatterns_es_VE', 'goog.i18n.DateTimePatterns_et_EE', 'goog.i18n.DateTimePatterns_eu_ES', 'goog.i18n.DateTimePatterns_fa_AF', 'goog.i18n.DateTimePatterns_fa_IR', 'goog.i18n.DateTimePatterns_ff', 'goog.i18n.DateTimePatterns_ff_SN', 'goog.i18n.DateTimePatterns_fi_FI', 'goog.i18n.DateTimePatterns_fil_PH', 'goog.i18n.DateTimePatterns_fo', 'goog.i18n.DateTimePatterns_fo_FO', 'goog.i18n.DateTimePatterns_fr_BE', 'goog.i18n.DateTimePatterns_fr_BL', 'goog.i18n.DateTimePatterns_fr_CF', 'goog.i18n.DateTimePatterns_fr_CH', 'goog.i18n.DateTimePatterns_fr_CI', 'goog.i18n.DateTimePatterns_fr_CM', 'goog.i18n.DateTimePatterns_fr_FR', 'goog.i18n.DateTimePatterns_fr_GN', 'goog.i18n.DateTimePatterns_fr_GP', 'goog.i18n.DateTimePatterns_fr_LU', 'goog.i18n.DateTimePatterns_fr_MC', 'goog.i18n.DateTimePatterns_fr_MF', 'goog.i18n.DateTimePatterns_fr_MG', 'goog.i18n.DateTimePatterns_fr_ML', 'goog.i18n.DateTimePatterns_fr_MQ', 'goog.i18n.DateTimePatterns_fr_NE', 'goog.i18n.DateTimePatterns_fr_RE', 'goog.i18n.DateTimePatterns_fr_SN', 'goog.i18n.DateTimePatterns_ga', 'goog.i18n.DateTimePatterns_ga_IE', 'goog.i18n.DateTimePatterns_gl_ES', 'goog.i18n.DateTimePatterns_gsw_CH', 'goog.i18n.DateTimePatterns_gu_IN', 'goog.i18n.DateTimePatterns_guz', 'goog.i18n.DateTimePatterns_guz_KE', 'goog.i18n.DateTimePatterns_gv', 'goog.i18n.DateTimePatterns_gv_GB', 'goog.i18n.DateTimePatterns_ha', 'goog.i18n.DateTimePatterns_ha_Latn', 'goog.i18n.DateTimePatterns_ha_Latn_GH', 'goog.i18n.DateTimePatterns_ha_Latn_NE', 'goog.i18n.DateTimePatterns_ha_Latn_NG', 'goog.i18n.DateTimePatterns_haw', 'goog.i18n.DateTimePatterns_haw_US', 'goog.i18n.DateTimePatterns_he_IL', 'goog.i18n.DateTimePatterns_hi_IN', 'goog.i18n.DateTimePatterns_hr_HR', 'goog.i18n.DateTimePatterns_hu_HU', 'goog.i18n.DateTimePatterns_hy', 'goog.i18n.DateTimePatterns_hy_AM', 'goog.i18n.DateTimePatterns_id_ID', 'goog.i18n.DateTimePatterns_ig', 'goog.i18n.DateTimePatterns_ig_NG', 'goog.i18n.DateTimePatterns_ii', 'goog.i18n.DateTimePatterns_ii_CN', 'goog.i18n.DateTimePatterns_is_IS', 'goog.i18n.DateTimePatterns_it_CH', 'goog.i18n.DateTimePatterns_it_IT', 'goog.i18n.DateTimePatterns_ja_JP', 'goog.i18n.DateTimePatterns_jmc', 'goog.i18n.DateTimePatterns_jmc_TZ', 'goog.i18n.DateTimePatterns_ka', 'goog.i18n.DateTimePatterns_ka_GE', 'goog.i18n.DateTimePatterns_kab', 'goog.i18n.DateTimePatterns_kab_DZ', 'goog.i18n.DateTimePatterns_kam', 'goog.i18n.DateTimePatterns_kam_KE', 'goog.i18n.DateTimePatterns_kde', 'goog.i18n.DateTimePatterns_kde_TZ', 'goog.i18n.DateTimePatterns_kea', 'goog.i18n.DateTimePatterns_kea_CV', 'goog.i18n.DateTimePatterns_khq', 'goog.i18n.DateTimePatterns_khq_ML', 'goog.i18n.DateTimePatterns_ki', 'goog.i18n.DateTimePatterns_ki_KE', 'goog.i18n.DateTimePatterns_kk', 'goog.i18n.DateTimePatterns_kk_Cyrl', 'goog.i18n.DateTimePatterns_kk_Cyrl_KZ', 'goog.i18n.DateTimePatterns_kl', 'goog.i18n.DateTimePatterns_kl_GL', 'goog.i18n.DateTimePatterns_kln', 'goog.i18n.DateTimePatterns_kln_KE', 'goog.i18n.DateTimePatterns_km', 'goog.i18n.DateTimePatterns_km_KH', 'goog.i18n.DateTimePatterns_kn_IN', 'goog.i18n.DateTimePatterns_ko_KR', 'goog.i18n.DateTimePatterns_kok', 'goog.i18n.DateTimePatterns_kok_IN', 'goog.i18n.DateTimePatterns_kw', 'goog.i18n.DateTimePatterns_kw_GB', 'goog.i18n.DateTimePatterns_lag', 'goog.i18n.DateTimePatterns_lag_TZ', 'goog.i18n.DateTimePatterns_lg', 'goog.i18n.DateTimePatterns_lg_UG', 'goog.i18n.DateTimePatterns_lt_LT', 'goog.i18n.DateTimePatterns_luo', 'goog.i18n.DateTimePatterns_luo_KE', 'goog.i18n.DateTimePatterns_luy', 'goog.i18n.DateTimePatterns_luy_KE', 'goog.i18n.DateTimePatterns_lv_LV', 'goog.i18n.DateTimePatterns_mas', 'goog.i18n.DateTimePatterns_mas_KE', 'goog.i18n.DateTimePatterns_mas_TZ', 'goog.i18n.DateTimePatterns_mer', 'goog.i18n.DateTimePatterns_mer_KE', 'goog.i18n.DateTimePatterns_mfe', 'goog.i18n.DateTimePatterns_mfe_MU', 'goog.i18n.DateTimePatterns_mg', 'goog.i18n.DateTimePatterns_mg_MG', 'goog.i18n.DateTimePatterns_mk', 'goog.i18n.DateTimePatterns_mk_MK', 'goog.i18n.DateTimePatterns_ml_IN', 'goog.i18n.DateTimePatterns_mr_IN', 'goog.i18n.DateTimePatterns_ms_BN', 'goog.i18n.DateTimePatterns_ms_MY', 'goog.i18n.DateTimePatterns_mt_MT', 'goog.i18n.DateTimePatterns_naq', 'goog.i18n.DateTimePatterns_naq_NA', 'goog.i18n.DateTimePatterns_nb', 'goog.i18n.DateTimePatterns_nb_NO', 'goog.i18n.DateTimePatterns_nd', 'goog.i18n.DateTimePatterns_nd_ZW', 'goog.i18n.DateTimePatterns_ne', 'goog.i18n.DateTimePatterns_ne_IN', 'goog.i18n.DateTimePatterns_ne_NP', 'goog.i18n.DateTimePatterns_nl_BE', 'goog.i18n.DateTimePatterns_nl_NL', 'goog.i18n.DateTimePatterns_nn', 'goog.i18n.DateTimePatterns_nn_NO', 'goog.i18n.DateTimePatterns_nyn', 'goog.i18n.DateTimePatterns_nyn_UG', 'goog.i18n.DateTimePatterns_om', 'goog.i18n.DateTimePatterns_om_ET', 'goog.i18n.DateTimePatterns_om_KE', 'goog.i18n.DateTimePatterns_or_IN', 'goog.i18n.DateTimePatterns_pa', 'goog.i18n.DateTimePatterns_pa_Arab', 'goog.i18n.DateTimePatterns_pa_Arab_PK', 'goog.i18n.DateTimePatterns_pa_Guru', 'goog.i18n.DateTimePatterns_pa_Guru_IN', 'goog.i18n.DateTimePatterns_pl_PL', 'goog.i18n.DateTimePatterns_ps', 'goog.i18n.DateTimePatterns_ps_AF', 'goog.i18n.DateTimePatterns_pt_GW', 'goog.i18n.DateTimePatterns_pt_MZ', 'goog.i18n.DateTimePatterns_rm', 'goog.i18n.DateTimePatterns_rm_CH', 'goog.i18n.DateTimePatterns_ro_MD', 'goog.i18n.DateTimePatterns_ro_RO', 'goog.i18n.DateTimePatterns_rof', 'goog.i18n.DateTimePatterns_rof_TZ', 'goog.i18n.DateTimePatterns_ru_MD', 'goog.i18n.DateTimePatterns_ru_RU', 'goog.i18n.DateTimePatterns_ru_UA', 'goog.i18n.DateTimePatterns_rw', 'goog.i18n.DateTimePatterns_rw_RW', 'goog.i18n.DateTimePatterns_rwk', 'goog.i18n.DateTimePatterns_rwk_TZ', 'goog.i18n.DateTimePatterns_saq', 'goog.i18n.DateTimePatterns_saq_KE', 'goog.i18n.DateTimePatterns_seh', 'goog.i18n.DateTimePatterns_seh_MZ', 'goog.i18n.DateTimePatterns_ses', 'goog.i18n.DateTimePatterns_ses_ML', 'goog.i18n.DateTimePatterns_sg', 'goog.i18n.DateTimePatterns_sg_CF', 'goog.i18n.DateTimePatterns_shi', 'goog.i18n.DateTimePatterns_shi_Latn', 'goog.i18n.DateTimePatterns_shi_Latn_MA', 'goog.i18n.DateTimePatterns_shi_Tfng', 'goog.i18n.DateTimePatterns_shi_Tfng_MA', 'goog.i18n.DateTimePatterns_si', 'goog.i18n.DateTimePatterns_si_LK', 'goog.i18n.DateTimePatterns_sk_SK', 'goog.i18n.DateTimePatterns_sl_SI', 'goog.i18n.DateTimePatterns_sn', 'goog.i18n.DateTimePatterns_sn_ZW', 'goog.i18n.DateTimePatterns_so', 'goog.i18n.DateTimePatterns_so_DJ', 'goog.i18n.DateTimePatterns_so_ET', 'goog.i18n.DateTimePatterns_so_KE', 'goog.i18n.DateTimePatterns_so_SO', 'goog.i18n.DateTimePatterns_sq_AL', 'goog.i18n.DateTimePatterns_sr_Cyrl', 'goog.i18n.DateTimePatterns_sr_Cyrl_BA', 'goog.i18n.DateTimePatterns_sr_Cyrl_ME', 'goog.i18n.DateTimePatterns_sr_Cyrl_RS', 'goog.i18n.DateTimePatterns_sr_Latn', 'goog.i18n.DateTimePatterns_sr_Latn_BA', 'goog.i18n.DateTimePatterns_sr_Latn_ME', 'goog.i18n.DateTimePatterns_sr_Latn_RS', 'goog.i18n.DateTimePatterns_sv_FI', 'goog.i18n.DateTimePatterns_sv_SE', 'goog.i18n.DateTimePatterns_sw_KE', 'goog.i18n.DateTimePatterns_sw_TZ', 'goog.i18n.DateTimePatterns_ta_IN', 'goog.i18n.DateTimePatterns_ta_LK', 'goog.i18n.DateTimePatterns_te_IN', 'goog.i18n.DateTimePatterns_teo', 'goog.i18n.DateTimePatterns_teo_KE', 'goog.i18n.DateTimePatterns_teo_UG', 'goog.i18n.DateTimePatterns_th_TH', 'goog.i18n.DateTimePatterns_ti', 'goog.i18n.DateTimePatterns_ti_ER', 'goog.i18n.DateTimePatterns_ti_ET', 'goog.i18n.DateTimePatterns_tl_PH', 'goog.i18n.DateTimePatterns_to', 'goog.i18n.DateTimePatterns_to_TO', 'goog.i18n.DateTimePatterns_tr_TR', 'goog.i18n.DateTimePatterns_tzm', 'goog.i18n.DateTimePatterns_tzm_Latn', 'goog.i18n.DateTimePatterns_tzm_Latn_MA', 'goog.i18n.DateTimePatterns_uk_UA', 'goog.i18n.DateTimePatterns_ur_IN', 'goog.i18n.DateTimePatterns_ur_PK', 'goog.i18n.DateTimePatterns_uz', 'goog.i18n.DateTimePatterns_uz_Arab', 'goog.i18n.DateTimePatterns_uz_Arab_AF', 'goog.i18n.DateTimePatterns_uz_Cyrl', 'goog.i18n.DateTimePatterns_uz_Cyrl_UZ', 'goog.i18n.DateTimePatterns_uz_Latn', 'goog.i18n.DateTimePatterns_uz_Latn_UZ', 'goog.i18n.DateTimePatterns_vi_VN', 'goog.i18n.DateTimePatterns_vun', 'goog.i18n.DateTimePatterns_vun_TZ', 'goog.i18n.DateTimePatterns_xog', 'goog.i18n.DateTimePatterns_xog_UG', 'goog.i18n.DateTimePatterns_yo', 'goog.i18n.DateTimePatterns_yo_NG', 'goog.i18n.DateTimePatterns_zh_Hans', 'goog.i18n.DateTimePatterns_zh_Hans_CN', 'goog.i18n.DateTimePatterns_zh_Hans_HK', 'goog.i18n.DateTimePatterns_zh_Hans_MO', 'goog.i18n.DateTimePatterns_zh_Hans_SG', 'goog.i18n.DateTimePatterns_zh_Hant', 'goog.i18n.DateTimePatterns_zh_Hant_HK', 'goog.i18n.DateTimePatterns_zh_Hant_MO', 'goog.i18n.DateTimePatterns_zh_Hant_TW', 'goog.i18n.DateTimePatterns_zu', 'goog.i18n.DateTimePatterns_zu_ZA'], ['goog.i18n.DateTimePatterns']); +goog.addDependency('i18n/datetimepatterns.js', ['goog.i18n.DateTimePatterns', 'goog.i18n.DateTimePatterns_am', 'goog.i18n.DateTimePatterns_ar', 'goog.i18n.DateTimePatterns_bg', 'goog.i18n.DateTimePatterns_bn', 'goog.i18n.DateTimePatterns_ca', 'goog.i18n.DateTimePatterns_cs', 'goog.i18n.DateTimePatterns_da', 'goog.i18n.DateTimePatterns_de', 'goog.i18n.DateTimePatterns_de_AT', 'goog.i18n.DateTimePatterns_de_CH', 'goog.i18n.DateTimePatterns_el', 'goog.i18n.DateTimePatterns_en', 'goog.i18n.DateTimePatterns_en_AU', 'goog.i18n.DateTimePatterns_en_GB', 'goog.i18n.DateTimePatterns_en_IE', 'goog.i18n.DateTimePatterns_en_IN', 'goog.i18n.DateTimePatterns_en_SG', 'goog.i18n.DateTimePatterns_en_US', 'goog.i18n.DateTimePatterns_en_ZA', 'goog.i18n.DateTimePatterns_es', 'goog.i18n.DateTimePatterns_et', 'goog.i18n.DateTimePatterns_eu', 'goog.i18n.DateTimePatterns_fa', 'goog.i18n.DateTimePatterns_fi', 'goog.i18n.DateTimePatterns_fil', 'goog.i18n.DateTimePatterns_fr', 'goog.i18n.DateTimePatterns_fr_CA', 'goog.i18n.DateTimePatterns_gl', 'goog.i18n.DateTimePatterns_gsw', 'goog.i18n.DateTimePatterns_gu', 'goog.i18n.DateTimePatterns_he', 'goog.i18n.DateTimePatterns_hi', 'goog.i18n.DateTimePatterns_hr', 'goog.i18n.DateTimePatterns_hu', 'goog.i18n.DateTimePatterns_id', 'goog.i18n.DateTimePatterns_in', 'goog.i18n.DateTimePatterns_is', 'goog.i18n.DateTimePatterns_it', 'goog.i18n.DateTimePatterns_iw', 'goog.i18n.DateTimePatterns_ja', 'goog.i18n.DateTimePatterns_kn', 'goog.i18n.DateTimePatterns_ko', 'goog.i18n.DateTimePatterns_ln', 'goog.i18n.DateTimePatterns_lt', 'goog.i18n.DateTimePatterns_lv', 'goog.i18n.DateTimePatterns_ml', 'goog.i18n.DateTimePatterns_mo', 'goog.i18n.DateTimePatterns_mr', 'goog.i18n.DateTimePatterns_ms', 'goog.i18n.DateTimePatterns_mt', 'goog.i18n.DateTimePatterns_nl', 'goog.i18n.DateTimePatterns_no', 'goog.i18n.DateTimePatterns_or', 'goog.i18n.DateTimePatterns_pl', 'goog.i18n.DateTimePatterns_pt', 'goog.i18n.DateTimePatterns_pt_BR', 'goog.i18n.DateTimePatterns_pt_PT', 'goog.i18n.DateTimePatterns_ro', 'goog.i18n.DateTimePatterns_ru', 'goog.i18n.DateTimePatterns_sk', 'goog.i18n.DateTimePatterns_sl', 'goog.i18n.DateTimePatterns_sq', 'goog.i18n.DateTimePatterns_sr', 'goog.i18n.DateTimePatterns_sv', 'goog.i18n.DateTimePatterns_sw', 'goog.i18n.DateTimePatterns_ta', 'goog.i18n.DateTimePatterns_te', 'goog.i18n.DateTimePatterns_th', 'goog.i18n.DateTimePatterns_tl', 'goog.i18n.DateTimePatterns_tr', 'goog.i18n.DateTimePatterns_uk', 'goog.i18n.DateTimePatterns_ur', 'goog.i18n.DateTimePatterns_vi', 'goog.i18n.DateTimePatterns_zh', 'goog.i18n.DateTimePatterns_zh_CN', 'goog.i18n.DateTimePatterns_zh_HK', 'goog.i18n.DateTimePatterns_zh_TW'], []); +goog.addDependency('i18n/datetimepatternsext.js', ['goog.i18n.DateTimePatternsExt', 'goog.i18n.DateTimePatterns_af', 'goog.i18n.DateTimePatterns_af_NA', 'goog.i18n.DateTimePatterns_af_ZA', 'goog.i18n.DateTimePatterns_ak', 'goog.i18n.DateTimePatterns_ak_GH', 'goog.i18n.DateTimePatterns_am_ET', 'goog.i18n.DateTimePatterns_ar_AE', 'goog.i18n.DateTimePatterns_ar_BH', 'goog.i18n.DateTimePatterns_ar_DZ', 'goog.i18n.DateTimePatterns_ar_EG', 'goog.i18n.DateTimePatterns_ar_IQ', 'goog.i18n.DateTimePatterns_ar_JO', 'goog.i18n.DateTimePatterns_ar_KW', 'goog.i18n.DateTimePatterns_ar_LB', 'goog.i18n.DateTimePatterns_ar_LY', 'goog.i18n.DateTimePatterns_ar_MA', 'goog.i18n.DateTimePatterns_ar_OM', 'goog.i18n.DateTimePatterns_ar_QA', 'goog.i18n.DateTimePatterns_ar_SA', 'goog.i18n.DateTimePatterns_ar_SD', 'goog.i18n.DateTimePatterns_ar_SY', 'goog.i18n.DateTimePatterns_ar_TN', 'goog.i18n.DateTimePatterns_ar_YE', 'goog.i18n.DateTimePatterns_as', 'goog.i18n.DateTimePatterns_as_IN', 'goog.i18n.DateTimePatterns_asa', 'goog.i18n.DateTimePatterns_asa_TZ', 'goog.i18n.DateTimePatterns_az', 'goog.i18n.DateTimePatterns_az_Cyrl', 'goog.i18n.DateTimePatterns_az_Cyrl_AZ', 'goog.i18n.DateTimePatterns_az_Latn', 'goog.i18n.DateTimePatterns_az_Latn_AZ', 'goog.i18n.DateTimePatterns_be', 'goog.i18n.DateTimePatterns_be_BY', 'goog.i18n.DateTimePatterns_bem', 'goog.i18n.DateTimePatterns_bem_ZM', 'goog.i18n.DateTimePatterns_bez', 'goog.i18n.DateTimePatterns_bez_TZ', 'goog.i18n.DateTimePatterns_bg_BG', 'goog.i18n.DateTimePatterns_bm', 'goog.i18n.DateTimePatterns_bm_ML', 'goog.i18n.DateTimePatterns_bn_BD', 'goog.i18n.DateTimePatterns_bn_IN', 'goog.i18n.DateTimePatterns_bo', 'goog.i18n.DateTimePatterns_bo_CN', 'goog.i18n.DateTimePatterns_bo_IN', 'goog.i18n.DateTimePatterns_bs', 'goog.i18n.DateTimePatterns_bs_BA', 'goog.i18n.DateTimePatterns_ca_ES', 'goog.i18n.DateTimePatterns_cgg', 'goog.i18n.DateTimePatterns_cgg_UG', 'goog.i18n.DateTimePatterns_chr', 'goog.i18n.DateTimePatterns_chr_US', 'goog.i18n.DateTimePatterns_cs_CZ', 'goog.i18n.DateTimePatterns_cy', 'goog.i18n.DateTimePatterns_cy_GB', 'goog.i18n.DateTimePatterns_da_DK', 'goog.i18n.DateTimePatterns_dav', 'goog.i18n.DateTimePatterns_dav_KE', 'goog.i18n.DateTimePatterns_de_BE', 'goog.i18n.DateTimePatterns_de_DE', 'goog.i18n.DateTimePatterns_de_LI', 'goog.i18n.DateTimePatterns_de_LU', 'goog.i18n.DateTimePatterns_ebu', 'goog.i18n.DateTimePatterns_ebu_KE', 'goog.i18n.DateTimePatterns_ee', 'goog.i18n.DateTimePatterns_ee_GH', 'goog.i18n.DateTimePatterns_ee_TG', 'goog.i18n.DateTimePatterns_el_CY', 'goog.i18n.DateTimePatterns_el_GR', 'goog.i18n.DateTimePatterns_en_AS', 'goog.i18n.DateTimePatterns_en_BE', 'goog.i18n.DateTimePatterns_en_BW', 'goog.i18n.DateTimePatterns_en_BZ', 'goog.i18n.DateTimePatterns_en_CA', 'goog.i18n.DateTimePatterns_en_GU', 'goog.i18n.DateTimePatterns_en_HK', 'goog.i18n.DateTimePatterns_en_JM', 'goog.i18n.DateTimePatterns_en_MH', 'goog.i18n.DateTimePatterns_en_MP', 'goog.i18n.DateTimePatterns_en_MT', 'goog.i18n.DateTimePatterns_en_MU', 'goog.i18n.DateTimePatterns_en_NA', 'goog.i18n.DateTimePatterns_en_NZ', 'goog.i18n.DateTimePatterns_en_PH', 'goog.i18n.DateTimePatterns_en_PK', 'goog.i18n.DateTimePatterns_en_TT', 'goog.i18n.DateTimePatterns_en_UM', 'goog.i18n.DateTimePatterns_en_US_POSIX', 'goog.i18n.DateTimePatterns_en_VI', 'goog.i18n.DateTimePatterns_en_ZW', 'goog.i18n.DateTimePatterns_eo', 'goog.i18n.DateTimePatterns_es_419', 'goog.i18n.DateTimePatterns_es_AR', 'goog.i18n.DateTimePatterns_es_BO', 'goog.i18n.DateTimePatterns_es_CL', 'goog.i18n.DateTimePatterns_es_CO', 'goog.i18n.DateTimePatterns_es_CR', 'goog.i18n.DateTimePatterns_es_DO', 'goog.i18n.DateTimePatterns_es_EC', 'goog.i18n.DateTimePatterns_es_ES', 'goog.i18n.DateTimePatterns_es_GQ', 'goog.i18n.DateTimePatterns_es_GT', 'goog.i18n.DateTimePatterns_es_HN', 'goog.i18n.DateTimePatterns_es_MX', 'goog.i18n.DateTimePatterns_es_NI', 'goog.i18n.DateTimePatterns_es_PA', 'goog.i18n.DateTimePatterns_es_PE', 'goog.i18n.DateTimePatterns_es_PR', 'goog.i18n.DateTimePatterns_es_PY', 'goog.i18n.DateTimePatterns_es_SV', 'goog.i18n.DateTimePatterns_es_US', 'goog.i18n.DateTimePatterns_es_UY', 'goog.i18n.DateTimePatterns_es_VE', 'goog.i18n.DateTimePatterns_et_EE', 'goog.i18n.DateTimePatterns_eu_ES', 'goog.i18n.DateTimePatterns_fa_AF', 'goog.i18n.DateTimePatterns_fa_IR', 'goog.i18n.DateTimePatterns_ff', 'goog.i18n.DateTimePatterns_ff_SN', 'goog.i18n.DateTimePatterns_fi_FI', 'goog.i18n.DateTimePatterns_fil_PH', 'goog.i18n.DateTimePatterns_fo', 'goog.i18n.DateTimePatterns_fo_FO', 'goog.i18n.DateTimePatterns_fr_BE', 'goog.i18n.DateTimePatterns_fr_BF', 'goog.i18n.DateTimePatterns_fr_BI', 'goog.i18n.DateTimePatterns_fr_BJ', 'goog.i18n.DateTimePatterns_fr_BL', 'goog.i18n.DateTimePatterns_fr_CD', 'goog.i18n.DateTimePatterns_fr_CF', 'goog.i18n.DateTimePatterns_fr_CG', 'goog.i18n.DateTimePatterns_fr_CH', 'goog.i18n.DateTimePatterns_fr_CI', 'goog.i18n.DateTimePatterns_fr_CM', 'goog.i18n.DateTimePatterns_fr_DJ', 'goog.i18n.DateTimePatterns_fr_FR', 'goog.i18n.DateTimePatterns_fr_GA', 'goog.i18n.DateTimePatterns_fr_GN', 'goog.i18n.DateTimePatterns_fr_GP', 'goog.i18n.DateTimePatterns_fr_GQ', 'goog.i18n.DateTimePatterns_fr_KM', 'goog.i18n.DateTimePatterns_fr_LU', 'goog.i18n.DateTimePatterns_fr_MC', 'goog.i18n.DateTimePatterns_fr_MF', 'goog.i18n.DateTimePatterns_fr_MG', 'goog.i18n.DateTimePatterns_fr_ML', 'goog.i18n.DateTimePatterns_fr_MQ', 'goog.i18n.DateTimePatterns_fr_NE', 'goog.i18n.DateTimePatterns_fr_RE', 'goog.i18n.DateTimePatterns_fr_RW', 'goog.i18n.DateTimePatterns_fr_SN', 'goog.i18n.DateTimePatterns_fr_TD', 'goog.i18n.DateTimePatterns_fr_TG', 'goog.i18n.DateTimePatterns_ga', 'goog.i18n.DateTimePatterns_ga_IE', 'goog.i18n.DateTimePatterns_gl_ES', 'goog.i18n.DateTimePatterns_gsw_CH', 'goog.i18n.DateTimePatterns_gu_IN', 'goog.i18n.DateTimePatterns_guz', 'goog.i18n.DateTimePatterns_guz_KE', 'goog.i18n.DateTimePatterns_gv', 'goog.i18n.DateTimePatterns_gv_GB', 'goog.i18n.DateTimePatterns_ha', 'goog.i18n.DateTimePatterns_ha_Latn', 'goog.i18n.DateTimePatterns_ha_Latn_GH', 'goog.i18n.DateTimePatterns_ha_Latn_NE', 'goog.i18n.DateTimePatterns_ha_Latn_NG', 'goog.i18n.DateTimePatterns_haw', 'goog.i18n.DateTimePatterns_haw_US', 'goog.i18n.DateTimePatterns_he_IL', 'goog.i18n.DateTimePatterns_hi_IN', 'goog.i18n.DateTimePatterns_hr_HR', 'goog.i18n.DateTimePatterns_hu_HU', 'goog.i18n.DateTimePatterns_hy', 'goog.i18n.DateTimePatterns_hy_AM', 'goog.i18n.DateTimePatterns_id_ID', 'goog.i18n.DateTimePatterns_ig', 'goog.i18n.DateTimePatterns_ig_NG', 'goog.i18n.DateTimePatterns_ii', 'goog.i18n.DateTimePatterns_ii_CN', 'goog.i18n.DateTimePatterns_is_IS', 'goog.i18n.DateTimePatterns_it_CH', 'goog.i18n.DateTimePatterns_it_IT', 'goog.i18n.DateTimePatterns_ja_JP', 'goog.i18n.DateTimePatterns_jmc', 'goog.i18n.DateTimePatterns_jmc_TZ', 'goog.i18n.DateTimePatterns_ka', 'goog.i18n.DateTimePatterns_ka_GE', 'goog.i18n.DateTimePatterns_kab', 'goog.i18n.DateTimePatterns_kab_DZ', 'goog.i18n.DateTimePatterns_kam', 'goog.i18n.DateTimePatterns_kam_KE', 'goog.i18n.DateTimePatterns_kde', 'goog.i18n.DateTimePatterns_kde_TZ', 'goog.i18n.DateTimePatterns_kea', 'goog.i18n.DateTimePatterns_kea_CV', 'goog.i18n.DateTimePatterns_khq', 'goog.i18n.DateTimePatterns_khq_ML', 'goog.i18n.DateTimePatterns_ki', 'goog.i18n.DateTimePatterns_ki_KE', 'goog.i18n.DateTimePatterns_kk', 'goog.i18n.DateTimePatterns_kk_Cyrl', 'goog.i18n.DateTimePatterns_kk_Cyrl_KZ', 'goog.i18n.DateTimePatterns_kl', 'goog.i18n.DateTimePatterns_kl_GL', 'goog.i18n.DateTimePatterns_kln', 'goog.i18n.DateTimePatterns_kln_KE', 'goog.i18n.DateTimePatterns_km', 'goog.i18n.DateTimePatterns_km_KH', 'goog.i18n.DateTimePatterns_kn_IN', 'goog.i18n.DateTimePatterns_ko_KR', 'goog.i18n.DateTimePatterns_kok', 'goog.i18n.DateTimePatterns_kok_IN', 'goog.i18n.DateTimePatterns_kw', 'goog.i18n.DateTimePatterns_kw_GB', 'goog.i18n.DateTimePatterns_lag', 'goog.i18n.DateTimePatterns_lag_TZ', 'goog.i18n.DateTimePatterns_lg', 'goog.i18n.DateTimePatterns_lg_UG', 'goog.i18n.DateTimePatterns_lt_LT', 'goog.i18n.DateTimePatterns_luo', 'goog.i18n.DateTimePatterns_luo_KE', 'goog.i18n.DateTimePatterns_luy', 'goog.i18n.DateTimePatterns_luy_KE', 'goog.i18n.DateTimePatterns_lv_LV', 'goog.i18n.DateTimePatterns_mas', 'goog.i18n.DateTimePatterns_mas_KE', 'goog.i18n.DateTimePatterns_mas_TZ', 'goog.i18n.DateTimePatterns_mer', 'goog.i18n.DateTimePatterns_mer_KE', 'goog.i18n.DateTimePatterns_mfe', 'goog.i18n.DateTimePatterns_mfe_MU', 'goog.i18n.DateTimePatterns_mg', 'goog.i18n.DateTimePatterns_mg_MG', 'goog.i18n.DateTimePatterns_mk', 'goog.i18n.DateTimePatterns_mk_MK', 'goog.i18n.DateTimePatterns_ml_IN', 'goog.i18n.DateTimePatterns_mr_IN', 'goog.i18n.DateTimePatterns_ms_BN', 'goog.i18n.DateTimePatterns_ms_MY', 'goog.i18n.DateTimePatterns_mt_MT', 'goog.i18n.DateTimePatterns_my', 'goog.i18n.DateTimePatterns_my_MM', 'goog.i18n.DateTimePatterns_naq', 'goog.i18n.DateTimePatterns_naq_NA', 'goog.i18n.DateTimePatterns_nb', 'goog.i18n.DateTimePatterns_nb_NO', 'goog.i18n.DateTimePatterns_nd', 'goog.i18n.DateTimePatterns_nd_ZW', 'goog.i18n.DateTimePatterns_ne', 'goog.i18n.DateTimePatterns_ne_IN', 'goog.i18n.DateTimePatterns_ne_NP', 'goog.i18n.DateTimePatterns_nl_BE', 'goog.i18n.DateTimePatterns_nl_NL', 'goog.i18n.DateTimePatterns_nn', 'goog.i18n.DateTimePatterns_nn_NO', 'goog.i18n.DateTimePatterns_nyn', 'goog.i18n.DateTimePatterns_nyn_UG', 'goog.i18n.DateTimePatterns_om', 'goog.i18n.DateTimePatterns_om_ET', 'goog.i18n.DateTimePatterns_om_KE', 'goog.i18n.DateTimePatterns_or_IN', 'goog.i18n.DateTimePatterns_pa', 'goog.i18n.DateTimePatterns_pa_Arab', 'goog.i18n.DateTimePatterns_pa_Arab_PK', 'goog.i18n.DateTimePatterns_pa_Guru', 'goog.i18n.DateTimePatterns_pa_Guru_IN', 'goog.i18n.DateTimePatterns_pl_PL', 'goog.i18n.DateTimePatterns_ps', 'goog.i18n.DateTimePatterns_ps_AF', 'goog.i18n.DateTimePatterns_pt_GW', 'goog.i18n.DateTimePatterns_pt_MZ', 'goog.i18n.DateTimePatterns_rm', 'goog.i18n.DateTimePatterns_rm_CH', 'goog.i18n.DateTimePatterns_ro_MD', 'goog.i18n.DateTimePatterns_ro_RO', 'goog.i18n.DateTimePatterns_rof', 'goog.i18n.DateTimePatterns_rof_TZ', 'goog.i18n.DateTimePatterns_ru_MD', 'goog.i18n.DateTimePatterns_ru_RU', 'goog.i18n.DateTimePatterns_ru_UA', 'goog.i18n.DateTimePatterns_rw', 'goog.i18n.DateTimePatterns_rw_RW', 'goog.i18n.DateTimePatterns_rwk', 'goog.i18n.DateTimePatterns_rwk_TZ', 'goog.i18n.DateTimePatterns_saq', 'goog.i18n.DateTimePatterns_saq_KE', 'goog.i18n.DateTimePatterns_seh', 'goog.i18n.DateTimePatterns_seh_MZ', 'goog.i18n.DateTimePatterns_ses', 'goog.i18n.DateTimePatterns_ses_ML', 'goog.i18n.DateTimePatterns_sg', 'goog.i18n.DateTimePatterns_sg_CF', 'goog.i18n.DateTimePatterns_shi', 'goog.i18n.DateTimePatterns_shi_Latn', 'goog.i18n.DateTimePatterns_shi_Latn_MA', 'goog.i18n.DateTimePatterns_shi_Tfng', 'goog.i18n.DateTimePatterns_shi_Tfng_MA', 'goog.i18n.DateTimePatterns_si', 'goog.i18n.DateTimePatterns_si_LK', 'goog.i18n.DateTimePatterns_sk_SK', 'goog.i18n.DateTimePatterns_sl_SI', 'goog.i18n.DateTimePatterns_sn', 'goog.i18n.DateTimePatterns_sn_ZW', 'goog.i18n.DateTimePatterns_so', 'goog.i18n.DateTimePatterns_so_DJ', 'goog.i18n.DateTimePatterns_so_ET', 'goog.i18n.DateTimePatterns_so_KE', 'goog.i18n.DateTimePatterns_so_SO', 'goog.i18n.DateTimePatterns_sq_AL', 'goog.i18n.DateTimePatterns_sr_Cyrl', 'goog.i18n.DateTimePatterns_sr_Cyrl_BA', 'goog.i18n.DateTimePatterns_sr_Cyrl_ME', 'goog.i18n.DateTimePatterns_sr_Cyrl_RS', 'goog.i18n.DateTimePatterns_sr_Latn', 'goog.i18n.DateTimePatterns_sr_Latn_BA', 'goog.i18n.DateTimePatterns_sr_Latn_ME', 'goog.i18n.DateTimePatterns_sr_Latn_RS', 'goog.i18n.DateTimePatterns_sv_FI', 'goog.i18n.DateTimePatterns_sv_SE', 'goog.i18n.DateTimePatterns_sw_KE', 'goog.i18n.DateTimePatterns_sw_TZ', 'goog.i18n.DateTimePatterns_ta_IN', 'goog.i18n.DateTimePatterns_ta_LK', 'goog.i18n.DateTimePatterns_te_IN', 'goog.i18n.DateTimePatterns_teo', 'goog.i18n.DateTimePatterns_teo_KE', 'goog.i18n.DateTimePatterns_teo_UG', 'goog.i18n.DateTimePatterns_th_TH', 'goog.i18n.DateTimePatterns_ti', 'goog.i18n.DateTimePatterns_ti_ER', 'goog.i18n.DateTimePatterns_ti_ET', 'goog.i18n.DateTimePatterns_to', 'goog.i18n.DateTimePatterns_to_TO', 'goog.i18n.DateTimePatterns_tr_TR', 'goog.i18n.DateTimePatterns_tzm', 'goog.i18n.DateTimePatterns_tzm_Latn', 'goog.i18n.DateTimePatterns_tzm_Latn_MA', 'goog.i18n.DateTimePatterns_uk_UA', 'goog.i18n.DateTimePatterns_ur_IN', 'goog.i18n.DateTimePatterns_ur_PK', 'goog.i18n.DateTimePatterns_uz', 'goog.i18n.DateTimePatterns_uz_Arab', 'goog.i18n.DateTimePatterns_uz_Arab_AF', 'goog.i18n.DateTimePatterns_uz_Cyrl', 'goog.i18n.DateTimePatterns_uz_Cyrl_UZ', 'goog.i18n.DateTimePatterns_uz_Latn', 'goog.i18n.DateTimePatterns_uz_Latn_UZ', 'goog.i18n.DateTimePatterns_vi_VN', 'goog.i18n.DateTimePatterns_vun', 'goog.i18n.DateTimePatterns_vun_TZ', 'goog.i18n.DateTimePatterns_xog', 'goog.i18n.DateTimePatterns_xog_UG', 'goog.i18n.DateTimePatterns_yo', 'goog.i18n.DateTimePatterns_yo_NG', 'goog.i18n.DateTimePatterns_zh_Hans', 'goog.i18n.DateTimePatterns_zh_Hans_CN', 'goog.i18n.DateTimePatterns_zh_Hans_HK', 'goog.i18n.DateTimePatterns_zh_Hans_MO', 'goog.i18n.DateTimePatterns_zh_Hans_SG', 'goog.i18n.DateTimePatterns_zh_Hant', 'goog.i18n.DateTimePatterns_zh_Hant_HK', 'goog.i18n.DateTimePatterns_zh_Hant_MO', 'goog.i18n.DateTimePatterns_zh_Hant_TW', 'goog.i18n.DateTimePatterns_zu', 'goog.i18n.DateTimePatterns_zu_ZA'], ['goog.i18n.DateTimePatterns']); goog.addDependency('i18n/datetimesymbols.js', ['goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_am', 'goog.i18n.DateTimeSymbols_ar', 'goog.i18n.DateTimeSymbols_bg', 'goog.i18n.DateTimeSymbols_bn', 'goog.i18n.DateTimeSymbols_ca', 'goog.i18n.DateTimeSymbols_cs', 'goog.i18n.DateTimeSymbols_da', 'goog.i18n.DateTimeSymbols_de', 'goog.i18n.DateTimeSymbols_de_AT', 'goog.i18n.DateTimeSymbols_de_CH', 'goog.i18n.DateTimeSymbols_el', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_en_AU', 'goog.i18n.DateTimeSymbols_en_GB', 'goog.i18n.DateTimeSymbols_en_IE', 'goog.i18n.DateTimeSymbols_en_IN', 'goog.i18n.DateTimeSymbols_en_ISO', 'goog.i18n.DateTimeSymbols_en_SG', 'goog.i18n.DateTimeSymbols_en_US', 'goog.i18n.DateTimeSymbols_en_ZA', 'goog.i18n.DateTimeSymbols_es', 'goog.i18n.DateTimeSymbols_et', 'goog.i18n.DateTimeSymbols_eu', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.DateTimeSymbols_fi', 'goog.i18n.DateTimeSymbols_fil', 'goog.i18n.DateTimeSymbols_fr', 'goog.i18n.DateTimeSymbols_fr_CA', 'goog.i18n.DateTimeSymbols_gl', 'goog.i18n.DateTimeSymbols_gsw', 'goog.i18n.DateTimeSymbols_gu', 'goog.i18n.DateTimeSymbols_he', 'goog.i18n.DateTimeSymbols_hi', 'goog.i18n.DateTimeSymbols_hr', 'goog.i18n.DateTimeSymbols_hu', 'goog.i18n.DateTimeSymbols_id', 'goog.i18n.DateTimeSymbols_in', 'goog.i18n.DateTimeSymbols_is', 'goog.i18n.DateTimeSymbols_it', 'goog.i18n.DateTimeSymbols_iw', 'goog.i18n.DateTimeSymbols_ja', 'goog.i18n.DateTimeSymbols_kn', 'goog.i18n.DateTimeSymbols_ko', 'goog.i18n.DateTimeSymbols_ln', 'goog.i18n.DateTimeSymbols_lt', 'goog.i18n.DateTimeSymbols_lv', 'goog.i18n.DateTimeSymbols_ml', 'goog.i18n.DateTimeSymbols_mo', 'goog.i18n.DateTimeSymbols_mr', 'goog.i18n.DateTimeSymbols_ms', 'goog.i18n.DateTimeSymbols_mt', 'goog.i18n.DateTimeSymbols_nl', 'goog.i18n.DateTimeSymbols_no', 'goog.i18n.DateTimeSymbols_or', 'goog.i18n.DateTimeSymbols_pl', 'goog.i18n.DateTimeSymbols_pt', 'goog.i18n.DateTimeSymbols_pt_BR', 'goog.i18n.DateTimeSymbols_pt_PT', 'goog.i18n.DateTimeSymbols_ro', 'goog.i18n.DateTimeSymbols_ru', 'goog.i18n.DateTimeSymbols_sk', 'goog.i18n.DateTimeSymbols_sl', 'goog.i18n.DateTimeSymbols_sq', 'goog.i18n.DateTimeSymbols_sr', 'goog.i18n.DateTimeSymbols_sv', 'goog.i18n.DateTimeSymbols_sw', 'goog.i18n.DateTimeSymbols_ta', 'goog.i18n.DateTimeSymbols_te', 'goog.i18n.DateTimeSymbols_th', 'goog.i18n.DateTimeSymbols_tl', 'goog.i18n.DateTimeSymbols_tr', 'goog.i18n.DateTimeSymbols_uk', 'goog.i18n.DateTimeSymbols_ur', 'goog.i18n.DateTimeSymbols_vi', 'goog.i18n.DateTimeSymbols_zh', 'goog.i18n.DateTimeSymbols_zh_CN', 'goog.i18n.DateTimeSymbols_zh_HK', 'goog.i18n.DateTimeSymbols_zh_TW'], []); -goog.addDependency('i18n/datetimesymbolsext.js', ['goog.i18n.DateTimeSymbolsExt', 'goog.i18n.DateTimeSymbols_aa', 'goog.i18n.DateTimeSymbols_aa_DJ', 'goog.i18n.DateTimeSymbols_aa_ER', 'goog.i18n.DateTimeSymbols_aa_ER_SAAHO', 'goog.i18n.DateTimeSymbols_aa_ET', 'goog.i18n.DateTimeSymbols_af', 'goog.i18n.DateTimeSymbols_af_NA', 'goog.i18n.DateTimeSymbols_af_ZA', 'goog.i18n.DateTimeSymbols_ak', 'goog.i18n.DateTimeSymbols_ak_GH', 'goog.i18n.DateTimeSymbols_am_ET', 'goog.i18n.DateTimeSymbols_ar_AE', 'goog.i18n.DateTimeSymbols_ar_BH', 'goog.i18n.DateTimeSymbols_ar_DZ', 'goog.i18n.DateTimeSymbols_ar_EG', 'goog.i18n.DateTimeSymbols_ar_IQ', 'goog.i18n.DateTimeSymbols_ar_JO', 'goog.i18n.DateTimeSymbols_ar_KW', 'goog.i18n.DateTimeSymbols_ar_LB', 'goog.i18n.DateTimeSymbols_ar_LY', 'goog.i18n.DateTimeSymbols_ar_MA', 'goog.i18n.DateTimeSymbols_ar_OM', 'goog.i18n.DateTimeSymbols_ar_QA', 'goog.i18n.DateTimeSymbols_ar_SA', 'goog.i18n.DateTimeSymbols_ar_SD', 'goog.i18n.DateTimeSymbols_ar_SY', 'goog.i18n.DateTimeSymbols_ar_TN', 'goog.i18n.DateTimeSymbols_ar_YE', 'goog.i18n.DateTimeSymbols_as', 'goog.i18n.DateTimeSymbols_as_IN', 'goog.i18n.DateTimeSymbols_az', 'goog.i18n.DateTimeSymbols_az_AZ', 'goog.i18n.DateTimeSymbols_az_Cyrl', 'goog.i18n.DateTimeSymbols_az_Cyrl_AZ', 'goog.i18n.DateTimeSymbols_az_Latn', 'goog.i18n.DateTimeSymbols_az_Latn_AZ', 'goog.i18n.DateTimeSymbols_be', 'goog.i18n.DateTimeSymbols_be_BY', 'goog.i18n.DateTimeSymbols_bg_BG', 'goog.i18n.DateTimeSymbols_bn_BD', 'goog.i18n.DateTimeSymbols_bn_IN', 'goog.i18n.DateTimeSymbols_bo', 'goog.i18n.DateTimeSymbols_bo_CN', 'goog.i18n.DateTimeSymbols_bo_IN', 'goog.i18n.DateTimeSymbols_bs', 'goog.i18n.DateTimeSymbols_bs_BA', 'goog.i18n.DateTimeSymbols_byn', 'goog.i18n.DateTimeSymbols_byn_ER', 'goog.i18n.DateTimeSymbols_ca_ES', 'goog.i18n.DateTimeSymbols_cch', 'goog.i18n.DateTimeSymbols_cch_NG', 'goog.i18n.DateTimeSymbols_cop', 'goog.i18n.DateTimeSymbols_cs_CZ', 'goog.i18n.DateTimeSymbols_cy', 'goog.i18n.DateTimeSymbols_cy_GB', 'goog.i18n.DateTimeSymbols_da_DK', 'goog.i18n.DateTimeSymbols_de_BE', 'goog.i18n.DateTimeSymbols_de_DE', 'goog.i18n.DateTimeSymbols_de_LI', 'goog.i18n.DateTimeSymbols_de_LU', 'goog.i18n.DateTimeSymbols_dv', 'goog.i18n.DateTimeSymbols_dv_MV', 'goog.i18n.DateTimeSymbols_dz', 'goog.i18n.DateTimeSymbols_dz_BT', 'goog.i18n.DateTimeSymbols_ee', 'goog.i18n.DateTimeSymbols_ee_GH', 'goog.i18n.DateTimeSymbols_ee_TG', 'goog.i18n.DateTimeSymbols_el_CY', 'goog.i18n.DateTimeSymbols_el_GR', 'goog.i18n.DateTimeSymbols_el_POLYTON', 'goog.i18n.DateTimeSymbols_en_AS', 'goog.i18n.DateTimeSymbols_en_BE', 'goog.i18n.DateTimeSymbols_en_BW', 'goog.i18n.DateTimeSymbols_en_BZ', 'goog.i18n.DateTimeSymbols_en_CA', 'goog.i18n.DateTimeSymbols_en_Dsrt', 'goog.i18n.DateTimeSymbols_en_Dsrt_US', 'goog.i18n.DateTimeSymbols_en_GU', 'goog.i18n.DateTimeSymbols_en_HK', 'goog.i18n.DateTimeSymbols_en_JM', 'goog.i18n.DateTimeSymbols_en_MH', 'goog.i18n.DateTimeSymbols_en_MP', 'goog.i18n.DateTimeSymbols_en_MT', 'goog.i18n.DateTimeSymbols_en_NA', 'goog.i18n.DateTimeSymbols_en_NZ', 'goog.i18n.DateTimeSymbols_en_PH', 'goog.i18n.DateTimeSymbols_en_PK', 'goog.i18n.DateTimeSymbols_en_Shaw', 'goog.i18n.DateTimeSymbols_en_TT', 'goog.i18n.DateTimeSymbols_en_UM', 'goog.i18n.DateTimeSymbols_en_VI', 'goog.i18n.DateTimeSymbols_en_ZW', 'goog.i18n.DateTimeSymbols_eo', 'goog.i18n.DateTimeSymbols_es_AR', 'goog.i18n.DateTimeSymbols_es_BO', 'goog.i18n.DateTimeSymbols_es_CL', 'goog.i18n.DateTimeSymbols_es_CO', 'goog.i18n.DateTimeSymbols_es_CR', 'goog.i18n.DateTimeSymbols_es_DO', 'goog.i18n.DateTimeSymbols_es_EC', 'goog.i18n.DateTimeSymbols_es_ES', 'goog.i18n.DateTimeSymbols_es_GT', 'goog.i18n.DateTimeSymbols_es_HN', 'goog.i18n.DateTimeSymbols_es_MX', 'goog.i18n.DateTimeSymbols_es_NI', 'goog.i18n.DateTimeSymbols_es_PA', 'goog.i18n.DateTimeSymbols_es_PE', 'goog.i18n.DateTimeSymbols_es_PR', 'goog.i18n.DateTimeSymbols_es_PY', 'goog.i18n.DateTimeSymbols_es_SV', 'goog.i18n.DateTimeSymbols_es_US', 'goog.i18n.DateTimeSymbols_es_UY', 'goog.i18n.DateTimeSymbols_es_VE', 'goog.i18n.DateTimeSymbols_et_EE', 'goog.i18n.DateTimeSymbols_eu_ES', 'goog.i18n.DateTimeSymbols_fa_AF', 'goog.i18n.DateTimeSymbols_fa_IR', 'goog.i18n.DateTimeSymbols_fi_FI', 'goog.i18n.DateTimeSymbols_fil_PH', 'goog.i18n.DateTimeSymbols_fo', 'goog.i18n.DateTimeSymbols_fo_FO', 'goog.i18n.DateTimeSymbols_fr_BE', 'goog.i18n.DateTimeSymbols_fr_CH', 'goog.i18n.DateTimeSymbols_fr_FR', 'goog.i18n.DateTimeSymbols_fr_LU', 'goog.i18n.DateTimeSymbols_fr_MC', 'goog.i18n.DateTimeSymbols_fr_SN', 'goog.i18n.DateTimeSymbols_fur', 'goog.i18n.DateTimeSymbols_fur_IT', 'goog.i18n.DateTimeSymbols_ga', 'goog.i18n.DateTimeSymbols_ga_IE', 'goog.i18n.DateTimeSymbols_gaa', 'goog.i18n.DateTimeSymbols_gaa_GH', 'goog.i18n.DateTimeSymbols_gez', 'goog.i18n.DateTimeSymbols_gez_ER', 'goog.i18n.DateTimeSymbols_gez_ET', 'goog.i18n.DateTimeSymbols_gl_ES', 'goog.i18n.DateTimeSymbols_gsw_CH', 'goog.i18n.DateTimeSymbols_gu_IN', 'goog.i18n.DateTimeSymbols_gv', 'goog.i18n.DateTimeSymbols_gv_GB', 'goog.i18n.DateTimeSymbols_ha', 'goog.i18n.DateTimeSymbols_ha_Arab', 'goog.i18n.DateTimeSymbols_ha_Arab_NG', 'goog.i18n.DateTimeSymbols_ha_Arab_SD', 'goog.i18n.DateTimeSymbols_ha_GH', 'goog.i18n.DateTimeSymbols_ha_Latn', 'goog.i18n.DateTimeSymbols_ha_Latn_GH', 'goog.i18n.DateTimeSymbols_ha_Latn_NE', 'goog.i18n.DateTimeSymbols_ha_Latn_NG', 'goog.i18n.DateTimeSymbols_ha_NE', 'goog.i18n.DateTimeSymbols_ha_NG', 'goog.i18n.DateTimeSymbols_ha_SD', 'goog.i18n.DateTimeSymbols_haw', 'goog.i18n.DateTimeSymbols_haw_US', 'goog.i18n.DateTimeSymbols_he_IL', 'goog.i18n.DateTimeSymbols_hi_IN', 'goog.i18n.DateTimeSymbols_hr_HR', 'goog.i18n.DateTimeSymbols_hu_HU', 'goog.i18n.DateTimeSymbols_hy', 'goog.i18n.DateTimeSymbols_hy_AM', 'goog.i18n.DateTimeSymbols_ia', 'goog.i18n.DateTimeSymbols_id_ID', 'goog.i18n.DateTimeSymbols_ig', 'goog.i18n.DateTimeSymbols_ig_NG', 'goog.i18n.DateTimeSymbols_ii', 'goog.i18n.DateTimeSymbols_ii_CN', 'goog.i18n.DateTimeSymbols_is_IS', 'goog.i18n.DateTimeSymbols_it_CH', 'goog.i18n.DateTimeSymbols_it_IT', 'goog.i18n.DateTimeSymbols_iu', 'goog.i18n.DateTimeSymbols_ja_JP', 'goog.i18n.DateTimeSymbols_ka', 'goog.i18n.DateTimeSymbols_ka_GE', 'goog.i18n.DateTimeSymbols_kaj', 'goog.i18n.DateTimeSymbols_kaj_NG', 'goog.i18n.DateTimeSymbols_kam', 'goog.i18n.DateTimeSymbols_kam_KE', 'goog.i18n.DateTimeSymbols_kcg', 'goog.i18n.DateTimeSymbols_kcg_NG', 'goog.i18n.DateTimeSymbols_kfo', 'goog.i18n.DateTimeSymbols_kfo_CI', 'goog.i18n.DateTimeSymbols_kk', 'goog.i18n.DateTimeSymbols_kk_Cyrl', 'goog.i18n.DateTimeSymbols_kk_Cyrl_KZ', 'goog.i18n.DateTimeSymbols_kk_KZ', 'goog.i18n.DateTimeSymbols_kl', 'goog.i18n.DateTimeSymbols_kl_GL', 'goog.i18n.DateTimeSymbols_km', 'goog.i18n.DateTimeSymbols_km_KH', 'goog.i18n.DateTimeSymbols_kn_IN', 'goog.i18n.DateTimeSymbols_ko_KR', 'goog.i18n.DateTimeSymbols_kok', 'goog.i18n.DateTimeSymbols_kok_IN', 'goog.i18n.DateTimeSymbols_kpe', 'goog.i18n.DateTimeSymbols_kpe_GN', 'goog.i18n.DateTimeSymbols_kpe_LR', 'goog.i18n.DateTimeSymbols_ku', 'goog.i18n.DateTimeSymbols_ku_Arab', 'goog.i18n.DateTimeSymbols_ku_Arab_IQ', 'goog.i18n.DateTimeSymbols_ku_Arab_IR', 'goog.i18n.DateTimeSymbols_ku_Arab_SY', 'goog.i18n.DateTimeSymbols_ku_IQ', 'goog.i18n.DateTimeSymbols_ku_IR', 'goog.i18n.DateTimeSymbols_ku_Latn', 'goog.i18n.DateTimeSymbols_ku_Latn_TR', 'goog.i18n.DateTimeSymbols_ku_SY', 'goog.i18n.DateTimeSymbols_ku_TR', 'goog.i18n.DateTimeSymbols_kw', 'goog.i18n.DateTimeSymbols_kw_GB', 'goog.i18n.DateTimeSymbols_ky', 'goog.i18n.DateTimeSymbols_ky_KG', 'goog.i18n.DateTimeSymbols_ln_CD', 'goog.i18n.DateTimeSymbols_ln_CG', 'goog.i18n.DateTimeSymbols_lo', 'goog.i18n.DateTimeSymbols_lo_LA', 'goog.i18n.DateTimeSymbols_lt_LT', 'goog.i18n.DateTimeSymbols_lv_LV', 'goog.i18n.DateTimeSymbols_mk', 'goog.i18n.DateTimeSymbols_mk_MK', 'goog.i18n.DateTimeSymbols_ml_IN', 'goog.i18n.DateTimeSymbols_mn', 'goog.i18n.DateTimeSymbols_mn_CN', 'goog.i18n.DateTimeSymbols_mn_Cyrl', 'goog.i18n.DateTimeSymbols_mn_Cyrl_MN', 'goog.i18n.DateTimeSymbols_mn_MN', 'goog.i18n.DateTimeSymbols_mn_Mong', 'goog.i18n.DateTimeSymbols_mn_Mong_CN', 'goog.i18n.DateTimeSymbols_mr_IN', 'goog.i18n.DateTimeSymbols_ms_BN', 'goog.i18n.DateTimeSymbols_ms_MY', 'goog.i18n.DateTimeSymbols_mt_MT', 'goog.i18n.DateTimeSymbols_my', 'goog.i18n.DateTimeSymbols_my_MM', 'goog.i18n.DateTimeSymbols_nb', 'goog.i18n.DateTimeSymbols_nb_NO', 'goog.i18n.DateTimeSymbols_nds', 'goog.i18n.DateTimeSymbols_nds_DE', 'goog.i18n.DateTimeSymbols_ne', 'goog.i18n.DateTimeSymbols_ne_IN', 'goog.i18n.DateTimeSymbols_ne_NP', 'goog.i18n.DateTimeSymbols_nl_BE', 'goog.i18n.DateTimeSymbols_nl_NL', 'goog.i18n.DateTimeSymbols_nn', 'goog.i18n.DateTimeSymbols_nn_NO', 'goog.i18n.DateTimeSymbols_nr', 'goog.i18n.DateTimeSymbols_nr_ZA', 'goog.i18n.DateTimeSymbols_nso', 'goog.i18n.DateTimeSymbols_nso_ZA', 'goog.i18n.DateTimeSymbols_ny', 'goog.i18n.DateTimeSymbols_ny_MW', 'goog.i18n.DateTimeSymbols_oc', 'goog.i18n.DateTimeSymbols_oc_FR', 'goog.i18n.DateTimeSymbols_om', 'goog.i18n.DateTimeSymbols_om_ET', 'goog.i18n.DateTimeSymbols_om_KE', 'goog.i18n.DateTimeSymbols_or_IN', 'goog.i18n.DateTimeSymbols_pa', 'goog.i18n.DateTimeSymbols_pa_Arab', 'goog.i18n.DateTimeSymbols_pa_Arab_PK', 'goog.i18n.DateTimeSymbols_pa_Guru', 'goog.i18n.DateTimeSymbols_pa_Guru_IN', 'goog.i18n.DateTimeSymbols_pa_IN', 'goog.i18n.DateTimeSymbols_pa_PK', 'goog.i18n.DateTimeSymbols_pl_PL', 'goog.i18n.DateTimeSymbols_ps', 'goog.i18n.DateTimeSymbols_ps_AF', 'goog.i18n.DateTimeSymbols_ro_MD', 'goog.i18n.DateTimeSymbols_ro_RO', 'goog.i18n.DateTimeSymbols_ru_RU', 'goog.i18n.DateTimeSymbols_ru_UA', 'goog.i18n.DateTimeSymbols_rw', 'goog.i18n.DateTimeSymbols_rw_RW', 'goog.i18n.DateTimeSymbols_sa', 'goog.i18n.DateTimeSymbols_sa_IN', 'goog.i18n.DateTimeSymbols_se', 'goog.i18n.DateTimeSymbols_se_FI', 'goog.i18n.DateTimeSymbols_se_NO', 'goog.i18n.DateTimeSymbols_sh', 'goog.i18n.DateTimeSymbols_sh_BA', 'goog.i18n.DateTimeSymbols_sh_CS', 'goog.i18n.DateTimeSymbols_sh_YU', 'goog.i18n.DateTimeSymbols_si', 'goog.i18n.DateTimeSymbols_si_LK', 'goog.i18n.DateTimeSymbols_sid', 'goog.i18n.DateTimeSymbols_sid_ET', 'goog.i18n.DateTimeSymbols_sk_SK', 'goog.i18n.DateTimeSymbols_sl_SI', 'goog.i18n.DateTimeSymbols_so', 'goog.i18n.DateTimeSymbols_so_DJ', 'goog.i18n.DateTimeSymbols_so_ET', 'goog.i18n.DateTimeSymbols_so_KE', 'goog.i18n.DateTimeSymbols_so_SO', 'goog.i18n.DateTimeSymbols_sq_AL', 'goog.i18n.DateTimeSymbols_sr_BA', 'goog.i18n.DateTimeSymbols_sr_CS', 'goog.i18n.DateTimeSymbols_sr_Cyrl', 'goog.i18n.DateTimeSymbols_sr_Cyrl_BA', 'goog.i18n.DateTimeSymbols_sr_Cyrl_CS', 'goog.i18n.DateTimeSymbols_sr_Cyrl_ME', 'goog.i18n.DateTimeSymbols_sr_Cyrl_RS', 'goog.i18n.DateTimeSymbols_sr_Cyrl_YU', 'goog.i18n.DateTimeSymbols_sr_Latn', 'goog.i18n.DateTimeSymbols_sr_Latn_BA', 'goog.i18n.DateTimeSymbols_sr_Latn_CS', 'goog.i18n.DateTimeSymbols_sr_Latn_ME', 'goog.i18n.DateTimeSymbols_sr_Latn_RS', 'goog.i18n.DateTimeSymbols_sr_Latn_YU', 'goog.i18n.DateTimeSymbols_sr_ME', 'goog.i18n.DateTimeSymbols_sr_RS', 'goog.i18n.DateTimeSymbols_sr_YU', 'goog.i18n.DateTimeSymbols_ss', 'goog.i18n.DateTimeSymbols_ss_SZ', 'goog.i18n.DateTimeSymbols_ss_ZA', 'goog.i18n.DateTimeSymbols_st', 'goog.i18n.DateTimeSymbols_st_LS', 'goog.i18n.DateTimeSymbols_st_ZA', 'goog.i18n.DateTimeSymbols_sv_FI', 'goog.i18n.DateTimeSymbols_sv_SE', 'goog.i18n.DateTimeSymbols_sw_KE', 'goog.i18n.DateTimeSymbols_sw_TZ', 'goog.i18n.DateTimeSymbols_syr', 'goog.i18n.DateTimeSymbols_syr_SY', 'goog.i18n.DateTimeSymbols_ta_IN', 'goog.i18n.DateTimeSymbols_te_IN', 'goog.i18n.DateTimeSymbols_tg', 'goog.i18n.DateTimeSymbols_tg_Cyrl', 'goog.i18n.DateTimeSymbols_tg_Cyrl_TJ', 'goog.i18n.DateTimeSymbols_tg_TJ', 'goog.i18n.DateTimeSymbols_th_TH', 'goog.i18n.DateTimeSymbols_ti', 'goog.i18n.DateTimeSymbols_ti_ER', 'goog.i18n.DateTimeSymbols_ti_ET', 'goog.i18n.DateTimeSymbols_tig', 'goog.i18n.DateTimeSymbols_tig_ER', 'goog.i18n.DateTimeSymbols_tl_PH', 'goog.i18n.DateTimeSymbols_tn', 'goog.i18n.DateTimeSymbols_tn_ZA', 'goog.i18n.DateTimeSymbols_to', 'goog.i18n.DateTimeSymbols_to_TO', 'goog.i18n.DateTimeSymbols_tr_TR', 'goog.i18n.DateTimeSymbols_trv', 'goog.i18n.DateTimeSymbols_trv_TW', 'goog.i18n.DateTimeSymbols_ts', 'goog.i18n.DateTimeSymbols_ts_ZA', 'goog.i18n.DateTimeSymbols_tt', 'goog.i18n.DateTimeSymbols_tt_RU', 'goog.i18n.DateTimeSymbols_ug', 'goog.i18n.DateTimeSymbols_ug_Arab', 'goog.i18n.DateTimeSymbols_ug_Arab_CN', 'goog.i18n.DateTimeSymbols_ug_CN', 'goog.i18n.DateTimeSymbols_uk_UA', 'goog.i18n.DateTimeSymbols_ur_IN', 'goog.i18n.DateTimeSymbols_ur_PK', 'goog.i18n.DateTimeSymbols_uz', 'goog.i18n.DateTimeSymbols_uz_AF', 'goog.i18n.DateTimeSymbols_uz_Arab', 'goog.i18n.DateTimeSymbols_uz_Arab_AF', 'goog.i18n.DateTimeSymbols_uz_Cyrl', 'goog.i18n.DateTimeSymbols_uz_Cyrl_UZ', 'goog.i18n.DateTimeSymbols_uz_Latn', 'goog.i18n.DateTimeSymbols_uz_Latn_UZ', 'goog.i18n.DateTimeSymbols_uz_UZ', 'goog.i18n.DateTimeSymbols_ve', 'goog.i18n.DateTimeSymbols_ve_ZA', 'goog.i18n.DateTimeSymbols_vi_VN', 'goog.i18n.DateTimeSymbols_wal', 'goog.i18n.DateTimeSymbols_wal_ET', 'goog.i18n.DateTimeSymbols_wo', 'goog.i18n.DateTimeSymbols_wo_Latn', 'goog.i18n.DateTimeSymbols_wo_Latn_SN', 'goog.i18n.DateTimeSymbols_wo_SN', 'goog.i18n.DateTimeSymbols_xh', 'goog.i18n.DateTimeSymbols_xh_ZA', 'goog.i18n.DateTimeSymbols_yo', 'goog.i18n.DateTimeSymbols_yo_NG', 'goog.i18n.DateTimeSymbols_zh_Hans', 'goog.i18n.DateTimeSymbols_zh_Hans_CN', 'goog.i18n.DateTimeSymbols_zh_Hans_HK', 'goog.i18n.DateTimeSymbols_zh_Hans_MO', 'goog.i18n.DateTimeSymbols_zh_Hans_SG', 'goog.i18n.DateTimeSymbols_zh_Hant', 'goog.i18n.DateTimeSymbols_zh_Hant_HK', 'goog.i18n.DateTimeSymbols_zh_Hant_MO', 'goog.i18n.DateTimeSymbols_zh_Hant_TW', 'goog.i18n.DateTimeSymbols_zh_MO', 'goog.i18n.DateTimeSymbols_zh_SG', 'goog.i18n.DateTimeSymbols_zu', 'goog.i18n.DateTimeSymbols_zu_ZA'], ['goog.i18n.DateTimeSymbols']); +goog.addDependency('i18n/datetimesymbolsext.js', ['goog.i18n.DateTimeSymbolsExt', 'goog.i18n.DateTimeSymbols_aa', 'goog.i18n.DateTimeSymbols_aa_DJ', 'goog.i18n.DateTimeSymbols_aa_ER', 'goog.i18n.DateTimeSymbols_aa_ET', 'goog.i18n.DateTimeSymbols_af', 'goog.i18n.DateTimeSymbols_af_NA', 'goog.i18n.DateTimeSymbols_af_ZA', 'goog.i18n.DateTimeSymbols_ak', 'goog.i18n.DateTimeSymbols_ak_GH', 'goog.i18n.DateTimeSymbols_am_ET', 'goog.i18n.DateTimeSymbols_ar_AE', 'goog.i18n.DateTimeSymbols_ar_BH', 'goog.i18n.DateTimeSymbols_ar_DZ', 'goog.i18n.DateTimeSymbols_ar_EG', 'goog.i18n.DateTimeSymbols_ar_IQ', 'goog.i18n.DateTimeSymbols_ar_JO', 'goog.i18n.DateTimeSymbols_ar_KW', 'goog.i18n.DateTimeSymbols_ar_LB', 'goog.i18n.DateTimeSymbols_ar_LY', 'goog.i18n.DateTimeSymbols_ar_MA', 'goog.i18n.DateTimeSymbols_ar_OM', 'goog.i18n.DateTimeSymbols_ar_QA', 'goog.i18n.DateTimeSymbols_ar_SA', 'goog.i18n.DateTimeSymbols_ar_SD', 'goog.i18n.DateTimeSymbols_ar_SY', 'goog.i18n.DateTimeSymbols_ar_TN', 'goog.i18n.DateTimeSymbols_ar_YE', 'goog.i18n.DateTimeSymbols_as', 'goog.i18n.DateTimeSymbols_as_IN', 'goog.i18n.DateTimeSymbols_az', 'goog.i18n.DateTimeSymbols_az_AZ', 'goog.i18n.DateTimeSymbols_az_Arab', 'goog.i18n.DateTimeSymbols_az_Arab_IR', 'goog.i18n.DateTimeSymbols_az_Cyrl', 'goog.i18n.DateTimeSymbols_az_Cyrl_AZ', 'goog.i18n.DateTimeSymbols_az_IR', 'goog.i18n.DateTimeSymbols_az_Latn', 'goog.i18n.DateTimeSymbols_az_Latn_AZ', 'goog.i18n.DateTimeSymbols_be', 'goog.i18n.DateTimeSymbols_be_BY', 'goog.i18n.DateTimeSymbols_bg_BG', 'goog.i18n.DateTimeSymbols_bn_BD', 'goog.i18n.DateTimeSymbols_bn_IN', 'goog.i18n.DateTimeSymbols_bo', 'goog.i18n.DateTimeSymbols_bo_CN', 'goog.i18n.DateTimeSymbols_bo_IN', 'goog.i18n.DateTimeSymbols_bs', 'goog.i18n.DateTimeSymbols_bs_BA', 'goog.i18n.DateTimeSymbols_byn', 'goog.i18n.DateTimeSymbols_byn_ER', 'goog.i18n.DateTimeSymbols_ca_ES', 'goog.i18n.DateTimeSymbols_cch', 'goog.i18n.DateTimeSymbols_cch_NG', 'goog.i18n.DateTimeSymbols_cs_CZ', 'goog.i18n.DateTimeSymbols_cy', 'goog.i18n.DateTimeSymbols_cy_GB', 'goog.i18n.DateTimeSymbols_da_DK', 'goog.i18n.DateTimeSymbols_de_BE', 'goog.i18n.DateTimeSymbols_de_DE', 'goog.i18n.DateTimeSymbols_de_LI', 'goog.i18n.DateTimeSymbols_de_LU', 'goog.i18n.DateTimeSymbols_dv', 'goog.i18n.DateTimeSymbols_dv_MV', 'goog.i18n.DateTimeSymbols_dz', 'goog.i18n.DateTimeSymbols_dz_BT', 'goog.i18n.DateTimeSymbols_ee', 'goog.i18n.DateTimeSymbols_ee_GH', 'goog.i18n.DateTimeSymbols_ee_TG', 'goog.i18n.DateTimeSymbols_el_CY', 'goog.i18n.DateTimeSymbols_el_GR', 'goog.i18n.DateTimeSymbols_el_POLYTON', 'goog.i18n.DateTimeSymbols_en_AS', 'goog.i18n.DateTimeSymbols_en_BE', 'goog.i18n.DateTimeSymbols_en_BW', 'goog.i18n.DateTimeSymbols_en_BZ', 'goog.i18n.DateTimeSymbols_en_CA', 'goog.i18n.DateTimeSymbols_en_Dsrt', 'goog.i18n.DateTimeSymbols_en_Dsrt_US', 'goog.i18n.DateTimeSymbols_en_GU', 'goog.i18n.DateTimeSymbols_en_HK', 'goog.i18n.DateTimeSymbols_en_JM', 'goog.i18n.DateTimeSymbols_en_MH', 'goog.i18n.DateTimeSymbols_en_MP', 'goog.i18n.DateTimeSymbols_en_MT', 'goog.i18n.DateTimeSymbols_en_NA', 'goog.i18n.DateTimeSymbols_en_NZ', 'goog.i18n.DateTimeSymbols_en_PH', 'goog.i18n.DateTimeSymbols_en_PK', 'goog.i18n.DateTimeSymbols_en_Shaw', 'goog.i18n.DateTimeSymbols_en_TT', 'goog.i18n.DateTimeSymbols_en_UM', 'goog.i18n.DateTimeSymbols_en_VI', 'goog.i18n.DateTimeSymbols_en_ZW', 'goog.i18n.DateTimeSymbols_eo', 'goog.i18n.DateTimeSymbols_es_AR', 'goog.i18n.DateTimeSymbols_es_BO', 'goog.i18n.DateTimeSymbols_es_CL', 'goog.i18n.DateTimeSymbols_es_CO', 'goog.i18n.DateTimeSymbols_es_CR', 'goog.i18n.DateTimeSymbols_es_DO', 'goog.i18n.DateTimeSymbols_es_EC', 'goog.i18n.DateTimeSymbols_es_ES', 'goog.i18n.DateTimeSymbols_es_GT', 'goog.i18n.DateTimeSymbols_es_HN', 'goog.i18n.DateTimeSymbols_es_MX', 'goog.i18n.DateTimeSymbols_es_NI', 'goog.i18n.DateTimeSymbols_es_PA', 'goog.i18n.DateTimeSymbols_es_PE', 'goog.i18n.DateTimeSymbols_es_PR', 'goog.i18n.DateTimeSymbols_es_PY', 'goog.i18n.DateTimeSymbols_es_SV', 'goog.i18n.DateTimeSymbols_es_US', 'goog.i18n.DateTimeSymbols_es_UY', 'goog.i18n.DateTimeSymbols_es_VE', 'goog.i18n.DateTimeSymbols_et_EE', 'goog.i18n.DateTimeSymbols_eu_ES', 'goog.i18n.DateTimeSymbols_fa_AF', 'goog.i18n.DateTimeSymbols_fa_IR', 'goog.i18n.DateTimeSymbols_fi_FI', 'goog.i18n.DateTimeSymbols_fil_PH', 'goog.i18n.DateTimeSymbols_fo', 'goog.i18n.DateTimeSymbols_fo_FO', 'goog.i18n.DateTimeSymbols_fr_BE', 'goog.i18n.DateTimeSymbols_fr_CH', 'goog.i18n.DateTimeSymbols_fr_FR', 'goog.i18n.DateTimeSymbols_fr_LU', 'goog.i18n.DateTimeSymbols_fr_MC', 'goog.i18n.DateTimeSymbols_fr_SN', 'goog.i18n.DateTimeSymbols_fur', 'goog.i18n.DateTimeSymbols_fur_IT', 'goog.i18n.DateTimeSymbols_ga', 'goog.i18n.DateTimeSymbols_ga_IE', 'goog.i18n.DateTimeSymbols_gaa', 'goog.i18n.DateTimeSymbols_gaa_GH', 'goog.i18n.DateTimeSymbols_gez', 'goog.i18n.DateTimeSymbols_gez_ER', 'goog.i18n.DateTimeSymbols_gez_ET', 'goog.i18n.DateTimeSymbols_gl_ES', 'goog.i18n.DateTimeSymbols_gsw_CH', 'goog.i18n.DateTimeSymbols_gu_IN', 'goog.i18n.DateTimeSymbols_gv', 'goog.i18n.DateTimeSymbols_gv_GB', 'goog.i18n.DateTimeSymbols_ha', 'goog.i18n.DateTimeSymbols_ha_Arab', 'goog.i18n.DateTimeSymbols_ha_Arab_NG', 'goog.i18n.DateTimeSymbols_ha_Arab_SD', 'goog.i18n.DateTimeSymbols_ha_GH', 'goog.i18n.DateTimeSymbols_ha_Latn', 'goog.i18n.DateTimeSymbols_ha_Latn_GH', 'goog.i18n.DateTimeSymbols_ha_Latn_NE', 'goog.i18n.DateTimeSymbols_ha_Latn_NG', 'goog.i18n.DateTimeSymbols_ha_NE', 'goog.i18n.DateTimeSymbols_ha_NG', 'goog.i18n.DateTimeSymbols_ha_SD', 'goog.i18n.DateTimeSymbols_haw', 'goog.i18n.DateTimeSymbols_haw_US', 'goog.i18n.DateTimeSymbols_he_IL', 'goog.i18n.DateTimeSymbols_hi_IN', 'goog.i18n.DateTimeSymbols_hr_HR', 'goog.i18n.DateTimeSymbols_hu_HU', 'goog.i18n.DateTimeSymbols_hy', 'goog.i18n.DateTimeSymbols_hy_AM', 'goog.i18n.DateTimeSymbols_ia', 'goog.i18n.DateTimeSymbols_id_ID', 'goog.i18n.DateTimeSymbols_ig', 'goog.i18n.DateTimeSymbols_ig_NG', 'goog.i18n.DateTimeSymbols_ii', 'goog.i18n.DateTimeSymbols_ii_CN', 'goog.i18n.DateTimeSymbols_is_IS', 'goog.i18n.DateTimeSymbols_it_CH', 'goog.i18n.DateTimeSymbols_it_IT', 'goog.i18n.DateTimeSymbols_iu', 'goog.i18n.DateTimeSymbols_ja_JP', 'goog.i18n.DateTimeSymbols_ka', 'goog.i18n.DateTimeSymbols_ka_GE', 'goog.i18n.DateTimeSymbols_kaj', 'goog.i18n.DateTimeSymbols_kaj_NG', 'goog.i18n.DateTimeSymbols_kam', 'goog.i18n.DateTimeSymbols_kam_KE', 'goog.i18n.DateTimeSymbols_kcg', 'goog.i18n.DateTimeSymbols_kcg_NG', 'goog.i18n.DateTimeSymbols_kfo', 'goog.i18n.DateTimeSymbols_kfo_CI', 'goog.i18n.DateTimeSymbols_kk', 'goog.i18n.DateTimeSymbols_kk_Cyrl', 'goog.i18n.DateTimeSymbols_kk_Cyrl_KZ', 'goog.i18n.DateTimeSymbols_kk_KZ', 'goog.i18n.DateTimeSymbols_kl', 'goog.i18n.DateTimeSymbols_kl_GL', 'goog.i18n.DateTimeSymbols_km', 'goog.i18n.DateTimeSymbols_km_KH', 'goog.i18n.DateTimeSymbols_kn_IN', 'goog.i18n.DateTimeSymbols_ko_KR', 'goog.i18n.DateTimeSymbols_kok', 'goog.i18n.DateTimeSymbols_kok_IN', 'goog.i18n.DateTimeSymbols_kpe', 'goog.i18n.DateTimeSymbols_kpe_GN', 'goog.i18n.DateTimeSymbols_kpe_LR', 'goog.i18n.DateTimeSymbols_ku', 'goog.i18n.DateTimeSymbols_ku_Arab', 'goog.i18n.DateTimeSymbols_ku_Arab_IQ', 'goog.i18n.DateTimeSymbols_ku_Arab_IR', 'goog.i18n.DateTimeSymbols_ku_IQ', 'goog.i18n.DateTimeSymbols_ku_IR', 'goog.i18n.DateTimeSymbols_ku_Latn', 'goog.i18n.DateTimeSymbols_ku_Latn_SY', 'goog.i18n.DateTimeSymbols_ku_Latn_TR', 'goog.i18n.DateTimeSymbols_ku_SY', 'goog.i18n.DateTimeSymbols_ku_TR', 'goog.i18n.DateTimeSymbols_kw', 'goog.i18n.DateTimeSymbols_kw_GB', 'goog.i18n.DateTimeSymbols_ky', 'goog.i18n.DateTimeSymbols_ky_KG', 'goog.i18n.DateTimeSymbols_ln_CD', 'goog.i18n.DateTimeSymbols_ln_CG', 'goog.i18n.DateTimeSymbols_lo', 'goog.i18n.DateTimeSymbols_lo_LA', 'goog.i18n.DateTimeSymbols_lt_LT', 'goog.i18n.DateTimeSymbols_lv_LV', 'goog.i18n.DateTimeSymbols_mk', 'goog.i18n.DateTimeSymbols_mk_MK', 'goog.i18n.DateTimeSymbols_ml_IN', 'goog.i18n.DateTimeSymbols_mn', 'goog.i18n.DateTimeSymbols_mn_CN', 'goog.i18n.DateTimeSymbols_mn_Cyrl', 'goog.i18n.DateTimeSymbols_mn_Cyrl_MN', 'goog.i18n.DateTimeSymbols_mn_MN', 'goog.i18n.DateTimeSymbols_mn_Mong', 'goog.i18n.DateTimeSymbols_mn_Mong_CN', 'goog.i18n.DateTimeSymbols_mr_IN', 'goog.i18n.DateTimeSymbols_ms_BN', 'goog.i18n.DateTimeSymbols_ms_MY', 'goog.i18n.DateTimeSymbols_mt_MT', 'goog.i18n.DateTimeSymbols_my', 'goog.i18n.DateTimeSymbols_my_MM', 'goog.i18n.DateTimeSymbols_nb', 'goog.i18n.DateTimeSymbols_nb_NO', 'goog.i18n.DateTimeSymbols_nds', 'goog.i18n.DateTimeSymbols_nds_DE', 'goog.i18n.DateTimeSymbols_ne', 'goog.i18n.DateTimeSymbols_ne_IN', 'goog.i18n.DateTimeSymbols_ne_NP', 'goog.i18n.DateTimeSymbols_nl_BE', 'goog.i18n.DateTimeSymbols_nl_NL', 'goog.i18n.DateTimeSymbols_nn', 'goog.i18n.DateTimeSymbols_nn_NO', 'goog.i18n.DateTimeSymbols_nr', 'goog.i18n.DateTimeSymbols_nr_ZA', 'goog.i18n.DateTimeSymbols_nso', 'goog.i18n.DateTimeSymbols_nso_ZA', 'goog.i18n.DateTimeSymbols_ny', 'goog.i18n.DateTimeSymbols_ny_MW', 'goog.i18n.DateTimeSymbols_oc', 'goog.i18n.DateTimeSymbols_oc_FR', 'goog.i18n.DateTimeSymbols_om', 'goog.i18n.DateTimeSymbols_om_ET', 'goog.i18n.DateTimeSymbols_om_KE', 'goog.i18n.DateTimeSymbols_or_IN', 'goog.i18n.DateTimeSymbols_pa', 'goog.i18n.DateTimeSymbols_pa_Arab', 'goog.i18n.DateTimeSymbols_pa_Arab_PK', 'goog.i18n.DateTimeSymbols_pa_Guru', 'goog.i18n.DateTimeSymbols_pa_Guru_IN', 'goog.i18n.DateTimeSymbols_pa_IN', 'goog.i18n.DateTimeSymbols_pa_PK', 'goog.i18n.DateTimeSymbols_pl_PL', 'goog.i18n.DateTimeSymbols_ps', 'goog.i18n.DateTimeSymbols_ps_AF', 'goog.i18n.DateTimeSymbols_ro_MD', 'goog.i18n.DateTimeSymbols_ro_RO', 'goog.i18n.DateTimeSymbols_ru_RU', 'goog.i18n.DateTimeSymbols_ru_UA', 'goog.i18n.DateTimeSymbols_rw', 'goog.i18n.DateTimeSymbols_rw_RW', 'goog.i18n.DateTimeSymbols_sa', 'goog.i18n.DateTimeSymbols_sa_IN', 'goog.i18n.DateTimeSymbols_se', 'goog.i18n.DateTimeSymbols_se_FI', 'goog.i18n.DateTimeSymbols_se_NO', 'goog.i18n.DateTimeSymbols_sh', 'goog.i18n.DateTimeSymbols_sh_BA', 'goog.i18n.DateTimeSymbols_sh_CS', 'goog.i18n.DateTimeSymbols_sh_YU', 'goog.i18n.DateTimeSymbols_si', 'goog.i18n.DateTimeSymbols_si_LK', 'goog.i18n.DateTimeSymbols_sid', 'goog.i18n.DateTimeSymbols_sid_ET', 'goog.i18n.DateTimeSymbols_sk_SK', 'goog.i18n.DateTimeSymbols_sl_SI', 'goog.i18n.DateTimeSymbols_so', 'goog.i18n.DateTimeSymbols_so_DJ', 'goog.i18n.DateTimeSymbols_so_ET', 'goog.i18n.DateTimeSymbols_so_KE', 'goog.i18n.DateTimeSymbols_so_SO', 'goog.i18n.DateTimeSymbols_sq_AL', 'goog.i18n.DateTimeSymbols_sr_BA', 'goog.i18n.DateTimeSymbols_sr_CS', 'goog.i18n.DateTimeSymbols_sr_Cyrl', 'goog.i18n.DateTimeSymbols_sr_Cyrl_BA', 'goog.i18n.DateTimeSymbols_sr_Cyrl_CS', 'goog.i18n.DateTimeSymbols_sr_Cyrl_ME', 'goog.i18n.DateTimeSymbols_sr_Cyrl_RS', 'goog.i18n.DateTimeSymbols_sr_Cyrl_YU', 'goog.i18n.DateTimeSymbols_sr_Latn', 'goog.i18n.DateTimeSymbols_sr_Latn_BA', 'goog.i18n.DateTimeSymbols_sr_Latn_CS', 'goog.i18n.DateTimeSymbols_sr_Latn_ME', 'goog.i18n.DateTimeSymbols_sr_Latn_RS', 'goog.i18n.DateTimeSymbols_sr_Latn_YU', 'goog.i18n.DateTimeSymbols_sr_ME', 'goog.i18n.DateTimeSymbols_sr_RS', 'goog.i18n.DateTimeSymbols_sr_YU', 'goog.i18n.DateTimeSymbols_ss', 'goog.i18n.DateTimeSymbols_ss_SZ', 'goog.i18n.DateTimeSymbols_ss_ZA', 'goog.i18n.DateTimeSymbols_st', 'goog.i18n.DateTimeSymbols_st_LS', 'goog.i18n.DateTimeSymbols_st_ZA', 'goog.i18n.DateTimeSymbols_sv_FI', 'goog.i18n.DateTimeSymbols_sv_SE', 'goog.i18n.DateTimeSymbols_sw_KE', 'goog.i18n.DateTimeSymbols_sw_TZ', 'goog.i18n.DateTimeSymbols_syr', 'goog.i18n.DateTimeSymbols_syr_SY', 'goog.i18n.DateTimeSymbols_ta_IN', 'goog.i18n.DateTimeSymbols_te_IN', 'goog.i18n.DateTimeSymbols_tg', 'goog.i18n.DateTimeSymbols_tg_Cyrl', 'goog.i18n.DateTimeSymbols_tg_Cyrl_TJ', 'goog.i18n.DateTimeSymbols_tg_TJ', 'goog.i18n.DateTimeSymbols_th_TH', 'goog.i18n.DateTimeSymbols_ti', 'goog.i18n.DateTimeSymbols_ti_ER', 'goog.i18n.DateTimeSymbols_ti_ET', 'goog.i18n.DateTimeSymbols_tig', 'goog.i18n.DateTimeSymbols_tig_ER', 'goog.i18n.DateTimeSymbols_tl_PH', 'goog.i18n.DateTimeSymbols_tn', 'goog.i18n.DateTimeSymbols_tn_ZA', 'goog.i18n.DateTimeSymbols_to', 'goog.i18n.DateTimeSymbols_to_TO', 'goog.i18n.DateTimeSymbols_tr_TR', 'goog.i18n.DateTimeSymbols_trv', 'goog.i18n.DateTimeSymbols_trv_TW', 'goog.i18n.DateTimeSymbols_ts', 'goog.i18n.DateTimeSymbols_ts_ZA', 'goog.i18n.DateTimeSymbols_tt', 'goog.i18n.DateTimeSymbols_tt_RU', 'goog.i18n.DateTimeSymbols_ug', 'goog.i18n.DateTimeSymbols_ug_Arab', 'goog.i18n.DateTimeSymbols_ug_Arab_CN', 'goog.i18n.DateTimeSymbols_ug_CN', 'goog.i18n.DateTimeSymbols_uk_UA', 'goog.i18n.DateTimeSymbols_ur_IN', 'goog.i18n.DateTimeSymbols_ur_PK', 'goog.i18n.DateTimeSymbols_uz', 'goog.i18n.DateTimeSymbols_uz_AF', 'goog.i18n.DateTimeSymbols_uz_Arab', 'goog.i18n.DateTimeSymbols_uz_Arab_AF', 'goog.i18n.DateTimeSymbols_uz_Cyrl', 'goog.i18n.DateTimeSymbols_uz_Cyrl_UZ', 'goog.i18n.DateTimeSymbols_uz_Latn', 'goog.i18n.DateTimeSymbols_uz_Latn_UZ', 'goog.i18n.DateTimeSymbols_uz_UZ', 'goog.i18n.DateTimeSymbols_ve', 'goog.i18n.DateTimeSymbols_ve_ZA', 'goog.i18n.DateTimeSymbols_vi_VN', 'goog.i18n.DateTimeSymbols_wal', 'goog.i18n.DateTimeSymbols_wal_ET', 'goog.i18n.DateTimeSymbols_wo', 'goog.i18n.DateTimeSymbols_wo_Latn', 'goog.i18n.DateTimeSymbols_wo_Latn_SN', 'goog.i18n.DateTimeSymbols_wo_SN', 'goog.i18n.DateTimeSymbols_xh', 'goog.i18n.DateTimeSymbols_xh_ZA', 'goog.i18n.DateTimeSymbols_yo', 'goog.i18n.DateTimeSymbols_yo_NG', 'goog.i18n.DateTimeSymbols_zh_Hans', 'goog.i18n.DateTimeSymbols_zh_Hans_CN', 'goog.i18n.DateTimeSymbols_zh_Hans_HK', 'goog.i18n.DateTimeSymbols_zh_Hans_MO', 'goog.i18n.DateTimeSymbols_zh_Hans_SG', 'goog.i18n.DateTimeSymbols_zh_Hant', 'goog.i18n.DateTimeSymbols_zh_Hant_HK', 'goog.i18n.DateTimeSymbols_zh_Hant_MO', 'goog.i18n.DateTimeSymbols_zh_Hant_TW', 'goog.i18n.DateTimeSymbols_zh_MO', 'goog.i18n.DateTimeSymbols_zh_SG', 'goog.i18n.DateTimeSymbols_zu', 'goog.i18n.DateTimeSymbols_zu_ZA'], ['goog.i18n.DateTimeSymbols']); goog.addDependency('i18n/graphemebreak.js', ['goog.i18n.GraphemeBreak'], ['goog.structs.InversionMap']); goog.addDependency('i18n/messageformat.js', ['goog.i18n.MessageFormat'], ['goog.asserts', 'goog.i18n.NumberFormat', 'goog.i18n.pluralRules']); goog.addDependency('i18n/mime.js', ['goog.i18n.mime', 'goog.i18n.mime.encode'], []); goog.addDependency('i18n/numberformat.js', ['goog.i18n.NumberFormat'], ['goog.i18n.NumberFormatSymbols', 'goog.i18n.currencyCodeMap']); -goog.addDependency('i18n/numberformatsymbols.js', ['goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_aa', 'goog.i18n.NumberFormatSymbols_aa_DJ', 'goog.i18n.NumberFormatSymbols_aa_ER', 'goog.i18n.NumberFormatSymbols_aa_ER_SAAHO', 'goog.i18n.NumberFormatSymbols_aa_ET', 'goog.i18n.NumberFormatSymbols_af', 'goog.i18n.NumberFormatSymbols_af_NA', 'goog.i18n.NumberFormatSymbols_af_ZA', 'goog.i18n.NumberFormatSymbols_ak', 'goog.i18n.NumberFormatSymbols_ak_GH', 'goog.i18n.NumberFormatSymbols_am', 'goog.i18n.NumberFormatSymbols_am_ET', 'goog.i18n.NumberFormatSymbols_ar', 'goog.i18n.NumberFormatSymbols_ar_AE', 'goog.i18n.NumberFormatSymbols_ar_BH', 'goog.i18n.NumberFormatSymbols_ar_DZ', 'goog.i18n.NumberFormatSymbols_ar_EG', 'goog.i18n.NumberFormatSymbols_ar_IQ', 'goog.i18n.NumberFormatSymbols_ar_JO', 'goog.i18n.NumberFormatSymbols_ar_KW', 'goog.i18n.NumberFormatSymbols_ar_LB', 'goog.i18n.NumberFormatSymbols_ar_LY', 'goog.i18n.NumberFormatSymbols_ar_MA', 'goog.i18n.NumberFormatSymbols_ar_OM', 'goog.i18n.NumberFormatSymbols_ar_QA', 'goog.i18n.NumberFormatSymbols_ar_SA', 'goog.i18n.NumberFormatSymbols_ar_SD', 'goog.i18n.NumberFormatSymbols_ar_SY', 'goog.i18n.NumberFormatSymbols_ar_TN', 'goog.i18n.NumberFormatSymbols_ar_YE', 'goog.i18n.NumberFormatSymbols_as', 'goog.i18n.NumberFormatSymbols_as_IN', 'goog.i18n.NumberFormatSymbols_az', 'goog.i18n.NumberFormatSymbols_az_AZ', 'goog.i18n.NumberFormatSymbols_az_Cyrl', 'goog.i18n.NumberFormatSymbols_az_Cyrl_AZ', 'goog.i18n.NumberFormatSymbols_az_Latn', 'goog.i18n.NumberFormatSymbols_az_Latn_AZ', 'goog.i18n.NumberFormatSymbols_be', 'goog.i18n.NumberFormatSymbols_be_BY', 'goog.i18n.NumberFormatSymbols_bg', 'goog.i18n.NumberFormatSymbols_bg_BG', 'goog.i18n.NumberFormatSymbols_bn', 'goog.i18n.NumberFormatSymbols_bn_BD', 'goog.i18n.NumberFormatSymbols_bn_IN', 'goog.i18n.NumberFormatSymbols_bo', 'goog.i18n.NumberFormatSymbols_bo_CN', 'goog.i18n.NumberFormatSymbols_bo_IN', 'goog.i18n.NumberFormatSymbols_bs', 'goog.i18n.NumberFormatSymbols_bs_BA', 'goog.i18n.NumberFormatSymbols_byn', 'goog.i18n.NumberFormatSymbols_byn_ER', 'goog.i18n.NumberFormatSymbols_ca', 'goog.i18n.NumberFormatSymbols_ca_ES', 'goog.i18n.NumberFormatSymbols_cch', 'goog.i18n.NumberFormatSymbols_cch_NG', 'goog.i18n.NumberFormatSymbols_cop', 'goog.i18n.NumberFormatSymbols_cs', 'goog.i18n.NumberFormatSymbols_cs_CZ', 'goog.i18n.NumberFormatSymbols_cy', 'goog.i18n.NumberFormatSymbols_cy_GB', 'goog.i18n.NumberFormatSymbols_da', 'goog.i18n.NumberFormatSymbols_da_DK', 'goog.i18n.NumberFormatSymbols_de', 'goog.i18n.NumberFormatSymbols_de_AT', 'goog.i18n.NumberFormatSymbols_de_BE', 'goog.i18n.NumberFormatSymbols_de_CH', 'goog.i18n.NumberFormatSymbols_de_DE', 'goog.i18n.NumberFormatSymbols_de_LI', 'goog.i18n.NumberFormatSymbols_de_LU', 'goog.i18n.NumberFormatSymbols_dv', 'goog.i18n.NumberFormatSymbols_dv_MV', 'goog.i18n.NumberFormatSymbols_dz', 'goog.i18n.NumberFormatSymbols_dz_BT', 'goog.i18n.NumberFormatSymbols_ee', 'goog.i18n.NumberFormatSymbols_ee_GH', 'goog.i18n.NumberFormatSymbols_ee_TG', 'goog.i18n.NumberFormatSymbols_el', 'goog.i18n.NumberFormatSymbols_el_CY', 'goog.i18n.NumberFormatSymbols_el_GR', 'goog.i18n.NumberFormatSymbols_el_POLYTON', 'goog.i18n.NumberFormatSymbols_en', 'goog.i18n.NumberFormatSymbols_en_AS', 'goog.i18n.NumberFormatSymbols_en_AU', 'goog.i18n.NumberFormatSymbols_en_BE', 'goog.i18n.NumberFormatSymbols_en_BW', 'goog.i18n.NumberFormatSymbols_en_BZ', 'goog.i18n.NumberFormatSymbols_en_CA', 'goog.i18n.NumberFormatSymbols_en_Dsrt', 'goog.i18n.NumberFormatSymbols_en_Dsrt_US', 'goog.i18n.NumberFormatSymbols_en_GB', 'goog.i18n.NumberFormatSymbols_en_GU', 'goog.i18n.NumberFormatSymbols_en_HK', 'goog.i18n.NumberFormatSymbols_en_IE', 'goog.i18n.NumberFormatSymbols_en_IN', 'goog.i18n.NumberFormatSymbols_en_JM', 'goog.i18n.NumberFormatSymbols_en_MH', 'goog.i18n.NumberFormatSymbols_en_MP', 'goog.i18n.NumberFormatSymbols_en_MT', 'goog.i18n.NumberFormatSymbols_en_NA', 'goog.i18n.NumberFormatSymbols_en_NZ', 'goog.i18n.NumberFormatSymbols_en_PH', 'goog.i18n.NumberFormatSymbols_en_PK', 'goog.i18n.NumberFormatSymbols_en_SG', 'goog.i18n.NumberFormatSymbols_en_Shaw', 'goog.i18n.NumberFormatSymbols_en_TT', 'goog.i18n.NumberFormatSymbols_en_UM', 'goog.i18n.NumberFormatSymbols_en_US', 'goog.i18n.NumberFormatSymbols_en_VI', 'goog.i18n.NumberFormatSymbols_en_ZA', 'goog.i18n.NumberFormatSymbols_en_ZW', 'goog.i18n.NumberFormatSymbols_eo', 'goog.i18n.NumberFormatSymbols_es', 'goog.i18n.NumberFormatSymbols_es_AR', 'goog.i18n.NumberFormatSymbols_es_BO', 'goog.i18n.NumberFormatSymbols_es_CL', 'goog.i18n.NumberFormatSymbols_es_CO', 'goog.i18n.NumberFormatSymbols_es_CR', 'goog.i18n.NumberFormatSymbols_es_DO', 'goog.i18n.NumberFormatSymbols_es_EC', 'goog.i18n.NumberFormatSymbols_es_ES', 'goog.i18n.NumberFormatSymbols_es_GT', 'goog.i18n.NumberFormatSymbols_es_HN', 'goog.i18n.NumberFormatSymbols_es_MX', 'goog.i18n.NumberFormatSymbols_es_NI', 'goog.i18n.NumberFormatSymbols_es_PA', 'goog.i18n.NumberFormatSymbols_es_PE', 'goog.i18n.NumberFormatSymbols_es_PR', 'goog.i18n.NumberFormatSymbols_es_PY', 'goog.i18n.NumberFormatSymbols_es_SV', 'goog.i18n.NumberFormatSymbols_es_US', 'goog.i18n.NumberFormatSymbols_es_UY', 'goog.i18n.NumberFormatSymbols_es_VE', 'goog.i18n.NumberFormatSymbols_et', 'goog.i18n.NumberFormatSymbols_et_EE', 'goog.i18n.NumberFormatSymbols_eu', 'goog.i18n.NumberFormatSymbols_eu_ES', 'goog.i18n.NumberFormatSymbols_fa', 'goog.i18n.NumberFormatSymbols_fa_AF', 'goog.i18n.NumberFormatSymbols_fa_IR', 'goog.i18n.NumberFormatSymbols_fi', 'goog.i18n.NumberFormatSymbols_fi_FI', 'goog.i18n.NumberFormatSymbols_fil', 'goog.i18n.NumberFormatSymbols_fil_PH', 'goog.i18n.NumberFormatSymbols_fo', 'goog.i18n.NumberFormatSymbols_fo_FO', 'goog.i18n.NumberFormatSymbols_fr', 'goog.i18n.NumberFormatSymbols_fr_BE', 'goog.i18n.NumberFormatSymbols_fr_CA', 'goog.i18n.NumberFormatSymbols_fr_CH', 'goog.i18n.NumberFormatSymbols_fr_FR', 'goog.i18n.NumberFormatSymbols_fr_LU', 'goog.i18n.NumberFormatSymbols_fr_MC', 'goog.i18n.NumberFormatSymbols_fr_SN', 'goog.i18n.NumberFormatSymbols_fur', 'goog.i18n.NumberFormatSymbols_fur_IT', 'goog.i18n.NumberFormatSymbols_ga', 'goog.i18n.NumberFormatSymbols_ga_IE', 'goog.i18n.NumberFormatSymbols_gaa', 'goog.i18n.NumberFormatSymbols_gaa_GH', 'goog.i18n.NumberFormatSymbols_gez', 'goog.i18n.NumberFormatSymbols_gez_ER', 'goog.i18n.NumberFormatSymbols_gez_ET', 'goog.i18n.NumberFormatSymbols_gl', 'goog.i18n.NumberFormatSymbols_gl_ES', 'goog.i18n.NumberFormatSymbols_gsw', 'goog.i18n.NumberFormatSymbols_gsw_CH', 'goog.i18n.NumberFormatSymbols_gu', 'goog.i18n.NumberFormatSymbols_gu_IN', 'goog.i18n.NumberFormatSymbols_gv', 'goog.i18n.NumberFormatSymbols_gv_GB', 'goog.i18n.NumberFormatSymbols_ha', 'goog.i18n.NumberFormatSymbols_ha_Arab', 'goog.i18n.NumberFormatSymbols_ha_Arab_NG', 'goog.i18n.NumberFormatSymbols_ha_Arab_SD', 'goog.i18n.NumberFormatSymbols_ha_GH', 'goog.i18n.NumberFormatSymbols_ha_Latn', 'goog.i18n.NumberFormatSymbols_ha_Latn_GH', 'goog.i18n.NumberFormatSymbols_ha_Latn_NE', 'goog.i18n.NumberFormatSymbols_ha_Latn_NG', 'goog.i18n.NumberFormatSymbols_ha_NE', 'goog.i18n.NumberFormatSymbols_ha_NG', 'goog.i18n.NumberFormatSymbols_ha_SD', 'goog.i18n.NumberFormatSymbols_haw', 'goog.i18n.NumberFormatSymbols_haw_US', 'goog.i18n.NumberFormatSymbols_he', 'goog.i18n.NumberFormatSymbols_he_IL', 'goog.i18n.NumberFormatSymbols_hi', 'goog.i18n.NumberFormatSymbols_hi_IN', 'goog.i18n.NumberFormatSymbols_hr', 'goog.i18n.NumberFormatSymbols_hr_HR', 'goog.i18n.NumberFormatSymbols_hu', 'goog.i18n.NumberFormatSymbols_hu_HU', 'goog.i18n.NumberFormatSymbols_hy', 'goog.i18n.NumberFormatSymbols_hy_AM', 'goog.i18n.NumberFormatSymbols_ia', 'goog.i18n.NumberFormatSymbols_id', 'goog.i18n.NumberFormatSymbols_id_ID', 'goog.i18n.NumberFormatSymbols_ig', 'goog.i18n.NumberFormatSymbols_ig_NG', 'goog.i18n.NumberFormatSymbols_ii', 'goog.i18n.NumberFormatSymbols_ii_CN', 'goog.i18n.NumberFormatSymbols_in', 'goog.i18n.NumberFormatSymbols_is', 'goog.i18n.NumberFormatSymbols_is_IS', 'goog.i18n.NumberFormatSymbols_it', 'goog.i18n.NumberFormatSymbols_it_CH', 'goog.i18n.NumberFormatSymbols_it_IT', 'goog.i18n.NumberFormatSymbols_iu', 'goog.i18n.NumberFormatSymbols_iw', 'goog.i18n.NumberFormatSymbols_ja', 'goog.i18n.NumberFormatSymbols_ja_JP', 'goog.i18n.NumberFormatSymbols_ka', 'goog.i18n.NumberFormatSymbols_ka_GE', 'goog.i18n.NumberFormatSymbols_kaj', 'goog.i18n.NumberFormatSymbols_kaj_NG', 'goog.i18n.NumberFormatSymbols_kam', 'goog.i18n.NumberFormatSymbols_kam_KE', 'goog.i18n.NumberFormatSymbols_kcg', 'goog.i18n.NumberFormatSymbols_kcg_NG', 'goog.i18n.NumberFormatSymbols_kfo', 'goog.i18n.NumberFormatSymbols_kfo_CI', 'goog.i18n.NumberFormatSymbols_kk', 'goog.i18n.NumberFormatSymbols_kk_Cyrl', 'goog.i18n.NumberFormatSymbols_kk_Cyrl_KZ', 'goog.i18n.NumberFormatSymbols_kk_KZ', 'goog.i18n.NumberFormatSymbols_kl', 'goog.i18n.NumberFormatSymbols_kl_GL', 'goog.i18n.NumberFormatSymbols_km', 'goog.i18n.NumberFormatSymbols_km_KH', 'goog.i18n.NumberFormatSymbols_kn', 'goog.i18n.NumberFormatSymbols_kn_IN', 'goog.i18n.NumberFormatSymbols_ko', 'goog.i18n.NumberFormatSymbols_ko_KR', 'goog.i18n.NumberFormatSymbols_kok', 'goog.i18n.NumberFormatSymbols_kok_IN', 'goog.i18n.NumberFormatSymbols_kpe', 'goog.i18n.NumberFormatSymbols_kpe_GN', 'goog.i18n.NumberFormatSymbols_kpe_LR', 'goog.i18n.NumberFormatSymbols_ku', 'goog.i18n.NumberFormatSymbols_ku_Arab', 'goog.i18n.NumberFormatSymbols_ku_Arab_IQ', 'goog.i18n.NumberFormatSymbols_ku_Arab_IR', 'goog.i18n.NumberFormatSymbols_ku_Arab_SY', 'goog.i18n.NumberFormatSymbols_ku_IQ', 'goog.i18n.NumberFormatSymbols_ku_IR', 'goog.i18n.NumberFormatSymbols_ku_Latn', 'goog.i18n.NumberFormatSymbols_ku_Latn_TR', 'goog.i18n.NumberFormatSymbols_ku_SY', 'goog.i18n.NumberFormatSymbols_ku_TR', 'goog.i18n.NumberFormatSymbols_kw', 'goog.i18n.NumberFormatSymbols_kw_GB', 'goog.i18n.NumberFormatSymbols_ky', 'goog.i18n.NumberFormatSymbols_ky_KG', 'goog.i18n.NumberFormatSymbols_ln', 'goog.i18n.NumberFormatSymbols_ln_CD', 'goog.i18n.NumberFormatSymbols_ln_CG', 'goog.i18n.NumberFormatSymbols_lo', 'goog.i18n.NumberFormatSymbols_lo_LA', 'goog.i18n.NumberFormatSymbols_lt', 'goog.i18n.NumberFormatSymbols_lt_LT', 'goog.i18n.NumberFormatSymbols_lv', 'goog.i18n.NumberFormatSymbols_lv_LV', 'goog.i18n.NumberFormatSymbols_mk', 'goog.i18n.NumberFormatSymbols_mk_MK', 'goog.i18n.NumberFormatSymbols_ml', 'goog.i18n.NumberFormatSymbols_ml_IN', 'goog.i18n.NumberFormatSymbols_mn', 'goog.i18n.NumberFormatSymbols_mn_CN', 'goog.i18n.NumberFormatSymbols_mn_Cyrl', 'goog.i18n.NumberFormatSymbols_mn_Cyrl_MN', 'goog.i18n.NumberFormatSymbols_mn_MN', 'goog.i18n.NumberFormatSymbols_mn_Mong', 'goog.i18n.NumberFormatSymbols_mn_Mong_CN', 'goog.i18n.NumberFormatSymbols_mo', 'goog.i18n.NumberFormatSymbols_mr', 'goog.i18n.NumberFormatSymbols_mr_IN', 'goog.i18n.NumberFormatSymbols_ms', 'goog.i18n.NumberFormatSymbols_ms_BN', 'goog.i18n.NumberFormatSymbols_ms_MY', 'goog.i18n.NumberFormatSymbols_mt', 'goog.i18n.NumberFormatSymbols_mt_MT', 'goog.i18n.NumberFormatSymbols_my', 'goog.i18n.NumberFormatSymbols_my_MM', 'goog.i18n.NumberFormatSymbols_nb', 'goog.i18n.NumberFormatSymbols_nb_NO', 'goog.i18n.NumberFormatSymbols_nds', 'goog.i18n.NumberFormatSymbols_nds_DE', 'goog.i18n.NumberFormatSymbols_ne', 'goog.i18n.NumberFormatSymbols_ne_IN', 'goog.i18n.NumberFormatSymbols_ne_NP', 'goog.i18n.NumberFormatSymbols_nl', 'goog.i18n.NumberFormatSymbols_nl_BE', 'goog.i18n.NumberFormatSymbols_nl_NL', 'goog.i18n.NumberFormatSymbols_nn', 'goog.i18n.NumberFormatSymbols_nn_NO', 'goog.i18n.NumberFormatSymbols_no', 'goog.i18n.NumberFormatSymbols_nr', 'goog.i18n.NumberFormatSymbols_nr_ZA', 'goog.i18n.NumberFormatSymbols_nso', 'goog.i18n.NumberFormatSymbols_nso_ZA', 'goog.i18n.NumberFormatSymbols_ny', 'goog.i18n.NumberFormatSymbols_ny_MW', 'goog.i18n.NumberFormatSymbols_oc', 'goog.i18n.NumberFormatSymbols_oc_FR', 'goog.i18n.NumberFormatSymbols_om', 'goog.i18n.NumberFormatSymbols_om_ET', 'goog.i18n.NumberFormatSymbols_om_KE', 'goog.i18n.NumberFormatSymbols_or', 'goog.i18n.NumberFormatSymbols_or_IN', 'goog.i18n.NumberFormatSymbols_pa', 'goog.i18n.NumberFormatSymbols_pa_Arab', 'goog.i18n.NumberFormatSymbols_pa_Arab_PK', 'goog.i18n.NumberFormatSymbols_pa_Guru', 'goog.i18n.NumberFormatSymbols_pa_Guru_IN', 'goog.i18n.NumberFormatSymbols_pa_IN', 'goog.i18n.NumberFormatSymbols_pa_PK', 'goog.i18n.NumberFormatSymbols_pl', 'goog.i18n.NumberFormatSymbols_pl_PL', 'goog.i18n.NumberFormatSymbols_ps', 'goog.i18n.NumberFormatSymbols_ps_AF', 'goog.i18n.NumberFormatSymbols_pt', 'goog.i18n.NumberFormatSymbols_pt_BR', 'goog.i18n.NumberFormatSymbols_pt_PT', 'goog.i18n.NumberFormatSymbols_ro', 'goog.i18n.NumberFormatSymbols_ro_MD', 'goog.i18n.NumberFormatSymbols_ro_RO', 'goog.i18n.NumberFormatSymbols_ru', 'goog.i18n.NumberFormatSymbols_ru_RU', 'goog.i18n.NumberFormatSymbols_ru_UA', 'goog.i18n.NumberFormatSymbols_rw', 'goog.i18n.NumberFormatSymbols_rw_RW', 'goog.i18n.NumberFormatSymbols_sa', 'goog.i18n.NumberFormatSymbols_sa_IN', 'goog.i18n.NumberFormatSymbols_se', 'goog.i18n.NumberFormatSymbols_se_FI', 'goog.i18n.NumberFormatSymbols_se_NO', 'goog.i18n.NumberFormatSymbols_sh', 'goog.i18n.NumberFormatSymbols_sh_BA', 'goog.i18n.NumberFormatSymbols_sh_CS', 'goog.i18n.NumberFormatSymbols_sh_YU', 'goog.i18n.NumberFormatSymbols_si', 'goog.i18n.NumberFormatSymbols_si_LK', 'goog.i18n.NumberFormatSymbols_sid', 'goog.i18n.NumberFormatSymbols_sid_ET', 'goog.i18n.NumberFormatSymbols_sk', 'goog.i18n.NumberFormatSymbols_sk_SK', 'goog.i18n.NumberFormatSymbols_sl', 'goog.i18n.NumberFormatSymbols_sl_SI', 'goog.i18n.NumberFormatSymbols_so', 'goog.i18n.NumberFormatSymbols_so_DJ', 'goog.i18n.NumberFormatSymbols_so_ET', 'goog.i18n.NumberFormatSymbols_so_KE', 'goog.i18n.NumberFormatSymbols_so_SO', 'goog.i18n.NumberFormatSymbols_sq', 'goog.i18n.NumberFormatSymbols_sq_AL', 'goog.i18n.NumberFormatSymbols_sr', 'goog.i18n.NumberFormatSymbols_sr_BA', 'goog.i18n.NumberFormatSymbols_sr_CS', 'goog.i18n.NumberFormatSymbols_sr_Cyrl', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_BA', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_CS', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_ME', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_RS', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_YU', 'goog.i18n.NumberFormatSymbols_sr_Latn', 'goog.i18n.NumberFormatSymbols_sr_Latn_BA', 'goog.i18n.NumberFormatSymbols_sr_Latn_CS', 'goog.i18n.NumberFormatSymbols_sr_Latn_ME', 'goog.i18n.NumberFormatSymbols_sr_Latn_RS', 'goog.i18n.NumberFormatSymbols_sr_Latn_YU', 'goog.i18n.NumberFormatSymbols_sr_ME', 'goog.i18n.NumberFormatSymbols_sr_RS', 'goog.i18n.NumberFormatSymbols_sr_YU', 'goog.i18n.NumberFormatSymbols_ss', 'goog.i18n.NumberFormatSymbols_ss_SZ', 'goog.i18n.NumberFormatSymbols_ss_ZA', 'goog.i18n.NumberFormatSymbols_st', 'goog.i18n.NumberFormatSymbols_st_LS', 'goog.i18n.NumberFormatSymbols_st_ZA', 'goog.i18n.NumberFormatSymbols_sv', 'goog.i18n.NumberFormatSymbols_sv_FI', 'goog.i18n.NumberFormatSymbols_sv_SE', 'goog.i18n.NumberFormatSymbols_sw', 'goog.i18n.NumberFormatSymbols_sw_KE', 'goog.i18n.NumberFormatSymbols_sw_TZ', 'goog.i18n.NumberFormatSymbols_syr', 'goog.i18n.NumberFormatSymbols_syr_SY', 'goog.i18n.NumberFormatSymbols_ta', 'goog.i18n.NumberFormatSymbols_ta_IN', 'goog.i18n.NumberFormatSymbols_te', 'goog.i18n.NumberFormatSymbols_te_IN', 'goog.i18n.NumberFormatSymbols_tg', 'goog.i18n.NumberFormatSymbols_tg_Cyrl', 'goog.i18n.NumberFormatSymbols_tg_Cyrl_TJ', 'goog.i18n.NumberFormatSymbols_tg_TJ', 'goog.i18n.NumberFormatSymbols_th', 'goog.i18n.NumberFormatSymbols_th_TH', 'goog.i18n.NumberFormatSymbols_ti', 'goog.i18n.NumberFormatSymbols_ti_ER', 'goog.i18n.NumberFormatSymbols_ti_ET', 'goog.i18n.NumberFormatSymbols_tig', 'goog.i18n.NumberFormatSymbols_tig_ER', 'goog.i18n.NumberFormatSymbols_tl', 'goog.i18n.NumberFormatSymbols_tl_PH', 'goog.i18n.NumberFormatSymbols_tn', 'goog.i18n.NumberFormatSymbols_tn_ZA', 'goog.i18n.NumberFormatSymbols_to', 'goog.i18n.NumberFormatSymbols_to_TO', 'goog.i18n.NumberFormatSymbols_tr', 'goog.i18n.NumberFormatSymbols_tr_TR', 'goog.i18n.NumberFormatSymbols_trv', 'goog.i18n.NumberFormatSymbols_trv_TW', 'goog.i18n.NumberFormatSymbols_ts', 'goog.i18n.NumberFormatSymbols_ts_ZA', 'goog.i18n.NumberFormatSymbols_tt', 'goog.i18n.NumberFormatSymbols_tt_RU', 'goog.i18n.NumberFormatSymbols_ug', 'goog.i18n.NumberFormatSymbols_ug_Arab', 'goog.i18n.NumberFormatSymbols_ug_Arab_CN', 'goog.i18n.NumberFormatSymbols_ug_CN', 'goog.i18n.NumberFormatSymbols_uk', 'goog.i18n.NumberFormatSymbols_uk_UA', 'goog.i18n.NumberFormatSymbols_ur', 'goog.i18n.NumberFormatSymbols_ur_IN', 'goog.i18n.NumberFormatSymbols_ur_PK', 'goog.i18n.NumberFormatSymbols_uz', 'goog.i18n.NumberFormatSymbols_uz_AF', 'goog.i18n.NumberFormatSymbols_uz_Arab', 'goog.i18n.NumberFormatSymbols_uz_Arab_AF', 'goog.i18n.NumberFormatSymbols_uz_Cyrl', 'goog.i18n.NumberFormatSymbols_uz_Cyrl_UZ', 'goog.i18n.NumberFormatSymbols_uz_Latn', 'goog.i18n.NumberFormatSymbols_uz_Latn_UZ', 'goog.i18n.NumberFormatSymbols_uz_UZ', 'goog.i18n.NumberFormatSymbols_ve', 'goog.i18n.NumberFormatSymbols_ve_ZA', 'goog.i18n.NumberFormatSymbols_vi', 'goog.i18n.NumberFormatSymbols_vi_VN', 'goog.i18n.NumberFormatSymbols_wal', 'goog.i18n.NumberFormatSymbols_wal_ET', 'goog.i18n.NumberFormatSymbols_wo', 'goog.i18n.NumberFormatSymbols_wo_Latn', 'goog.i18n.NumberFormatSymbols_wo_Latn_SN', 'goog.i18n.NumberFormatSymbols_wo_SN', 'goog.i18n.NumberFormatSymbols_xh', 'goog.i18n.NumberFormatSymbols_xh_ZA', 'goog.i18n.NumberFormatSymbols_yo', 'goog.i18n.NumberFormatSymbols_yo_NG', 'goog.i18n.NumberFormatSymbols_zh', 'goog.i18n.NumberFormatSymbols_zh_CN', 'goog.i18n.NumberFormatSymbols_zh_HK', 'goog.i18n.NumberFormatSymbols_zh_Hans', 'goog.i18n.NumberFormatSymbols_zh_Hans_CN', 'goog.i18n.NumberFormatSymbols_zh_Hans_HK', 'goog.i18n.NumberFormatSymbols_zh_Hans_MO', 'goog.i18n.NumberFormatSymbols_zh_Hans_SG', 'goog.i18n.NumberFormatSymbols_zh_Hant', 'goog.i18n.NumberFormatSymbols_zh_Hant_HK', 'goog.i18n.NumberFormatSymbols_zh_Hant_MO', 'goog.i18n.NumberFormatSymbols_zh_Hant_TW', 'goog.i18n.NumberFormatSymbols_zh_MO', 'goog.i18n.NumberFormatSymbols_zh_SG', 'goog.i18n.NumberFormatSymbols_zh_TW', 'goog.i18n.NumberFormatSymbols_zu', 'goog.i18n.NumberFormatSymbols_zu_ZA'], []); +goog.addDependency('i18n/numberformatsymbols.js', ['goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_am', 'goog.i18n.NumberFormatSymbols_am_ET', 'goog.i18n.NumberFormatSymbols_ar', 'goog.i18n.NumberFormatSymbols_ar_EG', 'goog.i18n.NumberFormatSymbols_bg', 'goog.i18n.NumberFormatSymbols_bg_BG', 'goog.i18n.NumberFormatSymbols_bn', 'goog.i18n.NumberFormatSymbols_bn_BD', 'goog.i18n.NumberFormatSymbols_ca', 'goog.i18n.NumberFormatSymbols_ca_ES', 'goog.i18n.NumberFormatSymbols_cs', 'goog.i18n.NumberFormatSymbols_cs_CZ', 'goog.i18n.NumberFormatSymbols_da', 'goog.i18n.NumberFormatSymbols_da_DK', 'goog.i18n.NumberFormatSymbols_de', 'goog.i18n.NumberFormatSymbols_de_AT', 'goog.i18n.NumberFormatSymbols_de_BE', 'goog.i18n.NumberFormatSymbols_de_CH', 'goog.i18n.NumberFormatSymbols_de_DE', 'goog.i18n.NumberFormatSymbols_de_LU', 'goog.i18n.NumberFormatSymbols_el', 'goog.i18n.NumberFormatSymbols_el_GR', 'goog.i18n.NumberFormatSymbols_el_POLYTON', 'goog.i18n.NumberFormatSymbols_en', 'goog.i18n.NumberFormatSymbols_en_AS', 'goog.i18n.NumberFormatSymbols_en_AU', 'goog.i18n.NumberFormatSymbols_en_Dsrt', 'goog.i18n.NumberFormatSymbols_en_Dsrt_US', 'goog.i18n.NumberFormatSymbols_en_GB', 'goog.i18n.NumberFormatSymbols_en_GU', 'goog.i18n.NumberFormatSymbols_en_IE', 'goog.i18n.NumberFormatSymbols_en_IN', 'goog.i18n.NumberFormatSymbols_en_MH', 'goog.i18n.NumberFormatSymbols_en_MP', 'goog.i18n.NumberFormatSymbols_en_SG', 'goog.i18n.NumberFormatSymbols_en_UM', 'goog.i18n.NumberFormatSymbols_en_US', 'goog.i18n.NumberFormatSymbols_en_VI', 'goog.i18n.NumberFormatSymbols_en_ZA', 'goog.i18n.NumberFormatSymbols_en_ZZ', 'goog.i18n.NumberFormatSymbols_es', 'goog.i18n.NumberFormatSymbols_es_ES', 'goog.i18n.NumberFormatSymbols_et', 'goog.i18n.NumberFormatSymbols_et_EE', 'goog.i18n.NumberFormatSymbols_eu', 'goog.i18n.NumberFormatSymbols_eu_ES', 'goog.i18n.NumberFormatSymbols_fa', 'goog.i18n.NumberFormatSymbols_fa_IR', 'goog.i18n.NumberFormatSymbols_fi', 'goog.i18n.NumberFormatSymbols_fi_FI', 'goog.i18n.NumberFormatSymbols_fil', 'goog.i18n.NumberFormatSymbols_fil_PH', 'goog.i18n.NumberFormatSymbols_fr', 'goog.i18n.NumberFormatSymbols_fr_BL', 'goog.i18n.NumberFormatSymbols_fr_CA', 'goog.i18n.NumberFormatSymbols_fr_FR', 'goog.i18n.NumberFormatSymbols_fr_GP', 'goog.i18n.NumberFormatSymbols_fr_MC', 'goog.i18n.NumberFormatSymbols_fr_MF', 'goog.i18n.NumberFormatSymbols_fr_MQ', 'goog.i18n.NumberFormatSymbols_fr_RE', 'goog.i18n.NumberFormatSymbols_gl', 'goog.i18n.NumberFormatSymbols_gl_ES', 'goog.i18n.NumberFormatSymbols_gsw', 'goog.i18n.NumberFormatSymbols_gsw_CH', 'goog.i18n.NumberFormatSymbols_gu', 'goog.i18n.NumberFormatSymbols_gu_IN', 'goog.i18n.NumberFormatSymbols_he', 'goog.i18n.NumberFormatSymbols_he_IL', 'goog.i18n.NumberFormatSymbols_hi', 'goog.i18n.NumberFormatSymbols_hi_IN', 'goog.i18n.NumberFormatSymbols_hr', 'goog.i18n.NumberFormatSymbols_hr_HR', 'goog.i18n.NumberFormatSymbols_hu', 'goog.i18n.NumberFormatSymbols_hu_HU', 'goog.i18n.NumberFormatSymbols_id', 'goog.i18n.NumberFormatSymbols_id_ID', 'goog.i18n.NumberFormatSymbols_in', 'goog.i18n.NumberFormatSymbols_is', 'goog.i18n.NumberFormatSymbols_is_IS', 'goog.i18n.NumberFormatSymbols_it', 'goog.i18n.NumberFormatSymbols_it_IT', 'goog.i18n.NumberFormatSymbols_iw', 'goog.i18n.NumberFormatSymbols_ja', 'goog.i18n.NumberFormatSymbols_ja_JP', 'goog.i18n.NumberFormatSymbols_kn', 'goog.i18n.NumberFormatSymbols_kn_IN', 'goog.i18n.NumberFormatSymbols_ko', 'goog.i18n.NumberFormatSymbols_ko_KR', 'goog.i18n.NumberFormatSymbols_ln', 'goog.i18n.NumberFormatSymbols_ln_CD', 'goog.i18n.NumberFormatSymbols_lt', 'goog.i18n.NumberFormatSymbols_lt_LT', 'goog.i18n.NumberFormatSymbols_lv', 'goog.i18n.NumberFormatSymbols_lv_LV', 'goog.i18n.NumberFormatSymbols_ml', 'goog.i18n.NumberFormatSymbols_ml_IN', 'goog.i18n.NumberFormatSymbols_mo', 'goog.i18n.NumberFormatSymbols_mr', 'goog.i18n.NumberFormatSymbols_mr_IN', 'goog.i18n.NumberFormatSymbols_ms', 'goog.i18n.NumberFormatSymbols_ms_MY', 'goog.i18n.NumberFormatSymbols_mt', 'goog.i18n.NumberFormatSymbols_mt_MT', 'goog.i18n.NumberFormatSymbols_nl', 'goog.i18n.NumberFormatSymbols_nl_NL', 'goog.i18n.NumberFormatSymbols_no', 'goog.i18n.NumberFormatSymbols_or', 'goog.i18n.NumberFormatSymbols_or_IN', 'goog.i18n.NumberFormatSymbols_pl', 'goog.i18n.NumberFormatSymbols_pl_PL', 'goog.i18n.NumberFormatSymbols_pt', 'goog.i18n.NumberFormatSymbols_pt_BR', 'goog.i18n.NumberFormatSymbols_pt_PT', 'goog.i18n.NumberFormatSymbols_ro', 'goog.i18n.NumberFormatSymbols_ro_RO', 'goog.i18n.NumberFormatSymbols_ru', 'goog.i18n.NumberFormatSymbols_ru_RU', 'goog.i18n.NumberFormatSymbols_sk', 'goog.i18n.NumberFormatSymbols_sk_SK', 'goog.i18n.NumberFormatSymbols_sl', 'goog.i18n.NumberFormatSymbols_sl_SI', 'goog.i18n.NumberFormatSymbols_sq', 'goog.i18n.NumberFormatSymbols_sq_AL', 'goog.i18n.NumberFormatSymbols_sr', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_RS', 'goog.i18n.NumberFormatSymbols_sr_Latn_RS', 'goog.i18n.NumberFormatSymbols_sr_RS', 'goog.i18n.NumberFormatSymbols_sv', 'goog.i18n.NumberFormatSymbols_sv_SE', 'goog.i18n.NumberFormatSymbols_sw', 'goog.i18n.NumberFormatSymbols_sw_TZ', 'goog.i18n.NumberFormatSymbols_ta', 'goog.i18n.NumberFormatSymbols_ta_IN', 'goog.i18n.NumberFormatSymbols_te', 'goog.i18n.NumberFormatSymbols_te_IN', 'goog.i18n.NumberFormatSymbols_th', 'goog.i18n.NumberFormatSymbols_th_TH', 'goog.i18n.NumberFormatSymbols_tl', 'goog.i18n.NumberFormatSymbols_tl_PH', 'goog.i18n.NumberFormatSymbols_tr', 'goog.i18n.NumberFormatSymbols_tr_TR', 'goog.i18n.NumberFormatSymbols_uk', 'goog.i18n.NumberFormatSymbols_uk_UA', 'goog.i18n.NumberFormatSymbols_ur', 'goog.i18n.NumberFormatSymbols_ur_PK', 'goog.i18n.NumberFormatSymbols_vi', 'goog.i18n.NumberFormatSymbols_vi_VN', 'goog.i18n.NumberFormatSymbols_zh', 'goog.i18n.NumberFormatSymbols_zh_CN', 'goog.i18n.NumberFormatSymbols_zh_HK', 'goog.i18n.NumberFormatSymbols_zh_Hans', 'goog.i18n.NumberFormatSymbols_zh_Hans_CN', 'goog.i18n.NumberFormatSymbols_zh_TW'], []); +goog.addDependency('i18n/numberformatsymbolsext.js', ['goog.i18n.NumberFormatSymbolsExt', 'goog.i18n.NumberFormatSymbols_aa', 'goog.i18n.NumberFormatSymbols_aa_DJ', 'goog.i18n.NumberFormatSymbols_aa_ER', 'goog.i18n.NumberFormatSymbols_aa_ET', 'goog.i18n.NumberFormatSymbols_af', 'goog.i18n.NumberFormatSymbols_af_NA', 'goog.i18n.NumberFormatSymbols_af_ZA', 'goog.i18n.NumberFormatSymbols_ak', 'goog.i18n.NumberFormatSymbols_ak_GH', 'goog.i18n.NumberFormatSymbols_ar_AE', 'goog.i18n.NumberFormatSymbols_ar_BH', 'goog.i18n.NumberFormatSymbols_ar_DZ', 'goog.i18n.NumberFormatSymbols_ar_IQ', 'goog.i18n.NumberFormatSymbols_ar_JO', 'goog.i18n.NumberFormatSymbols_ar_KW', 'goog.i18n.NumberFormatSymbols_ar_LB', 'goog.i18n.NumberFormatSymbols_ar_LY', 'goog.i18n.NumberFormatSymbols_ar_MA', 'goog.i18n.NumberFormatSymbols_ar_OM', 'goog.i18n.NumberFormatSymbols_ar_QA', 'goog.i18n.NumberFormatSymbols_ar_SA', 'goog.i18n.NumberFormatSymbols_ar_SD', 'goog.i18n.NumberFormatSymbols_ar_SY', 'goog.i18n.NumberFormatSymbols_ar_TN', 'goog.i18n.NumberFormatSymbols_ar_YE', 'goog.i18n.NumberFormatSymbols_as', 'goog.i18n.NumberFormatSymbols_as_IN', 'goog.i18n.NumberFormatSymbols_asa', 'goog.i18n.NumberFormatSymbols_asa_TZ', 'goog.i18n.NumberFormatSymbols_az', 'goog.i18n.NumberFormatSymbols_az_AZ', 'goog.i18n.NumberFormatSymbols_az_Arab', 'goog.i18n.NumberFormatSymbols_az_Arab_IR', 'goog.i18n.NumberFormatSymbols_az_Cyrl', 'goog.i18n.NumberFormatSymbols_az_Cyrl_AZ', 'goog.i18n.NumberFormatSymbols_az_IR', 'goog.i18n.NumberFormatSymbols_az_Latn', 'goog.i18n.NumberFormatSymbols_az_Latn_AZ', 'goog.i18n.NumberFormatSymbols_be', 'goog.i18n.NumberFormatSymbols_be_BY', 'goog.i18n.NumberFormatSymbols_bem', 'goog.i18n.NumberFormatSymbols_bem_ZM', 'goog.i18n.NumberFormatSymbols_bez', 'goog.i18n.NumberFormatSymbols_bez_TZ', 'goog.i18n.NumberFormatSymbols_bm', 'goog.i18n.NumberFormatSymbols_bm_ML', 'goog.i18n.NumberFormatSymbols_bn_IN', 'goog.i18n.NumberFormatSymbols_bo', 'goog.i18n.NumberFormatSymbols_bo_CN', 'goog.i18n.NumberFormatSymbols_bo_IN', 'goog.i18n.NumberFormatSymbols_br', 'goog.i18n.NumberFormatSymbols_br_FR', 'goog.i18n.NumberFormatSymbols_brx', 'goog.i18n.NumberFormatSymbols_brx_IN', 'goog.i18n.NumberFormatSymbols_bs', 'goog.i18n.NumberFormatSymbols_bs_BA', 'goog.i18n.NumberFormatSymbols_byn', 'goog.i18n.NumberFormatSymbols_byn_ER', 'goog.i18n.NumberFormatSymbols_cch', 'goog.i18n.NumberFormatSymbols_cch_NG', 'goog.i18n.NumberFormatSymbols_cgg', 'goog.i18n.NumberFormatSymbols_cgg_UG', 'goog.i18n.NumberFormatSymbols_chr', 'goog.i18n.NumberFormatSymbols_chr_US', 'goog.i18n.NumberFormatSymbols_ckb', 'goog.i18n.NumberFormatSymbols_ckb_Arab', 'goog.i18n.NumberFormatSymbols_ckb_Arab_IQ', 'goog.i18n.NumberFormatSymbols_ckb_Arab_IR', 'goog.i18n.NumberFormatSymbols_ckb_IQ', 'goog.i18n.NumberFormatSymbols_ckb_IR', 'goog.i18n.NumberFormatSymbols_ckb_Latn', 'goog.i18n.NumberFormatSymbols_ckb_Latn_IQ', 'goog.i18n.NumberFormatSymbols_cy', 'goog.i18n.NumberFormatSymbols_cy_GB', 'goog.i18n.NumberFormatSymbols_dav', 'goog.i18n.NumberFormatSymbols_dav_KE', 'goog.i18n.NumberFormatSymbols_de_LI', 'goog.i18n.NumberFormatSymbols_dv', 'goog.i18n.NumberFormatSymbols_dv_MV', 'goog.i18n.NumberFormatSymbols_dz', 'goog.i18n.NumberFormatSymbols_dz_BT', 'goog.i18n.NumberFormatSymbols_ebu', 'goog.i18n.NumberFormatSymbols_ebu_KE', 'goog.i18n.NumberFormatSymbols_ee', 'goog.i18n.NumberFormatSymbols_ee_GH', 'goog.i18n.NumberFormatSymbols_ee_TG', 'goog.i18n.NumberFormatSymbols_el_CY', 'goog.i18n.NumberFormatSymbols_en_BE', 'goog.i18n.NumberFormatSymbols_en_BW', 'goog.i18n.NumberFormatSymbols_en_BZ', 'goog.i18n.NumberFormatSymbols_en_CA', 'goog.i18n.NumberFormatSymbols_en_HK', 'goog.i18n.NumberFormatSymbols_en_JM', 'goog.i18n.NumberFormatSymbols_en_MT', 'goog.i18n.NumberFormatSymbols_en_MU', 'goog.i18n.NumberFormatSymbols_en_NA', 'goog.i18n.NumberFormatSymbols_en_NZ', 'goog.i18n.NumberFormatSymbols_en_PH', 'goog.i18n.NumberFormatSymbols_en_PK', 'goog.i18n.NumberFormatSymbols_en_Shaw', 'goog.i18n.NumberFormatSymbols_en_TT', 'goog.i18n.NumberFormatSymbols_en_ZW', 'goog.i18n.NumberFormatSymbols_eo', 'goog.i18n.NumberFormatSymbols_es_419', 'goog.i18n.NumberFormatSymbols_es_AR', 'goog.i18n.NumberFormatSymbols_es_BO', 'goog.i18n.NumberFormatSymbols_es_CL', 'goog.i18n.NumberFormatSymbols_es_CO', 'goog.i18n.NumberFormatSymbols_es_CR', 'goog.i18n.NumberFormatSymbols_es_DO', 'goog.i18n.NumberFormatSymbols_es_EC', 'goog.i18n.NumberFormatSymbols_es_GQ', 'goog.i18n.NumberFormatSymbols_es_GT', 'goog.i18n.NumberFormatSymbols_es_HN', 'goog.i18n.NumberFormatSymbols_es_MX', 'goog.i18n.NumberFormatSymbols_es_NI', 'goog.i18n.NumberFormatSymbols_es_PA', 'goog.i18n.NumberFormatSymbols_es_PE', 'goog.i18n.NumberFormatSymbols_es_PR', 'goog.i18n.NumberFormatSymbols_es_PY', 'goog.i18n.NumberFormatSymbols_es_SV', 'goog.i18n.NumberFormatSymbols_es_US', 'goog.i18n.NumberFormatSymbols_es_UY', 'goog.i18n.NumberFormatSymbols_es_VE', 'goog.i18n.NumberFormatSymbols_fa_AF', 'goog.i18n.NumberFormatSymbols_ff', 'goog.i18n.NumberFormatSymbols_ff_SN', 'goog.i18n.NumberFormatSymbols_fo', 'goog.i18n.NumberFormatSymbols_fo_FO', 'goog.i18n.NumberFormatSymbols_fr_BE', 'goog.i18n.NumberFormatSymbols_fr_BF', 'goog.i18n.NumberFormatSymbols_fr_BI', 'goog.i18n.NumberFormatSymbols_fr_BJ', 'goog.i18n.NumberFormatSymbols_fr_CD', 'goog.i18n.NumberFormatSymbols_fr_CF', 'goog.i18n.NumberFormatSymbols_fr_CG', 'goog.i18n.NumberFormatSymbols_fr_CH', 'goog.i18n.NumberFormatSymbols_fr_CI', 'goog.i18n.NumberFormatSymbols_fr_CM', 'goog.i18n.NumberFormatSymbols_fr_DJ', 'goog.i18n.NumberFormatSymbols_fr_GA', 'goog.i18n.NumberFormatSymbols_fr_GN', 'goog.i18n.NumberFormatSymbols_fr_GQ', 'goog.i18n.NumberFormatSymbols_fr_KM', 'goog.i18n.NumberFormatSymbols_fr_LU', 'goog.i18n.NumberFormatSymbols_fr_MG', 'goog.i18n.NumberFormatSymbols_fr_ML', 'goog.i18n.NumberFormatSymbols_fr_NE', 'goog.i18n.NumberFormatSymbols_fr_RW', 'goog.i18n.NumberFormatSymbols_fr_SN', 'goog.i18n.NumberFormatSymbols_fr_TD', 'goog.i18n.NumberFormatSymbols_fr_TG', 'goog.i18n.NumberFormatSymbols_fur', 'goog.i18n.NumberFormatSymbols_fur_IT', 'goog.i18n.NumberFormatSymbols_ga', 'goog.i18n.NumberFormatSymbols_ga_IE', 'goog.i18n.NumberFormatSymbols_gaa', 'goog.i18n.NumberFormatSymbols_gaa_GH', 'goog.i18n.NumberFormatSymbols_gez', 'goog.i18n.NumberFormatSymbols_gez_ER', 'goog.i18n.NumberFormatSymbols_gez_ET', 'goog.i18n.NumberFormatSymbols_guz', 'goog.i18n.NumberFormatSymbols_guz_KE', 'goog.i18n.NumberFormatSymbols_gv', 'goog.i18n.NumberFormatSymbols_gv_GB', 'goog.i18n.NumberFormatSymbols_ha', 'goog.i18n.NumberFormatSymbols_ha_Arab', 'goog.i18n.NumberFormatSymbols_ha_Arab_NG', 'goog.i18n.NumberFormatSymbols_ha_Arab_SD', 'goog.i18n.NumberFormatSymbols_ha_GH', 'goog.i18n.NumberFormatSymbols_ha_Latn', 'goog.i18n.NumberFormatSymbols_ha_Latn_GH', 'goog.i18n.NumberFormatSymbols_ha_Latn_NE', 'goog.i18n.NumberFormatSymbols_ha_Latn_NG', 'goog.i18n.NumberFormatSymbols_ha_NE', 'goog.i18n.NumberFormatSymbols_ha_NG', 'goog.i18n.NumberFormatSymbols_ha_SD', 'goog.i18n.NumberFormatSymbols_haw', 'goog.i18n.NumberFormatSymbols_haw_US', 'goog.i18n.NumberFormatSymbols_hy', 'goog.i18n.NumberFormatSymbols_hy_AM', 'goog.i18n.NumberFormatSymbols_ia', 'goog.i18n.NumberFormatSymbols_ig', 'goog.i18n.NumberFormatSymbols_ig_NG', 'goog.i18n.NumberFormatSymbols_ii', 'goog.i18n.NumberFormatSymbols_ii_CN', 'goog.i18n.NumberFormatSymbols_it_CH', 'goog.i18n.NumberFormatSymbols_iu', 'goog.i18n.NumberFormatSymbols_jmc', 'goog.i18n.NumberFormatSymbols_jmc_TZ', 'goog.i18n.NumberFormatSymbols_ka', 'goog.i18n.NumberFormatSymbols_ka_GE', 'goog.i18n.NumberFormatSymbols_kab', 'goog.i18n.NumberFormatSymbols_kab_DZ', 'goog.i18n.NumberFormatSymbols_kaj', 'goog.i18n.NumberFormatSymbols_kaj_NG', 'goog.i18n.NumberFormatSymbols_kam', 'goog.i18n.NumberFormatSymbols_kam_KE', 'goog.i18n.NumberFormatSymbols_kcg', 'goog.i18n.NumberFormatSymbols_kcg_NG', 'goog.i18n.NumberFormatSymbols_kde', 'goog.i18n.NumberFormatSymbols_kde_TZ', 'goog.i18n.NumberFormatSymbols_kea', 'goog.i18n.NumberFormatSymbols_kea_CV', 'goog.i18n.NumberFormatSymbols_kfo', 'goog.i18n.NumberFormatSymbols_kfo_CI', 'goog.i18n.NumberFormatSymbols_khq', 'goog.i18n.NumberFormatSymbols_khq_ML', 'goog.i18n.NumberFormatSymbols_ki', 'goog.i18n.NumberFormatSymbols_ki_KE', 'goog.i18n.NumberFormatSymbols_kk', 'goog.i18n.NumberFormatSymbols_kk_Cyrl', 'goog.i18n.NumberFormatSymbols_kk_Cyrl_KZ', 'goog.i18n.NumberFormatSymbols_kk_KZ', 'goog.i18n.NumberFormatSymbols_kl', 'goog.i18n.NumberFormatSymbols_kl_GL', 'goog.i18n.NumberFormatSymbols_kln', 'goog.i18n.NumberFormatSymbols_kln_KE', 'goog.i18n.NumberFormatSymbols_km', 'goog.i18n.NumberFormatSymbols_km_KH', 'goog.i18n.NumberFormatSymbols_kok', 'goog.i18n.NumberFormatSymbols_kok_IN', 'goog.i18n.NumberFormatSymbols_kpe', 'goog.i18n.NumberFormatSymbols_kpe_GN', 'goog.i18n.NumberFormatSymbols_kpe_LR', 'goog.i18n.NumberFormatSymbols_ksb', 'goog.i18n.NumberFormatSymbols_ksb_TZ', 'goog.i18n.NumberFormatSymbols_ksh', 'goog.i18n.NumberFormatSymbols_ksh_DE', 'goog.i18n.NumberFormatSymbols_ku', 'goog.i18n.NumberFormatSymbols_ku_Arab', 'goog.i18n.NumberFormatSymbols_ku_Arab_IQ', 'goog.i18n.NumberFormatSymbols_ku_Arab_IR', 'goog.i18n.NumberFormatSymbols_ku_IQ', 'goog.i18n.NumberFormatSymbols_ku_IR', 'goog.i18n.NumberFormatSymbols_ku_Latn', 'goog.i18n.NumberFormatSymbols_ku_Latn_SY', 'goog.i18n.NumberFormatSymbols_ku_Latn_TR', 'goog.i18n.NumberFormatSymbols_ku_SY', 'goog.i18n.NumberFormatSymbols_ku_TR', 'goog.i18n.NumberFormatSymbols_kw', 'goog.i18n.NumberFormatSymbols_kw_GB', 'goog.i18n.NumberFormatSymbols_ky', 'goog.i18n.NumberFormatSymbols_ky_KG', 'goog.i18n.NumberFormatSymbols_lag', 'goog.i18n.NumberFormatSymbols_lag_TZ', 'goog.i18n.NumberFormatSymbols_lg', 'goog.i18n.NumberFormatSymbols_lg_UG', 'goog.i18n.NumberFormatSymbols_ln_CG', 'goog.i18n.NumberFormatSymbols_lo', 'goog.i18n.NumberFormatSymbols_lo_LA', 'goog.i18n.NumberFormatSymbols_luo', 'goog.i18n.NumberFormatSymbols_luo_KE', 'goog.i18n.NumberFormatSymbols_luy', 'goog.i18n.NumberFormatSymbols_luy_KE', 'goog.i18n.NumberFormatSymbols_mas', 'goog.i18n.NumberFormatSymbols_mas_KE', 'goog.i18n.NumberFormatSymbols_mas_TZ', 'goog.i18n.NumberFormatSymbols_mer', 'goog.i18n.NumberFormatSymbols_mer_KE', 'goog.i18n.NumberFormatSymbols_mfe', 'goog.i18n.NumberFormatSymbols_mfe_MU', 'goog.i18n.NumberFormatSymbols_mg', 'goog.i18n.NumberFormatSymbols_mg_MG', 'goog.i18n.NumberFormatSymbols_mi', 'goog.i18n.NumberFormatSymbols_mi_NZ', 'goog.i18n.NumberFormatSymbols_mk', 'goog.i18n.NumberFormatSymbols_mk_MK', 'goog.i18n.NumberFormatSymbols_mn', 'goog.i18n.NumberFormatSymbols_mn_CN', 'goog.i18n.NumberFormatSymbols_mn_Cyrl', 'goog.i18n.NumberFormatSymbols_mn_Cyrl_MN', 'goog.i18n.NumberFormatSymbols_mn_MN', 'goog.i18n.NumberFormatSymbols_mn_Mong', 'goog.i18n.NumberFormatSymbols_mn_Mong_CN', 'goog.i18n.NumberFormatSymbols_ms_BN', 'goog.i18n.NumberFormatSymbols_my', 'goog.i18n.NumberFormatSymbols_my_MM', 'goog.i18n.NumberFormatSymbols_naq', 'goog.i18n.NumberFormatSymbols_naq_NA', 'goog.i18n.NumberFormatSymbols_nb', 'goog.i18n.NumberFormatSymbols_nb_NO', 'goog.i18n.NumberFormatSymbols_nd', 'goog.i18n.NumberFormatSymbols_nd_ZW', 'goog.i18n.NumberFormatSymbols_nds', 'goog.i18n.NumberFormatSymbols_nds_DE', 'goog.i18n.NumberFormatSymbols_ne', 'goog.i18n.NumberFormatSymbols_ne_IN', 'goog.i18n.NumberFormatSymbols_ne_NP', 'goog.i18n.NumberFormatSymbols_nl_BE', 'goog.i18n.NumberFormatSymbols_nn', 'goog.i18n.NumberFormatSymbols_nn_NO', 'goog.i18n.NumberFormatSymbols_nr', 'goog.i18n.NumberFormatSymbols_nr_ZA', 'goog.i18n.NumberFormatSymbols_nso', 'goog.i18n.NumberFormatSymbols_nso_ZA', 'goog.i18n.NumberFormatSymbols_ny', 'goog.i18n.NumberFormatSymbols_ny_MW', 'goog.i18n.NumberFormatSymbols_nyn', 'goog.i18n.NumberFormatSymbols_nyn_UG', 'goog.i18n.NumberFormatSymbols_oc', 'goog.i18n.NumberFormatSymbols_oc_FR', 'goog.i18n.NumberFormatSymbols_om', 'goog.i18n.NumberFormatSymbols_om_ET', 'goog.i18n.NumberFormatSymbols_om_KE', 'goog.i18n.NumberFormatSymbols_pa', 'goog.i18n.NumberFormatSymbols_pa_Arab', 'goog.i18n.NumberFormatSymbols_pa_Arab_PK', 'goog.i18n.NumberFormatSymbols_pa_Guru', 'goog.i18n.NumberFormatSymbols_pa_Guru_IN', 'goog.i18n.NumberFormatSymbols_pa_IN', 'goog.i18n.NumberFormatSymbols_pa_PK', 'goog.i18n.NumberFormatSymbols_ps', 'goog.i18n.NumberFormatSymbols_ps_AF', 'goog.i18n.NumberFormatSymbols_pt_AO', 'goog.i18n.NumberFormatSymbols_pt_GW', 'goog.i18n.NumberFormatSymbols_pt_MZ', 'goog.i18n.NumberFormatSymbols_rm', 'goog.i18n.NumberFormatSymbols_rm_CH', 'goog.i18n.NumberFormatSymbols_ro_MD', 'goog.i18n.NumberFormatSymbols_rof', 'goog.i18n.NumberFormatSymbols_rof_TZ', 'goog.i18n.NumberFormatSymbols_ru_MD', 'goog.i18n.NumberFormatSymbols_ru_UA', 'goog.i18n.NumberFormatSymbols_rw', 'goog.i18n.NumberFormatSymbols_rw_RW', 'goog.i18n.NumberFormatSymbols_rwk', 'goog.i18n.NumberFormatSymbols_rwk_TZ', 'goog.i18n.NumberFormatSymbols_sa', 'goog.i18n.NumberFormatSymbols_sa_IN', 'goog.i18n.NumberFormatSymbols_saq', 'goog.i18n.NumberFormatSymbols_saq_KE', 'goog.i18n.NumberFormatSymbols_se', 'goog.i18n.NumberFormatSymbols_se_FI', 'goog.i18n.NumberFormatSymbols_se_NO', 'goog.i18n.NumberFormatSymbols_seh', 'goog.i18n.NumberFormatSymbols_seh_MZ', 'goog.i18n.NumberFormatSymbols_ses', 'goog.i18n.NumberFormatSymbols_ses_ML', 'goog.i18n.NumberFormatSymbols_sg', 'goog.i18n.NumberFormatSymbols_sg_CF', 'goog.i18n.NumberFormatSymbols_sh', 'goog.i18n.NumberFormatSymbols_sh_BA', 'goog.i18n.NumberFormatSymbols_sh_CS', 'goog.i18n.NumberFormatSymbols_sh_YU', 'goog.i18n.NumberFormatSymbols_shi', 'goog.i18n.NumberFormatSymbols_shi_Latn', 'goog.i18n.NumberFormatSymbols_shi_Latn_MA', 'goog.i18n.NumberFormatSymbols_shi_MA', 'goog.i18n.NumberFormatSymbols_shi_Tfng', 'goog.i18n.NumberFormatSymbols_shi_Tfng_MA', 'goog.i18n.NumberFormatSymbols_si', 'goog.i18n.NumberFormatSymbols_si_LK', 'goog.i18n.NumberFormatSymbols_sid', 'goog.i18n.NumberFormatSymbols_sid_ET', 'goog.i18n.NumberFormatSymbols_sn', 'goog.i18n.NumberFormatSymbols_sn_ZW', 'goog.i18n.NumberFormatSymbols_so', 'goog.i18n.NumberFormatSymbols_so_DJ', 'goog.i18n.NumberFormatSymbols_so_ET', 'goog.i18n.NumberFormatSymbols_so_KE', 'goog.i18n.NumberFormatSymbols_so_SO', 'goog.i18n.NumberFormatSymbols_sr_BA', 'goog.i18n.NumberFormatSymbols_sr_CS', 'goog.i18n.NumberFormatSymbols_sr_Cyrl', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_BA', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_CS', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_ME', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_YU', 'goog.i18n.NumberFormatSymbols_sr_Latn', 'goog.i18n.NumberFormatSymbols_sr_Latn_BA', 'goog.i18n.NumberFormatSymbols_sr_Latn_CS', 'goog.i18n.NumberFormatSymbols_sr_Latn_ME', 'goog.i18n.NumberFormatSymbols_sr_Latn_YU', 'goog.i18n.NumberFormatSymbols_sr_ME', 'goog.i18n.NumberFormatSymbols_sr_YU', 'goog.i18n.NumberFormatSymbols_ss', 'goog.i18n.NumberFormatSymbols_ss_SZ', 'goog.i18n.NumberFormatSymbols_ss_ZA', 'goog.i18n.NumberFormatSymbols_ssy', 'goog.i18n.NumberFormatSymbols_ssy_ER', 'goog.i18n.NumberFormatSymbols_st', 'goog.i18n.NumberFormatSymbols_st_LS', 'goog.i18n.NumberFormatSymbols_st_ZA', 'goog.i18n.NumberFormatSymbols_sv_FI', 'goog.i18n.NumberFormatSymbols_sw_KE', 'goog.i18n.NumberFormatSymbols_syr', 'goog.i18n.NumberFormatSymbols_syr_SY', 'goog.i18n.NumberFormatSymbols_ta_LK', 'goog.i18n.NumberFormatSymbols_teo', 'goog.i18n.NumberFormatSymbols_teo_KE', 'goog.i18n.NumberFormatSymbols_teo_UG', 'goog.i18n.NumberFormatSymbols_tg', 'goog.i18n.NumberFormatSymbols_tg_Cyrl', 'goog.i18n.NumberFormatSymbols_tg_Cyrl_TJ', 'goog.i18n.NumberFormatSymbols_tg_TJ', 'goog.i18n.NumberFormatSymbols_ti', 'goog.i18n.NumberFormatSymbols_ti_ER', 'goog.i18n.NumberFormatSymbols_ti_ET', 'goog.i18n.NumberFormatSymbols_tig', 'goog.i18n.NumberFormatSymbols_tig_ER', 'goog.i18n.NumberFormatSymbols_tn', 'goog.i18n.NumberFormatSymbols_tn_ZA', 'goog.i18n.NumberFormatSymbols_to', 'goog.i18n.NumberFormatSymbols_to_TO', 'goog.i18n.NumberFormatSymbols_trv', 'goog.i18n.NumberFormatSymbols_trv_TW', 'goog.i18n.NumberFormatSymbols_ts', 'goog.i18n.NumberFormatSymbols_ts_ZA', 'goog.i18n.NumberFormatSymbols_tt', 'goog.i18n.NumberFormatSymbols_tt_RU', 'goog.i18n.NumberFormatSymbols_tzm', 'goog.i18n.NumberFormatSymbols_tzm_Latn', 'goog.i18n.NumberFormatSymbols_tzm_Latn_MA', 'goog.i18n.NumberFormatSymbols_tzm_MA', 'goog.i18n.NumberFormatSymbols_ug', 'goog.i18n.NumberFormatSymbols_ug_Arab', 'goog.i18n.NumberFormatSymbols_ug_Arab_CN', 'goog.i18n.NumberFormatSymbols_ug_CN', 'goog.i18n.NumberFormatSymbols_ur_IN', 'goog.i18n.NumberFormatSymbols_uz', 'goog.i18n.NumberFormatSymbols_uz_AF', 'goog.i18n.NumberFormatSymbols_uz_Arab', 'goog.i18n.NumberFormatSymbols_uz_Arab_AF', 'goog.i18n.NumberFormatSymbols_uz_Cyrl', 'goog.i18n.NumberFormatSymbols_uz_Cyrl_UZ', 'goog.i18n.NumberFormatSymbols_uz_Latn', 'goog.i18n.NumberFormatSymbols_uz_Latn_UZ', 'goog.i18n.NumberFormatSymbols_uz_UZ', 'goog.i18n.NumberFormatSymbols_ve', 'goog.i18n.NumberFormatSymbols_ve_ZA', 'goog.i18n.NumberFormatSymbols_vun', 'goog.i18n.NumberFormatSymbols_vun_TZ', 'goog.i18n.NumberFormatSymbols_wal', 'goog.i18n.NumberFormatSymbols_wal_ET', 'goog.i18n.NumberFormatSymbols_wo', 'goog.i18n.NumberFormatSymbols_wo_Latn', 'goog.i18n.NumberFormatSymbols_wo_Latn_SN', 'goog.i18n.NumberFormatSymbols_wo_SN', 'goog.i18n.NumberFormatSymbols_xh', 'goog.i18n.NumberFormatSymbols_xh_ZA', 'goog.i18n.NumberFormatSymbols_xog', 'goog.i18n.NumberFormatSymbols_xog_UG', 'goog.i18n.NumberFormatSymbols_yo', 'goog.i18n.NumberFormatSymbols_yo_NG', 'goog.i18n.NumberFormatSymbols_zh_Hans_HK', 'goog.i18n.NumberFormatSymbols_zh_Hans_MO', 'goog.i18n.NumberFormatSymbols_zh_Hans_SG', 'goog.i18n.NumberFormatSymbols_zh_Hant', 'goog.i18n.NumberFormatSymbols_zh_Hant_HK', 'goog.i18n.NumberFormatSymbols_zh_Hant_MO', 'goog.i18n.NumberFormatSymbols_zh_Hant_TW', 'goog.i18n.NumberFormatSymbols_zh_MO', 'goog.i18n.NumberFormatSymbols_zh_SG', 'goog.i18n.NumberFormatSymbols_zu', 'goog.i18n.NumberFormatSymbols_zu_ZA'], ['goog.i18n.NumberFormatSymbols']); goog.addDependency('i18n/pluralrules.js', ['goog.i18n.pluralRules'], []); goog.addDependency('i18n/timezone.js', ['goog.i18n.TimeZone'], ['goog.array', 'goog.date.DateLike', 'goog.string']); goog.addDependency('i18n/uchar.js', ['goog.i18n.uChar'], []); -goog.addDependency('iter/iter.js', ['goog.iter', 'goog.iter.Iterator', 'goog.iter.StopIteration'], ['goog.array']); +goog.addDependency('iter/iter.js', ['goog.iter', 'goog.iter.Iterator', 'goog.iter.StopIteration'], ['goog.array', 'goog.asserts']); goog.addDependency('json/json.js', ['goog.json', 'goog.json.Serializer'], []); goog.addDependency('locale/countries.js', ['goog.locale.countries'], []); goog.addDependency('locale/defaultlocalenameconstants.js', ['goog.locale.defaultLocaleNameConstants'], []); @@ -289,9 +304,21 @@ goog.addDependency('math/size.js', ['goog.math.Size'], []); goog.addDependency('math/vec2.js', ['goog.math.Vec2'], ['goog.math', 'goog.math.Coordinate']); goog.addDependency('math/vec3.js', ['goog.math.Vec3'], ['goog.math', 'goog.math.Coordinate3']); goog.addDependency('memoize/memoize.js', ['goog.memoize'], []); -goog.addDependency('messaging/bufferedchannel.js', ['goog.messaging.BufferedChannel', 'goog.messaging.BufferedChannel.ReservedServiceNameError'], ['goog.Timer', 'goog.Uri', 'goog.debug.Error', 'goog.debug.Logger', 'goog.events', 'goog.messaging.MessageChannel']); +goog.addDependency('messaging/abstractchannel.js', ['goog.messaging.AbstractChannel'], ['goog.Disposable', 'goog.debug', 'goog.debug.Logger', 'goog.json', 'goog.messaging.MessageChannel']); +goog.addDependency('messaging/bufferedchannel.js', ['goog.messaging.BufferedChannel'], ['goog.Timer', 'goog.Uri', 'goog.debug.Error', 'goog.debug.Logger', 'goog.events', 'goog.messaging.MessageChannel', 'goog.messaging.MultiChannel']); +goog.addDependency('messaging/deferredchannel.js', ['goog.messaging.DeferredChannel'], ['goog.async.Deferred', 'goog.messaging.MessageChannel']); +goog.addDependency('messaging/loggerclient.js', ['goog.messaging.LoggerClient'], ['goog.Disposable', 'goog.debug', 'goog.debug.LogManager', 'goog.debug.Logger']); +goog.addDependency('messaging/loggerserver.js', ['goog.messaging.LoggerServer'], ['goog.Disposable', 'goog.debug.Logger']); goog.addDependency('messaging/messagechannel.js', ['goog.messaging.MessageChannel'], []); goog.addDependency('messaging/messaging.js', ['goog.messaging'], ['goog.messaging.MessageChannel']); +goog.addDependency('messaging/multichannel.js', ['goog.messaging.MultiChannel', 'goog.messaging.MultiChannel.VirtualChannel'], ['goog.Disposable', 'goog.debug.Logger', 'goog.events.EventHandler', 'goog.messaging.MessageChannel', 'goog.object']); +goog.addDependency('messaging/portcaller.js', ['goog.messaging.PortCaller'], ['goog.Disposable', 'goog.async.Deferred', 'goog.messaging.DeferredChannel', 'goog.messaging.PortChannel', 'goog.messaging.PortNetwork', 'goog.object']); +goog.addDependency('messaging/portchannel.js', ['goog.messaging.PortChannel'], ['goog.Timer', 'goog.array', 'goog.async.Deferred', 'goog.debug', 'goog.debug.Logger', 'goog.dom', 'goog.dom.DomHelper', 'goog.events', 'goog.events.EventType', 'goog.json', 'goog.messaging.AbstractChannel', 'goog.messaging.DeferredChannel', 'goog.object', 'goog.string']); +goog.addDependency('messaging/portnetwork.js', ['goog.messaging.PortNetwork'], []); +goog.addDependency('messaging/portoperator.js', ['goog.messaging.PortOperator'], ['goog.Disposable', 'goog.asserts', 'goog.debug.Logger', 'goog.messaging.PortChannel', 'goog.messaging.PortNetwork', 'goog.object']); +goog.addDependency('messaging/testdata/portchannel_worker.js', ['goog.messaging.testdata.portchannel_worker'], ['goog.messaging.PortChannel']); +goog.addDependency('messaging/testdata/portnetwork_worker1.js', ['goog.messaging.testdata.portnetwork_worker1'], ['goog.messaging.PortCaller', 'goog.messaging.PortChannel']); +goog.addDependency('messaging/testdata/portnetwork_worker2.js', ['goog.messaging.testdata.portnetwork_worker2'], ['goog.messaging.PortCaller', 'goog.messaging.PortChannel']); goog.addDependency('module/abstractmoduleloader.js', ['goog.module.AbstractModuleLoader'], []); goog.addDependency('module/basemodule.js', ['goog.module.BaseModule'], ['goog.Disposable']); goog.addDependency('module/basemoduleloader.js', ['goog.module.BaseModuleLoader'], ['goog.Disposable', 'goog.debug.Logger', 'goog.module.AbstractModuleLoader']); @@ -304,17 +331,19 @@ goog.addDependency('module/modulemanager.js', ['goog.module.ModuleManager', 'goo goog.addDependency('module/testdata/modA_1.js', ['goog.module.testdata.modA_1'], []); goog.addDependency('module/testdata/modA_2.js', ['goog.module.testdata.modA_2'], ['goog.module.ModuleManager']); goog.addDependency('module/testdata/modB_1.js', ['goog.module.testdata.modB_1'], ['goog.module.ModuleManager']); -goog.addDependency('net/browserchannel.js', ['goog.net.BrowserChannel', 'goog.net.BrowserChannel.Error', 'goog.net.BrowserChannel.Handler', 'goog.net.BrowserChannel.LogSaver', 'goog.net.BrowserChannel.QueuedMap', 'goog.net.BrowserChannel.StatEvent', 'goog.net.BrowserChannel.TimingEvent'], ['goog.Uri', 'goog.array', 'goog.debug.TextFormatter', 'goog.events.Event', 'goog.events.EventTarget', 'goog.json', 'goog.net.BrowserTestChannel', 'goog.net.ChannelDebug', 'goog.net.ChannelRequest', 'goog.net.XhrIo', 'goog.string', 'goog.structs.CircularBuffer', 'goog.userAgent']); -goog.addDependency('net/browsertestchannel.js', ['goog.net.BrowserTestChannel'], ['goog.net.ChannelDebug', 'goog.net.ChannelRequest', 'goog.userAgent']); +goog.addDependency('net/browserchannel.js', ['goog.net.BrowserChannel', 'goog.net.BrowserChannel.Error', 'goog.net.BrowserChannel.Event', 'goog.net.BrowserChannel.Handler', 'goog.net.BrowserChannel.LogSaver', 'goog.net.BrowserChannel.QueuedMap', 'goog.net.BrowserChannel.Stat', 'goog.net.BrowserChannel.StatEvent', 'goog.net.BrowserChannel.State', 'goog.net.BrowserChannel.TimingEvent'], ['goog.Uri', 'goog.array', 'goog.debug.Logger', 'goog.debug.TextFormatter', 'goog.events.Event', 'goog.events.EventTarget', 'goog.json', 'goog.net.BrowserTestChannel', 'goog.net.ChannelDebug', 'goog.net.ChannelRequest', 'goog.net.ChannelRequest.Error', 'goog.net.XhrIo', 'goog.net.tmpnetwork', 'goog.string', 'goog.structs', 'goog.structs.CircularBuffer', 'goog.userAgent']); +goog.addDependency('net/browsertestchannel.js', ['goog.net.BrowserTestChannel'], ['goog.json', 'goog.net.ChannelRequest.Error', 'goog.net.tmpnetwork', 'goog.userAgent']); goog.addDependency('net/bulkloader.js', ['goog.net.BulkLoader'], ['goog.debug.Logger', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.net.BulkLoaderHelper', 'goog.net.EventType', 'goog.net.XhrIo']); goog.addDependency('net/bulkloaderhelper.js', ['goog.net.BulkLoaderHelper'], ['goog.Disposable', 'goog.debug.Logger']); goog.addDependency('net/channeldebug.js', ['goog.net.ChannelDebug'], ['goog.debug.Logger', 'goog.json']); -goog.addDependency('net/channelrequest.js', ['goog.net.ChannelRequest'], ['goog.Timer', 'goog.Uri', 'goog.events.EventHandler', 'goog.net.XhrIo', 'goog.net.XmlHttp', 'goog.net.tmpnetwork', 'goog.object', 'goog.userAgent']); -goog.addDependency('net/cookies.js', ['goog.net.cookies'], ['goog.userAgent']); -goog.addDependency('net/crossdomainrpc.js', ['goog.net.CrossDomainRpc'], ['goog.Uri.QueryData', 'goog.debug.Logger', 'goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.json', 'goog.net.EventType', 'goog.userAgent']); +goog.addDependency('net/channelrequest.js', ['goog.net.ChannelRequest', 'goog.net.ChannelRequest.Error'], ['goog.Timer', 'goog.events', 'goog.events.EventHandler', 'goog.net.EventType', 'goog.net.XmlHttp.ReadyState', 'goog.object', 'goog.userAgent']); +goog.addDependency('net/cookies.js', ['goog.net.Cookies', 'goog.net.cookies'], ['goog.userAgent']); +goog.addDependency('net/crossdomainrpc.js', ['goog.net.CrossDomainRpc'], ['goog.Uri.QueryData', 'goog.debug.Logger', 'goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.json', 'goog.net.EventType', 'goog.net.HttpStatus', 'goog.userAgent']); goog.addDependency('net/errorcode.js', ['goog.net.ErrorCode'], []); goog.addDependency('net/eventtype.js', ['goog.net.EventType'], []); -goog.addDependency('net/iframeio.js', ['goog.net.IframeIo', 'goog.net.IframeIo.IncrementalDataEvent'], ['goog.Timer', 'goog.Uri', 'goog.debug', 'goog.debug.Logger', 'goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.json', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.xhrMonitor', 'goog.string', 'goog.structs', 'goog.userAgent']); +goog.addDependency('net/filedownloader.js', ['goog.net.FileDownloader', 'goog.net.FileDownloader.Error'], ['goog.Disposable', 'goog.async.Deferred', 'goog.crypt.hash32', 'goog.debug.Error', 'goog.events.EventHandler', 'goog.fs', 'goog.fs.DirectoryEntry.Behavior', 'goog.fs.Error.ErrorCode', 'goog.fs.FileSaver.EventType', 'goog.net.EventType', 'goog.net.XhrIo.ResponseType', 'goog.net.XhrIoPool']); +goog.addDependency('net/httpstatus.js', ['goog.net.HttpStatus'], []); +goog.addDependency('net/iframeio.js', ['goog.net.IframeIo', 'goog.net.IframeIo.IncrementalDataEvent'], ['goog.Timer', 'goog.Uri', 'goog.debug', 'goog.debug.Logger', 'goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.json', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.xhrMonitor', 'goog.reflect', 'goog.string', 'goog.structs', 'goog.userAgent']); goog.addDependency('net/iframeloadmonitor.js', ['goog.net.IframeLoadMonitor'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.userAgent']); goog.addDependency('net/imageloader.js', ['goog.net.ImageLoader'], ['goog.dom', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.net.EventType', 'goog.object', 'goog.userAgent']); goog.addDependency('net/jsonp.js', ['goog.net.Jsonp'], ['goog.Uri', 'goog.dom']); @@ -323,8 +352,9 @@ goog.addDependency('net/mockxhrlite.js', ['goog.net.MockXhrLite'], ['goog.testin goog.addDependency('net/multiiframeloadmonitor.js', ['goog.net.MultiIframeLoadMonitor'], ['goog.net.IframeLoadMonitor']); goog.addDependency('net/networktester.js', ['goog.net.NetworkTester'], ['goog.Timer', 'goog.Uri', 'goog.debug.Logger']); goog.addDependency('net/tmpnetwork.js', ['goog.net.tmpnetwork'], ['goog.Uri', 'goog.net.ChannelDebug']); +goog.addDependency('net/websocket.js', ['goog.net.WebSocket', 'goog.net.WebSocket.ErrorEvent', 'goog.net.WebSocket.EventType', 'goog.net.WebSocket.MessageEvent'], ['goog.Timer', 'goog.asserts', 'goog.debug.Logger', 'goog.debug.entryPointRegistry', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget']); goog.addDependency('net/wrapperxmlhttpfactory.js', ['goog.net.WrapperXmlHttpFactory'], ['goog.net.XmlHttpFactory']); -goog.addDependency('net/xhrio.js', ['goog.net.XhrIo'], ['goog.Timer', 'goog.debug.Logger', 'goog.debug.entryPointRegistry', 'goog.debug.errorHandlerWeakDep', 'goog.events.EventTarget', 'goog.json', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.XmlHttp', 'goog.net.xhrMonitor', 'goog.structs', 'goog.structs.Map', 'goog.uri.utils']); +goog.addDependency('net/xhrio.js', ['goog.net.XhrIo', 'goog.net.XhrIo.ResponseType'], ['goog.Timer', 'goog.debug.Logger', 'goog.debug.entryPointRegistry', 'goog.debug.errorHandlerWeakDep', 'goog.events.EventTarget', 'goog.json', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.HttpStatus', 'goog.net.XmlHttp', 'goog.net.xhrMonitor', 'goog.object', 'goog.structs', 'goog.structs.Map', 'goog.uri.utils']); goog.addDependency('net/xhriopool.js', ['goog.net.XhrIoPool'], ['goog.net.XhrIo', 'goog.structs', 'goog.structs.PriorityPool']); goog.addDependency('net/xhrlite.js', ['goog.net.XhrLite'], ['goog.net.XhrIo']); goog.addDependency('net/xhrlitepool.js', ['goog.net.XhrLitePool'], ['goog.net.XhrIoPool']); @@ -332,20 +362,20 @@ goog.addDependency('net/xhrmanager.js', ['goog.net.XhrManager', 'goog.net.XhrMan goog.addDependency('net/xhrmonitor.js', ['goog.net.xhrMonitor'], ['goog.array', 'goog.debug.Logger', 'goog.userAgent']); goog.addDependency('net/xmlhttp.js', ['goog.net.DefaultXmlHttpFactory', 'goog.net.XmlHttp', 'goog.net.XmlHttp.OptionType', 'goog.net.XmlHttp.ReadyState'], ['goog.net.WrapperXmlHttpFactory', 'goog.net.XmlHttpFactory']); goog.addDependency('net/xmlhttpfactory.js', ['goog.net.XmlHttpFactory'], []); -goog.addDependency('net/xpc/crosspagechannel.js', ['goog.net.xpc.CrossPageChannel', 'goog.net.xpc.CrossPageChannel.Role'], ['goog.Disposable', 'goog.Uri', 'goog.dom', 'goog.events', 'goog.json', 'goog.messaging.MessageChannel', 'goog.net.xpc', 'goog.net.xpc.FrameElementMethodTransport', 'goog.net.xpc.IframePollingTransport', 'goog.net.xpc.IframeRelayTransport', 'goog.net.xpc.NativeMessagingTransport', 'goog.net.xpc.NixTransport', 'goog.net.xpc.Transport', 'goog.userAgent']); +goog.addDependency('net/xpc/crosspagechannel.js', ['goog.net.xpc.CrossPageChannel', 'goog.net.xpc.CrossPageChannel.Role'], ['goog.Disposable', 'goog.Uri', 'goog.dom', 'goog.events', 'goog.json', 'goog.messaging.AbstractChannel', 'goog.net.xpc', 'goog.net.xpc.FrameElementMethodTransport', 'goog.net.xpc.IframePollingTransport', 'goog.net.xpc.IframeRelayTransport', 'goog.net.xpc.NativeMessagingTransport', 'goog.net.xpc.NixTransport', 'goog.net.xpc.Transport', 'goog.userAgent']); goog.addDependency('net/xpc/frameelementmethodtransport.js', ['goog.net.xpc.FrameElementMethodTransport'], ['goog.net.xpc', 'goog.net.xpc.Transport']); goog.addDependency('net/xpc/iframepollingtransport.js', ['goog.net.xpc.IframePollingTransport', 'goog.net.xpc.IframePollingTransport.Receiver', 'goog.net.xpc.IframePollingTransport.Sender'], ['goog.array', 'goog.dom', 'goog.net.xpc', 'goog.net.xpc.Transport', 'goog.userAgent']); goog.addDependency('net/xpc/iframerelaytransport.js', ['goog.net.xpc.IframeRelayTransport'], ['goog.dom', 'goog.events', 'goog.net.xpc', 'goog.net.xpc.Transport', 'goog.userAgent']); goog.addDependency('net/xpc/nativemessagingtransport.js', ['goog.net.xpc.NativeMessagingTransport'], ['goog.events', 'goog.net.xpc', 'goog.net.xpc.Transport']); -goog.addDependency('net/xpc/nixtransport.js', ['goog.net.xpc.NixTransport'], ['goog.net.xpc', 'goog.net.xpc.Transport']); +goog.addDependency('net/xpc/nixtransport.js', ['goog.net.xpc.NixTransport'], ['goog.net.xpc', 'goog.net.xpc.Transport', 'goog.reflect']); goog.addDependency('net/xpc/relay.js', ['goog.net.xpc.relay'], []); goog.addDependency('net/xpc/transport.js', ['goog.net.xpc.Transport'], ['goog.Disposable', 'goog.net.xpc']); -goog.addDependency('net/xpc/xpc.js', ['goog.net.xpc'], ['goog.debug.Logger']); +goog.addDependency('net/xpc/xpc.js', ['goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.ChannelStates', 'goog.net.xpc.TransportNames', 'goog.net.xpc.TransportTypes', 'goog.net.xpc.UriCfgFields'], ['goog.debug.Logger']); goog.addDependency('object/object.js', ['goog.object'], []); goog.addDependency('positioning/absoluteposition.js', ['goog.positioning.AbsolutePosition'], ['goog.math.Box', 'goog.math.Coordinate', 'goog.math.Size', 'goog.positioning', 'goog.positioning.AbstractPosition']); goog.addDependency('positioning/abstractposition.js', ['goog.positioning.AbstractPosition'], ['goog.math.Box', 'goog.math.Size', 'goog.positioning.Corner']); goog.addDependency('positioning/anchoredposition.js', ['goog.positioning.AnchoredPosition'], ['goog.math.Box', 'goog.positioning', 'goog.positioning.AbstractPosition']); -goog.addDependency('positioning/anchoredviewportposition.js', ['goog.positioning.AnchoredViewportPosition'], ['goog.math.Box', 'goog.positioning', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus']); +goog.addDependency('positioning/anchoredviewportposition.js', ['goog.positioning.AnchoredViewportPosition'], ['goog.functions', 'goog.math.Box', 'goog.positioning', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus']); goog.addDependency('positioning/clientposition.js', ['goog.positioning.ClientPosition'], ['goog.math.Box', 'goog.math.Coordinate', 'goog.math.Size', 'goog.positioning', 'goog.positioning.AbstractPosition']); goog.addDependency('positioning/menuanchoredposition.js', ['goog.positioning.MenuAnchoredPosition'], ['goog.math.Box', 'goog.math.Size', 'goog.positioning', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow']); goog.addDependency('positioning/positioning.js', ['goog.positioning', 'goog.positioning.Corner', 'goog.positioning.CornerBit', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus'], ['goog.dom', 'goog.dom.TagName', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.Size', 'goog.style']); @@ -362,16 +392,38 @@ goog.addDependency('proto2/package_test.pb.js', ['someprotopackage.TestPackageTy goog.addDependency('proto2/pbliteserializer.js', ['goog.proto2.PbLiteSerializer'], ['goog.proto2.LazyDeserializer', 'goog.proto2.Util']); goog.addDependency('proto2/serializer.js', ['goog.proto2.Serializer'], ['goog.proto2.Descriptor', 'goog.proto2.FieldDescriptor', 'goog.proto2.Message', 'goog.proto2.Util']); goog.addDependency('proto2/test.pb.js', ['proto2.TestAllTypes', 'proto2.TestAllTypes.NestedEnum', 'proto2.TestAllTypes.NestedMessage', 'proto2.TestAllTypes.OptionalGroup', 'proto2.TestAllTypes.RepeatedGroup'], ['goog.proto2.Message']); +goog.addDependency('proto2/textformatserializer.js', ['goog.proto2.TextFormatSerializer', 'goog.proto2.TextFormatSerializer.Parser'], ['goog.json', 'goog.proto2.Serializer', 'goog.proto2.Util', 'goog.string']); goog.addDependency('proto2/util.js', ['goog.proto2.Util'], ['goog.asserts']); goog.addDependency('pubsub/pubsub.js', ['goog.pubsub.PubSub'], ['goog.Disposable', 'goog.array']); goog.addDependency('reflect/reflect.js', ['goog.reflect'], []); +goog.addDependency('soy/renderer.js', ['goog.soy.InjectedDataSupplier', 'goog.soy.Renderer'], ['goog.dom', 'goog.soy']); +goog.addDependency('soy/soy.js', ['goog.soy'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName']); +goog.addDependency('soy/soy_test.js', ['goog.soy.testHelper'], ['goog.dom', 'goog.string', 'goog.userAgent']); goog.addDependency('spell/spellcheck.js', ['goog.spell.SpellCheck', 'goog.spell.SpellCheck.WordChangedEvent'], ['goog.Timer', 'goog.events.EventTarget', 'goog.structs.Set']); +goog.addDependency('storage/collectablestorage.js', ['goog.storage.CollectableStorage'], ['goog.array', 'goog.asserts', 'goog.iter', 'goog.storage.ErrorCode', 'goog.storage.ExpiringStorage', 'goog.storage.RichStorage.Wrapper', 'goog.storage.mechanism.IterableMechanism']); +goog.addDependency('storage/encryptedstorage.js', ['goog.storage.EncryptedStorage'], ['goog.crypt', 'goog.crypt.Arc4', 'goog.crypt.Sha1', 'goog.crypt.base64', 'goog.json', 'goog.json.Serializer', 'goog.storage.CollectableStorage', 'goog.storage.ErrorCode', 'goog.storage.RichStorage', 'goog.storage.RichStorage.Wrapper', 'goog.storage.mechanism.IterableMechanism']); +goog.addDependency('storage/errorcode.js', ['goog.storage.ErrorCode'], []); +goog.addDependency('storage/expiringstorage.js', ['goog.storage.ExpiringStorage'], ['goog.storage.RichStorage', 'goog.storage.RichStorage.Wrapper', 'goog.storage.mechanism.Mechanism']); +goog.addDependency('storage/mechanism/errorcode.js', ['goog.storage.mechanism.ErrorCode'], []); +goog.addDependency('storage/mechanism/html5localstorage.js', ['goog.storage.mechanism.HTML5LocalStorage'], ['goog.asserts', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.storage.mechanism.ErrorCode', 'goog.storage.mechanism.IterableMechanism']); +goog.addDependency('storage/mechanism/ieuserdata.js', ['goog.storage.mechanism.IEUserData'], ['goog.asserts', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.storage.mechanism.ErrorCode', 'goog.storage.mechanism.IterableMechanism', 'goog.structs.Map', 'goog.userAgent']); +goog.addDependency('storage/mechanism/iterablemechanism.js', ['goog.storage.mechanism.IterableMechanism'], ['goog.array', 'goog.asserts', 'goog.iter', 'goog.iter.Iterator', 'goog.storage.mechanism.Mechanism']); +goog.addDependency('storage/mechanism/iterablemechanism_test.js', ['goog.storage.mechanism.iterablemechanism_test'], ['goog.iter.Iterator', 'goog.storage.mechanism.IterableMechanism', 'goog.testing.asserts']); +goog.addDependency('storage/mechanism/mechanism.js', ['goog.storage.mechanism.Mechanism'], []); +goog.addDependency('storage/mechanism/mechanism_test.js', ['goog.storage.mechanism.mechanism_test'], ['goog.storage.mechanism.ErrorCode', 'goog.storage.mechanism.HTML5LocalStorage', 'goog.storage.mechanism.Mechanism', 'goog.testing.asserts', 'goog.userAgent.product', 'goog.userAgent.product.isVersion']); +goog.addDependency('storage/mechanism/mechanismfactory.js', ['goog.storage.mechanism.mechanismfactory'], ['goog.storage.mechanism.HTML5LocalStorage', 'goog.storage.mechanism.IEUserData', 'goog.storage.mechanism.IterableMechanism', 'goog.storage.mechanism.PrefixedMechanism']); +goog.addDependency('storage/mechanism/prefixedmechanism.js', ['goog.storage.mechanism.PrefixedMechanism'], ['goog.iter.Iterator', 'goog.storage.mechanism.IterableMechanism']); +goog.addDependency('storage/mechanism/prefixedmechanism_test.js', ['goog.storage.mechanism.prefixedmechanism_test'], ['goog.iter.Iterator', 'goog.storage.mechanism.IterableMechanism', 'goog.testing.asserts']); +goog.addDependency('storage/richstorage.js', ['goog.storage.RichStorage', 'goog.storage.RichStorage.Wrapper'], ['goog.storage.ErrorCode', 'goog.storage.Storage', 'goog.storage.mechanism.Mechanism']); +goog.addDependency('storage/storage.js', ['goog.storage.Storage'], ['goog.json', 'goog.json.Serializer', 'goog.storage.ErrorCode', 'goog.storage.mechanism.Mechanism']); +goog.addDependency('storage/storage_test.js', ['goog.storage.storage_test'], ['goog.storage.Storage', 'goog.structs.Map', 'goog.testing.asserts']); goog.addDependency('string/path.js', ['goog.string.path'], ['goog.array', 'goog.string']); goog.addDependency('string/string.js', ['goog.string', 'goog.string.Unicode'], []); goog.addDependency('string/stringbuffer.js', ['goog.string.StringBuffer'], ['goog.userAgent.jscript']); goog.addDependency('string/stringformat.js', ['goog.string.format'], ['goog.string']); -goog.addDependency('structs/avltree.js', ['goog.structs.AvlTree', 'goog.structs.AvlTree.Node'], ['goog.structs']); +goog.addDependency('structs/avltree.js', ['goog.structs.AvlTree', 'goog.structs.AvlTree.Node'], ['goog.structs', 'goog.structs.Collection']); goog.addDependency('structs/circularbuffer.js', ['goog.structs.CircularBuffer'], []); +goog.addDependency('structs/collection.js', ['goog.structs.Collection'], []); goog.addDependency('structs/heap.js', ['goog.structs.Heap'], ['goog.array', 'goog.structs.Node']); goog.addDependency('structs/inversionmap.js', ['goog.structs.InversionMap'], ['goog.array']); goog.addDependency('structs/linkedmap.js', ['goog.structs.LinkedMap'], ['goog.structs.Map']); @@ -382,18 +434,20 @@ goog.addDependency('structs/prioritypool.js', ['goog.structs.PriorityPool'], ['g goog.addDependency('structs/priorityqueue.js', ['goog.structs.PriorityQueue'], ['goog.structs', 'goog.structs.Heap']); goog.addDependency('structs/quadtree.js', ['goog.structs.QuadTree', 'goog.structs.QuadTree.Node', 'goog.structs.QuadTree.Point'], ['goog.math.Coordinate']); goog.addDependency('structs/queue.js', ['goog.structs.Queue'], ['goog.array']); -goog.addDependency('structs/set.js', ['goog.structs.Set'], ['goog.structs', 'goog.structs.Map']); +goog.addDependency('structs/set.js', ['goog.structs.Set'], ['goog.structs', 'goog.structs.Collection', 'goog.structs.Map']); goog.addDependency('structs/simplepool.js', ['goog.structs.SimplePool'], ['goog.Disposable']); goog.addDependency('structs/stringset.js', ['goog.structs.StringSet'], ['goog.iter']); goog.addDependency('structs/structs.js', ['goog.structs'], ['goog.array', 'goog.object']); goog.addDependency('structs/treenode.js', ['goog.structs.TreeNode'], ['goog.array', 'goog.asserts', 'goog.structs.Node']); goog.addDependency('structs/trie.js', ['goog.structs.Trie'], ['goog.object', 'goog.structs']); goog.addDependency('style/cursor.js', ['goog.style.cursor'], ['goog.userAgent']); -goog.addDependency('style/style.js', ['goog.style'], ['goog.array', 'goog.dom', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.math.Size', 'goog.object', 'goog.userAgent']); +goog.addDependency('style/style.js', ['goog.style'], ['goog.array', 'goog.dom', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.math.Size', 'goog.object', 'goog.string', 'goog.userAgent']); goog.addDependency('testing/asserts.js', ['goog.testing.JsUnitException', 'goog.testing.asserts'], ['goog.testing.stacktrace']); goog.addDependency('testing/async/mockcontrol.js', ['goog.testing.async.MockControl'], ['goog.asserts', 'goog.async.Deferred', 'goog.debug', 'goog.testing.asserts', 'goog.testing.mockmatchers.IgnoreArgument']); goog.addDependency('testing/asynctestcase.js', ['goog.testing.AsyncTestCase', 'goog.testing.AsyncTestCase.ControlBreakingException'], ['goog.testing.TestCase', 'goog.testing.TestCase.Test', 'goog.testing.asserts']); goog.addDependency('testing/benchmark.js', ['goog.testing.benchmark'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.PerformanceTable', 'goog.testing.PerformanceTimer', 'goog.testing.TestCase']); +goog.addDependency('testing/benchmarks/jsbinarysizebutton.js', ['goog.ui.benchmarks.jsbinarysizebutton'], ['goog.array', 'goog.dom', 'goog.events', 'goog.ui.Button', 'goog.ui.ButtonSide', 'goog.ui.Component.EventType', 'goog.ui.CustomButton']); +goog.addDependency('testing/benchmarks/jsbinarysizetoolbar.js', ['goog.ui.benchmarks.jsbinarysizetoolbar'], ['goog.array', 'goog.dom', 'goog.events', 'goog.object', 'goog.ui.Component.EventType', 'goog.ui.Option', 'goog.ui.Toolbar', 'goog.ui.ToolbarButton', 'goog.ui.ToolbarSelect', 'goog.ui.ToolbarSeparator']); goog.addDependency('testing/continuationtestcase.js', ['goog.testing.ContinuationTestCase', 'goog.testing.ContinuationTestCase.Step', 'goog.testing.ContinuationTestCase.Test'], ['goog.array', 'goog.events.EventHandler', 'goog.testing.TestCase', 'goog.testing.TestCase.Test', 'goog.testing.asserts']); goog.addDependency('testing/deferredtestcase.js', ['goog.testing.DeferredTestCase'], ['goog.async.Deferred', 'goog.testing.AsyncTestCase', 'goog.testing.TestCase']); goog.addDependency('testing/dom.js', ['goog.testing.dom'], ['goog.dom', 'goog.dom.NodeIterator', 'goog.dom.NodeType', 'goog.dom.TagIterator', 'goog.dom.TagName', 'goog.dom.classes', 'goog.iter', 'goog.object', 'goog.string', 'goog.style', 'goog.testing.asserts', 'goog.userAgent']); @@ -401,14 +455,23 @@ goog.addDependency('testing/editor/dom.js', ['goog.testing.editor.dom'], ['goog. goog.addDependency('testing/editor/fieldmock.js', ['goog.testing.editor.FieldMock'], ['goog.dom', 'goog.dom.Range', 'goog.editor.Field', 'goog.testing.LooseMock']); goog.addDependency('testing/editor/testhelper.js', ['goog.testing.editor.TestHelper'], ['goog.Disposable', 'goog.dom.Range', 'goog.editor.BrowserFeature', 'goog.testing.dom']); goog.addDependency('testing/events/eventobserver.js', ['goog.testing.events.EventObserver'], ['goog.array']); -goog.addDependency('testing/events/events.js', ['goog.testing.events', 'goog.testing.events.Event'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.BrowserEvent.MouseButton', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.object', 'goog.userAgent']); +goog.addDependency('testing/events/events.js', ['goog.testing.events', 'goog.testing.events.Event'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.BrowserEvent.MouseButton', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.object', 'goog.style', 'goog.userAgent']); goog.addDependency('testing/events/matchers.js', ['goog.testing.events.EventMatcher'], ['goog.events.Event', 'goog.testing.mockmatchers.ArgumentMatcher']); goog.addDependency('testing/expectedfailures.js', ['goog.testing.ExpectedFailures'], ['goog.debug.DivConsole', 'goog.debug.Logger', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.style', 'goog.testing.JsUnitException', 'goog.testing.TestCase', 'goog.testing.asserts']); +goog.addDependency('testing/fs/blob.js', ['goog.testing.fs.Blob'], []); +goog.addDependency('testing/fs/entry.js', ['goog.testing.fs.DirectoryEntry', 'goog.testing.fs.Entry', 'goog.testing.fs.FileEntry'], ['goog.Timer', 'goog.array', 'goog.async.Deferred', 'goog.fs.DirectoryEntry', 'goog.fs.DirectoryEntry.Behavior', 'goog.fs.Error', 'goog.object', 'goog.string', 'goog.testing.fs.File', 'goog.testing.fs.FileWriter']); +goog.addDependency('testing/fs/file.js', ['goog.testing.fs.File'], ['goog.testing.fs.Blob']); +goog.addDependency('testing/fs/filesystem.js', ['goog.testing.fs.FileSystem'], ['goog.testing.fs.DirectoryEntry']); +goog.addDependency('testing/fs/filewriter.js', ['goog.testing.fs.FileWriter', 'goog.testing.fs.FileWriter.ProgressEvent'], ['goog.Timer', 'goog.events.Event', 'goog.events.EventTarget', 'goog.fs.Error', 'goog.fs.FileSaver.EventType', 'goog.fs.FileSaver.ReadyState', 'goog.string', 'goog.testing.fs.File']); +goog.addDependency('testing/fs/fs.js', ['goog.testing.fs'], ['goog.Timer', 'goog.array', 'goog.fs', 'goog.testing.fs.Blob', 'goog.testing.fs.FileSystem']); goog.addDependency('testing/functionmock.js', ['goog.testing', 'goog.testing.FunctionMock', 'goog.testing.GlobalFunctionMock', 'goog.testing.MethodMock'], ['goog.object', 'goog.testing.MockInterface', 'goog.testing.PropertyReplacer', 'goog.testing.StrictMock']); goog.addDependency('testing/graphics.js', ['goog.testing.graphics'], ['goog.graphics.Path.Segment', 'goog.testing.asserts']); goog.addDependency('testing/jsunit.js', ['goog.testing.jsunit'], ['goog.testing.TestCase', 'goog.testing.TestRunner']); goog.addDependency('testing/loosemock.js', ['goog.testing.LooseExpectationCollection', 'goog.testing.LooseMock'], ['goog.array', 'goog.structs.Map', 'goog.testing.Mock']); -goog.addDependency('testing/messaging/mockmessagechannel.js', ['goog.testing.messaging.MockMessageChannel'], ['goog.messaging.MessageChannel', 'goog.testing.asserts']); +goog.addDependency('testing/messaging/mockmessagechannel.js', ['goog.testing.messaging.MockMessageChannel'], ['goog.messaging.AbstractChannel', 'goog.testing.asserts']); +goog.addDependency('testing/messaging/mockmessageevent.js', ['goog.testing.messaging.MockMessageEvent'], ['goog.events.BrowserEvent', 'goog.events.EventType', 'goog.testing.events']); +goog.addDependency('testing/messaging/mockmessageport.js', ['goog.testing.messaging.MockMessagePort'], ['goog.events.EventTarget']); +goog.addDependency('testing/messaging/mockportnetwork.js', ['goog.testing.messaging.MockPortNetwork'], ['goog.messaging.PortNetwork', 'goog.testing.messaging.MockMessageChannel']); goog.addDependency('testing/mock.js', ['goog.testing.Mock', 'goog.testing.MockExpectation'], ['goog.array', 'goog.testing.JsUnitException', 'goog.testing.MockInterface', 'goog.testing.mockmatchers']); goog.addDependency('testing/mockclassfactory.js', ['goog.testing.MockClassFactory', 'goog.testing.MockClassRecord'], ['goog.array', 'goog.object', 'goog.testing.LooseMock', 'goog.testing.StrictMock', 'goog.testing.TestCase', 'goog.testing.mockmatchers']); goog.addDependency('testing/mockclock.js', ['goog.testing.MockClock'], ['goog.Disposable', 'goog.testing.PropertyReplacer']); @@ -417,15 +480,18 @@ goog.addDependency('testing/mockinterface.js', ['goog.testing.MockInterface'], [ goog.addDependency('testing/mockmatchers.js', ['goog.testing.mockmatchers', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.testing.mockmatchers.IgnoreArgument', 'goog.testing.mockmatchers.InstanceOf', 'goog.testing.mockmatchers.ObjectEquals', 'goog.testing.mockmatchers.RegexpMatch', 'goog.testing.mockmatchers.SaveArgument', 'goog.testing.mockmatchers.TypeOf'], ['goog.array', 'goog.dom', 'goog.testing.asserts']); goog.addDependency('testing/mockrandom.js', ['goog.testing.MockRandom'], ['goog.Disposable']); goog.addDependency('testing/mockrange.js', ['goog.testing.MockRange'], ['goog.dom.AbstractRange', 'goog.testing.LooseMock']); +goog.addDependency('testing/mockstorage.js', ['goog.testing.MockStorage'], ['goog.structs.Map']); goog.addDependency('testing/mockuseragent.js', ['goog.testing.MockUserAgent'], ['goog.Disposable', 'goog.userAgent']); goog.addDependency('testing/multitestrunner.js', ['goog.testing.MultiTestRunner', 'goog.testing.MultiTestRunner.TestFrame'], ['goog.Timer', 'goog.array', 'goog.dom', 'goog.dom.classes', 'goog.events.EventHandler', 'goog.functions', 'goog.string', 'goog.ui.Component', 'goog.ui.ServerChart', 'goog.ui.ServerChart.ChartType', 'goog.ui.TableSorter']); -goog.addDependency('testing/net/xhrio.js', ['goog.testing.net.XhrIo'], ['goog.array', 'goog.dom.xml', 'goog.events', 'goog.events.EventTarget', 'goog.json', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.XmlHttp', 'goog.object', 'goog.structs.Map', 'goog.uri.utils']); +goog.addDependency('testing/net/xhrio.js', ['goog.testing.net.XhrIo'], ['goog.array', 'goog.dom.xml', 'goog.events', 'goog.events.EventTarget', 'goog.json', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.HttpStatus', 'goog.net.XhrIo.ResponseType', 'goog.net.XmlHttp', 'goog.object', 'goog.structs.Map', 'goog.uri.utils']); +goog.addDependency('testing/net/xhriopool.js', ['goog.testing.net.XhrIoPool'], ['goog.net.XhrIoPool', 'goog.testing.net.XhrIo']); goog.addDependency('testing/objectpropertystring.js', ['goog.testing.ObjectPropertyString'], []); goog.addDependency('testing/performancetable.js', ['goog.testing.PerformanceTable'], ['goog.dom', 'goog.testing.PerformanceTimer']); goog.addDependency('testing/performancetimer.js', ['goog.testing.PerformanceTimer'], ['goog.array', 'goog.math']); goog.addDependency('testing/propertyreplacer.js', ['goog.testing.PropertyReplacer'], ['goog.userAgent']); goog.addDependency('testing/pseudorandom.js', ['goog.testing.PseudoRandom'], ['goog.Disposable']); goog.addDependency('testing/recordfunction.js', ['goog.testing.FunctionCall', 'goog.testing.recordConstructor', 'goog.testing.recordFunction'], []); +goog.addDependency('testing/shardingtestcase.js', ['goog.testing.ShardingTestCase'], ['goog.asserts', 'goog.testing.TestCase']); goog.addDependency('testing/singleton.js', ['goog.testing.singleton'], ['goog.array']); goog.addDependency('testing/stacktrace.js', ['goog.testing.stacktrace', 'goog.testing.stacktrace.Frame'], []); goog.addDependency('testing/strictmock.js', ['goog.testing.StrictMock'], ['goog.array', 'goog.testing.Mock']); @@ -438,10 +504,10 @@ goog.addDependency('testing/ui/rendererharness.js', ['goog.testing.ui.RendererHa goog.addDependency('testing/ui/style.js', ['goog.testing.ui.style'], ['goog.array', 'goog.dom', 'goog.dom.classes', 'goog.testing.asserts']); goog.addDependency('timer/timer.js', ['goog.Timer'], ['goog.events.EventTarget']); goog.addDependency('tweak/entries.js', ['goog.tweak.BaseEntry', 'goog.tweak.BasePrimitiveSetting', 'goog.tweak.BaseSetting', 'goog.tweak.BooleanGroup', 'goog.tweak.BooleanInGroupSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.ButtonAction', 'goog.tweak.NumericSetting', 'goog.tweak.StringSetting'], ['goog.array', 'goog.asserts', 'goog.debug.Logger', 'goog.object']); -goog.addDependency('tweak/registry.js', ['goog.tweak.Registry'], ['goog.asserts', 'goog.debug.Logger', 'goog.object', 'goog.tweak.BaseEntry', 'goog.uri.utils']); +goog.addDependency('tweak/registry.js', ['goog.tweak.Registry'], ['goog.asserts', 'goog.debug.Logger', 'goog.object', 'goog.string', 'goog.tweak.BaseEntry', 'goog.uri.utils']); goog.addDependency('tweak/testhelpers.js', ['goog.tweak.testhelpers'], ['goog.tweak']); goog.addDependency('tweak/tweak.js', ['goog.tweak', 'goog.tweak.ConfigParams'], ['goog.asserts', 'goog.tweak.BooleanGroup', 'goog.tweak.BooleanInGroupSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.ButtonAction', 'goog.tweak.NumericSetting', 'goog.tweak.Registry', 'goog.tweak.StringSetting']); -goog.addDependency('tweak/tweakui.js', ['goog.tweak.EntriesPanel', 'goog.tweak.TweakUi'], ['goog.array', 'goog.asserts', 'goog.dom.DomHelper', 'goog.object', 'goog.style', 'goog.tweak', 'goog.ui.Zippy']); +goog.addDependency('tweak/tweakui.js', ['goog.tweak.EntriesPanel', 'goog.tweak.TweakUi'], ['goog.array', 'goog.asserts', 'goog.dom.DomHelper', 'goog.object', 'goog.style', 'goog.tweak', 'goog.ui.Zippy', 'goog.userAgent']); goog.addDependency('ui/abstractspellchecker.js', ['goog.ui.AbstractSpellChecker', 'goog.ui.AbstractSpellChecker.AsyncResult'], ['goog.asserts', 'goog.dom', 'goog.dom.classes', 'goog.dom.selection', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.spell.SpellCheck', 'goog.structs.Set', 'goog.style', 'goog.ui.MenuItem', 'goog.ui.MenuSeparator', 'goog.ui.PopupMenu']); goog.addDependency('ui/activitymonitor.js', ['goog.ui.ActivityMonitor'], ['goog.array', 'goog.dom', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType']); goog.addDependency('ui/advancedtooltip.js', ['goog.ui.AdvancedTooltip'], ['goog.events.EventType', 'goog.math.Coordinate', 'goog.ui.Tooltip', 'goog.userAgent']); @@ -453,7 +519,7 @@ goog.addDependency('ui/autocomplete/basic.js', ['goog.ui.AutoComplete.Basic'], [ goog.addDependency('ui/autocomplete/inputhandler.js', ['goog.ui.AutoComplete.InputHandler'], ['goog.Disposable', 'goog.Timer', 'goog.dom.a11y', 'goog.dom.selection', 'goog.events', 'goog.events.EventHandler', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.string', 'goog.ui.AutoComplete']); goog.addDependency('ui/autocomplete/remote.js', ['goog.ui.AutoComplete.Remote'], ['goog.ui.AutoComplete', 'goog.ui.AutoComplete.InputHandler', 'goog.ui.AutoComplete.RemoteArrayMatcher', 'goog.ui.AutoComplete.Renderer']); goog.addDependency('ui/autocomplete/remotearraymatcher.js', ['goog.ui.AutoComplete.RemoteArrayMatcher'], ['goog.Disposable', 'goog.Uri', 'goog.events', 'goog.json', 'goog.net.XhrIo', 'goog.ui.AutoComplete']); -goog.addDependency('ui/autocomplete/renderer.js', ['goog.ui.AutoComplete.Renderer', 'goog.ui.AutoComplete.Renderer.CustomRenderer'], ['goog.dom', 'goog.dom.a11y', 'goog.dom.classes', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.iter', 'goog.string', 'goog.style', 'goog.ui.AutoComplete', 'goog.ui.IdGenerator', 'goog.userAgent']); +goog.addDependency('ui/autocomplete/renderer.js', ['goog.ui.AutoComplete.Renderer', 'goog.ui.AutoComplete.Renderer.CustomRenderer'], ['goog.dom', 'goog.dom.a11y', 'goog.dom.classes', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.dom.FadeInAndShow', 'goog.fx.dom.FadeOutAndHide', 'goog.iter', 'goog.string', 'goog.style', 'goog.ui.AutoComplete', 'goog.ui.IdGenerator', 'goog.userAgent']); goog.addDependency('ui/autocomplete/richinputhandler.js', ['goog.ui.AutoComplete.RichInputHandler'], ['goog.ui.AutoComplete', 'goog.ui.AutoComplete.InputHandler']); goog.addDependency('ui/autocomplete/richremote.js', ['goog.ui.AutoComplete.RichRemote'], ['goog.ui.AutoComplete', 'goog.ui.AutoComplete.Remote', 'goog.ui.AutoComplete.Renderer', 'goog.ui.AutoComplete.RichInputHandler', 'goog.ui.AutoComplete.RichRemoteArrayMatcher']); goog.addDependency('ui/autocomplete/richremotearraymatcher.js', ['goog.ui.AutoComplete.RichRemoteArrayMatcher'], ['goog.ui.AutoComplete', 'goog.ui.AutoComplete.RemoteArrayMatcher']); @@ -466,8 +532,9 @@ goog.addDependency('ui/buttonside.js', ['goog.ui.ButtonSide'], []); goog.addDependency('ui/cccbutton.js', ['goog.ui.CccButton'], ['goog.dom', 'goog.dom.classes', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.ui.DeprecatedButton', 'goog.userAgent']); goog.addDependency('ui/charcounter.js', ['goog.ui.CharCounter', 'goog.ui.CharCounter.Display'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.InputHandler']); goog.addDependency('ui/charpicker.js', ['goog.ui.CharPicker'], ['goog.array', 'goog.dom', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.events.KeyHandler', 'goog.i18n.CharListDecompressor', 'goog.i18n.uChar', 'goog.structs.Set', 'goog.style', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.ContainerScroller', 'goog.ui.FlatButtonRenderer', 'goog.ui.HoverCard', 'goog.ui.LabelInput', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.MenuItem', 'goog.ui.Tooltip.ElementTooltipPosition']); -goog.addDependency('ui/checkbox.js', ['goog.ui.Checkbox', 'goog.ui.Checkbox.State'], ['goog.array', 'goog.dom.classes', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler.EventType', 'goog.object', 'goog.ui.Component.EventType', 'goog.ui.Control', 'goog.ui.registry']); +goog.addDependency('ui/checkbox.js', ['goog.ui.Checkbox', 'goog.ui.Checkbox.State'], ['goog.events.EventType', 'goog.events.KeyCodes', 'goog.ui.CheckboxRenderer', 'goog.ui.Component.EventType', 'goog.ui.Component.State', 'goog.ui.Control', 'goog.ui.registry']); goog.addDependency('ui/checkboxmenuitem.js', ['goog.ui.CheckBoxMenuItem'], ['goog.ui.ControlContent', 'goog.ui.MenuItem', 'goog.ui.registry']); +goog.addDependency('ui/checkboxrenderer.js', ['goog.ui.CheckboxRenderer'], ['goog.array', 'goog.asserts', 'goog.dom.a11y', 'goog.dom.a11y.Role', 'goog.dom.a11y.State', 'goog.dom.classes', 'goog.object', 'goog.ui.ControlRenderer']); goog.addDependency('ui/colorbutton.js', ['goog.ui.ColorButton'], ['goog.ui.Button', 'goog.ui.ColorButtonRenderer', 'goog.ui.registry']); goog.addDependency('ui/colorbuttonrenderer.js', ['goog.ui.ColorButtonRenderer'], ['goog.dom.classes', 'goog.functions', 'goog.ui.ColorMenuButtonRenderer']); goog.addDependency('ui/colormenubutton.js', ['goog.ui.ColorMenuButton'], ['goog.array', 'goog.object', 'goog.ui.ColorMenuButtonRenderer', 'goog.ui.ColorPalette', 'goog.ui.Component.EventType', 'goog.ui.ControlContent', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.registry']); @@ -476,7 +543,7 @@ goog.addDependency('ui/colorpalette.js', ['goog.ui.ColorPalette'], ['goog.array' goog.addDependency('ui/colorpicker.js', ['goog.ui.ColorPicker', 'goog.ui.ColorPicker.EventType'], ['goog.ui.ColorPalette', 'goog.ui.Component', 'goog.ui.Component.State']); goog.addDependency('ui/colorsplitbehavior.js', ['goog.ui.ColorSplitBehavior'], ['goog.ui.ColorButton', 'goog.ui.ColorMenuButton', 'goog.ui.SplitBehavior']); goog.addDependency('ui/combobox.js', ['goog.ui.ComboBox', 'goog.ui.ComboBoxItem'], ['goog.Timer', 'goog.debug.Logger', 'goog.dom.classes', 'goog.events', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.ItemEvent', 'goog.ui.LabelInput', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.registry', 'goog.userAgent']); -goog.addDependency('ui/component.js', ['goog.ui.Component', 'goog.ui.Component.Error', 'goog.ui.Component.EventType', 'goog.ui.Component.State'], ['goog.array', 'goog.dom', 'goog.dom.DomHelper', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.object', 'goog.style', 'goog.ui.IdGenerator']); +goog.addDependency('ui/component.js', ['goog.ui.Component', 'goog.ui.Component.Error', 'goog.ui.Component.EventType', 'goog.ui.Component.State'], ['goog.array', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.object', 'goog.style', 'goog.ui.IdGenerator']); goog.addDependency('ui/container.js', ['goog.ui.Container', 'goog.ui.Container.EventType', 'goog.ui.Container.Orientation'], ['goog.dom', 'goog.dom.a11y', 'goog.dom.a11y.State', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.events.KeyHandler.EventType', 'goog.style', 'goog.ui.Component', 'goog.ui.Component.Error', 'goog.ui.Component.EventType', 'goog.ui.Component.State', 'goog.ui.ContainerRenderer']); goog.addDependency('ui/containerrenderer.js', ['goog.ui.ContainerRenderer'], ['goog.array', 'goog.dom', 'goog.dom.a11y', 'goog.dom.classes', 'goog.string', 'goog.style', 'goog.ui.Separator', 'goog.ui.registry', 'goog.userAgent']); goog.addDependency('ui/containerscroller.js', ['goog.ui.ContainerScroller'], ['goog.Timer', 'goog.events.EventHandler', 'goog.style', 'goog.ui.Component', 'goog.ui.Component.EventType', 'goog.ui.Container.EventType']); @@ -493,7 +560,7 @@ goog.addDependency('ui/customcolorpalette.js', ['goog.ui.CustomColorPalette'], [ goog.addDependency('ui/datepicker.js', ['goog.ui.DatePicker', 'goog.ui.DatePicker.Events', 'goog.ui.DatePickerEvent'], ['goog.date', 'goog.date.Date', 'goog.date.Interval', 'goog.dom', 'goog.dom.a11y', 'goog.dom.classes', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyHandler', 'goog.events.KeyHandler.EventType', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeSymbols', 'goog.style', 'goog.ui.Component']); goog.addDependency('ui/decorate.js', ['goog.ui.decorate'], ['goog.ui.registry']); goog.addDependency('ui/deprecatedbutton.js', ['goog.ui.DeprecatedButton'], ['goog.dom', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType']); -goog.addDependency('ui/dialog.js', ['goog.ui.Dialog', 'goog.ui.Dialog.ButtonSet', 'goog.ui.Dialog.DefaultButtonKeys', 'goog.ui.Dialog.Event', 'goog.ui.Dialog.EventType'], ['goog.Timer', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.a11y', 'goog.dom.classes', 'goog.dom.iframe', 'goog.events', 'goog.events.EventType', 'goog.events.FocusHandler', 'goog.events.KeyCodes', 'goog.fx.Dragger', 'goog.math.Rect', 'goog.structs', 'goog.structs.Map', 'goog.style', 'goog.ui.Component', 'goog.userAgent']); +goog.addDependency('ui/dialog.js', ['goog.ui.Dialog', 'goog.ui.Dialog.ButtonSet', 'goog.ui.Dialog.ButtonSet.DefaultButtons', 'goog.ui.Dialog.DefaultButtonCaptions', 'goog.ui.Dialog.DefaultButtonKeys', 'goog.ui.Dialog.Event', 'goog.ui.Dialog.EventType'], ['goog.Timer', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.a11y', 'goog.dom.classes', 'goog.dom.iframe', 'goog.events', 'goog.events.EventType', 'goog.events.FocusHandler', 'goog.events.KeyCodes', 'goog.fx.Dragger', 'goog.math.Rect', 'goog.structs', 'goog.structs.Map', 'goog.style', 'goog.ui.Component', 'goog.userAgent']); goog.addDependency('ui/dimensionpicker.js', ['goog.ui.DimensionPicker'], ['goog.events.EventType', 'goog.math.Size', 'goog.ui.Control', 'goog.ui.DimensionPickerRenderer', 'goog.ui.registry']); goog.addDependency('ui/dimensionpickerrenderer.js', ['goog.ui.DimensionPickerRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.i18n.bidi', 'goog.style', 'goog.ui.ControlRenderer', 'goog.userAgent']); goog.addDependency('ui/dragdropdetector.js', ['goog.ui.DragDropDetector', 'goog.ui.DragDropDetector.EventType', 'goog.ui.DragDropDetector.ImageDropEvent', 'goog.ui.DragDropDetector.LinkDropEvent'], ['goog.dom', 'goog.dom.TagName', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.string', 'goog.style', 'goog.userAgent']); @@ -537,6 +604,7 @@ goog.addDependency('ui/labelinput.js', ['goog.ui.LabelInput'], ['goog.Timer', 'g goog.addDependency('ui/linkbuttonrenderer.js', ['goog.ui.LinkButtonRenderer'], ['goog.ui.Button', 'goog.ui.FlatButtonRenderer', 'goog.ui.registry']); goog.addDependency('ui/media/flashobject.js', ['goog.ui.media.FlashObject', 'goog.ui.media.FlashObject.ScriptAccessLevel', 'goog.ui.media.FlashObject.Wmodes'], ['goog.asserts', 'goog.debug.Logger', 'goog.events.EventHandler', 'goog.string', 'goog.structs.Map', 'goog.style', 'goog.ui.Component', 'goog.ui.Component.Error', 'goog.userAgent', 'goog.userAgent.flash']); goog.addDependency('ui/media/flickr.js', ['goog.ui.media.FlickrSet', 'goog.ui.media.FlickrSetModel'], ['goog.object', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaModel.Player', 'goog.ui.media.MediaRenderer']); +goog.addDependency('ui/media/googlevideo.js', ['goog.ui.media.GoogleVideo', 'goog.ui.media.GoogleVideoModel'], ['goog.string', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaModel.Player', 'goog.ui.media.MediaRenderer']); goog.addDependency('ui/media/media.js', ['goog.ui.media.Media', 'goog.ui.media.MediaRenderer'], ['goog.style', 'goog.ui.Component.State', 'goog.ui.Control', 'goog.ui.ControlRenderer']); goog.addDependency('ui/media/mediamodel.js', ['goog.ui.media.MediaModel', 'goog.ui.media.MediaModel.Category', 'goog.ui.media.MediaModel.Credit', 'goog.ui.media.MediaModel.Credit.Role', 'goog.ui.media.MediaModel.Credit.Scheme', 'goog.ui.media.MediaModel.Medium', 'goog.ui.media.MediaModel.MimeType', 'goog.ui.media.MediaModel.Player', 'goog.ui.media.MediaModel.Thumbnail'], ['goog.array']); goog.addDependency('ui/media/mp3.js', ['goog.ui.media.Mp3'], ['goog.string', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaRenderer']); @@ -544,13 +612,13 @@ goog.addDependency('ui/media/photo.js', ['goog.ui.media.Photo'], ['goog.ui.media goog.addDependency('ui/media/picasa.js', ['goog.ui.media.PicasaAlbum', 'goog.ui.media.PicasaAlbumModel'], ['goog.object', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaModel.Player', 'goog.ui.media.MediaRenderer']); goog.addDependency('ui/media/vimeo.js', ['goog.ui.media.Vimeo', 'goog.ui.media.VimeoModel'], ['goog.string', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaModel.Player', 'goog.ui.media.MediaRenderer']); goog.addDependency('ui/media/youtube.js', ['goog.ui.media.Youtube', 'goog.ui.media.YoutubeModel'], ['goog.string', 'goog.ui.Component.Error', 'goog.ui.Component.State', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaModel.Player', 'goog.ui.media.MediaModel.Thumbnail', 'goog.ui.media.MediaRenderer']); -goog.addDependency('ui/menu.js', ['goog.ui.Menu', 'goog.ui.Menu.EventType'], ['goog.string', 'goog.style', 'goog.ui.Component.EventType', 'goog.ui.Component.State', 'goog.ui.Container', 'goog.ui.Container.Orientation', 'goog.ui.MenuHeader', 'goog.ui.MenuItem', 'goog.ui.MenuRenderer', 'goog.ui.MenuSeparator']); +goog.addDependency('ui/menu.js', ['goog.ui.Menu', 'goog.ui.Menu.EventType'], ['goog.math.Coordinate', 'goog.string', 'goog.style', 'goog.ui.Component.EventType', 'goog.ui.Component.State', 'goog.ui.Container', 'goog.ui.Container.Orientation', 'goog.ui.MenuHeader', 'goog.ui.MenuItem', 'goog.ui.MenuRenderer', 'goog.ui.MenuSeparator']); goog.addDependency('ui/menubase.js', ['goog.ui.MenuBase'], ['goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyHandler', 'goog.events.KeyHandler.EventType', 'goog.ui.Popup']); -goog.addDependency('ui/menubutton.js', ['goog.ui.MenuButton'], ['goog.Timer', 'goog.dom', 'goog.dom.a11y', 'goog.dom.a11y.State', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler.EventType', 'goog.math.Box', 'goog.math.Rect', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.style', 'goog.ui.Button', 'goog.ui.Component.EventType', 'goog.ui.Component.State', 'goog.ui.ControlContent', 'goog.ui.Menu', 'goog.ui.MenuButtonRenderer', 'goog.ui.registry']); +goog.addDependency('ui/menubutton.js', ['goog.ui.MenuButton'], ['goog.Timer', 'goog.dom', 'goog.dom.a11y', 'goog.dom.a11y.State', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler.EventType', 'goog.math.Box', 'goog.math.Rect', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.style', 'goog.ui.Button', 'goog.ui.Component.EventType', 'goog.ui.Component.State', 'goog.ui.ControlContent', 'goog.ui.Menu', 'goog.ui.MenuButtonRenderer', 'goog.ui.registry', 'goog.userAgent', 'goog.userAgent.product']); goog.addDependency('ui/menubuttonrenderer.js', ['goog.ui.MenuButtonRenderer'], ['goog.dom', 'goog.style', 'goog.ui.CustomButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.Menu', 'goog.ui.MenuRenderer', 'goog.userAgent']); goog.addDependency('ui/menuheader.js', ['goog.ui.MenuHeader'], ['goog.ui.Component.State', 'goog.ui.Control', 'goog.ui.MenuHeaderRenderer', 'goog.ui.registry']); goog.addDependency('ui/menuheaderrenderer.js', ['goog.ui.MenuHeaderRenderer'], ['goog.dom', 'goog.dom.classes', 'goog.ui.ControlRenderer']); -goog.addDependency('ui/menuitem.js', ['goog.ui.MenuItem'], ['goog.ui.Component.State', 'goog.ui.Control', 'goog.ui.ControlContent', 'goog.ui.MenuItemRenderer', 'goog.ui.registry']); +goog.addDependency('ui/menuitem.js', ['goog.ui.MenuItem'], ['goog.array', 'goog.dom', 'goog.dom.classes', 'goog.math.Coordinate', 'goog.string', 'goog.ui.Component.State', 'goog.ui.Control', 'goog.ui.ControlContent', 'goog.ui.MenuItemRenderer', 'goog.ui.registry']); goog.addDependency('ui/menuitemrenderer.js', ['goog.ui.MenuItemRenderer'], ['goog.dom', 'goog.dom.a11y', 'goog.dom.a11y.Role', 'goog.dom.classes', 'goog.ui.Component.State', 'goog.ui.ControlContent', 'goog.ui.ControlRenderer']); goog.addDependency('ui/menurenderer.js', ['goog.ui.MenuRenderer'], ['goog.dom', 'goog.dom.a11y', 'goog.dom.a11y.Role', 'goog.dom.a11y.State', 'goog.ui.ContainerRenderer', 'goog.ui.Separator']); goog.addDependency('ui/menuseparator.js', ['goog.ui.MenuSeparator'], ['goog.ui.MenuSeparatorRenderer', 'goog.ui.Separator', 'goog.ui.registry']); @@ -624,7 +692,7 @@ goog.addDependency('ui/tristatemenuitemrenderer.js', ['goog.ui.TriStateMenuItemR goog.addDependency('ui/twothumbslider.js', ['goog.ui.TwoThumbSlider'], ['goog.dom', 'goog.dom.a11y', 'goog.dom.a11y.Role', 'goog.ui.SliderBase']); goog.addDependency('ui/zippy.js', ['goog.ui.Zippy', 'goog.ui.ZippyEvent'], ['goog.dom', 'goog.dom.classes', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.style']); goog.addDependency('uri/uri.js', ['goog.Uri', 'goog.Uri.QueryData'], ['goog.array', 'goog.string', 'goog.structs', 'goog.structs.Map', 'goog.uri.utils', 'goog.uri.utils.ComponentIndex']); -goog.addDependency('uri/utils.js', ['goog.uri.utils', 'goog.uri.utils.ComponentIndex'], ['goog.asserts', 'goog.string']); +goog.addDependency('uri/utils.js', ['goog.uri.utils', 'goog.uri.utils.ComponentIndex', 'goog.uri.utils.QueryArray', 'goog.uri.utils.QueryValue', 'goog.uri.utils.StandardQueryParam'], ['goog.asserts', 'goog.string']); goog.addDependency('useragent/adobereader.js', ['goog.userAgent.adobeReader'], ['goog.string', 'goog.userAgent']); goog.addDependency('useragent/flash.js', ['goog.userAgent.flash'], ['goog.string']); goog.addDependency('useragent/iphoto.js', ['goog.userAgent.iphoto'], ['goog.string', 'goog.userAgent']); @@ -634,7 +702,17 @@ goog.addDependency('useragent/platform.js', ['goog.userAgent.platform'], ['goog. goog.addDependency('useragent/product.js', ['goog.userAgent.product'], ['goog.userAgent']); goog.addDependency('useragent/product_isversion.js', ['goog.userAgent.product.isVersion'], ['goog.userAgent.product']); goog.addDependency('useragent/useragent.js', ['goog.userAgent'], ['goog.string']); -goog.addDependency('window/window.js', ['goog.window'], ['goog.string']); +goog.addDependency('vec/float32array.js', ['goog.vec.Float32Array'], []); +goog.addDependency('vec/mat3.js', ['goog.vec.Mat3'], ['goog.vec', 'goog.vec.Vec3']); +goog.addDependency('vec/mat4.js', ['goog.vec.Mat4'], ['goog.vec', 'goog.vec.Vec3', 'goog.vec.Vec4']); +goog.addDependency('vec/matrix3.js', ['goog.vec.Matrix3'], ['goog.vec']); +goog.addDependency('vec/matrix4.js', ['goog.vec.Matrix4'], ['goog.vec', 'goog.vec.Vec3', 'goog.vec.Vec4']); +goog.addDependency('vec/quaternion.js', ['goog.vec.Quaternion'], ['goog.vec', 'goog.vec.Vec4']); +goog.addDependency('vec/ray.js', ['goog.vec.Ray'], ['goog.vec.Vec3']); +goog.addDependency('vec/vec.js', ['goog.vec'], ['goog.vec.Float32Array']); +goog.addDependency('vec/vec3.js', ['goog.vec.Vec3'], ['goog.vec']); +goog.addDependency('vec/vec4.js', ['goog.vec.Vec4'], ['goog.vec']); +goog.addDependency('window/window.js', ['goog.window'], ['goog.string', 'goog.userAgent']); goog.addDependency('../../third_party/closure/goog/caja/string/html/htmlparser.js', ['goog.string.html.HtmlParser', 'goog.string.html.HtmlParser.EFlags', 'goog.string.html.HtmlParser.Elements', 'goog.string.html.HtmlParser.Entities', 'goog.string.html.HtmlSaxHandler'], []); goog.addDependency('../../third_party/closure/goog/caja/string/html/htmlsanitizer.js', ['goog.string.html.HtmlSanitizer', 'goog.string.html.HtmlSanitizer.AttributeType', 'goog.string.html.HtmlSanitizer.Attributes', 'goog.string.html.htmlSanitize'], ['goog.string.StringBuffer', 'goog.string.html.HtmlParser', 'goog.string.html.HtmlParser.EFlags', 'goog.string.html.HtmlParser.Elements', 'goog.string.html.HtmlSaxHandler']); @@ -644,3 +722,5 @@ goog.addDependency('../../third_party/closure/goog/loremipsum/text/loremipsum.js goog.addDependency('../../third_party/closure/goog/mochikit/async/deferred.js', ['goog.async.Deferred', 'goog.async.Deferred.AlreadyCalledError', 'goog.async.Deferred.CancelledError'], ['goog.array', 'goog.asserts', 'goog.debug.Error']); goog.addDependency('../../third_party/closure/goog/mochikit/async/deferredlist.js', ['goog.async.DeferredList'], ['goog.array', 'goog.async.Deferred']); goog.addDependency('../../third_party/closure/goog/osapi/osapi.js', ['goog.osapi'], []); +goog.addDependency('../../third_party/closure/goog/silverlight/silverlight.js', ['goog.silverlight'], []); +goog.addDependency('../../third_party/closure/goog/silverlight/supporteduseragent.js', ['goog.silverlight.supportedUserAgent'], []); diff --git a/contrib/closure-library/goog/disposable/disposable.js b/contrib/closure-library/goog/disposable/disposable.js index fa7e42e..79ebc40 100644 --- a/contrib/closure-library/goog/disposable/disposable.js +++ b/contrib/closure-library/goog/disposable/disposable.js @@ -21,15 +21,66 @@ goog.provide('goog.Disposable'); goog.provide('goog.dispose'); +goog.require('goog.disposable.IDisposable'); + + /** * Class that provides the basic implementation for disposable objects. If your * class holds one or more references to COM objects, DOM nodes, or other * disposable objects, it should extend this class or implement the disposable - * interface. + * interface (defined in goog.disposable.IDisposable). * @constructor + * @implements {goog.disposable.IDisposable} + */ +goog.Disposable = function() { + if (goog.Disposable.ENABLE_MONITORING) { + goog.Disposable.instances_[goog.getUid(this)] = this; + } +}; + + +/** + * @define {boolean} Whether to enable the monitoring of the goog.Disposable + * instances. Switching on the monitoring is only recommended for debugging + * because it has a significant impact on performance and memory usage. + * If switched off, the monitoring code compiles down to 0 bytes. + * The monitoring expects that all disposable objects call the + * {@code goog.Disposable} base constructor. + */ +goog.Disposable.ENABLE_MONITORING = false; + + +/** + * Maps the unique ID of every undisposed {@code goog.Disposable} object to + * the object itself. + * @type {!Object.} + * @private */ -goog.Disposable = function() {}; +goog.Disposable.instances_ = {}; + + +/** + * @return {!Array.} All {@code goog.Disposable} objects that + * haven't been disposed of. + */ +goog.Disposable.getUndisposedObjects = function() { + var ret = []; + for (var id in goog.Disposable.instances_) { + if (goog.Disposable.instances_.hasOwnProperty(id)) { + ret.push(goog.Disposable.instances_[Number(id)]); + } + } + return ret; +}; + + +/** + * Clears the registry of undisposed objects but doesn't dispose of them. + */ +goog.Disposable.clearUndisposedObjects = function() { + goog.Disposable.instances_ = {}; +}; /** @@ -40,6 +91,14 @@ goog.Disposable = function() {}; goog.Disposable.prototype.disposed_ = false; +/** + * Disposables that should be disposed when this object is disposed. + * @type {Array.} + * @private + */ +goog.Disposable.prototype.dependentDisposables_; + + /** * @return {boolean} Whether the object has been disposed of. */ @@ -60,6 +119,8 @@ goog.Disposable.prototype.getDisposed = goog.Disposable.prototype.isDisposed; * {@link #disposeInternal}. Classes that extend {@code goog.Disposable} should * override {@link #disposeInternal} in order to delete references to COM * objects, DOM nodes, and other disposable objects. + * + * @return {void} Nothing. */ goog.Disposable.prototype.dispose = function() { if (!this.disposed_) { @@ -67,10 +128,33 @@ goog.Disposable.prototype.dispose = function() { // gets disposed recursively. this.disposed_ = true; this.disposeInternal(); + if (goog.Disposable.ENABLE_MONITORING) { + var uid = goog.getUid(this); + if (!goog.Disposable.instances_.hasOwnProperty(uid)) { + throw Error(this + ' did not call the goog.Disposable base ' + + 'constructor or was disposed of after a clearUndisposedObjects ' + + 'call'); + } + delete goog.Disposable.instances_[uid]; + } } }; +/** + * Associates a disposable object with this object so that they will be disposed + * together. + * @param {goog.disposable.IDisposable} disposable that will be disposed when + * this object is disposed. + */ +goog.Disposable.prototype.registerDisposable = function(disposable) { + if (!this.dependentDisposables_) { + this.dependentDisposables_ = []; + } + this.dependentDisposables_.push(disposable); +}; + + /** * Deletes or nulls out any references to COM objects, DOM nodes, or other * disposable objects. Classes that extend {@code goog.Disposable} should @@ -92,7 +176,9 @@ goog.Disposable.prototype.dispose = function() { * @protected */ goog.Disposable.prototype.disposeInternal = function() { - // No-op in the base class. + if (this.dependentDisposables_) { + goog.disposeAll.apply(null, this.dependentDisposables_); + } }; @@ -106,3 +192,22 @@ goog.dispose = function(obj) { obj.dispose(); } }; + + +/** + * Calls {@code dispose} on each member of the list that supports it. (If the + * member is an ArrayLike, then {@code goog.disposeAll()} will be called + * recursively on each of its members.) If the member is not an object with a + * {@code dispose()} method, then it is ignored. + * @param {...*} var_args The list. + */ +goog.disposeAll = function(var_args) { + for (var i = 0, len = arguments.length; i < len; ++i) { + var disposable = arguments[i]; + if (goog.isArrayLike(disposable)) { + goog.disposeAll.apply(null, disposable); + } else { + goog.dispose(disposable); + } + } +}; diff --git a/contrib/closure-library/goog/disposable/disposable_test.html b/contrib/closure-library/goog/disposable/disposable_test.html index ba94bb1..76c16e1 100644 --- a/contrib/closure-library/goog/disposable/disposable_test.html +++ b/contrib/closure-library/goog/disposable/disposable_test.html @@ -3,7 +3,7 @@ @@ -29,6 +29,7 @@ goog.inherits(DisposableTest, goog.Disposable); DisposableTest.prototype.disposeInternal = function() { + DisposableTest.superClass_.disposeInternal.call(this); delete this.element; }; @@ -64,6 +65,8 @@ } function tearDown() { + goog.Disposable.ENABLE_MONITORING = false; + goog.Disposable.instances_ = {}; d1.dispose(); d2.dispose(); } @@ -142,6 +145,92 @@ function A() {} goog.dispose(new A()); } - + + function testMonitoringFailure() { + function BadDisposable() {}; + goog.inherits(BadDisposable, goog.Disposable); + + goog.Disposable.ENABLE_MONITORING = true; + + var badDisposable = new BadDisposable; + assertArrayEquals('no disposable objects registered', [], + goog.Disposable.getUndisposedObjects()); + assertThrows('the base ctor should have been called', + goog.bind(badDisposable.dispose, badDisposable)); + } + + function testGetUndisposedObjects() { + goog.Disposable.ENABLE_MONITORING = true; + + var d1 = new DisposableTest(); + var d2 = new DisposableTest(); + assertSameElements('the undisposed instances', [d1, d2], + goog.Disposable.getUndisposedObjects()); + + d1.dispose(); + assertSameElements('1 undisposed instance left', [d2], + goog.Disposable.getUndisposedObjects()); + + d1.dispose(); + assertSameElements('second disposal of the same object is no-op', [d2], + goog.Disposable.getUndisposedObjects()); + + d2.dispose(); + assertSameElements('all objects have been disposed of', [], + goog.Disposable.getUndisposedObjects()); + } + + function testClearUndisposedObjects() { + goog.Disposable.ENABLE_MONITORING = true; + + var d1 = new DisposableTest(); + var d2 = new DisposableTest(); + d2.dispose(); + goog.Disposable.clearUndisposedObjects() + assertSameElements('no undisposed object in the registry', [], + goog.Disposable.getUndisposedObjects()); + + assertThrows('disposal after clearUndisposedObjects()', function() { + d1.dispose(); + }); + + // d2 is already disposed of, the redisposal shouldn't throw error. + d2.dispose(); + } + + function testRegisterDisposable() { + var d1 = new DisposableTest(); + var d2 = new DisposableTest(); + + d1.registerDisposable(d2); + d1.dispose(); + + assertTrue('d2 should be disposed when d1 is disposed', d2.isDisposed()); + } + + function testDisposeAll() { + var d1 = new DisposableTest(); + var d2 = new DisposableTest(); + + goog.disposeAll(d1, d2); + + assertTrue('d1 should be disposed', d1.isDisposed()); + assertTrue('d2 should be disposed', d2.isDisposed()); + } + + function testDisposeAllRecursive() { + var d1 = new DisposableTest(); + var d2 = new DisposableTest(); + var d3 = new DisposableTest(); + var d4 = new DisposableTest(); + + goog.disposeAll(d1, [[d2], d3, d4]); + + assertTrue('d1 should be disposed', d1.isDisposed()); + assertTrue('d2 should be disposed', d2.isDisposed()); + assertTrue('d3 should be disposed', d3.isDisposed()); + assertTrue('d4 should be disposed', d4.isDisposed()); + } + diff --git a/contrib/closure-library/goog/disposable/idisposable.js b/contrib/closure-library/goog/disposable/idisposable.js new file mode 100644 index 0000000..2ca263a --- /dev/null +++ b/contrib/closure-library/goog/disposable/idisposable.js @@ -0,0 +1,44 @@ +// Copyright 2011 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Definition of the disposable interface. A disposable object + * has a dispose method to to clean up references and resources. + */ + + +goog.provide('goog.disposable.IDisposable'); + + + +/** + * Interface for a disposable object. If a instance requires cleanup + * (references COM objects, DOM notes, or other disposable objects), it should + * implement this interface (it may subclass goog.Disposable). + * @interface + */ +goog.disposable.IDisposable = function() {}; + + +/** + * Disposes of the object and its resources. + * @return {void} Nothing. + */ +goog.disposable.IDisposable.prototype.dispose; + + +/** + * @return {boolean} Whether the object has been disposed of. + */ +goog.disposable.IDisposable.prototype.isDisposed; diff --git a/contrib/closure-library/goog/dom/a11y.js b/contrib/closure-library/goog/dom/a11y.js index b315e4e..00c035b 100644 --- a/contrib/closure-library/goog/dom/a11y.js +++ b/contrib/closure-library/goog/dom/a11y.js @@ -15,55 +15,163 @@ /** * @fileoverview Utilities for adding, removing and setting ARIA roles * as defined by W3C ARIA Working Draft: - * http://www.w3.org/TR/2008/WD-wai-aria-20080806/ - * At this time Firefox 3.0 is the only browser that has good support for ARIA; - * IE8 (beta) has partial support, while Opera and WebKit implementations - * are forthcoming. An application could call - * goog.dom.a11y.setNoBrowserCheck with true to turn on ARIA - * support for all browsers. + * http://www.w3.org/TR/2010/WD-wai-aria-20100916/ + * All modern browsers have some form of ARIA support, so no browser checks are + * performed when adding ARIA to components. * */ goog.provide('goog.dom.a11y'); +goog.provide('goog.dom.a11y.LivePriority'); goog.provide('goog.dom.a11y.Role'); goog.provide('goog.dom.a11y.State'); goog.require('goog.dom'); -goog.require('goog.userAgent'); /** - * Enumeration of ARIA states. - * More will be added later. + * Enumeration of ARIA states and properties. * @enum {string} */ goog.dom.a11y.State = { - // ARIA state for setting the currently active descendant of an element. + // ARIA property for setting the currently active descendant of an element, + // for example the selected item in a list box. Value: ID of an element. ACTIVEDESCENDANT: 'activedescendant', - // ARIA state to specify how input completion is provided. + + // ARIA property that, if true, indicates that all of a changed region should + // be presented, instead of only parts. Value: one of {true, false}. + ATOMIC: 'atomic', + + // ARIA property to specify that input completion is provided. Value: + // one of {'inline', 'list', 'both', 'none'}. AUTOCOMPLETE: 'autocomplete', - // ARIA state for a checked item. + + // ARIA state to indicate that an element and its subtree are being updated. + // Value: one of {true, false}. + BUSY: 'busy', + + // ARIA state for a checked item. Value: one of {'true', 'false', 'mixed', + // undefined}. CHECKED: 'checked', - // ARIA state for a disabled item. + + // ARIA property that identifies the element or elements whose contents or + // presence are controlled by this element. Value: space-separated IDs of + // other elements. + CONTROLS: 'controls', + + // ARIA property that identifies the element or elements that describe + // this element. Value: space-separated IDs of other elements. + DESCRIBEDBY: 'describedby', + + // ARIA state for a disabled item. Value: one of {true, false}. DISABLED: 'disabled', + + // ARIA property that indicates what functions can be performed when a + // dragged object is released on the drop target. Value: one of + // {'copy', 'move', 'link', 'execute', 'popup', 'none'}. + DROPEFFECT: 'dropeffect', + // ARIA state for setting whether the element like a tree node is expanded. + // Value: one of {true, false, undefined}. EXPANDED: 'expanded', - // ARIA state for whether the element has a popup + + // ARIA property that identifies the next element (or elements) in the + // recommended reading order of content. Value: space-separated ids of + // elements to flow to. + FLOWTO: 'flowto', + + // ARIA state that indicates an element's "grabbed" state in drag-and-drop. + // Value: one of {true, false, undefined}. + GRABBED: 'grabbed', + + // ARIA property indicating whether the element has a popup. Value: one of + // {true, false}. HASPOPUP: 'haspopup', - // ARIA state for setting the element which labels another element. + + // ARIA state indicating that the element is not visible or perceivable + // to any user. Value: one of {true, false}. + HIDDEN: 'hidden', + + // ARIA state indicating that the entered value does not conform. Value: + // one of {false, true, 'grammar', 'spelling'} + INVALID: 'invalid', + + // ARIA property that provides a label to override any other text, value, or + // contents used to describe this element. Value: string. + LABEL: 'label', + + // ARIA property for setting the element which labels another element. + // Value: space-separated IDs of elements. LABELLEDBY: 'labelledby', - // ARIA state for setting the level of an element in the hierarchy + + // ARIA property for setting the level of an element in the hierarchy. + // Value: integer. LEVEL: 'level', - // ARIA state for a pressed item. + + // ARIA property indicating that an element will be updated, and + // describes the types of updates the user agents, assistive technologies, + // and user can expect from the live region. Value: one of {'off', 'polite', + // 'assertive'}. + LIVE: 'live', + + // ARIA property indicating whether a text box can accept multiline input. + // Value: one of {true, false}. + MULTILINE: 'multiline', + + // ARIA property indicating if the user may select more than one item. + // Value: one of {true, false}. + MULTISELECTABLE: 'multiselectable', + + // ARIA property indicating if the element is horizontal or vertical. + // Value: one of {'vertical', 'horizontal'}. + ORIENTATION: 'orientation', + + // ARIA property creating a visual, functional, or contextual parent/child + // relationship when the DOM hierarchy can't be used to represent it. + // Value: Space-separated IDs of elements. + OWNS: 'owns', + + // ARIA property that defines an element's number of position in a list. + // Value: integer. + POSINSET: 'posinset', + + // ARIA state for a pressed item. Value: one of {true, false, undefined, + // 'mixed'}. PRESSED: 'pressed', + + // ARIA property indicating that an element is not editable. Value: + // one of {true, false}. + READONLY: 'readonly', + + // ARIA property indicating that change notifications within this subtree + // of a live region should be announced. Value: one of {'additions', + // 'removals', 'text', 'all', 'additions text'}. + RELEVANT: 'relevant', + + // ARIA property indicating that user input is required on this element + // before a form may be submitted. Value: one of {true, false}. + REQUIRED: 'required', + // ARIA state for setting the currently selected item in the list. + // Value: one of {true, false, undefined}. SELECTED: 'selected', - // ARIA state for slider maximum value. + + // ARIA property defining the number of items in a list. Value: integer. + SETSIZE: 'setsize', + + // ARIA property indicating if items are sorted. Value: one of {'ascending', + // 'descending', 'none', 'other'}. + SORT: 'sort', + + // ARIA property for slider maximum value. Value: number. VALUEMAX: 'valuemax', - // ARIA state for slider minimum value. + + // ARIA property for slider minimum value. Value: number. VALUEMIN: 'valuemin', - // ARIA state for slider active value. + + // ARIA property for slider active value. Value: number. VALUENOW: 'valuenow', - // ARIA state for slider active value represented as text. + + // ARIA property for slider active value represented as text. Value: string. VALUETEXT: 'valuetext' }; @@ -73,57 +181,209 @@ goog.dom.a11y.State = { * @enum {string} */ goog.dom.a11y.Role = { + // ARIA role for an alert element that doesn't need to be explicitly closed. + ALERT: 'alert', + + // ARIA role for an alert dialog element that takes focus and must be closed. + ALERTDIALOG: 'alertdialog', + + // ARIA role for an application that implements its own keyboard navigation. + APPLICATION: 'application', + + // ARIA role for an article. + ARTICLE: 'article', + + // ARIA role for a banner containing mostly site content, not page content. + BANNER: 'banner', + // ARIA role for a button element. BUTTON: 'button', - // ARIA role for a checkbox button element. + + // ARIA role for a checkbox button element; use with the CHECKED state. CHECKBOX: 'checkbox', - // ARIA role for a combobox element. + + // ARIA role for a column header of a table or grid. + COLUMNHEADER: 'columnheader', + + // ARIA role for a combo box element. COMBOBOX: 'combobox', - // ARIA role for a dialog element. + + // ARIA role for a supporting section of the document. + COMPLEMENTARY: 'complementary', + + // ARIA role for a dialog, some descendant must take initial focus. DIALOG: 'dialog', - // ARIA role for link. + + // ARIA role for a directory, like a table of contents. + DIRECTORY: 'directory', + + // ARIA role for a part of a page that's a document, not a web application. + DOCUMENT: 'document', + + // ARIA role for a landmark region logically considered one form. + FORM: 'form', + + // ARIA role for an interactive control of tabular data. + GRID: 'grid', + + // ARIA role for a cell in a grid. + GRIDCELL: 'gridcell', + + // ARIA role for a group of related elements like tree item siblings. + GROUP: 'group', + + // ARIA role for a heading element. + HEADING: 'heading', + + // ARIA role for a container of elements that together comprise one image. + IMG: 'img', + + // ARIA role for a link. LINK: 'link', - // ARIA role for listbox. + + // ARIA role for a list of non-interactive list items. + LIST: 'list', + + // ARIA role for a listbox. LISTBOX: 'listbox', - // ARIA role for popup menu, submenu elements etc. + + // ARIA role for a list item. + LISTITEM: 'listitem', + + // ARIA role for a live region where new information is added. + LOG: 'log', + + // ARIA landmark role for the main content in a document. Use only once. MAIN: 'main', - // ARIA role for main content in a document. + + // ARIA role for a live region of non-essential information that changes. + MARQUEE: 'marquee', + + // ARIA role for a mathematical expression. + MATH: 'math', + + // ARIA role for a popup menu. MENU: 'menu', + // ARIA role for a menubar element containing menu elements. MENUBAR: 'menubar', + // ARIA role for menu item elements. MENU_ITEM: 'menuitem', + // ARIA role for a checkbox box element inside a menu. MENU_ITEM_CHECKBOX: 'menuitemcheckbox', + // ARIA role for a radio button element inside a menu. MENU_ITEM_RADIO: 'menuitemradio', - // ARIA role for option items, generally used with a parent of listbox. + + // ARIA landmark role for a collection of navigation links. NAVIGATION: 'navigation', - // ARIA role for a collection of links suitable for use when navigating - // the document or related documents. + + // ARIA role for a section ancillary to the main content. + NOTE: 'note', + + // ARIA role for option items that are children of combobox, listbox, menu, + // radiogroup, or tree elements. OPTION: 'option', - // ARIA role for a group of elements like a group of radio buttons, - // a form, etc. - GROUP: 'group', + + // ARIA role for ignorable cosmetic elements with no semantic significance. + PRESENTATION: 'presentation', + + // ARIA role for a progress bar element. + PROGRESSBAR: 'progressbar', + + // ARIA role for a radio button element. + RADIO: 'radio', + + // ARIA role for a group of connected radio button elements. + RADIOGROUP: 'radiogroup', + + // ARIA role for an important region of the page. + REGION: 'region', + + // ARIA role for a row of cells in a grid. + ROW: 'row', + + // ARIA role for a group of one or more rows in a grid. + ROWGROUP: 'rowgroup', + + // ARIA role for a row header of a table or grid. + ROWHEADER: 'rowheader', + + // ARIA role for a scrollbar element. + SCROLLBAR: 'scrollbar', + + // ARIA landmark role for a part of the page providing search functionality. + SEARCH: 'search', + + // ARIA role for a menu separator. + SEPARATOR: 'separator', + // ARIA role for a slider. SLIDER: 'slider', + + // ARIA role for a spin button. + SPINBUTTON: 'spinbutton', + + // ARIA role for a live region with advisory info less severe than an alert. + STATUS: 'status', + // ARIA role for a tab button. TAB: 'tab', + // ARIA role for a tab bar (i.e. a list of tab buttons). TAB_LIST: 'tablist', + // ARIA role for a tab page (i.e. the element holding tab contents). TAB_PANEL: 'tabpanel', + + // ARIA role for a textbox element. + TEXTBOX: 'textbox', + + // ARIA role for an element displaying elapsed time or time remaining. + TIMER: 'timer', + // ARIA role for a toolbar element. - TOOLBAR: 'toolbar' + TOOLBAR: 'toolbar', + + // ARIA role for a tooltip element. + TOOLTIP: 'tooltip', + + // ARIA role for a tree. + TREE: 'tree', + + // ARIA role for a grid whose rows can be expanded and collapsed like a tree. + TREEGRID: 'treegrid', + + // ARIA role for a tree item that sometimes may be expanded or collapsed. + TREEITEM: 'treeitem' }; /** - * Flag for skipping browser check while adding ARIA roles and states. - * @private - * @type {boolean} + * Enumeration of ARIA state values for live regions. + * + * See http://www.w3.org/TR/wai-aria/states_and_properties#aria-live + * for more information. + * @enum {string} */ -goog.dom.a11y.noBrowserCheck_; +goog.dom.a11y.LivePriority = { + /** + * Default value. Used for live regions that should never be spoken. + */ + OFF: 'off', + /** + * Spoke only when the user is idle. Best option in most cases. + */ + POLITE: 'polite', + /** + * Spoken as soon as possible, which means that the information has a + * higher priority than normal, but does not necessarily interrupt + * immediately. + */ + ASSERTIVE: 'assertive' +}; /** @@ -132,10 +392,8 @@ goog.dom.a11y.noBrowserCheck_; * @param {string} roleName role name(s). */ goog.dom.a11y.setRole = function(element, roleName) { - if (goog.userAgent.GECKO || goog.dom.a11y.noBrowserCheck_) { - element.setAttribute('role', roleName); - element.roleName = roleName; - } + element.setAttribute('role', roleName); + element.roleName = roleName; }; @@ -150,45 +408,36 @@ goog.dom.a11y.getRole = function(element) { /** - * Sets the state of an element. + * Sets the state or property of an element. * @param {Element} element DOM node where we set state. * @param {string} state State attribute being set. Automatically adds prefix * 'aria-' to the state name. * @param {string|boolean|number} value Value for the state attribute. */ goog.dom.a11y.setState = function(element, state, value) { - if (goog.userAgent.GECKO || goog.dom.a11y.noBrowserCheck_) { - element.setAttribute('aria-' + state, value); - } + element.setAttribute('aria-' + state, value); }; /** - * Gets value of specified state property. + * Gets value of specified state or property. * @param {Element} element DOM node to get state from. * @param {string} stateName State name. * @return {string} Value of the state attribute. */ goog.dom.a11y.getState = function(element, stateName) { - return element.getAttribute('aria-' + stateName) || ''; -}; - - -/** - * Getter for noBrowserCheck_ flag. - * @return {boolean} Value of the noBrowserCheck_ flag. - */ -goog.dom.a11y.getNoBrowserCheck = function() { - return !!goog.dom.a11y.noBrowserCheck_; -}; - - -/** - * Sets a flag to skip browser check while adding ARIA roles and states. - * @param {boolean} noBrowserCheck True if no browser check should be performed. - */ -goog.dom.a11y.setNoBrowserCheck = function(noBrowserCheck) { - goog.dom.a11y.noBrowserCheck_ = noBrowserCheck; + var attrb = + /** @type {string|number|boolean} */(element.getAttribute('aria-' + + stateName)); + // Check for multiple representations - attrb might + // be a boolean or a string + if ((attrb === true) || (attrb === false)) { + return attrb ? 'true' : 'false'; + } else if (!attrb) { + return ''; + } else { + return String(attrb); + } }; diff --git a/contrib/closure-library/goog/dom/a11y_test.html b/contrib/closure-library/goog/dom/a11y_test.html index 404f498..03ee5d9 100644 --- a/contrib/closure-library/goog/dom/a11y_test.html +++ b/contrib/closure-library/goog/dom/a11y_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/dom/annotate_test.html b/contrib/closure-library/goog/dom/annotate_test.html index fb8ef59..c666494 100644 --- a/contrib/closure-library/goog/dom/annotate_test.html +++ b/contrib/closure-library/goog/dom/annotate_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/dom/browserfeature.js b/contrib/closure-library/goog/dom/browserfeature.js index 9910870..662bc3b 100644 --- a/contrib/closure-library/goog/dom/browserfeature.js +++ b/contrib/closure-library/goog/dom/browserfeature.js @@ -35,6 +35,15 @@ goog.dom.BrowserFeature = { CAN_ADD_NAME_OR_TYPE_ATTRIBUTES: !goog.userAgent.IE || goog.userAgent.isVersion('9'), + /** + * Whether we can use element.children to access an element's Element + * children. Available since Gecko 1.9.1, IE 9. (IE<9 also includes comment + * nodes in the collection.) + */ + CAN_USE_CHILDREN_ATTRIBUTE: !goog.userAgent.GECKO && !goog.userAgent.IE || + goog.userAgent.IE && goog.userAgent.isVersion('9') || + goog.userAgent.GECKO && goog.userAgent.isVersion('1.9.1'), + /** * Opera, Safari 3, and Internet Explorer 9 all support innerText but they * include text nodes in script and style tags. diff --git a/contrib/closure-library/goog/dom/browserrange/abstractrange.js b/contrib/closure-library/goog/dom/browserrange/abstractrange.js index 7d763ee..8875b33 100644 --- a/contrib/closure-library/goog/dom/browserrange/abstractrange.js +++ b/contrib/closure-library/goog/dom/browserrange/abstractrange.js @@ -36,6 +36,7 @@ goog.require('goog.string.StringBuffer'); goog.require('goog.userAgent'); + /** * The constructor for abstract ranges. Don't call this from subclasses. * @constructor @@ -85,6 +86,7 @@ goog.dom.browserrange.AbstractRange.prototype.getStartNode = goog.dom.browserrange.AbstractRange.prototype.getStartOffset = goog.abstractMethod; + /** * Returns the node the range ends in. * @return {Node} The element or text node the range ends in. diff --git a/contrib/closure-library/goog/dom/browserrange/browserrange.js b/contrib/closure-library/goog/dom/browserrange/browserrange.js index 9b06a5b..2c85777 100644 --- a/contrib/closure-library/goog/dom/browserrange/browserrange.js +++ b/contrib/closure-library/goog/dom/browserrange/browserrange.js @@ -58,7 +58,7 @@ goog.dom.browserrange.Error = { * @return {goog.dom.browserrange.AbstractRange} A wrapper object. */ goog.dom.browserrange.createRange = function(range) { - if (goog.userAgent.IE) { + if (goog.userAgent.IE && !goog.userAgent.isDocumentMode(9)) { return new goog.dom.browserrange.IeRange( /** @type {TextRange} */ (range), goog.dom.getOwnerDocument(range.parentElement())); @@ -85,7 +85,7 @@ goog.dom.browserrange.createRange = function(range) { * @return {goog.dom.browserrange.AbstractRange} A wrapper object. */ goog.dom.browserrange.createRangeFromNodeContents = function(node) { - if (goog.userAgent.IE) { + if (goog.userAgent.IE && !goog.userAgent.isDocumentMode(9)) { return goog.dom.browserrange.IeRange.createFromNodeContents(node); } else if (goog.userAgent.WEBKIT) { return goog.dom.browserrange.WebKitRange.createFromNodeContents(node); @@ -114,7 +114,7 @@ goog.dom.browserrange.createRangeFromNodeContents = function(node) { */ goog.dom.browserrange.createRangeFromNodes = function(startNode, startOffset, endNode, endOffset) { - if (goog.userAgent.IE) { + if (goog.userAgent.IE && !goog.userAgent.isDocumentMode(9)) { return goog.dom.browserrange.IeRange.createFromNodes(startNode, startOffset, endNode, endOffset); } else if (goog.userAgent.WEBKIT) { diff --git a/contrib/closure-library/goog/dom/browserrange/browserrange_test.html b/contrib/closure-library/goog/dom/browserrange/browserrange_test.html index 5d71807..996817d 100644 --- a/contrib/closure-library/goog/dom/browserrange/browserrange_test.html +++ b/contrib/closure-library/goog/dom/browserrange/browserrange_test.html @@ -3,7 +3,7 @@ @@ -309,7 +309,8 @@ var selRange = goog.dom.Range.createFromWindow(); var startNode = selRange.getStartNode(); - if (goog.userAgent.GECKO) { + if (goog.userAgent.GECKO || + (goog.userAgent.IE && goog.userAgent.isDocumentMode(9))) { assertEquals('Start node should be span', spanElem, startNode); } else { assertEquals('Startnode should have text:123', @@ -334,7 +335,8 @@ var selRange = goog.dom.Range.createFromWindow(); var startNode = selRange.getStartNode(); - if (goog.userAgent.GECKO) { + if (goog.userAgent.GECKO || + (goog.userAgent.IE && goog.userAgent.isDocumentMode(9))) { assertEquals('Start node should be span', spanElem, startNode); } else { assertEquals('Start node should have text:123', @@ -363,7 +365,8 @@ var selRange = goog.dom.Range.createFromWindow(); var startNode = selRange.getStartNode(); - if (goog.userAgent.GECKO) { + if (goog.userAgent.GECKO || + (goog.userAgent.IE && goog.userAgent.isDocumentMode(9))) { assertEquals('Start node should be span', spanElem, startNode); } else { assertEquals('Startnode should have text:123', @@ -371,7 +374,8 @@ } assertEquals('Startoffset should be 0', 0, selRange.getStartOffset()); var endNode = selRange.getEndNode(); - if (goog.userAgent.GECKO) { + if (goog.userAgent.GECKO || + (goog.userAgent.IE && goog.userAgent.isDocumentMode(9))) { assertEquals('Endnode should be span', spanElem, endNode); assertEquals('Endoffset should be 1', 1, selRange.getEndOffset()); } else { @@ -396,7 +400,8 @@ assertEquals('Start node should be span', spanElem, startNode); assertEquals('Startoffset should be 1', 1, selRange.getStartOffset()); var endNode = selRange.getEndNode(); - if (goog.userAgent.GECKO) { + if (goog.userAgent.GECKO || + (goog.userAgent.IE && goog.userAgent.isDocumentMode(9))) { assertEquals('Endnode should be span', spanElem, endNode); assertEquals('Endoffset should be 3', 3, selRange.getEndOffset()); } else { @@ -418,7 +423,8 @@ var selRange = goog.dom.Range.createFromWindow(); var startNode = selRange.getStartNode(); - if (goog.userAgent.GECKO) { + if (goog.userAgent.GECKO || + (goog.userAgent.IE && goog.userAgent.isDocumentMode(9))) { assertEquals('Start node should be span', spanElem, startNode); assertEquals('Startoffset should be 2', 2, selRange.getStartOffset()); } else { @@ -427,7 +433,8 @@ assertEquals('Startoffset should be 0', 0, selRange.getStartOffset()); } var endNode = selRange.getEndNode(); - if (goog.userAgent.GECKO) { + if (goog.userAgent.GECKO || + (goog.userAgent.IE && goog.userAgent.isDocumentMode(9))) { assertEquals('Endnode should be span', spanElem, endNode); assertEquals('Endoffset should be 3', 3, selRange.getEndOffset()); } else { diff --git a/contrib/closure-library/goog/dom/browserrange/geckorange.js b/contrib/closure-library/goog/dom/browserrange/geckorange.js index e4ae2b9..174d9c5 100644 --- a/contrib/closure-library/goog/dom/browserrange/geckorange.js +++ b/contrib/closure-library/goog/dom/browserrange/geckorange.js @@ -27,6 +27,7 @@ goog.provide('goog.dom.browserrange.GeckoRange'); goog.require('goog.dom.browserrange.W3cRange'); + /** * The constructor for Gecko specific browser ranges. * @param {Range} range The range object. diff --git a/contrib/closure-library/goog/dom/browserrange/ierange.js b/contrib/closure-library/goog/dom/browserrange/ierange.js index de7cba1..e3cd847 100644 --- a/contrib/closure-library/goog/dom/browserrange/ierange.js +++ b/contrib/closure-library/goog/dom/browserrange/ierange.js @@ -38,6 +38,7 @@ goog.require('goog.iter.StopIteration'); goog.require('goog.string'); + /** * The constructor for IE specific browser ranges. * @param {TextRange} range The range object. @@ -64,7 +65,6 @@ goog.inherits(goog.dom.browserrange.IeRange, goog.dom.browserrange.AbstractRange); - /** * Logging object. * @type {goog.debug.Logger} @@ -306,7 +306,6 @@ goog.dom.browserrange.IeRange.prototype.startOffset_ = -1; goog.dom.browserrange.IeRange.prototype.endOffset_ = -1; - /** * @return {goog.dom.browserrange.IeRange} A clone of this range. */ @@ -432,7 +431,7 @@ goog.dom.browserrange.IeRange.prototype.findDeepestContainer_ = function(node) { var isNativeInRangeErratic = this.isCollapsed() && isChildRangeErratic; // In case 2 mentioned above, childRange is also collapsed. So we need to - // compare start of this range with both start and end of child range. + // compare start of this range with both start and end of child range. var inChildRange = isNativeInRangeErratic ? (this.compareBrowserRangeEndpoints(childRange, start, start) >= 0 && this.compareBrowserRangeEndpoints(childRange, start, end) <= 0) : @@ -536,7 +535,7 @@ goog.dom.browserrange.IeRange.prototype.getEndpointNode_ = function(endpoint, // dom related properties like ownerDocument, parentNode, nextSibling etc // cause error when accessed. Therefore use the for-loop on childNodes to // iterate. - for (var j = 0, length = node.childNodes.length; j < length; j++ ) { + for (var j = 0, length = node.childNodes.length; j < length; j++) { var i = isStartEndpoint ? j : length - j - 1; var child = node.childNodes[i]; var childRange; @@ -822,6 +821,7 @@ goog.dom.browserrange.IeRange.prototype.removeContents = function() { } }; + /** * @param {TextRange} range The range to get a dom helper for. * @return {goog.dom.DomHelper} A dom helper for the document the range diff --git a/contrib/closure-library/goog/dom/browserrange/operarange.js b/contrib/closure-library/goog/dom/browserrange/operarange.js index 619ba34..d4b321a 100644 --- a/contrib/closure-library/goog/dom/browserrange/operarange.js +++ b/contrib/closure-library/goog/dom/browserrange/operarange.js @@ -26,6 +26,7 @@ goog.provide('goog.dom.browserrange.OperaRange'); goog.require('goog.dom.browserrange.W3cRange'); + /** * The constructor for Opera specific browser ranges. * @param {Range} range The range object. diff --git a/contrib/closure-library/goog/dom/browserrange/w3crange.js b/contrib/closure-library/goog/dom/browserrange/w3crange.js index d49e843..128b375 100644 --- a/contrib/closure-library/goog/dom/browserrange/w3crange.js +++ b/contrib/closure-library/goog/dom/browserrange/w3crange.js @@ -32,6 +32,7 @@ goog.require('goog.dom.browserrange.AbstractRange'); goog.require('goog.string'); + /** * The constructor for W3C specific browser ranges. * @param {Range} range The range object. diff --git a/contrib/closure-library/goog/dom/browserrange/webkitrange.js b/contrib/closure-library/goog/dom/browserrange/webkitrange.js index 27eebb9..a60b30a 100644 --- a/contrib/closure-library/goog/dom/browserrange/webkitrange.js +++ b/contrib/closure-library/goog/dom/browserrange/webkitrange.js @@ -29,6 +29,7 @@ goog.require('goog.dom.browserrange.W3cRange'); goog.require('goog.userAgent'); + /** * The constructor for WebKit specific browser ranges. * @param {Range} range The range object. @@ -68,6 +69,7 @@ goog.dom.browserrange.WebKitRange.createFromNodes = function(startNode, startOffset, endNode, endOffset)); }; + /** @inheritDoc */ goog.dom.browserrange.WebKitRange.prototype.compareBrowserRangeEndpoints = function(range, thisEndpoint, otherEndpoint) { @@ -91,6 +93,7 @@ goog.dom.browserrange.WebKitRange.prototype.compareBrowserRangeEndpoints = /** @type {Range} */ (range)); }; + /** @inheritDoc */ goog.dom.browserrange.WebKitRange.prototype.selectInternal = function( selection, reversed) { diff --git a/contrib/closure-library/goog/dom/classes_test.html b/contrib/closure-library/goog/dom/classes_test.html index c5db8a6..9368795 100644 --- a/contrib/closure-library/goog/dom/classes_test.html +++ b/contrib/closure-library/goog/dom/classes_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/dom/controlrange.js b/contrib/closure-library/goog/dom/controlrange.js index e38dabe..161dc79 100644 --- a/contrib/closure-library/goog/dom/controlrange.js +++ b/contrib/closure-library/goog/dom/controlrange.js @@ -36,6 +36,7 @@ goog.require('goog.iter.StopIteration'); goog.require('goog.userAgent'); + /** * Create a new control selection with no properties. Do not use this * constructor: use one of the goog.dom.Range.createFrom* methods instead. @@ -345,6 +346,7 @@ goog.dom.ControlRange.prototype.collapse = function(toAnchor) { // SAVED RANGE OBJECTS + /** * A SavedRange implementation using DOM endpoints. * @param {goog.dom.ControlRange} range The range to save. @@ -387,6 +389,7 @@ goog.dom.DomSavedControlRange_.prototype.disposeInternal = function() { // RANGE ITERATION + /** * Subclass of goog.dom.TagIterator that iterates over a DOM range. It * adds functions to determine the portion of each text node that is selected. @@ -399,7 +402,8 @@ goog.dom.ControlRangeIterator = function(range) { if (range) { this.elements_ = range.getSortedElements(); this.startNode_ = this.elements_.shift(); - this.endNode_ = goog.array.peek(this.elements_) || this.startNode_; + this.endNode_ = /** @type {Node} */ (goog.array.peek(this.elements_)) || + this.startNode_; } goog.dom.RangeIterator.call(this, this.startNode_, false); diff --git a/contrib/closure-library/goog/dom/controlrange_test.html b/contrib/closure-library/goog/dom/controlrange_test.html index fae21c4..99ecd11 100644 --- a/contrib/closure-library/goog/dom/controlrange_test.html +++ b/contrib/closure-library/goog/dom/controlrange_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/dom/dataset.js b/contrib/closure-library/goog/dom/dataset.js new file mode 100644 index 0000000..5f9b821 --- /dev/null +++ b/contrib/closure-library/goog/dom/dataset.js @@ -0,0 +1,90 @@ +// Copyright 2009 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Utilities for adding, removing and setting values in + * an Element's dataset. + * See {@link http://www.w3.org/TR/html5/Overview.html#dom-dataset}. + * + */ + +goog.provide('goog.dom.dataset'); + +goog.require('goog.string'); + + +/** + * Sets a custom data attribute on an element. The key should be + * in camelCase format (e.g "keyName" for the "data-key-name" attribute). + * @param {Element} element DOM node to set the custom data attribute on. + * @param {string} key Key for the custom data attribute. + * @param {string} value Value for the custom data attribute. + */ +goog.dom.dataset.set = function(element, key, value) { + if (element.dataset) { + element.dataset[key] = value; + } else { + element.setAttribute('data-' + goog.string.toSelectorCase(key), value); + } +}; + + +/** + * Gets a custom data attribute from an element. The key should be + * in camelCase format (e.g "keyName" for the "data-key-name" attribute). + * @param {Element} element DOM node to get the custom data attribute from. + * @param {string} key Key for the custom data attribute. + * @return {?string} The attribute value, if it exists. + */ +goog.dom.dataset.get = function(element, key) { + if (element.dataset) { + return element.dataset[key]; + } else { + return element.getAttribute('data-' + goog.string.toSelectorCase(key)); + } +}; + + +/** + * Removes a custom data attribute from an element. The key should be + * in camelCase format (e.g "keyName" for the "data-key-name" attribute). + * @param {Element} element DOM node to get the custom data attribute from. + * @param {string} key Key for the custom data attribute. + */ +goog.dom.dataset.remove = function(element, key) { + if (element.dataset) { + delete element.dataset[key]; + } else { + element.removeAttribute('data-' + goog.string.toSelectorCase(key)); + } +}; + + +/** + * Checks whether custom data attribute exists on an element. The key should be + * in camelCase format (e.g "keyName" for the "data-key-name" attribute). + * + * @param {Element} element DOM node to get the custom data attribute from. + * @param {string} key Key for the custom data attribute. + * @return {boolean} Whether the attibute exists. + */ +goog.dom.dataset.has = function(element, key) { + if (element.dataset) { + return key in element.dataset; + } else if (element.hasAttribute) { + return element.hasAttribute('data-' + goog.string.toSelectorCase(key)); + } else { + return !!(element.getAttribute('data-' + goog.string.toSelectorCase(key))); + } +}; diff --git a/contrib/closure-library/goog/dom/dataset_test.html b/contrib/closure-library/goog/dom/dataset_test.html new file mode 100644 index 0000000..0030aa6 --- /dev/null +++ b/contrib/closure-library/goog/dom/dataset_test.html @@ -0,0 +1,104 @@ + + + + + +Closure Unit Tests - goog.dom.dataset + + + + + + + + + diff --git a/contrib/closure-library/goog/dom/dom.js b/contrib/closure-library/goog/dom/dom.js index 12ea234..c970e92 100644 --- a/contrib/closure-library/goog/dom/dom.js +++ b/contrib/closure-library/goog/dom/dom.js @@ -336,6 +336,7 @@ goog.dom.DIRECT_ATTRIBUTE_MAP_ = { 'width': 'width', 'usemap': 'useMap', 'frameborder': 'frameBorder', + 'maxlength': 'maxLength', 'type': 'type' }; @@ -440,13 +441,7 @@ goog.dom.getViewportSize_ = function(win) { return new goog.math.Size(win.innerWidth, innerHeight); } - var readsFromDocumentElement = goog.dom.isCss1CompatMode_(doc); - if (goog.userAgent.OPERA && !goog.userAgent.isVersion('9.50')) { - // Older versions of Opera used to read from document.body, but this - // changed with 9.5. - readsFromDocumentElement = false; - } - var el = readsFromDocumentElement ? doc.documentElement : doc.body; + var el = goog.dom.isCss1CompatMode_(doc) ? doc.documentElement : doc.body; return new goog.math.Size(el.clientWidth, el.clientHeight); }; @@ -461,6 +456,7 @@ goog.dom.getDocumentHeight = function() { return goog.dom.getDocumentHeight_(window); }; + /** * Calculates the height of the document of the given window. * @@ -566,7 +562,9 @@ goog.dom.getDocumentScroll = function() { */ goog.dom.getDocumentScroll_ = function(doc) { var el = goog.dom.getDocumentScrollElement_(doc); - return new goog.math.Coordinate(el.scrollLeft, el.scrollTop); + var win = goog.dom.getWindow_(doc); + return new goog.math.Coordinate(win.pageXOffset || el.scrollLeft, + win.pageYOffset || el.scrollTop); }; @@ -639,6 +637,7 @@ goog.dom.createDom = function(tagName, opt_attributes, var_args) { return goog.dom.createDom_(document, arguments); }; + /** * Helper for {@code createDom}. * @param {!Document} doc The document to create the DOM in. @@ -996,6 +995,22 @@ goog.dom.insertSiblingAfter = function(newNode, refNode) { }; +/** + * Insert a child at a given index. If index is larger than the number of child + * nodes that the parent currently has, the node is inserted as the last child + * node. + * @param {Element} parent The element into which to insert the child. + * @param {Node} child The element to insert. + * @param {number} index The index at which to insert the new child node. Must + * not be negative. + */ +goog.dom.insertChildAt = function(parent, child, index) { + // Note that if the second argument is null, insertBefore + // will append the child at the end of the list of children. + parent.insertBefore(child, parent.childNodes[index] || null); +}; + + /** * Removes a node from its parent. * @param {Node} node The node to remove. @@ -1047,12 +1062,35 @@ goog.dom.flattenElement = function(element) { }; +/** + * Returns an array containing just the element children of the given element. + * @param {Element} element The element whose element children we want. + * @return {Array|NodeList} An array or array-like list of just the element + * children of the given element. + */ +goog.dom.getChildren = function(element) { + // We check if the children attribute is supported for child elements + // since IE8 misuses the attribute by also including comments. + if (goog.dom.BrowserFeature.CAN_USE_CHILDREN_ATTRIBUTE && + element.children != undefined) { + return element.children; + } + // Fall back to manually filtering the element's child nodes. + return goog.array.filter(element.childNodes, function(node) { + return node.nodeType == goog.dom.NodeType.ELEMENT; + }); +}; + + /** * Returns the first child node that is an element. * @param {Node} node The node to get the first child element of. * @return {Element} The first child node of {@code node} that is an element. */ goog.dom.getFirstElementChild = function(node) { + if (node.firstElementChild != undefined) { + return /** @type {Element} */(node).firstElementChild; + } return goog.dom.getNextElementNode_(node.firstChild, true); }; @@ -1063,6 +1101,9 @@ goog.dom.getFirstElementChild = function(node) { * @return {Element} The last child node of {@code node} that is an element. */ goog.dom.getLastElementChild = function(node) { + if (node.lastElementChild != undefined) { + return /** @type {Element} */(node).lastElementChild; + } return goog.dom.getNextElementNode_(node.lastChild, false); }; @@ -1073,6 +1114,9 @@ goog.dom.getLastElementChild = function(node) { * @return {Element} The next sibling of {@code node} that is an element. */ goog.dom.getNextElementSibling = function(node) { + if (node.nextElementSibling != undefined) { + return /** @type {Element} */(node).nextElementSibling; + } return goog.dom.getNextElementNode_(node.nextSibling, true); }; @@ -1084,6 +1128,9 @@ goog.dom.getNextElementSibling = function(node) { * an element. */ goog.dom.getPreviousElementSibling = function(node) { + if (node.previousElementSibling != undefined) { + return /** @type {Element} */(node).previousElementSibling; + } return goog.dom.getNextElementNode_(node.previousSibling, false); }; @@ -1162,6 +1209,17 @@ goog.dom.isNodeLike = function(obj) { }; +/** + * Returns true if the specified value is a Window object. This includes the + * global window for HTML pages, and iframe windows. + * @param {*} obj Variable to test. + * @return {boolean} Whether the variable is a window. + */ +goog.dom.isWindow = function(obj) { + return goog.isObject(obj) && obj['window'] == obj; +}; + + /** * Whether a node contains another node. * @param {Node} parent The node that should contain the other node. @@ -1594,6 +1652,8 @@ goog.dom.getTextContent = function(node) { // Strip ­ entities. goog.format.insertWordBreaks inserts them in Opera. textContent = textContent.replace(/ \xAD /g, ' ').replace(/\xAD/g, ''); + // Strip ​ entities. goog.format.insertWordBreaks inserts them in IE8. + textContent = textContent.replace(/\u200B/g, ''); // Skip this replacement on IE, which automatically turns   into ' ' // and / +/ into ' ' when reading innerText. @@ -1781,6 +1841,21 @@ goog.dom.getAncestorByTagNameAndClass = function(element, opt_tag, opt_class) { }; +/** + * Walks up the DOM hierarchy returning the first ancestor that has the passed + * class name. If the passed element matches the specified criteria, the + * element itself is returned. + * @param {Node} element The DOM node to start with. + * @param {?string=} opt_class The class name to match (or null/undefined to + * match any node regardless of class name). + * @return {Node} The first ancestor that matches the passed criteria, or + * null if none match. + */ +goog.dom.getAncestorByClass = function(element, opt_class) { + return goog.dom.getAncestorByTagNameAndClass(element, null, opt_class); +}; + + /** * Walks up the DOM hierarchy returning the first ancestor that passes the * matcher function. @@ -1814,6 +1889,7 @@ goog.dom.getAncestor = function( }; + /** * Create an instance of a DOM helper with a new document object. * @param {Document=} opt_document Document object to associate with this @@ -2375,6 +2451,20 @@ goog.dom.DomHelper.prototype.getAncestorByTagNameAndClass = goog.dom.getAncestorByTagNameAndClass; +/** + * Walks up the DOM hierarchy returning the first ancestor that has the passed + * class name. If the passed element matches the specified criteria, the + * element itself is returned. + * @param {Node} element The DOM node to start with. + * @param {?string=} opt_class The class name to match (or null/undefined to + * match any node regardless of class name). + * @return {Node} The first ancestor that matches the passed criteria, or + * null if none match. + */ +goog.dom.DomHelper.prototype.getAncestorByClass = + goog.dom.getAncestorByClass; + + /** * Walks up the DOM hierarchy returning the first ancestor that passes the * matcher function. diff --git a/contrib/closure-library/goog/dom/dom_quirks_test.html b/contrib/closure-library/goog/dom/dom_quirks_test.html index 434eb4a..f501342 100644 --- a/contrib/closure-library/goog/dom/dom_quirks_test.html +++ b/contrib/closure-library/goog/dom/dom_quirks_test.html @@ -2,7 +2,7 @@ diff --git a/contrib/closure-library/goog/dom/iframe_test.html b/contrib/closure-library/goog/dom/iframe_test.html index edd7961..9370f9d 100644 --- a/contrib/closure-library/goog/dom/iframe_test.html +++ b/contrib/closure-library/goog/dom/iframe_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/dom/multirange.js b/contrib/closure-library/goog/dom/multirange.js index b344d40..e03b5af 100644 --- a/contrib/closure-library/goog/dom/multirange.js +++ b/contrib/closure-library/goog/dom/multirange.js @@ -33,6 +33,7 @@ goog.require('goog.dom.TextRange'); goog.require('goog.iter.StopIteration'); + /** * Creates a new multi part range with no properties. Do not use this * constructor: use one of the goog.dom.Range.createFrom* methods instead. @@ -360,6 +361,7 @@ goog.dom.MultiRange.prototype.collapse = function(toAnchor) { // SAVED RANGE OBJECTS + /** * A SavedRange implementation using DOM endpoints. * @param {goog.dom.MultiRange} range The range to save. @@ -405,6 +407,7 @@ goog.dom.DomSavedMultiRange_.prototype.disposeInternal = function() { // RANGE ITERATION + /** * Subclass of goog.dom.TagIterator that iterates over a DOM range. It * adds functions to determine the portion of each text node that is selected. diff --git a/contrib/closure-library/goog/dom/multirange_test.html b/contrib/closure-library/goog/dom/multirange_test.html index 51d06ec..f82fc50 100644 --- a/contrib/closure-library/goog/dom/multirange_test.html +++ b/contrib/closure-library/goog/dom/multirange_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/dom/nodeoffset.js b/contrib/closure-library/goog/dom/nodeoffset.js index eb53324..3a10f7e 100644 --- a/contrib/closure-library/goog/dom/nodeoffset.js +++ b/contrib/closure-library/goog/dom/nodeoffset.js @@ -25,6 +25,7 @@ goog.require('goog.Disposable'); goog.require('goog.dom.TagName'); + /** * Object to store the offset from one node to another in a way that works on * any similar DOM structure regardless of whether it is the same actual nodes. @@ -34,6 +35,8 @@ goog.require('goog.dom.TagName'); * @constructor */ goog.dom.NodeOffset = function(node, baseNode) { + goog.Disposable.call(this); + /** * A stack of childNode offsets. * @type {Array.} diff --git a/contrib/closure-library/goog/dom/nodeoffset_test.html b/contrib/closure-library/goog/dom/nodeoffset_test.html index c24af78..b92b8f7 100644 --- a/contrib/closure-library/goog/dom/nodeoffset_test.html +++ b/contrib/closure-library/goog/dom/nodeoffset_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/dom/pattern/abstractpattern.js b/contrib/closure-library/goog/dom/pattern/abstractpattern.js index 65b8372..6015b09 100644 --- a/contrib/closure-library/goog/dom/pattern/abstractpattern.js +++ b/contrib/closure-library/goog/dom/pattern/abstractpattern.js @@ -23,6 +23,7 @@ goog.provide('goog.dom.pattern.AbstractPattern'); goog.require('goog.dom.pattern.MatchType'); + /** * Base pattern class for DOM matching. * diff --git a/contrib/closure-library/goog/dom/pattern/allchildren.js b/contrib/closure-library/goog/dom/pattern/allchildren.js index 2ff215c..75ebb5e 100644 --- a/contrib/closure-library/goog/dom/pattern/allchildren.js +++ b/contrib/closure-library/goog/dom/pattern/allchildren.js @@ -24,6 +24,7 @@ goog.require('goog.dom.pattern.AbstractPattern'); goog.require('goog.dom.pattern.MatchType'); + /** * Pattern object that matches any nodes at or below the current tree depth. * diff --git a/contrib/closure-library/goog/dom/pattern/callback/counter.js b/contrib/closure-library/goog/dom/pattern/callback/counter.js index 5eff1db..a354de0 100644 --- a/contrib/closure-library/goog/dom/pattern/callback/counter.js +++ b/contrib/closure-library/goog/dom/pattern/callback/counter.js @@ -21,6 +21,7 @@ goog.provide('goog.dom.pattern.callback.Counter'); + /** * Callback class for counting matches. * @constructor diff --git a/contrib/closure-library/goog/dom/pattern/callback/test.js b/contrib/closure-library/goog/dom/pattern/callback/test.js index c69d8c3..30a58c1 100644 --- a/contrib/closure-library/goog/dom/pattern/callback/test.js +++ b/contrib/closure-library/goog/dom/pattern/callback/test.js @@ -23,6 +23,7 @@ goog.provide('goog.dom.pattern.callback.Test'); goog.require('goog.iter.StopIteration'); + /** * Callback class for testing for at least one match. * @constructor diff --git a/contrib/closure-library/goog/dom/pattern/childmatches.js b/contrib/closure-library/goog/dom/pattern/childmatches.js index d16efb6..7315ebb 100644 --- a/contrib/closure-library/goog/dom/pattern/childmatches.js +++ b/contrib/closure-library/goog/dom/pattern/childmatches.js @@ -25,6 +25,7 @@ goog.require('goog.dom.pattern.AllChildren'); goog.require('goog.dom.pattern.MatchType'); + /** * Pattern object that matches any nodes at or below the current tree depth. * @@ -60,6 +61,7 @@ goog.dom.pattern.ChildMatches.prototype.matches; */ goog.dom.pattern.ChildMatches.prototype.minimumMatches_ = 0; + /** * The child pattern to collect matches from. * diff --git a/contrib/closure-library/goog/dom/pattern/endtag.js b/contrib/closure-library/goog/dom/pattern/endtag.js index 8af3e28..75f9952 100644 --- a/contrib/closure-library/goog/dom/pattern/endtag.js +++ b/contrib/closure-library/goog/dom/pattern/endtag.js @@ -24,6 +24,7 @@ goog.require('goog.dom.TagWalkType'); goog.require('goog.dom.pattern.Tag'); + /** * Pattern object that matches a closing tag. * diff --git a/contrib/closure-library/goog/dom/pattern/fulltag.js b/contrib/closure-library/goog/dom/pattern/fulltag.js index fdbca53..8296c83 100644 --- a/contrib/closure-library/goog/dom/pattern/fulltag.js +++ b/contrib/closure-library/goog/dom/pattern/fulltag.js @@ -25,6 +25,7 @@ goog.require('goog.dom.pattern.StartTag'); goog.require('goog.dom.pattern.Tag'); + /** * Pattern object that matches a full tag including all its children. * @@ -60,6 +61,7 @@ goog.inherits(goog.dom.pattern.FullTag, goog.dom.pattern.StartTag); */ goog.dom.pattern.FullTag.prototype.depth_ = 0; + /** * Test whether the given token is a start tag token which matches the tag name, * style, and attributes provided in the constructor. diff --git a/contrib/closure-library/goog/dom/pattern/matcher.js b/contrib/closure-library/goog/dom/pattern/matcher.js index eb52e8a..c0c87a3 100644 --- a/contrib/closure-library/goog/dom/pattern/matcher.js +++ b/contrib/closure-library/goog/dom/pattern/matcher.js @@ -28,6 +28,8 @@ goog.require('goog.iter'); // TODO(robbyw): Allow for backtracks of size > 1. + + /** * Given a set of patterns and a root node, this class tests the patterns in * parallel. diff --git a/contrib/closure-library/goog/dom/pattern/matcher_test.html b/contrib/closure-library/goog/dom/pattern/matcher_test.html index 5f780c0..67ef94c 100644 --- a/contrib/closure-library/goog/dom/pattern/matcher_test.html +++ b/contrib/closure-library/goog/dom/pattern/matcher_test.html @@ -5,7 +5,7 @@ diff --git a/contrib/closure-library/goog/dom/pattern/pattern_test.html b/contrib/closure-library/goog/dom/pattern/pattern_test.html index 1fd8786..542e713 100644 --- a/contrib/closure-library/goog/dom/pattern/pattern_test.html +++ b/contrib/closure-library/goog/dom/pattern/pattern_test.html @@ -5,7 +5,7 @@ diff --git a/contrib/closure-library/goog/dom/pattern/repeat.js b/contrib/closure-library/goog/dom/pattern/repeat.js index 4a0d673..d7cfbcc 100644 --- a/contrib/closure-library/goog/dom/pattern/repeat.js +++ b/contrib/closure-library/goog/dom/pattern/repeat.js @@ -24,6 +24,8 @@ goog.require('goog.dom.NodeType'); goog.require('goog.dom.pattern.AbstractPattern'); goog.require('goog.dom.pattern.MatchType'); + + /** * Pattern object that matches a repetition of another pattern. * @param {goog.dom.pattern.AbstractPattern} pattern The pattern to @@ -109,6 +111,7 @@ goog.dom.pattern.Repeat.prototype.matches; * matches, BACKTRACK_MATCH if the pattern does not match * but already had accumulated matches, MATCHING if the pattern * starts a match, and NO_MATCH if the pattern does not match. + * @suppress {missingProperties} See the broken line below. */ goog.dom.pattern.Repeat.prototype.matchToken = function(token, type) { // Reset if we're starting a new match @@ -152,6 +155,9 @@ goog.dom.pattern.Repeat.prototype.matchToken = function(token, type) { // TODO(robbyw): Backtrack further if necessary. this.count++; + // NOTE(nicksantos): This line of code is broken. this.patterns_ doesn't + // exist, and this.currentPosition_ doesn't exit. When this is fixed, + // remove the missingProperties suppression above. if (this.currentPosition_ == this.patterns_.length) { this.needsReset_ = true; return goog.dom.pattern.MatchType.BACKTRACK_MATCH; diff --git a/contrib/closure-library/goog/dom/pattern/sequence.js b/contrib/closure-library/goog/dom/pattern/sequence.js index d7ba315..7f2ea3e 100644 --- a/contrib/closure-library/goog/dom/pattern/sequence.js +++ b/contrib/closure-library/goog/dom/pattern/sequence.js @@ -25,6 +25,7 @@ goog.require('goog.dom.pattern.AbstractPattern'); goog.require('goog.dom.pattern.MatchType'); + /** * Pattern object that matches a sequence of other patterns. * diff --git a/contrib/closure-library/goog/dom/pattern/starttag.js b/contrib/closure-library/goog/dom/pattern/starttag.js index 900cdf4..4ce0113 100644 --- a/contrib/closure-library/goog/dom/pattern/starttag.js +++ b/contrib/closure-library/goog/dom/pattern/starttag.js @@ -24,6 +24,7 @@ goog.require('goog.dom.TagWalkType'); goog.require('goog.dom.pattern.Tag'); + /** * Pattern object that matches an opening tag. * diff --git a/contrib/closure-library/goog/dom/pattern/tag.js b/contrib/closure-library/goog/dom/pattern/tag.js index e7d76c5..9c714d0 100644 --- a/contrib/closure-library/goog/dom/pattern/tag.js +++ b/contrib/closure-library/goog/dom/pattern/tag.js @@ -26,6 +26,7 @@ goog.require('goog.dom.pattern.MatchType'); goog.require('goog.object'); + /** * Pattern object that matches an tag. * diff --git a/contrib/closure-library/goog/dom/pattern/text.js b/contrib/closure-library/goog/dom/pattern/text.js index c68a82a..5863a49 100644 --- a/contrib/closure-library/goog/dom/pattern/text.js +++ b/contrib/closure-library/goog/dom/pattern/text.js @@ -25,6 +25,8 @@ goog.require('goog.dom.pattern'); goog.require('goog.dom.pattern.AbstractPattern'); goog.require('goog.dom.pattern.MatchType'); + + /** * Pattern object that matches text by exact matching or regular expressions. * @@ -46,6 +48,7 @@ goog.inherits(goog.dom.pattern.Text, goog.dom.pattern.AbstractPattern); */ goog.dom.pattern.Text.prototype.match_; + /** * Test whether the given token is a text token which matches the string or * regular expression provided in the constructor. diff --git a/contrib/closure-library/goog/dom/range.js b/contrib/closure-library/goog/dom/range.js index 5008cde..4df2a20 100644 --- a/contrib/closure-library/goog/dom/range.js +++ b/contrib/closure-library/goog/dom/range.js @@ -160,7 +160,13 @@ goog.dom.Range.clearSelection = function(opt_win) { // Emptying an already empty selection throws an exception in IE } } else { - sel.removeAllRanges(); + try { + sel.removeAllRanges(); + } catch (e) { + // This throws in IE9 if the range has been invalidated; for example, if + // the user clicked on an element which disappeared during the event + // handler. + } } }; diff --git a/contrib/closure-library/goog/dom/range_test.html b/contrib/closure-library/goog/dom/range_test.html index b0a9f4f..14070be 100644 --- a/contrib/closure-library/goog/dom/range_test.html +++ b/contrib/closure-library/goog/dom/range_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/dom/savedcaretrange.js b/contrib/closure-library/goog/dom/savedcaretrange.js index 305430f..31d3134 100644 --- a/contrib/closure-library/goog/dom/savedcaretrange.js +++ b/contrib/closure-library/goog/dom/savedcaretrange.js @@ -28,6 +28,7 @@ goog.require('goog.dom.TagName'); goog.require('goog.string'); + /** * A struct for holding context about saved selections. * This can be used to preserve the selection and restore while the DOM is diff --git a/contrib/closure-library/goog/dom/savedcaretrange_test.html b/contrib/closure-library/goog/dom/savedcaretrange_test.html index ca40d67..22a1b4a 100644 --- a/contrib/closure-library/goog/dom/savedcaretrange_test.html +++ b/contrib/closure-library/goog/dom/savedcaretrange_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/dom/savedrange.js b/contrib/closure-library/goog/dom/savedrange.js index 4ab8e61..4f356d3 100644 --- a/contrib/closure-library/goog/dom/savedrange.js +++ b/contrib/closure-library/goog/dom/savedrange.js @@ -25,6 +25,7 @@ goog.require('goog.Disposable'); goog.require('goog.debug.Logger'); + /** * Abstract interface for a saved range. * @constructor diff --git a/contrib/closure-library/goog/dom/savedrange_test.html b/contrib/closure-library/goog/dom/savedrange_test.html index d5a46a8..9e4b018 100644 --- a/contrib/closure-library/goog/dom/savedrange_test.html +++ b/contrib/closure-library/goog/dom/savedrange_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/dom/selection.js b/contrib/closure-library/goog/dom/selection.js index 51423c0..6d6f69e 100644 --- a/contrib/closure-library/goog/dom/selection.js +++ b/contrib/closure-library/goog/dom/selection.js @@ -352,6 +352,7 @@ goog.dom.selection.getText = function(textfield) { throw Error('Cannot get the selection text'); }; + /** * Returns the selected text within a textarea in IE. * IE treats newline characters as \r\n characters, and we need to check for @@ -401,6 +402,7 @@ goog.dom.selection.getSelectionRangeText_ = function(selRange) { return untrimmedSelectionText; }; + /** * Helper function for returning the range for an object as well as the * selection range diff --git a/contrib/closure-library/goog/dom/selection_test.html b/contrib/closure-library/goog/dom/selection_test.html index 1695e2d..8cfc624 100644 --- a/contrib/closure-library/goog/dom/selection_test.html +++ b/contrib/closure-library/goog/dom/selection_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/dom/tagiterator.js b/contrib/closure-library/goog/dom/tagiterator.js index bd7ac46..b4c22e6 100644 --- a/contrib/closure-library/goog/dom/tagiterator.js +++ b/contrib/closure-library/goog/dom/tagiterator.js @@ -25,6 +25,7 @@ goog.require('goog.dom.NodeType'); goog.require('goog.iter.Iterator'); goog.require('goog.iter.StopIteration'); + /** * There are three types of token: *
    @@ -44,6 +45,7 @@ goog.dom.TagWalkType = { }; + /** * A DOM tree traversal iterator. * @@ -289,6 +291,7 @@ goog.dom.TagIterator.prototype.next = function() { return node; }; + /** * @return {boolean} Whether next has ever been called on this iterator. * @protected diff --git a/contrib/closure-library/goog/dom/tagiterator_test.html b/contrib/closure-library/goog/dom/tagiterator_test.html index 4b34232..6d61d03 100644 --- a/contrib/closure-library/goog/dom/tagiterator_test.html +++ b/contrib/closure-library/goog/dom/tagiterator_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/dom/tagname.js b/contrib/closure-library/goog/dom/tagname.js index b8a8b61..23bdd42 100644 --- a/contrib/closure-library/goog/dom/tagname.js +++ b/contrib/closure-library/goog/dom/tagname.js @@ -19,6 +19,7 @@ */ goog.provide('goog.dom.TagName'); + /** * Enum of all html tag names specified by the W3C HTML 4.01 Specification. * Reference http://www.w3.org/TR/html401/index/elements.html diff --git a/contrib/closure-library/goog/dom/tagname_test.html b/contrib/closure-library/goog/dom/tagname_test.html index 1d1294b..464a193 100644 --- a/contrib/closure-library/goog/dom/tagname_test.html +++ b/contrib/closure-library/goog/dom/tagname_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/dom/textrangeiterator.js b/contrib/closure-library/goog/dom/textrangeiterator.js index 641375f..0af8249 100644 --- a/contrib/closure-library/goog/dom/textrangeiterator.js +++ b/contrib/closure-library/goog/dom/textrangeiterator.js @@ -27,6 +27,7 @@ goog.require('goog.dom.TagName'); goog.require('goog.iter.StopIteration'); + /** * Subclass of goog.dom.TagIterator that iterates over a DOM range. It * adds functions to determine the portion of each text node that is selected. diff --git a/contrib/closure-library/goog/dom/textrangeiterator_test.html b/contrib/closure-library/goog/dom/textrangeiterator_test.html index 040aa16..028b771 100644 --- a/contrib/closure-library/goog/dom/textrangeiterator_test.html +++ b/contrib/closure-library/goog/dom/textrangeiterator_test.html @@ -3,7 +3,7 @@ @@ -132,12 +132,10 @@ node = iterator.next(); assertEquals(goog.dom.TagName.B, node.tagName); - try { + var ex = assertThrows('Should stop iteration when skipping B', function() { iterator.skipTag(); - fail('Should stop iteration when skipping B'); - } catch (ex) { - assertEquals(goog.iter.StopIteration, ex); - } + }); + assertEquals(goog.iter.StopIteration, ex); } diff --git a/contrib/closure-library/goog/dom/viewportsizemonitor.js b/contrib/closure-library/goog/dom/viewportsizemonitor.js index e5c62e0..869d7b1 100644 --- a/contrib/closure-library/goog/dom/viewportsizemonitor.js +++ b/contrib/closure-library/goog/dom/viewportsizemonitor.js @@ -28,6 +28,7 @@ goog.require('goog.math.Size'); goog.require('goog.userAgent'); + /** * This class can be used to monitor changes in the viewport size. Instances * dispatch a {@link goog.events.EventType.RESIZE} event when the viewport size diff --git a/contrib/closure-library/goog/dom/viewportsizemonitor_test.html b/contrib/closure-library/goog/dom/viewportsizemonitor_test.html index 6a29bad..d9b3c5f 100644 --- a/contrib/closure-library/goog/dom/viewportsizemonitor_test.html +++ b/contrib/closure-library/goog/dom/viewportsizemonitor_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/dom/xml_test.html b/contrib/closure-library/goog/dom/xml_test.html index f5fe6f1..9a19d1a 100644 --- a/contrib/closure-library/goog/dom/xml_test.html +++ b/contrib/closure-library/goog/dom/xml_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/editor/browserfeature.js b/contrib/closure-library/goog/editor/browserfeature.js index ea1018d..83e2032 100644 --- a/contrib/closure-library/goog/editor/browserfeature.js +++ b/contrib/closure-library/goog/editor/browserfeature.js @@ -32,11 +32,13 @@ goog.require('goog.userAgent.product.isVersion'); */ goog.editor.BrowserFeature = { // Whether this browser uses the IE TextRange object. - HAS_IE_RANGES: goog.userAgent.IE, + HAS_IE_RANGES: goog.userAgent.IE && !goog.userAgent.isDocumentMode(9), // Whether this browser uses the W3C standard Range object. + // Assumes IE higher versions will be compliance with W3C standard. HAS_W3C_RANGES: goog.userAgent.GECKO || goog.userAgent.WEBKIT || - goog.userAgent.OPERA, + goog.userAgent.OPERA || + (goog.userAgent.IE && goog.userAgent.isDocumentMode(9)), // Has the contentEditable attribute, which makes nodes editable. // @@ -91,7 +93,9 @@ goog.editor.BrowserFeature = { // Whether this browser's "FormatBlock" command may create multiple // blockquotes. - CREATES_MULTIPLE_BLOCKQUOTES: goog.userAgent.WEBKIT || goog.userAgent.OPERA, + CREATES_MULTIPLE_BLOCKQUOTES: + (goog.userAgent.WEBKIT && !goog.userAgent.isVersion('534.16')) || + goog.userAgent.OPERA, // Whether this browser's "FormatBlock" command will wrap blockquotes // inside of divs, instead of replacing divs with blockquotes. @@ -178,17 +182,18 @@ goog.editor.BrowserFeature = { // Whether this browser collapses the selection in a contenteditable when the // mouse is pressed in a non-editable portion of the same frame, even if - // Event.preventDefault is called. - COLLAPSES_SELECTION_ONMOUSEDOWN: goog.userAgent.OPERA, + // Event.preventDefault is called. This field is deprecated and unused -- only + // old versions of Opera have this bug. + COLLAPSES_SELECTION_ONMOUSEDOWN: false, // Whether the user can actually create a selection in this browser with the // caret in the MIDDLE of the selection by double-clicking. CARET_INSIDE_SELECTION: goog.userAgent.OPERA, // Whether the browser focuses automatically when - // the user clicks on - FOCUSES_EDITABLE_BODY_ON_HTML_CLICK: - goog.userAgent.IE || goog.userAgent.GECKO || goog.userAgent.WEBKIT, + // the user clicks on . This field is deprecated and unused -- only old + // versions of Opera don't have this behavior. + FOCUSES_EDITABLE_BODY_ON_HTML_CLICK: true, // Whether to use keydown for key listening (uses keypress otherwise). Taken // from goog.events.KeyHandler. @@ -245,6 +250,16 @@ goog.editor.BrowserFeature = { // browser: http://www.whatwg/org/specs/web-apps/current-work/#dnd SUPPORTS_HTML5_FILE_DRAGGING: (goog.userAgent.product.CHROME && goog.userAgent.product.isVersion('4')) || - (goog.userAgent.product.SAFARI && goog.userAgent.product.isVersion('533')) - + (goog.userAgent.product.SAFARI && goog.userAgent.isVersion('533')), + + // Version of Opera that supports the opera-defaultBlock execCommand to change + // the default block inserted when [return] is pressed. Note that this only is + // used if the caret is not already in a block that can be repeated. + // TODO(user): Link to public documentation of this feature if Opera puts + // something up about it. + SUPPORTS_OPERA_DEFAULTBLOCK_COMMAND: + goog.userAgent.OPERA && goog.userAgent.isVersion('11.10'), + + SUPPORTS_FILE_PASTING: goog.userAgent.product.CHROME && + goog.userAgent.product.isVersion('12') }; diff --git a/contrib/closure-library/goog/editor/browserfeature_test.html b/contrib/closure-library/goog/editor/browserfeature_test.html index 6eebc73..44d19c2 100644 --- a/contrib/closure-library/goog/editor/browserfeature_test.html +++ b/contrib/closure-library/goog/editor/browserfeature_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/editor/focus_test.html b/contrib/closure-library/goog/editor/focus_test.html index ce44983..749f6fe 100644 --- a/contrib/closure-library/goog/editor/focus_test.html +++ b/contrib/closure-library/goog/editor/focus_test.html @@ -7,7 +7,7 @@ diff --git a/contrib/closure-library/goog/editor/icontent.js b/contrib/closure-library/goog/editor/icontent.js index efcc362..a284b7c 100644 --- a/contrib/closure-library/goog/editor/icontent.js +++ b/contrib/closure-library/goog/editor/icontent.js @@ -30,6 +30,7 @@ goog.require('goog.style'); goog.require('goog.userAgent'); + /** * A data structure for storing simple rendering info about a field. * @@ -52,6 +53,7 @@ goog.editor.icontent.FieldFormatInfo = function(fieldId, standards, blended, }; + /** * A data structure for storing simple info about the styles of a field. * Only needed in Firefox/Blended mode. @@ -72,6 +74,7 @@ goog.editor.icontent.FieldStyleInfo = function(wrapper, css) { */ goog.editor.icontent.useStandardsModeIframes_ = false; + /** * Sets up goog.editor.icontent to always use standards-mode iframes. */ @@ -79,6 +82,7 @@ goog.editor.icontent.forceStandardsModeIframes = function() { goog.editor.icontent.useStandardsModeIframes_ = true; }; + /** * Generate the initial iframe content. * @param {goog.editor.icontent.FieldFormatInfo} info Formatting info about @@ -99,21 +103,7 @@ goog.editor.icontent.getInitialIframeContent_ = } // - html.push(' @@ -142,13 +142,6 @@ assertEquals(/contentEditable/i.test(htmlOut), false); propertyReplacer.set(goog.editor.BrowserFeature, 'HAS_CONTENT_EDITABLE', true); - propertyReplacer.set(goog.editor.BrowserFeature, - 'FOCUSES_EDITABLE_BODY_ON_HTML_CLICK', false); - htmlOut = goog.editor.icontent.getInitialIframeContent_( - info, html, styleInfo); - assertEquals(/]+?contentEditable/i.test(htmlOut), true); - propertyReplacer.set(goog.editor.BrowserFeature, - 'FOCUSES_EDITABLE_BODY_ON_HTML_CLICK', true); htmlOut = goog.editor.icontent.getInitialIframeContent_( info, html, styleInfo); assertEquals(/]+?contentEditable/i.test(htmlOut), true); diff --git a/contrib/closure-library/goog/editor/link.js b/contrib/closure-library/goog/editor/link.js index 11991d7..996932f 100644 --- a/contrib/closure-library/goog/editor/link.js +++ b/contrib/closure-library/goog/editor/link.js @@ -30,6 +30,7 @@ goog.require('goog.string.Unicode'); goog.require('goog.uri.utils'); + /** * Wrap an editable link. * @param {HTMLAnchorElement} anchor The anchor element. diff --git a/contrib/closure-library/goog/editor/link_test.html b/contrib/closure-library/goog/editor/link_test.html index 0c17a2a..a696fed 100644 --- a/contrib/closure-library/goog/editor/link_test.html +++ b/contrib/closure-library/goog/editor/link_test.html @@ -7,7 +7,7 @@ diff --git a/contrib/closure-library/goog/editor/node.js b/contrib/closure-library/goog/editor/node.js index 1bd56f5..7d8fc67 100644 --- a/contrib/closure-library/goog/editor/node.js +++ b/contrib/closure-library/goog/editor/node.js @@ -212,6 +212,7 @@ goog.editor.node.isAllNonNbspWhiteSpace = function(textNode) { return goog.string.isBreakingWhitespace(textNode.nodeValue); }; + /** * Returns true if the node contains only whitespace and is not and does not * contain any images, iframes or embed tags. @@ -286,6 +287,7 @@ goog.editor.node.findInChildren = function(parent, hasProperty) { return null; }; + /** * Search ancestor nodes using a predicate function and returns the topmost * ancestor in the chain of consecutive ancestors that satisfies the condition. @@ -306,6 +308,7 @@ goog.editor.node.findHighestMatchingAncestor = function(node, hasProperty) { return ancestor; }; + /** * Checks if node is a block-level html element. The display css * property is ignored. diff --git a/contrib/closure-library/goog/editor/node_test.html b/contrib/closure-library/goog/editor/node_test.html index c69f9fc..c644713 100644 --- a/contrib/closure-library/goog/editor/node_test.html +++ b/contrib/closure-library/goog/editor/node_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/editor/plugins/abstractbubbleplugin.js b/contrib/closure-library/goog/editor/plugins/abstractbubbleplugin.js index b0ad92a..91c67f9 100644 --- a/contrib/closure-library/goog/editor/plugins/abstractbubbleplugin.js +++ b/contrib/closure-library/goog/editor/plugins/abstractbubbleplugin.js @@ -34,6 +34,7 @@ goog.require('goog.ui.editor.Bubble'); goog.require('goog.userAgent'); + /** * Base class for bubble plugins. This is used for to connect user behavior * in the editor to a goog.ui.editor.Bubble UI element that allows diff --git a/contrib/closure-library/goog/editor/plugins/abstractbubbleplugin_test.html b/contrib/closure-library/goog/editor/plugins/abstractbubbleplugin_test.html index d4249e4..a4ecccf 100644 --- a/contrib/closure-library/goog/editor/plugins/abstractbubbleplugin_test.html +++ b/contrib/closure-library/goog/editor/plugins/abstractbubbleplugin_test.html @@ -9,7 +9,7 @@ diff --git a/contrib/closure-library/goog/editor/plugins/abstractdialogplugin.js b/contrib/closure-library/goog/editor/plugins/abstractdialogplugin.js index cd9c45d..7ab9e17 100644 --- a/contrib/closure-library/goog/editor/plugins/abstractdialogplugin.js +++ b/contrib/closure-library/goog/editor/plugins/abstractdialogplugin.js @@ -34,6 +34,8 @@ goog.require('goog.ui.editor.AbstractDialog.EventType'); // *** Public interface ***************************************************** // + + /** * An abstract superclass for a Trogedit plugin that creates exactly one * dialog. By default dialogs are not reused -- each time execCommand is called, @@ -77,6 +79,7 @@ goog.editor.plugins.AbstractDialogPlugin.prototype.execCommand = function( // *** Events *************************************************************** // + /** * Event type constants for events the dialog plugins fire. * @enum {string} @@ -91,6 +94,7 @@ goog.editor.plugins.AbstractDialogPlugin.EventType = { // *** Protected interface ************************************************** // + /** * Creates a new instance of this plugin's dialog. Must be overridden by * subclasses. @@ -104,6 +108,7 @@ goog.editor.plugins.AbstractDialogPlugin.EventType = { goog.editor.plugins.AbstractDialogPlugin.prototype.createDialog = goog.abstractMethod; + /** * Returns the current dialog that was created and opened by this plugin. * @return {goog.ui.editor.AbstractDialog} The current dialog that was created @@ -114,6 +119,7 @@ goog.editor.plugins.AbstractDialogPlugin.prototype.getDialog = function() { return this.dialog_; }; + /** * Sets whether this plugin should reuse the same instance of the dialog each * time execCommand is called or create a new one. This is intended for use by @@ -240,6 +246,7 @@ goog.editor.plugins.AbstractDialogPlugin.prototype.restoreOriginalSelection = } }; + /** * Cleans up the structure used to save the original selection before the dialog * was opened. Should be used by subclasses that don't restore the original @@ -265,6 +272,7 @@ goog.editor.plugins.AbstractDialogPlugin.prototype.disposeInternal = // *** Private implementation *********************************************** // + /** * The command that this plugin handles. * @type {string} @@ -272,6 +280,7 @@ goog.editor.plugins.AbstractDialogPlugin.prototype.disposeInternal = */ goog.editor.plugins.AbstractDialogPlugin.prototype.command_; + /** * The current dialog that was created and opened by this plugin. * @type {goog.ui.editor.AbstractDialog} @@ -279,6 +288,7 @@ goog.editor.plugins.AbstractDialogPlugin.prototype.command_; */ goog.editor.plugins.AbstractDialogPlugin.prototype.dialog_; + /** * Whether this plugin should reuse the same instance of the dialog each time * execCommand is called or create a new one. @@ -287,6 +297,7 @@ goog.editor.plugins.AbstractDialogPlugin.prototype.dialog_; */ goog.editor.plugins.AbstractDialogPlugin.prototype.reuseDialog_ = false; + /** * Mutex to prevent recursive calls to disposeDialog_. * @type {boolean} @@ -294,6 +305,7 @@ goog.editor.plugins.AbstractDialogPlugin.prototype.reuseDialog_ = false; */ goog.editor.plugins.AbstractDialogPlugin.prototype.isDisposingDialog_ = false; + /** * SavedRange representing the selection before the dialog was opened. * @type {goog.dom.SavedRange} diff --git a/contrib/closure-library/goog/editor/plugins/abstractdialogplugin_test.html b/contrib/closure-library/goog/editor/plugins/abstractdialogplugin_test.html index f94f9b2..094a859 100644 --- a/contrib/closure-library/goog/editor/plugins/abstractdialogplugin_test.html +++ b/contrib/closure-library/goog/editor/plugins/abstractdialogplugin_test.html @@ -7,7 +7,7 @@ diff --git a/contrib/closure-library/goog/editor/plugins/abstracttabhandler_test.html b/contrib/closure-library/goog/editor/plugins/abstracttabhandler_test.html index e963a3b..98800b7 100644 --- a/contrib/closure-library/goog/editor/plugins/abstracttabhandler_test.html +++ b/contrib/closure-library/goog/editor/plugins/abstracttabhandler_test.html @@ -7,7 +7,7 @@ diff --git a/contrib/closure-library/goog/editor/plugins/basictextformatter.js b/contrib/closure-library/goog/editor/plugins/basictextformatter.js index 6c21d12..860cbb6 100644 --- a/contrib/closure-library/goog/editor/plugins/basictextformatter.js +++ b/contrib/closure-library/goog/editor/plugins/basictextformatter.js @@ -39,6 +39,7 @@ goog.require('goog.ui.editor.messages'); goog.require('goog.userAgent'); + /** * Functions to style text (e.g. underline, make bold, etc.) * @constructor @@ -529,6 +530,7 @@ goog.editor.plugins.BasicTextFormatter.prototype.handleKeyboardShortcut = // Helpers for execCommand + /** * Regular expression to match BRs in HTML. Saves the BRs' attributes in $1 for * use with replace(). In non-IE browsers, does not match BRs adjacent to an @@ -541,6 +543,7 @@ goog.editor.plugins.BasicTextFormatter.BR_REGEXP_ = goog.userAgent.IE ? /]*)\/?>/gi : /]*)\/?>(?!<\/(div|p)>)/gi; + /** * Convert BRs in the selection to divs. * This is only intended to be used in IE and Opera. @@ -1000,6 +1003,7 @@ goog.editor.plugins.BasicTextFormatter.prototype.createLink_ = function(range, //--------------------------------------------------------------------- // browser fixes + /** * The following execCommands are "broken" in some way - in IE they allow * the nodes outside the contentEditable region to get modified (see @@ -1455,8 +1459,6 @@ goog.editor.plugins.BasicTextFormatter.prototype.applyExecCommandGeckoFixes_ = * Workaround for Opera bug CORE-23903. Opera sometimes fails to invalidate * serialized CSS or innerHTML for the DOM after certain execCommands when * styleWithCSS is on. Toggling an inline style on the elements fixes it. - * TODO(user): Opera says they're going to prioritize a fix for this. Remove - * this code once that fix is released. * @private */ goog.editor.plugins.BasicTextFormatter.prototype.invalidateInlineCss_ = @@ -1565,6 +1567,7 @@ goog.editor.plugins.BasicTextFormatter.SUPPORTED_JUSTIFICATIONS_ = { 'left': 1 }; + /** * Returns true if the current justification matches the justification * command for the entire selection. diff --git a/contrib/closure-library/goog/editor/plugins/basictextformatter_test.html b/contrib/closure-library/goog/editor/plugins/basictextformatter_test.html index 9e7e006..c541308 100644 --- a/contrib/closure-library/goog/editor/plugins/basictextformatter_test.html +++ b/contrib/closure-library/goog/editor/plugins/basictextformatter_test.html @@ -8,7 +8,7 @@ @@ -20,6 +20,7 @@ goog.require('goog.dom'); goog.require('goog.dom.Range'); goog.require('goog.editor.plugins.BasicTextFormatter'); + goog.require('goog.object'); goog.require('goog.testing.ExpectedFailures'); goog.require('goog.testing.PropertyReplacer'); goog.require('goog.testing.editor.FieldMock'); @@ -28,7 +29,7 @@ goog.require('goog.userAgent'); - + @@ -472,6 +473,7 @@ } var isFontSizeTest = false; + var defaultFontSizeMap; function setUpFontSizeTests() { isFontSizeTest = true; @@ -480,6 +482,26 @@ HELPER = new goog.testing.editor.TestHelper(ROOT); HELPER.setUpEditableElement(); FIELDMOCK.getElement().$returns(ROOT).$anyTimes(); + + // Map representing the sizes of the text in the HTML snippet used in these + // tests. The key is the exact text content of each text node, and the value + // is the initial size of the font in pixels. Since tests may cause a text + // node to be split in two, this also contains keys that initially don't + // match any text node, but may match one later if an existing node is + // split. The value for these keys is null, signifying no text node should + // exist with that content. + defaultFontSizeMap = { + '1': 16, + '2': null, + '23': 2, + '3': null, + '4': 16, + '5': null, + '56': 5, + '6': null, + '7': 16 + }; + assertFontSizes('Assertion failed on default font sizes!', {}); } function tearDownFontSizeTests() { @@ -489,6 +511,31 @@ } } + /** + * Asserts that the text nodes set up by setUpFontSizeTests() have had their + * font sizes changed as described by sizeChangesMap. + * @param {string} msg Assertion error message. + * @param {Object.} sizeChangesMap Maps the text content + * of a text node to be measured to its expected font size in pixels, or + * null if that text node should not be present in the document (i.e. + * because it was split into two). Only the text nodes that have changed + * from their default need to be specified. + */ + function assertFontSizes(msg, sizeChangesMap) { + goog.object.extend(defaultFontSizeMap, sizeChangesMap); + for (var k in defaultFontSizeMap) { + var node = HELPER.findTextNode(k); + var expected = defaultFontSizeMap[k]; + if (expected) { + assertNotNull(msg + ' [couldn\'t find text node "' + k + '"]', node); + assertEquals(msg + ' [incorrect font size for "' + k + '"]', + expected, goog.style.getFontSize(node.parentNode)); + } else { + assertNull(msg + ' [unexpected text node "' + k + '"]', node); + } + } + } + /** * Regression test for {@bug 1286408}. Tests that when you change the font * size of a selection, any font size styles that were nested inside are @@ -501,17 +548,15 @@ HELPER.select('1', 0, '4', 1); // Selects 1234. FORMATTER.execCommandInternal( goog.editor.plugins.BasicTextFormatter.COMMAND.FONT_SIZE, 6); - var span = HELPER.findTextNode('23').parentNode; + + assertFontSizes('New font size should override existing font size', + {'1': 32, '23': 32, '4': 32}); if (goog.editor.BrowserFeature.DOESNT_OVERRIDE_FONT_SIZE_IN_STYLE_ATTR) { - assertEquals('Old manually set font size should be gone', - '', span.style.fontSize); + var span = HELPER.findTextNode('23').parentNode; assertFalse('Style attribute should be gone', span.getAttributeNode('style') != null && span.getAttributeNode('style').specified); - } else { - assertCSSValueEquals('Old manually set font size should be changed', - 'font-size', 'xx-large', span.style.fontSize); } FIELDMOCK.$verify(); @@ -531,31 +576,22 @@ var span = HELPER.findTextNode('23').parentNode; var span2 = HELPER.findTextNode('56').parentNode; + assertFontSizes( + 'New font size should override existing font size in all spans', + {'23': 32, '4': 32, '56': 32}); + var whiteSpace = goog.userAgent.IE ? + goog.style.getCascadedStyle(span2, 'whiteSpace') : + goog.style.getComputedStyle(span2, 'whiteSpace'); + assertEquals('Whitespace style in last span should have been left', + 'pre', whiteSpace); + if (goog.editor.BrowserFeature.DOESNT_OVERRIDE_FONT_SIZE_IN_STYLE_ATTR) { - assertEquals('Old manually set font size should be gone from first span', - '', span.style.fontSize); assertFalse('Style attribute should be gone from first span', span.getAttributeNode('style') != null && span.getAttributeNode('style').specified); - assertEquals('Old manually set font size should be gone from last span', - '', span2.style.fontSize); assertTrue('Style attribute should not be gone from last span', span2.getAttributeNode('style') != null && span2.getAttributeNode('style').specified); - assertEquals('Whitespace style in last span should have been left', - 'pre', span2.style.whiteSpace); - } else { - assertCSSValueEquals( - 'Old manually set font size should be changed in first span', - 'font-size', 'xx-large', span.style.fontSize); - assertCSSValueEquals( - 'Old manually set font size should be changed in last span', - 'font-size', 'xx-large', span2.style.fontSize); - // Webkit creates a new span inside the existing span, sets the font - // size in the inner span, removes it from the outer span, and leaves the - // pre style in the outer span. Weird but works... - assertEquals('Whitespace style in last span should have been left', - 'pre', span2.parentNode.style.whiteSpace); } FIELDMOCK.$verify(); @@ -572,8 +608,10 @@ HELPER.select('23', 1, '4', 1); // Selects 34 (half of span with font size). FORMATTER.execCommandInternal( goog.editor.plugins.BasicTextFormatter.COMMAND.FONT_SIZE, 6); - assertEquals('Old manually set font size should still be there', - '2px', HELPER.findTextNode('2').parentNode.style.fontSize); + + assertFontSizes( + 'New font size shouldn\'t override existing font size before selection', + {'2': 2, '23': null, '3': 32, '4': 32}); FIELDMOCK.$verify(); } @@ -590,17 +628,11 @@ HELPER.select('23', 1, '56', 2); // Selects 3456. FORMATTER.execCommandInternal( goog.editor.plugins.BasicTextFormatter.COMMAND.FONT_SIZE, 6); - assertEquals('Old manually set font size should still be in first span', - '2px', HELPER.findTextNode('2').parentNode.style.fontSize); - var span2 = HELPER.findTextNode('56').parentNode; - if (goog.editor.BrowserFeature.DOESNT_OVERRIDE_FONT_SIZE_IN_STYLE_ATTR) { - assertEquals('Old manually set font size should be gone from last span', - '', span2.style.fontSize); - } else { - assertCSSValueEquals( - 'Old manually set font size should be changed in last span', - 'font-size', 'xx-large', span2.style.fontSize); - } + + assertFontSizes( + 'New font size shouldn\'t override existing font size before ' + + 'selection, but still override existing font size in last span', + {'2': 2, '23': null, '3': 32, '4': 32, '56': 32}); FIELDMOCK.$verify(); } diff --git a/contrib/closure-library/goog/editor/plugins/blockquote.js b/contrib/closure-library/goog/editor/plugins/blockquote.js index 8f395b7..3453c5d 100644 --- a/contrib/closure-library/goog/editor/plugins/blockquote.js +++ b/contrib/closure-library/goog/editor/plugins/blockquote.js @@ -31,6 +31,7 @@ goog.require('goog.editor.node'); goog.require('goog.functions'); + /** * Plugin to handle splitting block quotes. This plugin does nothing on its * own and should be used in conjunction with EnterHandler or one of its diff --git a/contrib/closure-library/goog/editor/plugins/blockquote_test.html b/contrib/closure-library/goog/editor/plugins/blockquote_test.html index d96d95a..f87e671 100644 --- a/contrib/closure-library/goog/editor/plugins/blockquote_test.html +++ b/contrib/closure-library/goog/editor/plugins/blockquote_test.html @@ -9,7 +9,7 @@ diff --git a/contrib/closure-library/goog/editor/plugins/emoticons.js b/contrib/closure-library/goog/editor/plugins/emoticons.js index 50dbeea..7cf7b2f 100644 --- a/contrib/closure-library/goog/editor/plugins/emoticons.js +++ b/contrib/closure-library/goog/editor/plugins/emoticons.js @@ -27,6 +27,7 @@ goog.require('goog.functions'); goog.require('goog.ui.emoji.Emoji'); + /** * Plugin for generating emoticons. * diff --git a/contrib/closure-library/goog/editor/plugins/emoticons_test.html b/contrib/closure-library/goog/editor/plugins/emoticons_test.html index 8a0425c..9454048 100644 --- a/contrib/closure-library/goog/editor/plugins/emoticons_test.html +++ b/contrib/closure-library/goog/editor/plugins/emoticons_test.html @@ -2,7 +2,7 @@ diff --git a/contrib/closure-library/goog/editor/plugins/enterhandler.js b/contrib/closure-library/goog/editor/plugins/enterhandler.js index 883c11b..9a80ab3 100644 --- a/contrib/closure-library/goog/editor/plugins/enterhandler.js +++ b/contrib/closure-library/goog/editor/plugins/enterhandler.js @@ -35,13 +35,14 @@ goog.require('goog.string'); goog.require('goog.userAgent'); + /** * Plugin to handle enter keys. This does all the crazy to normalize (as much as * is reasonable) what happens when you hit enter. This also handles the * special casing of hitting enter in a blockquote. * - * In IE and Safari, the resulting HTML uses one DIV tag per line. In FireFox, - * the resulting HTML uses BR tags at the end of each line. + * In IE, Webkit, and Opera, the resulting HTML uses one DIV tag per line. In + * Firefox, the resulting HTML uses BR tags at the end of each line. * * @constructor * @extends {goog.editor.Plugin} @@ -52,12 +53,34 @@ goog.editor.plugins.EnterHandler = function() { goog.inherits(goog.editor.plugins.EnterHandler, goog.editor.Plugin); +/** + * The type of block level tag to add on enter, for browsers that support + * specifying the default block-level tag. Can be overriden by subclasses; must + * be either DIV or P. + * @type {goog.dom.TagName} + * @protected + */ +goog.editor.plugins.EnterHandler.prototype.tag = goog.dom.TagName.DIV; + + /** @inheritDoc */ goog.editor.plugins.EnterHandler.prototype.getTrogClassId = function() { return 'EnterHandler'; }; +/** @inheritDoc */ +goog.editor.plugins.EnterHandler.prototype.enable = function(fieldObject) { + goog.base(this, 'enable', fieldObject); + + if (goog.editor.BrowserFeature.SUPPORTS_OPERA_DEFAULTBLOCK_COMMAND && + (this.tag == goog.dom.TagName.P || this.tag == goog.dom.TagName.DIV)) { + var doc = this.getFieldDomHelper().getDocument(); + doc.execCommand('opera-defaultBlock', false, this.tag); + } +}; + + /** * If the contents are empty, return the 'default' html for the field. * The 'default' contents depend on the enter handling mode, so it @@ -453,9 +476,9 @@ goog.editor.plugins.EnterHandler.prototype.ensureBlockIeOpera = function(tag, } - if (goog.userAgent.IE) { - // IE has a bug where if the cursor is directly before a block node - // (e.g., the content is "foo[cursor]
    bar
    "), + if (goog.userAgent.IE && !goog.userAgent.isVersion(9)) { + // IE (before IE9) has a bug where if the cursor is directly before a block + // node (e.g., the content is "foo[cursor]
    bar
    "), // the FormatBlock command actually formats the "bar" instead of the "foo". // This is just wrong. To work-around this, we want to move the // selection back one character, and then restore it to its prior position. diff --git a/contrib/closure-library/goog/editor/plugins/enterhandler_test.html b/contrib/closure-library/goog/editor/plugins/enterhandler_test.html index cd08b4c..13205dc 100644 --- a/contrib/closure-library/goog/editor/plugins/enterhandler_test.html +++ b/contrib/closure-library/goog/editor/plugins/enterhandler_test.html @@ -8,7 +8,7 @@ diff --git a/contrib/closure-library/goog/editor/plugins/headerformatter.js b/contrib/closure-library/goog/editor/plugins/headerformatter.js index 22876cd..cb10adf 100644 --- a/contrib/closure-library/goog/editor/plugins/headerformatter.js +++ b/contrib/closure-library/goog/editor/plugins/headerformatter.js @@ -24,6 +24,7 @@ goog.require('goog.editor.Plugin'); goog.require('goog.userAgent'); + /** * Applies header styles to text. * @constructor @@ -45,6 +46,7 @@ goog.editor.plugins.HeaderFormatter.prototype.getTrogClassId = function() { // switch statements in basictextformatter and we'll need to abstract that out // in order to seperate out any of the functions from basictextformatter. + /** * Commands that can be passed as the optional argument to execCommand. * @enum {string} diff --git a/contrib/closure-library/goog/editor/plugins/headerformatter_test.html b/contrib/closure-library/goog/editor/plugins/headerformatter_test.html index 218f76f..955a8c9 100644 --- a/contrib/closure-library/goog/editor/plugins/headerformatter_test.html +++ b/contrib/closure-library/goog/editor/plugins/headerformatter_test.html @@ -8,7 +8,7 @@ diff --git a/contrib/closure-library/goog/editor/plugins/linkbubble.js b/contrib/closure-library/goog/editor/plugins/linkbubble.js index 16f4d7c..ae94bfc 100644 --- a/contrib/closure-library/goog/editor/plugins/linkbubble.js +++ b/contrib/closure-library/goog/editor/plugins/linkbubble.js @@ -33,6 +33,7 @@ goog.require('goog.ui.editor.messages'); goog.require('goog.window'); + /** * Property bubble plugin for links. * @param {...!goog.editor.plugins.LinkBubble.Action} var_args List of @@ -435,6 +436,7 @@ goog.editor.plugins.LinkBubble.prototype.getTestLinkAction_ = function() { }; + /** * Constructor for extra actions that can be added to the link bubble. * @param {string} spanId The ID for the span showing the action. diff --git a/contrib/closure-library/goog/editor/plugins/linkbubble_test.html b/contrib/closure-library/goog/editor/plugins/linkbubble_test.html index 2f5938a..28e1c32 100644 --- a/contrib/closure-library/goog/editor/plugins/linkbubble_test.html +++ b/contrib/closure-library/goog/editor/plugins/linkbubble_test.html @@ -8,7 +8,7 @@ diff --git a/contrib/closure-library/goog/editor/plugins/linkdialogplugin_test.html b/contrib/closure-library/goog/editor/plugins/linkdialogplugin_test.html index 9c46d6b..4e8868c 100644 --- a/contrib/closure-library/goog/editor/plugins/linkdialogplugin_test.html +++ b/contrib/closure-library/goog/editor/plugins/linkdialogplugin_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/editor/plugins/loremipsum.js b/contrib/closure-library/goog/editor/plugins/loremipsum.js index 2ba08c3..4d8ec46 100644 --- a/contrib/closure-library/goog/editor/plugins/loremipsum.js +++ b/contrib/closure-library/goog/editor/plugins/loremipsum.js @@ -29,6 +29,7 @@ goog.require('goog.editor.node'); goog.require('goog.functions'); + /** * A plugin that manages lorem ipsum state of editable fields. * @param {string} message The lorem ipsum message. @@ -47,14 +48,17 @@ goog.editor.plugins.LoremIpsum = function(message) { }; goog.inherits(goog.editor.plugins.LoremIpsum, goog.editor.Plugin); + /** @inheritDoc */ goog.editor.plugins.LoremIpsum.prototype.getTrogClassId = goog.functions.constant('LoremIpsum'); + /** @inheritDoc */ goog.editor.plugins.LoremIpsum.prototype.activeOnUneditableFields = goog.functions.TRUE; + /** * Whether the field is currently filled with lorem ipsum text. * @type {boolean} @@ -62,6 +66,7 @@ goog.editor.plugins.LoremIpsum.prototype.activeOnUneditableFields = */ goog.editor.plugins.LoremIpsum.prototype.usingLorem_ = false; + /** * Handles queryCommandValue. * @param {string} command The command to query. @@ -71,6 +76,7 @@ goog.editor.plugins.LoremIpsum.prototype.queryCommandValue = function(command) { return command == goog.editor.Command.USING_LOREM && this.usingLorem_; }; + /** * Handles execCommand. * @param {string} command The command to execute. @@ -87,6 +93,7 @@ goog.editor.plugins.LoremIpsum.prototype.execCommand = function(command, } }; + /** @inheritDoc */ goog.editor.plugins.LoremIpsum.prototype.isSupportedCommand = function(command) { @@ -95,6 +102,7 @@ goog.editor.plugins.LoremIpsum.prototype.isSupportedCommand = command == goog.editor.Command.USING_LOREM; }; + /** * Set the lorem ipsum text in a goog.editor.Field if needed. * @private @@ -131,6 +139,7 @@ goog.editor.plugins.LoremIpsum.prototype.updateLorem_ = function() { } }; + /** * Clear an EditableField's lorem ipsum and put in initial text if needed. * diff --git a/contrib/closure-library/goog/editor/plugins/loremipsum_test.html b/contrib/closure-library/goog/editor/plugins/loremipsum_test.html index 03c0463..f2e60af 100644 --- a/contrib/closure-library/goog/editor/plugins/loremipsum_test.html +++ b/contrib/closure-library/goog/editor/plugins/loremipsum_test.html @@ -10,7 +10,7 @@ diff --git a/contrib/closure-library/goog/editor/plugins/removeformatting.js b/contrib/closure-library/goog/editor/plugins/removeformatting.js index b5ec8f8..426bd5c 100644 --- a/contrib/closure-library/goog/editor/plugins/removeformatting.js +++ b/contrib/closure-library/goog/editor/plugins/removeformatting.js @@ -31,6 +31,7 @@ goog.require('goog.editor.range'); goog.require('goog.string'); + /** * A plugin to handle removing formatting from selected text. * @constructor @@ -686,10 +687,10 @@ goog.editor.plugins.RemoveFormatting.prototype.removeFormattingWorker_ = // border=0 is a common way to not show a blue border around an image // that is wrapped by a link. If we remove that, the blue border will // show up, which to the user looks like adding format, not removing. - if (node.border == "0") { + if (node.border == '0') { sb.push(" border='0'"); } - sb.push(">"); + sb.push('>'); continue; case goog.dom.TagName.TD: diff --git a/contrib/closure-library/goog/editor/plugins/removeformatting_test.html b/contrib/closure-library/goog/editor/plugins/removeformatting_test.html index 9444e1e..865ba1c 100644 --- a/contrib/closure-library/goog/editor/plugins/removeformatting_test.html +++ b/contrib/closure-library/goog/editor/plugins/removeformatting_test.html @@ -8,7 +8,7 @@ @@ -42,12 +42,15 @@ var FORMATTER; var testHelper; + var WEBKIT_BEFORE_CHROME_8 = goog.userAgent.WEBKIT && + !goog.userAgent.isVersion('534.10'); + // Extra html to add to test html to make sure removeformatting is actually // getting called when you're testing if it leaves certain styles alone // (instead of not even running at all due to some other bug). However, adding // this extra text into the node to be selected screws up IE. // (e.g. t --> t ) - // TODO(marcosalmeida): Remove this special casing once http://b/3131117 is + // TODO(user): Remove this special casing once http://b/3131117 is // fixed. var controlHtml = goog.userAgent.IE ? '' : 'control'; var controlCleanHtml = goog.userAgent.IE ? '' : 'control'; @@ -167,7 +170,7 @@ } function testLinksAreNotRemoved() { - expectedFailures.expectFailureFor(goog.userAgent.WEBKIT, + expectedFailures.expectFailureFor(WEBKIT_BEFORE_CHROME_8, 'WebKit\'s removeFormatting command removes links.'); var anchor; @@ -209,7 +212,7 @@ FORMATTER.removeFormatting_(); // Webkit will change all tags to non-formatted ones anyway. // Make sure 'Foo' was changed to 'Bar' - if (goog.userAgent.WEBKIT) { + if (WEBKIT_BEFORE_CHROME_8) { assertHTMLEquals('regular cleaner should not have run', 'StartBar
    Bar
    Baz', div.innerHTML); @@ -425,7 +428,7 @@ goog.dom.Range.createFromNodes(div.firstChild.firstChild, 2, div.firstChild.lastChild.firstChild, 3).select(); - expectedFailures.expectFailureFor(goog.userAgent.WEBKIT, + expectedFailures.expectFailureFor(WEBKIT_BEFORE_CHROME_8, 'WebKit just gets this all wrong. Everything stays bold and ' + '"lditalic" gets italicised.'); @@ -521,7 +524,7 @@ goog.dom.Range.createFromNodeContents(div).select(); FORMATTER.removeFormatting_(); - expectedFailures.expectFailureFor(goog.userAgent.WEBKIT, + expectedFailures.expectFailureFor(WEBKIT_BEFORE_CHROME_8, 'WebKit removes the image entirely, see ' + 'https://bugs.webkit.org/show_bug.cgi?id=13125 .'); @@ -592,7 +595,7 @@ // Our workaround for the nbsp bug removes these, but causes worse problems. // See bugs.webkit.org/show_bug.cgi?id=29164 for more details. expectedFailures.expectFailureFor( - goog.userAgent.WEBKIT && + WEBKIT_BEFORE_CHROME_8 && !goog.editor.BrowserFeature.ADDS_NBSPS_IN_REMOVE_FORMAT, 'Extra apple-style-spans'); @@ -783,7 +786,7 @@ // Select it all. goog.dom.Range.createFromNodeContents(div).select(); - expectedFailures.expectFailureFor(goog.userAgent.WEBKIT, + expectedFailures.expectFailureFor(WEBKIT_BEFORE_CHROME_8, 'WebKit barfs apple-style-spans all over the place, and removes links.'); expectedFailures.run(function() { diff --git a/contrib/closure-library/goog/editor/plugins/spacestabhandler_test.html b/contrib/closure-library/goog/editor/plugins/spacestabhandler_test.html index 3dee8ba..6f4b0dc 100644 --- a/contrib/closure-library/goog/editor/plugins/spacestabhandler_test.html +++ b/contrib/closure-library/goog/editor/plugins/spacestabhandler_test.html @@ -7,7 +7,7 @@ diff --git a/contrib/closure-library/goog/editor/plugins/tableeditor.js b/contrib/closure-library/goog/editor/plugins/tableeditor.js index 35e1026..abaf029 100644 --- a/contrib/closure-library/goog/editor/plugins/tableeditor.js +++ b/contrib/closure-library/goog/editor/plugins/tableeditor.js @@ -29,6 +29,7 @@ goog.require('goog.editor.range'); goog.require('goog.object'); + /** * Plugin that adds support for table creation and editing commands. * @constructor @@ -275,6 +276,7 @@ goog.editor.plugins.TableEditor.prototype.execCommandInternal = function( return result; }; + /** * Checks whether the element is a table editable by the user. * @param {Node} element The element in question. @@ -294,6 +296,7 @@ goog.editor.plugins.TableEditor.prototype.isUserEditableTable_ = }); }; + /** * Adds a function to filter out non-user-editable tables. * @param {function(Element):boolean} func A function to decide whether the @@ -305,6 +308,7 @@ goog.editor.plugins.TableEditor.prototype.addIsTableEditableFunction = }; + /** * Class representing the selected cell objects within a single table. * @param {goog.dom.AbstractRange} range Selected range from which to calculate diff --git a/contrib/closure-library/goog/editor/plugins/tableeditor_test.html b/contrib/closure-library/goog/editor/plugins/tableeditor_test.html index 1884800..06d8402 100644 --- a/contrib/closure-library/goog/editor/plugins/tableeditor_test.html +++ b/contrib/closure-library/goog/editor/plugins/tableeditor_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/editor/plugins/tagonenterhandler.js b/contrib/closure-library/goog/editor/plugins/tagonenterhandler.js index 48da1a9..7752899 100644 --- a/contrib/closure-library/goog/editor/plugins/tagonenterhandler.js +++ b/contrib/closure-library/goog/editor/plugins/tagonenterhandler.js @@ -35,6 +35,7 @@ goog.require('goog.style'); goog.require('goog.userAgent'); + /** * Plugin to handle enter keys. This subclass normalizes all browsers to use * the given block tag on enter. @@ -43,12 +44,7 @@ goog.require('goog.userAgent'); * @extends {goog.editor.plugins.EnterHandler} */ goog.editor.plugins.TagOnEnterHandler = function(tag) { - /** - * The type of block level tag to add on enter. - * @type {goog.dom.TagName} - * @private - */ - this.tag_ = tag; + this.tag = tag; goog.editor.plugins.EnterHandler.call(this); }; @@ -65,9 +61,9 @@ goog.editor.plugins.TagOnEnterHandler.prototype.getTrogClassId = function() { /** @inheritDoc */ goog.editor.plugins.TagOnEnterHandler.prototype.getNonCollapsingBlankHtml = function() { - if (this.tag_ == goog.dom.TagName.P) { + if (this.tag == goog.dom.TagName.P) { return '

     

    '; - } else if (this.tag_ == goog.dom.TagName.DIV) { + } else if (this.tag == goog.dom.TagName.DIV) { return '

    '; } return '
    '; @@ -93,7 +89,7 @@ goog.editor.plugins.TagOnEnterHandler.prototype.isSupportedCommand = function( /** @inheritDoc */ goog.editor.plugins.TagOnEnterHandler.prototype.queryCommandValue = function( command) { - return command == goog.editor.Command.DEFAULT_TAG ? this.tag_ : null; + return command == goog.editor.Command.DEFAULT_TAG ? this.tag : null; }; @@ -113,8 +109,8 @@ goog.editor.plugins.TagOnEnterHandler.prototype.handleBackspaceInternal = goog.editor.plugins.TagOnEnterHandler.prototype.processParagraphTagsInternal = function(e, split) { if ((goog.userAgent.OPERA || goog.userAgent.IE) && - this.tag_ != goog.dom.TagName.P) { - this.ensureBlockIeOpera(this.tag_); + this.tag != goog.dom.TagName.P) { + this.ensureBlockIeOpera(this.tag); } }; @@ -154,7 +150,7 @@ goog.editor.plugins.TagOnEnterHandler.prototype.handleKeyUpInternal = function( } } else if ((goog.userAgent.IE || goog.userAgent.OPERA) && e.keyCode == goog.events.KeyCodes.ENTER) { - this.ensureBlockIeOpera(this.tag_, true); + this.ensureBlockIeOpera(this.tag, true); } // Safari uses DIVs by default. }; @@ -216,7 +212,7 @@ goog.editor.plugins.TagOnEnterHandler.prototype.ensureNodeIsWrappedW3c_ = return container == child.parentNode; }; var nodeToWrap = goog.dom.getAncestor(node, isChildOfFn, true); container = goog.editor.plugins.TagOnEnterHandler.wrapInContainerW3c_( - this.tag_, {node: nodeToWrap, offset: 0}, container); + this.tag, {node: nodeToWrap, offset: 0}, container); } return container; }; @@ -225,7 +221,7 @@ goog.editor.plugins.TagOnEnterHandler.prototype.ensureNodeIsWrappedW3c_ = /** @inheritDoc */ goog.editor.plugins.TagOnEnterHandler.prototype.handleEnterWebkitInternal = function(e) { - if (this.tag_ == goog.dom.TagName.DIV) { + if (this.tag == goog.dom.TagName.DIV) { var range = this.fieldObject.getRange(); var container = goog.editor.style.getContainer(range.getContainerElement()); @@ -315,7 +311,7 @@ goog.editor.plugins.TagOnEnterHandler.prototype.breakOutOfEmptyListItemGecko_ = // TODO(robbyw): Should we apply the list or list item styles to the new node? var newNode = goog.dom.getDomHelper(li).createElement( - inSubList ? goog.dom.TagName.LI : this.tag_); + inSubList ? goog.dom.TagName.LI : this.tag); if (!li.previousSibling) { goog.dom.insertSiblingBefore(newNode, listNode); @@ -697,6 +693,7 @@ goog.editor.plugins.TagOnEnterHandler.joinTextNodes_ = function(node, return node; }; + /** * Replaces leading or trailing spaces of a text node to a single Nbsp. * @param {Node} textNode The text node to search and replace white spaces. diff --git a/contrib/closure-library/goog/editor/plugins/tagonenterhandler_test.html b/contrib/closure-library/goog/editor/plugins/tagonenterhandler_test.html index 7b7e36f..6e96958 100644 --- a/contrib/closure-library/goog/editor/plugins/tagonenterhandler_test.html +++ b/contrib/closure-library/goog/editor/plugins/tagonenterhandler_test.html @@ -8,7 +8,7 @@ diff --git a/contrib/closure-library/goog/editor/plugins/undoredo.js b/contrib/closure-library/goog/editor/plugins/undoredo.js index 947bc7d..1baaae6 100644 --- a/contrib/closure-library/goog/editor/plugins/undoredo.js +++ b/contrib/closure-library/goog/editor/plugins/undoredo.js @@ -35,6 +35,7 @@ goog.require('goog.events'); goog.require('goog.events.EventHandler'); + /** * Encapsulates undo/redo logic using a custom undo stack (i.e. not browser * built-in). Browser built-in undo stacks are too flaky (e.g. IE's gets @@ -520,7 +521,7 @@ goog.editor.plugins.UndoRedo.prototype.refreshCurrentState = function( */ goog.editor.plugins.UndoRedo.prototype.handleBeforeChange_ = function(e) { if (this.inProgressUndo_) { - // We are in between a previous undo and it's delayed change event. + // We are in between a previous undo and its delayed change event. // Continuing here clobbers the redo stack. // This does mean that if you are trying to undo/redo really quickly, it // will be gated by the speed of delayed change events. @@ -644,6 +645,7 @@ goog.editor.plugins.UndoRedo.prototype.updateCurrentState_ = function( }; + /** * This object encapsulates the state of an editable field. * @@ -778,6 +780,7 @@ goog.editor.plugins.UndoRedo.UndoState_.prototype.equals = function(rhs) { }; + /** * Stores the state of the selection in a way the survives DOM modifications * that don't modify the user-interactable content (e.g. making something bold diff --git a/contrib/closure-library/goog/editor/plugins/undoredo_test.html b/contrib/closure-library/goog/editor/plugins/undoredo_test.html index 04a5601..8afea69 100644 --- a/contrib/closure-library/goog/editor/plugins/undoredo_test.html +++ b/contrib/closure-library/goog/editor/plugins/undoredo_test.html @@ -8,7 +8,7 @@ diff --git a/contrib/closure-library/goog/editor/plugins/undoredomanager.js b/contrib/closure-library/goog/editor/plugins/undoredomanager.js index 142575c..9ebcbe0 100644 --- a/contrib/closure-library/goog/editor/plugins/undoredomanager.js +++ b/contrib/closure-library/goog/editor/plugins/undoredomanager.js @@ -26,6 +26,7 @@ goog.require('goog.editor.plugins.UndoRedoState'); goog.require('goog.events.EventTarget'); + /** * Manages undo and redo operations through a series of {@code UndoRedoState}s * maintained on undo and redo stacks. @@ -71,6 +72,7 @@ goog.editor.plugins.UndoRedoManager = function() { }; goog.inherits(goog.editor.plugins.UndoRedoManager, goog.events.EventTarget); + /** * Event types for the events dispatched by undo-redo manager. * @enum {string} diff --git a/contrib/closure-library/goog/editor/plugins/undoredomanager_test.html b/contrib/closure-library/goog/editor/plugins/undoredomanager_test.html index 26ec639..9b7f215 100644 --- a/contrib/closure-library/goog/editor/plugins/undoredomanager_test.html +++ b/contrib/closure-library/goog/editor/plugins/undoredomanager_test.html @@ -8,7 +8,7 @@ diff --git a/contrib/closure-library/goog/editor/plugins/undoredostate.js b/contrib/closure-library/goog/editor/plugins/undoredostate.js index 2065509..b3da495 100644 --- a/contrib/closure-library/goog/editor/plugins/undoredostate.js +++ b/contrib/closure-library/goog/editor/plugins/undoredostate.js @@ -25,6 +25,7 @@ goog.provide('goog.editor.plugins.UndoRedoState'); goog.require('goog.events.EventTarget'); + /** * Represents an undo and redo action for a particular state transition. * diff --git a/contrib/closure-library/goog/editor/plugins/undoredostate_test.html b/contrib/closure-library/goog/editor/plugins/undoredostate_test.html index 0c77d91..80ec4ea 100644 --- a/contrib/closure-library/goog/editor/plugins/undoredostate_test.html +++ b/contrib/closure-library/goog/editor/plugins/undoredostate_test.html @@ -8,7 +8,7 @@ diff --git a/contrib/closure-library/goog/editor/range.js b/contrib/closure-library/goog/editor/range.js index 6eafb3d..833972b 100644 --- a/contrib/closure-library/goog/editor/range.js +++ b/contrib/closure-library/goog/editor/range.js @@ -460,6 +460,7 @@ goog.editor.range.intersectsTag = function(range, tagName) { }; + /** * One endpoint of a range, represented as a Node and and offset. * @param {Node} node The node containing the point. @@ -540,7 +541,6 @@ goog.editor.range.Point.getPointAtEndOfNode = function(node) { }; - /** * Saves the range by inserting carets into the HTML. * @@ -557,6 +557,7 @@ goog.editor.range.saveUsingNormalizedCarets = function(range) { }; + /** * Saves the range using carets, but normalizes text nodes when carets * are removed. diff --git a/contrib/closure-library/goog/editor/range_test.html b/contrib/closure-library/goog/editor/range_test.html index eb36ede..65635ad 100644 --- a/contrib/closure-library/goog/editor/range_test.html +++ b/contrib/closure-library/goog/editor/range_test.html @@ -3,7 +3,7 @@ Trogedit Unit Tests - goog.editor.SeamlessField - diff --git a/contrib/closure-library/goog/editor/seamlessfield_test.html b/contrib/closure-library/goog/editor/seamlessfield_test.html index ae2a86e..36d4e0f 100644 --- a/contrib/closure-library/goog/editor/seamlessfield_test.html +++ b/contrib/closure-library/goog/editor/seamlessfield_test.html @@ -14,14 +14,13 @@ Trogedit Unit Tests - goog.editor.SeamlessField - diff --git a/contrib/closure-library/goog/editor/seamlessfield_test.js b/contrib/closure-library/goog/editor/seamlessfield_test.js index f67dc28..2ca7cb8 100644 --- a/contrib/closure-library/goog/editor/seamlessfield_test.js +++ b/contrib/closure-library/goog/editor/seamlessfield_test.js @@ -16,6 +16,8 @@ * @fileoverview Trogedit unit tests for goog.editor.SeamlessField. * * @author nicksantos@google.com (Nick Santos) + * @suppress {missingProperties} There are many mocks in this unit test, + * and the mocks don't fit well in the type system. */ goog.provide('goog.editor.seamlessfield_test'); @@ -29,6 +31,7 @@ goog.require('goog.testing.MockClock'); goog.require('goog.testing.MockRange'); goog.require('goog.testing.jsunit'); +goog.setTestOnly('seamlessfield_test'); var fieldElem; var fieldElemClone; @@ -230,6 +233,7 @@ function testSetMinHeight() { } } + /** * @bug 1649967 This code used to throw a Javascript error. */ @@ -353,6 +357,7 @@ function createSeamlessIframe() { { 'frameBorder': '0', 'style': 'padding:0;' }); } + /** * Initialize a new editable field for the field id 'field', with the given * innerHTML and styles. @@ -368,6 +373,7 @@ function initSeamlessField(innerHTML, styles) { return field; } + /** * Make sure that the original field element for the given goog.editor.Field has * the same size before and after attaching the given iframe. If this is not diff --git a/contrib/closure-library/goog/editor/style_test.html b/contrib/closure-library/goog/editor/style_test.html index 2b2c577..e1bebcc 100644 --- a/contrib/closure-library/goog/editor/style_test.html +++ b/contrib/closure-library/goog/editor/style_test.html @@ -8,7 +8,7 @@ diff --git a/contrib/closure-library/goog/editor/table.js b/contrib/closure-library/goog/editor/table.js index 6b3fd3b..362c436 100644 --- a/contrib/closure-library/goog/editor/table.js +++ b/contrib/closure-library/goog/editor/table.js @@ -35,6 +35,7 @@ goog.require('goog.string.Unicode'); goog.require('goog.style'); + /** * Class providing high level table editing functions. * @param {Element} node Element that is a table or descendant of a table. @@ -317,7 +318,7 @@ goog.editor.Table.prototype.mergeCells = function( for (var i = 1; cell = cells[i]; i++) { var td = cell.element; if (!td.parentNode || td == targetTd) { - // We've already handled this cell at one of it's previous positions. + // We've already handled this cell at one of its previous positions. continue; } // Add a space if needed, to keep merged content from getting squished @@ -411,6 +412,7 @@ goog.editor.Table.prototype.createEmptyTd = function() { }; + /** * Class representing a logical table row: a tr element and any cells * that appear in that row. @@ -425,6 +427,7 @@ goog.editor.TableRow = function(trElement, rowIndex) { }; + /** * Class representing a table cell, which may span across multiple * rows and columns diff --git a/contrib/closure-library/goog/editor/table_test.html b/contrib/closure-library/goog/editor/table_test.html index 317404e..8f58a3d 100644 --- a/contrib/closure-library/goog/editor/table_test.html +++ b/contrib/closure-library/goog/editor/table_test.html @@ -1,5 +1,12 @@ - + + + table.js Tests diff --git a/contrib/closure-library/goog/events/actioneventwrapper.js b/contrib/closure-library/goog/events/actioneventwrapper.js index 701c5f6..e4fe953 100644 --- a/contrib/closure-library/goog/events/actioneventwrapper.js +++ b/contrib/closure-library/goog/events/actioneventwrapper.js @@ -25,6 +25,7 @@ goog.require('goog.events.EventWrapper'); goog.require('goog.events.KeyCodes'); + /** * Event wrapper for action handling. Fires when an element is activated either * by clicking it or by focusing it and pressing Enter. @@ -75,13 +76,13 @@ goog.events.ActionEventWrapper_.prototype.listen = function(target, listener, opt_capt, opt_scope, opt_eventHandler) { var callback = function(e) { if (e.type == goog.events.EventType.CLICK && - e.isButton(goog.events.BrowserEvent.MouseButton.LEFT) || + e.isMouseActionButton() || e.type == goog.events.EventType.KEYPRESS && ( e.keyCode == goog.events.KeyCodes.ENTER || e.keyCode == goog.events.KeyCodes.MAC_ENTER)) { listener.call(opt_scope, e); } - } + }; callback.listener_ = listener; callback.scope_ = opt_scope; diff --git a/contrib/closure-library/goog/events/actioneventwrapper_test.html b/contrib/closure-library/goog/events/actioneventwrapper_test.html index dc72386..273d0fd 100644 --- a/contrib/closure-library/goog/events/actioneventwrapper_test.html +++ b/contrib/closure-library/goog/events/actioneventwrapper_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/events/actionhandler.js b/contrib/closure-library/goog/events/actionhandler.js index 4613513..64a8458 100644 --- a/contrib/closure-library/goog/events/actionhandler.js +++ b/contrib/closure-library/goog/events/actionhandler.js @@ -43,6 +43,8 @@ goog.require('goog.events.EventType'); goog.require('goog.events.KeyCodes'); goog.require('goog.userAgent'); + + /** * A wrapper around an element that you want to listen to ACTION events on. * @param {Element|Document} element The element or document to listen on. @@ -76,6 +78,7 @@ goog.events.ActionHandler.EventType = { BEFOREACTION: 'beforeaction' }; + /** * Key event type to listen for. * @type {string} diff --git a/contrib/closure-library/goog/events/actionhandler_test.html b/contrib/closure-library/goog/events/actionhandler_test.html index 33e6fbd..5735215 100644 --- a/contrib/closure-library/goog/events/actionhandler_test.html +++ b/contrib/closure-library/goog/events/actionhandler_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/events/browserevent.js b/contrib/closure-library/goog/events/browserevent.js index c8af925..d853e63 100644 --- a/contrib/closure-library/goog/events/browserevent.js +++ b/contrib/closure-library/goog/events/browserevent.js @@ -48,6 +48,7 @@ goog.provide('goog.events.BrowserEvent.MouseButton'); goog.require('goog.events.BrowserFeature'); goog.require('goog.events.Event'); goog.require('goog.events.EventType'); +goog.require('goog.reflect'); goog.require('goog.userAgent'); @@ -84,9 +85,8 @@ goog.events.BrowserEvent.MouseButton = { /** * Static data for mapping mouse buttons. * @type {Array.} - * @private */ -goog.events.BrowserEvent.IEButtonMap_ = [ +goog.events.BrowserEvent.IEButtonMap = [ 1, // LEFT 4, // MIDDLE 2 // RIGHT @@ -239,7 +239,11 @@ goog.events.BrowserEvent.prototype.event_ = null; */ goog.events.BrowserEvent.prototype.init = function(e, opt_currentTarget) { var type = this.type = e.type; - this.target = e.target || e.srcElement; + goog.events.Event.call(this, type); + + // TODO(nicksantos): Change this.target to type EventTarget. + this.target = /** @type {Node} */ (e.target) || e.srcElement; + this.currentTarget = opt_currentTarget; var relatedTarget = /** @type {Node} */ (e.relatedTarget); @@ -249,10 +253,7 @@ goog.events.BrowserEvent.prototype.init = function(e, opt_currentTarget) { // denied exception. See: // https://bugzilla.mozilla.org/show_bug.cgi?id=497780 if (goog.userAgent.GECKO) { - /** @preserveTry */ - try { - relatedTarget = relatedTarget.nodeName && relatedTarget; - } catch (err) { + if (!goog.reflect.canAccessProperty(relatedTarget, 'nodeName')) { relatedTarget = null; } } @@ -282,18 +283,13 @@ goog.events.BrowserEvent.prototype.init = function(e, opt_currentTarget) { this.shiftKey = e.shiftKey; this.metaKey = e.metaKey; this.platformModifierKey = goog.userAgent.MAC ? e.metaKey : e.ctrlKey; - - if(e.state) { - this.state = e.state; - } else { - this.state = null; - } - + this.state = e.state; this.event_ = e; delete this.returnValue_; delete this.propagationStopped_; }; + /** * Tests to see which button was pressed during the event. This is really only * useful in IE and Gecko browsers. And in IE, it's only useful for @@ -316,7 +312,7 @@ goog.events.BrowserEvent.prototype.isButton = function(button) { return button == goog.events.BrowserEvent.MouseButton.LEFT; } else { return !!(this.event_.button & - goog.events.BrowserEvent.IEButtonMap_[button]); + goog.events.BrowserEvent.IEButtonMap[button]); } } else { return this.event_.button == button; @@ -324,6 +320,22 @@ goog.events.BrowserEvent.prototype.isButton = function(button) { }; +/** + * Whether this has an "action"-producing mouse button. + * + * By definition, this includes left-click on windows/linux, and left-click + * without the ctrl key on Macs. + * + * @return {boolean} The result. + */ +goog.events.BrowserEvent.prototype.isMouseActionButton = function() { + // Webkit does not ctrl+click to be a right-click, so we + // normalize it to behave like Gecko and Opera. + return this.isButton(goog.events.BrowserEvent.MouseButton.LEFT) && + !(goog.userAgent.WEBKIT && goog.userAgent.MAC && this.ctrlKey); +}; + + /** * @inheritDoc */ diff --git a/contrib/closure-library/goog/events/browserevent_test.html b/contrib/closure-library/goog/events/browserevent_test.html index 05cfd96..4e5129e 100644 --- a/contrib/closure-library/goog/events/browserevent_test.html +++ b/contrib/closure-library/goog/events/browserevent_test.html @@ -9,7 +9,7 @@ @@ -19,6 +19,7 @@ diff --git a/contrib/closure-library/goog/events/event.js b/contrib/closure-library/goog/events/event.js index 0e1a47c..e0d194b 100644 --- a/contrib/closure-library/goog/events/event.js +++ b/contrib/closure-library/goog/events/event.js @@ -23,6 +23,7 @@ goog.provide('goog.events.Event'); goog.require('goog.Disposable'); + /** * A base class for event objects, so that they can support preventDefault and * stopPropagation. diff --git a/contrib/closure-library/goog/events/event_test.html b/contrib/closure-library/goog/events/event_test.html index 62c64bc..18d5883 100644 --- a/contrib/closure-library/goog/events/event_test.html +++ b/contrib/closure-library/goog/events/event_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/events/eventhandler.js b/contrib/closure-library/goog/events/eventhandler.js index d0575f5..18df716 100644 --- a/contrib/closure-library/goog/events/eventhandler.js +++ b/contrib/closure-library/goog/events/eventhandler.js @@ -19,21 +19,21 @@ * Example: *
      * function Something() {
    - *   goog.events.EventHandler.call(this);
    + *   goog.base(this);
      *
      *   ... set up object ...
      *
      *   // Add event listeners
    - *   this.listen(this.starEl, 'click', this.handleStar);
    - *   this.listen(this.headerEl, 'click', this.expand);
    - *   this.listen(this.collapseEl, 'click', this.collapse);
    - *   this.listen(this.infoEl, 'mouseover', this.showHover);
    - *   this.listen(this.infoEl, 'mouseout', this.hideHover);
    + *   this.listen(this.starEl, goog.events.EventType.CLICK, this.handleStar);
    + *   this.listen(this.headerEl, goog.events.EventType.CLICK, this.expand);
    + *   this.listen(this.collapseEl, goog.events.EventType.CLICK, this.collapse);
    + *   this.listen(this.infoEl, goog.events.EventType.MOUSEOVER, this.showHover);
    + *   this.listen(this.infoEl, goog.events.EventType.MOUSEOUT, this.hideHover);
      * }
      * goog.inherits(Something, goog.events.EventHandler);
      *
      * Something.prototype.disposeInternal = function() {
    - *   Something.superClass_.disposeInternal.call(this);
    + *   goog.base(this, 'disposeInternal');
      *   goog.dom.removeNode(this.container);
      * };
      *
    @@ -64,18 +64,26 @@ goog.require('goog.object');
     goog.require('goog.structs.SimplePool');
     
     
    +
     /**
      * Super class for objects that want to easily manage a number of event
      * listeners.  It allows a short cut to listen and also provides a quick way
    - * to remove all events listeners belonging to this object. It is optimized to
    - * use less objects if only one event is being listened to, but if that's the
    - * case, it may not be worth using the EventHandler anyway.
    + * to remove all events listeners belonging to this object.
      * @param {Object=} opt_handler Object in whose scope to call the listeners.
      * @constructor
      * @extends {goog.Disposable}
      */
     goog.events.EventHandler = function(opt_handler) {
    +  goog.Disposable.call(this);
       this.handler_ = opt_handler;
    +
    +  /**
    +   * Keys for events that are being listened to.
    +   * @type {Object}
    +   * @private
    +   */
    +  this.keys_ = /** @type {Object} */ (
    +      goog.events.EventHandler.keyPool_.getObject());
     };
     goog.inherits(goog.events.EventHandler, goog.Disposable);
     
    @@ -107,23 +115,13 @@ goog.events.EventHandler.keyPool_ = new goog.structs.SimplePool(
     
     
     /**
    - * Keys for events that are being listened to. This is used once there are more
    - * than one event to listen to. If there is only one event to listen to, key_
    - * is used.
    - * @type {Object}
    + * Utility array used to unify the cases of listening for an array of types
    + * and listening for a single event, without using recursion or allocating
    + * an array each time.
    + * @type {Array.}
      * @private
      */
    -goog.events.EventHandler.keys_ = null;
    -
    -
    -/**
    - * Keys for event that is being listened to if only one event is being listened
    - * to. This is a performance optimization to avoid creating an extra object
    - * if not necessary.
    - * @type {?string}
    - * @private
    - */
    -goog.events.EventHandler.key_ = null;
    +goog.events.EventHandler.typeArray_ = [];
     
     
     /**
    @@ -142,16 +140,16 @@ goog.events.EventHandler.key_ = null;
     goog.events.EventHandler.prototype.listen = function(src, type, opt_fn,
                                                          opt_capture,
                                                          opt_handler) {
    -  if (goog.isArray(type)) {
    -    for (var i = 0; i < type.length; i++) {
    -      this.listen(src, type[i], opt_fn, opt_capture, opt_handler);
    -    }
    -  } else {
    +  if (!goog.isArray(type)) {
    +    goog.events.EventHandler.typeArray_[0] = /** @type {string} */(type);
    +    type = goog.events.EventHandler.typeArray_;
    +  }
    +  for (var i = 0; i < type.length; i++) {
         var key = (/** @type {number} */
    -        goog.events.listen(src, type, opt_fn || this,
    +        goog.events.listen(src, type[i], opt_fn || this,
                                opt_capture || false,
                                opt_handler || this.handler_ || this));
    -    this.recordListenerKey_(key);
    +    this.keys_[key] = true;
       }
     
       return this;
    @@ -182,10 +180,9 @@ goog.events.EventHandler.prototype.listenOnce = function(src, type, opt_fn,
         }
       } else {
         var key = (/** @type {number} */
    -        goog.events.listenOnce(src, type, opt_fn || this,
    -                               opt_capture || false,
    +        goog.events.listenOnce(src, type, opt_fn || this, opt_capture,
                                    opt_handler || this.handler_ || this));
    -    this.recordListenerKey_(key);
    +    this.keys_[key] = true;
       }
     
       return this;
    @@ -216,25 +213,10 @@ goog.events.EventHandler.prototype.listenWithWrapper = function(src, wrapper,
     
     
     /**
    - * Record the key returned for the listener so that it can be user later
    - * to remove the listener.
    - * @param {number} key Unique key for the listener.
    - * @private
    + * @return {number} Number of listeners registered by this handler.
      */
    -goog.events.EventHandler.prototype.recordListenerKey_ = function(key) {
    -  if (this.keys_) {
    -    // already have multiple keys
    -    this.keys_[key] = true;
    -  } else if (this.key_) {
    -    // going from one key to multiple - must now use object as map
    -    this.keys_ = goog.events.EventHandler.keyPool_.getObject();
    -    this.keys_[this.key_] = true;
    -    this.key_ = null;
    -    this.keys_[key] = true;
    -  } else {
    -    // first key - can use single key
    -    this.key_ = key;
    -  }
    +goog.events.EventHandler.prototype.getListenerCount = function() {
    +  return goog.object.getCount(this.keys_);
     };
     
     
    @@ -252,25 +234,18 @@ goog.events.EventHandler.prototype.recordListenerKey_ = function(key) {
     goog.events.EventHandler.prototype.unlisten = function(src, type, opt_fn,
                                                            opt_capture,
                                                            opt_handler) {
    -  if (this.key_ || this.keys_) {
    -    if (goog.isArray(type)) {
    -      for (var i = 0; i < type.length; i++) {
    -        this.unlisten(src, type[i], opt_fn, opt_capture, opt_handler);
    -      }
    -    } else {
    -      var listener = goog.events.getListener(src, type, opt_fn || this,
    -          opt_capture || false, opt_handler || this.handler_ || this);
    -
    -      if (listener) {
    -        var key = listener.key;
    -        goog.events.unlistenByKey(key);
    -
    -        if (this.keys_) {
    -          goog.object.remove(this.keys_, key);
    -        } else if (this.key_ == key) {
    -          this.key_ = null;
    -        }
    -      }
    +  if (goog.isArray(type)) {
    +    for (var i = 0; i < type.length; i++) {
    +      this.unlisten(src, type[i], opt_fn, opt_capture, opt_handler);
    +    }
    +  } else {
    +    var listener = goog.events.getListener(src, type, opt_fn || this,
    +        opt_capture, opt_handler || this.handler_ || this);
    +
    +    if (listener) {
    +      var key = listener.key;
    +      goog.events.unlistenByKey(key);
    +      delete this.keys_[key];
         }
       }
     
    @@ -303,17 +278,10 @@ goog.events.EventHandler.prototype.unlistenWithWrapper = function(src, wrapper,
      * Unlistens to all events.
      */
     goog.events.EventHandler.prototype.removeAll = function() {
    -  if (this.keys_) {
    -    for (var key in this.keys_) {
    -      goog.events.unlistenByKey((/** @type {number} */ key));
    -      // Clean the keys before returning object to the pool.
    -      delete this.keys_[key];
    -    }
    -    goog.events.EventHandler.keyPool_.releaseObject(this.keys_);
    -    this.keys_ = null;
    -
    -  } else if (this.key_) {
    -    goog.events.unlistenByKey(this.key_);
    +  for (var key in this.keys_) {
    +    goog.events.unlistenByKey((/** @type {number} */ key));
    +    // Clean the keys before returning object to the pool.
    +    delete this.keys_[key];
       }
     };
     
    @@ -323,7 +291,15 @@ goog.events.EventHandler.prototype.removeAll = function() {
      */
     goog.events.EventHandler.prototype.disposeInternal = function() {
       goog.events.EventHandler.superClass_.disposeInternal.call(this);
    -  this.removeAll();
    +  // The protected disposeInternal method is not supposed to be reentrant.
    +  // Unfortunately some projects call it directly, potentially multiple times.
    +  // To avoid the side effects of a double releaseObject() call, the disposal
    +  // code must not run if the EventHandler has already been disposed of.
    +  if (this.keys_) {
    +    this.removeAll();
    +    goog.events.EventHandler.keyPool_.releaseObject(this.keys_);
    +    this.keys_ = null;
    +  }
     };
     
     
    diff --git a/contrib/closure-library/goog/events/eventhandler_test.html b/contrib/closure-library/goog/events/eventhandler_test.html
    index a8ceb8c..7eaa921 100644
    --- a/contrib/closure-library/goog/events/eventhandler_test.html
    +++ b/contrib/closure-library/goog/events/eventhandler_test.html
    @@ -3,7 +3,7 @@
     
     
    @@ -31,6 +31,9 @@
       var c = document.getElementById('c');
       var d = document.getElementById('d');
     
    +  function tearDown() {
    +    goog.events.removeAll();
    +  }
     
       function testEventHandlerClearsListeners() {
         assertEquals('No event listeners should be registered at the start', 0,
    @@ -224,6 +227,18 @@
         assertEquals('No event should have been dispatched', 1, events.length);
       }
     
    +  function testGetListenerCount() {
    +    var eh = new goog.events.EventHandler();
    +    assertEquals('0 listeners registered initially', 0, eh.getListenerCount());
    +    var target = new goog.events.EventTarget();
    +    eh.listen(target, 'click', goog.nullFunction, false);
    +    eh.listen(target, 'click', goog.nullFunction, true);
    +    assertEquals('2 listeners registered', 2, eh.getListenerCount());
    +    eh.unlisten(target, 'click', goog.nullFunction, true);
    +    assertEquals('1 listener removed, 1 left', 1, eh.getListenerCount());
    +    eh.removeAll();
    +    assertEquals('all listeners removed', 0, eh.getListenerCount());
    +  }
     
     
     
    diff --git a/contrib/closure-library/goog/events/events.js b/contrib/closure-library/goog/events/events.js
    index c6d4957..f9213ba 100644
    --- a/contrib/closure-library/goog/events/events.js
    +++ b/contrib/closure-library/goog/events/events.js
    @@ -125,14 +125,6 @@ goog.events.keySeparator_ = '_';
     goog.events.requiresSyntheticEventPropagation_;
     
     
    -/**
    - * Return value for marking an event in IE.
    - * @type {string}
    - * @private
    - */
    -goog.events.RETURN_VALUE_ = 'marked_closure';
    -
    -
     /**
      * Adds an event listener for a specific event on a DOM Node or an object that
      * has implemented {@link goog.events.EventTarget}. A listener can only be
    @@ -591,7 +583,11 @@ goog.events.getListener = function(src, type, listener, opt_capt, opt_handler) {
       var listenerArray = goog.events.getListeners_(src, type, capture);
       if (listenerArray) {
         for (var i = 0; i < listenerArray.length; i++) {
    -      if (listenerArray[i].listener == listener &&
    +      // If goog.events.unlistenByKey is called during an event dispatch
    +      // then the listener array won't get cleaned up and there might be
    +      // 'removed' listeners in the list. Ignore those.
    +      if (!listenerArray[i].removed &&
    +          listenerArray[i].listener == listener &&
               listenerArray[i].capture == capture &&
               listenerArray[i].handler == opt_handler) {
             // We already have this listener. Return its key.
    @@ -792,13 +788,19 @@ goog.events.getTotalListenerCount = function() {
      *     true.
      */
     goog.events.dispatchEvent = function(src, e) {
    +  var type = e.type || e;
    +  var map = goog.events.listenerTree_;
    +  if (!(type in map)) {
    +    return true;
    +  }
    +
       // If accepting a string or object, create a custom event object so that
       // preventDefault and stopPropagation work with the event.
       if (goog.isString(e)) {
         e = new goog.events.Event(e, src);
       } else if (!(e instanceof goog.events.Event)) {
         var oldEvent = e;
    -    e = new goog.events.Event(e.type, src);
    +    e = new goog.events.Event(type, src);
         goog.object.extend(e, oldEvent);
       } else {
         e.target = e.target || src;
    @@ -806,13 +808,6 @@ goog.events.dispatchEvent = function(src, e) {
     
       var rv = 1, ancestors;
     
    -  var type = e.type;
    -  var map = goog.events.listenerTree_;
    -
    -  if (!(type in map)) {
    -    return true;
    -  }
    -
       map = map[type];
       var hasCapture = true in map;
       var targetsMap;
    @@ -1036,8 +1031,9 @@ goog.events.markIeEvent_ = function(e) {
         }
       }
     
    -  if (useReturnValue || e.returnValue != goog.events.RETURN_VALUE_) {
    -    e.returnValue = goog.events.RETURN_VALUE_;
    +  if (useReturnValue ||
    +      /** @type {boolean|undefined} */ (e.returnValue) == undefined) {
    +    e.returnValue = true;
       }
     };
     
    @@ -1048,10 +1044,9 @@ goog.events.markIeEvent_ = function(e) {
      * @param {Event} e  The IE browser event.
      * @return {boolean} True if the event object has been marked.
      * @private
    - * @notypecheck TODO(nicksantos): Fix this.
      */
     goog.events.isMarkedIeEvent_ = function(e) {
    -  return e.keyCode < 0 || e.returnValue == goog.events.RETURN_VALUE_;
    +  return e.keyCode < 0 || e.returnValue != undefined;
     };
     
     
    diff --git a/contrib/closure-library/goog/events/events_test.html b/contrib/closure-library/goog/events/events_test.html
    index 917640c..10c90ea 100644
    --- a/contrib/closure-library/goog/events/events_test.html
    +++ b/contrib/closure-library/goog/events/events_test.html
    @@ -3,7 +3,7 @@
     
     
    @@ -63,6 +63,21 @@
         }
       }
     
    +  function testSelfRemove() {
    +    var et1 = new goog.events.EventTarget();
    +    var callback = function() {
    +      // This listener removes itself during event dispatching, so it
    +      // is marked as 'removed' but not actually removed until after event
    +      // dispatching ends.
    +      goog.events.removeAll(et1, 'click');
    +
    +      // Test that goog.events.getListener ignores events marked as 'removed'.
    +      assertNull(goog.events.getListener(et1, 'click', callback));
    +    };
    +    var key = goog.events.listen(et1, 'click', callback);
    +    goog.events.dispatchEvent(et1, 'click');
    +  }
    +
       function testHasListener() {
         var div = document.createElement('div');
         assertFalse(goog.events.hasListener(div));
    diff --git a/contrib/closure-library/goog/events/eventtarget.js b/contrib/closure-library/goog/events/eventtarget.js
    index 092de54..c3a4834 100644
    --- a/contrib/closure-library/goog/events/eventtarget.js
    +++ b/contrib/closure-library/goog/events/eventtarget.js
    @@ -18,6 +18,7 @@
      * @see ../demos/eventtarget.html
      */
     
    +
     /**
      * Namespace for events
      */
    @@ -27,6 +28,7 @@ goog.require('goog.Disposable');
     goog.require('goog.events');
     
     
    +
     /**
      * This implements the EventTarget interface as defined by W3C DOM 2/3. The
      * main difference from the spec is that the this does not know about event
    diff --git a/contrib/closure-library/goog/events/eventtarget_test.html b/contrib/closure-library/goog/events/eventtarget_test.html
    index 6d0e338..364389c 100644
    --- a/contrib/closure-library/goog/events/eventtarget_test.html
    +++ b/contrib/closure-library/goog/events/eventtarget_test.html
    @@ -3,7 +3,7 @@
     
     
    diff --git a/contrib/closure-library/goog/events/eventtype.js b/contrib/closure-library/goog/events/eventtype.js
    index 9a1d675..8dfa243 100644
    --- a/contrib/closure-library/goog/events/eventtype.js
    +++ b/contrib/closure-library/goog/events/eventtype.js
    @@ -15,7 +15,6 @@
     /**
      * @fileoverview Event Types.
      *
    - *
      */
     
     
    @@ -23,6 +22,7 @@ goog.provide('goog.events.EventType');
     
     goog.require('goog.userAgent');
     
    +
     /**
      * Constants for event names.
      * @enum {string}
    @@ -47,8 +47,14 @@ goog.events.EventType = {
       BLUR: 'blur',
       FOCUS: 'focus',
       DEACTIVATE: 'deactivate', // IE only
    -  // TODO(user): Test these. I experienced problems with DOMFocusIn, the event
    -  // just wasn't firing.
    +  // NOTE: The following two events are not stable in cross-browser usage.
    +  //     WebKit and Opera implement DOMFocusIn/Out.
    +  //     IE implements focusin/out.
    +  //     Gecko implements neither see bug at
    +  //     https://bugzilla.mozilla.org/show_bug.cgi?id=396927.
    +  // The DOM Events Level 3 Draft deprecates DOMFocusIn in favor of focusin:
    +  //     http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html
    +  // You can use FOCUS in Capture phase until implementations converge.
       FOCUSIN: goog.userAgent.IE ? 'focusin' : 'DOMFocusIn',
       FOCUSOUT: goog.userAgent.IE ? 'focusout' : 'DOMFocusOut',
     
    @@ -84,7 +90,18 @@ goog.events.EventType = {
       UNLOAD: 'unload',
     
       // HTML 5 History events
    +  // See http://www.w3.org/TR/html5/history.html#event-definitions
       HASHCHANGE: 'hashchange',
    -  POPSTATE: 'popstate'
    -};
    +  PAGEHIDE: 'pagehide',
    +  PAGESHOW: 'pageshow',
    +  POPSTATE: 'popstate',
     
    +  // Copy and Paste
    +  COPY: 'copy',
    +  PASTE: 'paste',
    +  CUT: 'cut',
    +
    +  // HTML 5 worker events
    +  MESSAGE: 'message',
    +  CONNECT: 'connect'
    +};
    diff --git a/contrib/closure-library/goog/events/eventwrapper.js b/contrib/closure-library/goog/events/eventwrapper.js
    index 01a4939..f664802 100644
    --- a/contrib/closure-library/goog/events/eventwrapper.js
    +++ b/contrib/closure-library/goog/events/eventwrapper.js
    @@ -20,6 +20,7 @@
     goog.provide('goog.events.EventWrapper');
     
     
    +
     /**
      * Interface for event wrappers.
      * @interface
    diff --git a/contrib/closure-library/goog/events/filedrophandler.js b/contrib/closure-library/goog/events/filedrophandler.js
    index 31a32e7..c61c237 100644
    --- a/contrib/closure-library/goog/events/filedrophandler.js
    +++ b/contrib/closure-library/goog/events/filedrophandler.js
    @@ -32,6 +32,7 @@ goog.require('goog.events.EventTarget');
     goog.require('goog.events.EventType');
     
     
    +
     /**
      * A files drag and drop event detector. Gets an {@code element} as parameter
      * and fires {@code goog.events.FileDropHandler.EventType.DROP} event when files
    diff --git a/contrib/closure-library/goog/events/filedrophandler_test.html b/contrib/closure-library/goog/events/filedrophandler_test.html
    index 55afe35..547cb28 100644
    --- a/contrib/closure-library/goog/events/filedrophandler_test.html
    +++ b/contrib/closure-library/goog/events/filedrophandler_test.html
    @@ -3,7 +3,7 @@
     
     
    +Use of this source code is governed by the Apache License, Version 2.0.
    +See the COPYING file for details.
     
    +-->
     
     
     JsUnit tests for goog.events.ImeHandler
    @@ -42,7 +43,8 @@
     
     function initImeHandler() {
       goog.events.ImeHandler.USES_COMPOSITION_EVENTS =
    -      goog.userAgent.GECKO || goog.userAgent.product.CHROME;
    +      goog.userAgent.GECKO ||
    +      (goog.userAgent.WEBKIT && goog.userAgent.isVersion(532));
       imeHandler = new goog.events.ImeHandler(sandbox);
       eventsFired = [];
       goog.events.listen(
    @@ -111,7 +113,6 @@
     
       // Set the userAgent used for this test to Firefox.
       setUserAgent('GECKO');
    -  setProduct(null);
       stubs.set(goog.userAgent, 'MAC', false);
       initImeHandler();
     
    @@ -148,7 +149,7 @@
     
     function runChromeCompositionEvents(platform) {
       setUserAgent('WEBKIT');
    -  setProduct('CHROME');
    +  setVersion(532);
       stubs.set(goog.userAgent, platform, true);
       initImeHandler();
     
    @@ -171,7 +172,6 @@
      */
     function testHandlerKeyDownForIme_imeOnOff() {
       setUserAgent('IE');
    -  setProduct(null);
       initImeHandler();
     
       // Send a WIN_IME keyDown event and see whether IME mode turns on.
    @@ -201,7 +201,7 @@
      */
     function testHandleKeyUpForSafari() {
       setUserAgent('WEBKIT');
    -  setProduct('SAFARI');
    +  setVersion(531);
       initImeHandler();
     
       fireImeKeySequence();
    @@ -223,7 +223,7 @@
     
     function testScimFiresWinImeKeycodesChromeLinux() {
       setUserAgent('WEBKIT');
    -  setProduct('CHROME');
    +  setVersion(532);
       assertScimInputIgnored();
     }
     
    @@ -244,7 +244,6 @@
     }
     
     var userAgents = ['IE', 'GECKO', 'WEBKIT'];
    -var products = ['SAFARI', 'CHROME'];
     
     function setUserAgent(userAgent) {
       for (var i = 0; i < userAgents.length; i++) {
    @@ -252,10 +251,9 @@
       }
     }
     
    -function setProduct(product) {
    -  for (var i = 0; i < products.length; i++) {
    -    stubs.set(goog.userAgent.product, products[i], products[i] == product);
    -  }
    +function setVersion(version) {
    +  goog.userAgent.VERSION = version;
    +  goog.userAgent.isVersionCache_ = {};
     }
     
     function assertImeMode() {
    diff --git a/contrib/closure-library/goog/events/inputhandler.js b/contrib/closure-library/goog/events/inputhandler.js
    index 8909e4e..da1936a 100644
    --- a/contrib/closure-library/goog/events/inputhandler.js
    +++ b/contrib/closure-library/goog/events/inputhandler.js
    @@ -47,6 +47,7 @@ goog.require('goog.events.KeyCodes');
     goog.require('goog.userAgent');
     
     
    +
     /**
      * This event handler will dispatch events when the user types into a text
      * input, password input or a textarea
    @@ -86,7 +87,7 @@ goog.events.InputHandler = function(element) {
        * @type {goog.events.EventHandler}
        * @private
        */
    -  this.eventHandler_ = new goog.events.EventHandler();
    +  this.eventHandler_ = new goog.events.EventHandler(this);
       this.eventHandler_.listen(
           this.element_,
           this.inputEventEmulation_ ? ['keydown', 'paste', 'cut', 'drop'] : 'input',
    @@ -103,6 +104,7 @@ goog.events.InputHandler.EventType = {
       INPUT: 'input'
     };
     
    +
     /**
      * Id of a timer used to postpone firing input event in emulation mode.
      * @type {?number}
    diff --git a/contrib/closure-library/goog/events/keycodes.js b/contrib/closure-library/goog/events/keycodes.js
    index 995d148..a9e04f2 100644
    --- a/contrib/closure-library/goog/events/keycodes.js
    +++ b/contrib/closure-library/goog/events/keycodes.js
    @@ -92,7 +92,8 @@ goog.events.KeyCodes = {
       X: 88,
       Y: 89,
       Z: 90,
    -  META: 91,
    +  META: 91, // WIN_KEY_LEFT
    +  WIN_KEY_RIGHT: 92,
       CONTEXT_MENU: 93,
       NUM_ZERO: 96,
       NUM_ONE: 97,
    @@ -186,6 +187,7 @@ goog.events.KeyCodes.isTextModifyingKeyEvent = function(e) {
         case goog.events.KeyCodes.SHIFT:
         case goog.events.KeyCodes.UP:
         case goog.events.KeyCodes.WIN_KEY:
    +    case goog.events.KeyCodes.WIN_KEY_RIGHT:
           return false;
         default:
           return true;
    @@ -253,7 +255,8 @@ goog.events.KeyCodes.firesKeyPressEvent = function(keyCode, opt_heldKeyCode,
     
       switch (keyCode) {
         case goog.events.KeyCodes.ENTER:
    -      return true;
    +      // IE9 does not fire KEYPRESS on ENTER.
    +      return !(goog.userAgent.IE && goog.userAgent.isVersion('9'));
         case goog.events.KeyCodes.ESC:
           return !goog.userAgent.WEBKIT;
       }
    diff --git a/contrib/closure-library/goog/events/keycodes_test.html b/contrib/closure-library/goog/events/keycodes_test.html
    index 7030d27..65d9425 100644
    --- a/contrib/closure-library/goog/events/keycodes_test.html
    +++ b/contrib/closure-library/goog/events/keycodes_test.html
    @@ -1,12 +1,13 @@
     
     
    -
     
    +Use of this source code is governed by the Apache License, Version 2.0.
    +See the COPYING file for details.
     
    +Author: nicksantos@google.com (Nick Santos)
    +-->
     
     
     JsUnit tests for goog.events.KeyCodes
    diff --git a/contrib/closure-library/goog/events/keyhandler_test.html b/contrib/closure-library/goog/events/keyhandler_test.html
    index 89eaee4..160da82 100644
    --- a/contrib/closure-library/goog/events/keyhandler_test.html
    +++ b/contrib/closure-library/goog/events/keyhandler_test.html
    @@ -3,7 +3,7 @@
     
     
    @@ -14,6 +14,7 @@
       goog.require('goog.dom')
       goog.require('goog.events.KeyEvent');
       goog.require('goog.events.EventType');
    +  goog.require('goog.functions');
       goog.require('goog.testing.events');
       goog.require('goog.testing.jsunit');
     
    @@ -22,9 +23,9 @@
     
     
    @@ -19,6 +21,17 @@
     
     
     
     
    diff --git a/contrib/closure-library/goog/format/htmlprettyprinter.js b/contrib/closure-library/goog/format/htmlprettyprinter.js
    index 71f96f8..1cc63ae 100644
    --- a/contrib/closure-library/goog/format/htmlprettyprinter.js
    +++ b/contrib/closure-library/goog/format/htmlprettyprinter.js
    @@ -24,6 +24,7 @@ goog.require('goog.object');
     goog.require('goog.string.StringBuffer');
     
     
    +
     /**
      * This class formats HTML to be more human-readable.
      * TODO(user): Add hierarchical indentation.
    @@ -184,6 +185,7 @@ goog.format.HtmlPrettyPrinter.EMPTY_TAGS_ = goog.object.createSet(
         'hr',
         'isindex');
     
    +
     /**
      * Breaks up HTML so it's easily readable by the user.
      * @param {string} html The HTML text to pretty print.
    @@ -310,6 +312,7 @@ goog.format.HtmlPrettyPrinter.prototype.format = function(html) {
     };
     
     
    +
     /**
      * This class is a buffer to which we push our output. It tracks line breaks to
      * make sure we don't add unnecessary ones.
    diff --git a/contrib/closure-library/goog/format/htmlprettyprinter_test.html b/contrib/closure-library/goog/format/htmlprettyprinter_test.html
    index 0dca074..a814397 100644
    --- a/contrib/closure-library/goog/format/htmlprettyprinter_test.html
    +++ b/contrib/closure-library/goog/format/htmlprettyprinter_test.html
    @@ -3,7 +3,7 @@
     
     
    @@ -152,15 +152,10 @@
         assertEquals('f o o\n', goog.format.HtmlPrettyPrinter.format('f o o'));
     
         // But not this one.
    -    var success = false;
    -    try {
    -      goog.format.HtmlPrettyPrinter.format(COMPLEX_HTML);
    -    } catch (ex) {
    -      success = true;
    -      assertEquals('Regex failed to make progress through source html.',
    -          ex.message);
    -    }
    -    assertTrue('should have failed for invalid regex - endless loop.', success);
    +    var ex = assertThrows('should have failed for invalid regex - endless loop',
    +        goog.partial(goog.format.HtmlPrettyPrinter.format, COMPLEX_HTML));
    +    assertEquals('Regex failed to make progress through source html.',
    +        ex.message);
       } finally {
         goog.format.HtmlPrettyPrinter.TOKEN_REGEX_ = original;
       }
    @@ -197,14 +192,9 @@
         assertEquals('foo\n', goog.format.HtmlPrettyPrinter.format('foo'));
     
         // But not this one.
    -    var success = false;
    -    try {
    -      goog.format.HtmlPrettyPrinter.format(COMPLEX_HTML);
    -    } catch (ex) {
    -      success = true;
    -      assertEquals('Lost data pretty printing html.', ex.message)
    -    }
    -    assertTrue('should have failed for invalid regex - data loss.', success);
    +    var ex = assertThrows('should have failed for invalid regex - data loss',
    +        goog.partial(goog.format.HtmlPrettyPrinter.format, COMPLEX_HTML));
    +    assertEquals('Lost data pretty printing html.', ex.message);
       } finally {
         goog.format.HtmlPrettyPrinter.TOKEN_REGEX_ = original;
       }
    diff --git a/contrib/closure-library/goog/format/jsonprettyprinter.js b/contrib/closure-library/goog/format/jsonprettyprinter.js
    index 7e6c864..c6e0f24 100644
    --- a/contrib/closure-library/goog/format/jsonprettyprinter.js
    +++ b/contrib/closure-library/goog/format/jsonprettyprinter.js
    @@ -29,6 +29,7 @@ goog.require('goog.string.StringBuffer');
     goog.require('goog.string.format');
     
     
    +
     /**
      * Formats a JSON object as a string, properly indented for display.  Supports
      * displaying the string as text or html.  Users can also specify their own
    @@ -246,6 +247,7 @@ goog.format.JsonPrettyPrinter.prototype.printSpaces_ = function(indent,
     };
     
     
    +
     /**
      * A container for the delimiting characters used to display the JSON string
      * to a text display.  Each delimiter is a publicly accessible property of
    @@ -354,6 +356,7 @@ goog.format.JsonPrettyPrinter.TextDelimiters.prototype.postValue = '';
     goog.format.JsonPrettyPrinter.TextDelimiters.prototype.indent = 2;
     
     
    +
     /**
      * A container for the delimiting characters used to display the JSON string
      * to an HTML <pre> or <code> element.
    diff --git a/contrib/closure-library/goog/format/jsonprettyprinter_test.html b/contrib/closure-library/goog/format/jsonprettyprinter_test.html
    index a8c8f67..197a0ce 100644
    --- a/contrib/closure-library/goog/format/jsonprettyprinter_test.html
    +++ b/contrib/closure-library/goog/format/jsonprettyprinter_test.html
    @@ -3,7 +3,7 @@
     
     
    diff --git a/contrib/closure-library/goog/fs/entry.js b/contrib/closure-library/goog/fs/entry.js
    new file mode 100644
    index 0000000..e283cd6
    --- /dev/null
    +++ b/contrib/closure-library/goog/fs/entry.js
    @@ -0,0 +1,509 @@
    +// Copyright 2011 The Closure Library Authors. All Rights Reserved.
    +//
    +// Licensed under the Apache License, Version 2.0 (the "License");
    +// you may not use this file except in compliance with the License.
    +// You may obtain a copy of the License at
    +//
    +//      http://www.apache.org/licenses/LICENSE-2.0
    +//
    +// Unless required by applicable law or agreed to in writing, software
    +// distributed under the License is distributed on an "AS-IS" BASIS,
    +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +// See the License for the specific language governing permissions and
    +// limitations under the License.
    +
    +/**
    + * @fileoverview Wrappers for HTML5 Entry objects. These are all in the same
    + * file to avoid circular dependency issues.
    + *
    + * When adding or modifying functionality in this namespace, be sure to update
    + * the mock counterparts in goog.testing.fs.
    + *
    + */
    +
    +goog.provide('goog.fs.DirectoryEntry');
    +goog.provide('goog.fs.DirectoryEntry.Behavior');
    +goog.provide('goog.fs.Entry');
    +goog.provide('goog.fs.FileEntry');
    +
    +goog.require('goog.array');
    +goog.require('goog.async.Deferred');
    +goog.require('goog.fs.Error');
    +goog.require('goog.fs.FileWriter');
    +goog.require('goog.functions');
    +goog.require('goog.string');
    +
    +
    +/**
    + * The abstract class for entries in the filesystem.
    + *
    + * @param {!goog.fs.FileSystem} fs The wrapped filesystem.
    + * @param {!Entry} entry The underlying Entry object.
    + * @constructor
    + */
    +goog.fs.Entry = function(fs, entry) {
    +  /**
    +   * The wrapped filesystem.
    +   *
    +   * @type {!goog.fs.FileSystem}
    +   * @private
    +   */
    +  this.fs_ = fs;
    +
    +  /**
    +   * The underlying Entry object.
    +   *
    +   * @type {!Entry}
    +   * @private
    +   */
    +  this.entry_ = entry;
    +};
    +
    +
    +/**
    + * @return {boolean} Whether or not this entry is a file.
    + */
    +goog.fs.Entry.prototype.isFile = function() {
    +  return this.entry_.isFile;
    +};
    +
    +
    +/**
    + * @return {boolean} Whether or not this entry is a directory.
    + */
    +goog.fs.Entry.prototype.isDirectory = function() {
    +  return this.entry_.isDirectory;
    +};
    +
    +
    +/**
    + * @return {string} The name of this entry.
    + */
    +goog.fs.Entry.prototype.getName = function() {
    +  return this.entry_.name;
    +};
    +
    +
    +/**
    + * @return {string} The full path to this entry.
    + */
    +goog.fs.Entry.prototype.getFullPath = function() {
    +  return this.entry_.fullPath;
    +};
    +
    +
    +/**
    + * @return {!goog.fs.FileSystem} The filesystem backing this entry.
    + */
    +goog.fs.Entry.prototype.getFileSystem = function() {
    +  return this.fs_;
    +};
    +
    +
    +/**
    + * Retrieves the last modified date for this entry.
    + *
    + * @return {!goog.async.Deferred} The deferred Date for this entry. If an error
    + *     occurs, the errback is called with a {@link goog.fs.Error}.
    + */
    +goog.fs.Entry.prototype.getLastModified = function() {
    +  var d = new goog.async.Deferred();
    +
    +  this.entry_.getMetadata(
    +      function(metadata) { d.callback(metadata.modificationTime); },
    +      goog.bind(function(err) {
    +        var msg = 'retrieving last modified date for ' + this.getFullPath();
    +        d.errback(new goog.fs.Error(err.code, msg));
    +      }, this));
    +  return d;
    +};
    +
    +
    +/**
    + * Move this entry to a new location.
    + *
    + * @param {!goog.fs.DirectoryEntry} parent The new parent directory.
    + * @param {string=} opt_newName The new name of the entry. If omitted, the entry
    + *     retains its original name.
    + * @return {!goog.async.Deferred} The deferred {@link goog.fs.FileEntry} or
    + *     {@link goog.fs.DirectoryEntry} for the new entry. If an error occurs, the
    + *     errback is called with a {@link goog.fs.Error}.
    + */
    +goog.fs.Entry.prototype.moveTo = function(parent, opt_newName) {
    +  var d = new goog.async.Deferred();
    +  this.entry_.moveTo(
    +      parent.dir_, opt_newName,
    +      goog.bind(function(entry) { d.callback(this.wrapEntry(entry)); }, this),
    +      goog.bind(function(err) {
    +        var msg = 'moving ' + this.getFullPath() + ' into ' +
    +            parent.getFullPath() +
    +            (opt_newName ? ', renaming to ' + opt_newName : '');
    +        d.errback(new goog.fs.Error(err.code, msg));
    +      }, this));
    +  return d;
    +};
    +
    +
    +/**
    + * Copy this entry to a new location.
    + *
    + * @param {!goog.fs.DirectoryEntry} parent The new parent directory.
    + * @param {string=} opt_newName The name of the new entry. If omitted, the new
    + *     entry has the same name as the original.
    + * @return {!goog.async.Deferred} The deferred {@link goog.fs.FileEntry} or
    + *     {@link goog.fs.DirectoryEntry} for the new entry. If an error occurs, the
    + *     errback is called with a {@link goog.fs.Error}.
    + */
    +goog.fs.Entry.prototype.copyTo = function(parent, opt_newName) {
    +  var d = new goog.async.Deferred();
    +  this.entry_.copyTo(
    +      parent.dir_, opt_newName,
    +      goog.bind(function(entry) { d.callback(this.wrapEntry(entry)); }, this),
    +      goog.bind(function(err) {
    +        var msg = 'copying ' + this.getFullPath() + ' into ' +
    +            parent.getFullPath() +
    +            (opt_newName ? ', renaming to ' + opt_newName : '');
    +        d.errback(new goog.fs.Error(err.code, msg));
    +      }, this));
    +  return d;
    +};
    +
    +
    +/**
    + * Wrap an HTML5 entry object in an appropriate subclass instance.
    + *
    + * @param {!Entry} entry The underlying Entry object.
    + * @return {!goog.fs.Entry} The appropriate subclass wrapper.
    + * @protected
    + */
    +goog.fs.Entry.prototype.wrapEntry = function(entry) {
    +  return entry.isFile ?
    +      new goog.fs.FileEntry(this.fs_, /** @type {!FileEntry} */ (entry)) :
    +      new goog.fs.DirectoryEntry(
    +          this.fs_, /** @type {!DirectoryEntry} */ (entry));
    +};
    +
    +
    +/**
    + * Get the URI for this file.
    + *
    + * @param {string=} opt_mimeType The MIME type that will be served for the URI.
    + * @return {string} The URI.
    + */
    +goog.fs.Entry.prototype.toUri = function(opt_mimeType) {
    +  return this.entry_.toURI(opt_mimeType);
    +};
    +
    +
    +/**
    + * Remove this entry.
    + *
    + * @return {!goog.async.Deferred} A deferred object. If the removal succeeds,
    + *     the callback is valled with no value. If an error occurs, the errback is
    + *     called a {@link goog.fs.Error}.
    + */
    +goog.fs.Entry.prototype.remove = function() {
    +  var d = new goog.async.Deferred();
    +  this.entry_.remove(
    +      goog.bind(d.callback, d),
    +      goog.bind(function(err) {
    +        var msg = 'removing ' + this.getFullPath();
    +        d.errback(new goog.fs.Error(err.code, msg));
    +      }, this));
    +  return d;
    +};
    +
    +
    +/**
    + * Gets the parent directory.
    + *
    + * @return {!goog.async.Deferred} The deferred {@link goog.fs.DirectoryEntry}.
    + *     If an error occurs, the errback is called with a {@link goog.fs.Error}.
    + */
    +goog.fs.Entry.prototype.getParent = function() {
    +  var d = new goog.async.Deferred();
    +  this.entry_.getParent(
    +      goog.bind(function(parent) {
    +        d.callback(new goog.fs.DirectoryEntry(this.fs_, parent));
    +      }, this),
    +      goog.bind(function(err) {
    +        var msg = 'getting parent of ' + this.getFullPath();
    +        d.errback(new goog.fs.Error(err.code, msg));
    +      }, this));
    +  return d;
    +};
    +
    +
    +
    +/**
    + * A directory in a local FileSystem.
    + *
    + * This should not be instantiated directly. Instead, it should be accessed via
    + * {@link goog.fs.FileSystem#getRoot} or
    + * {@link goog.fs.DirectoryEntry#getDirectoryEntry}.
    + *
    + * @param {!goog.fs.FileSystem} fs The wrapped filesystem.
    + * @param {!DirectoryEntry} dir The underlying DirectoryEntry object.
    + * @constructor
    + * @extends {goog.fs.Entry}
    + */
    +goog.fs.DirectoryEntry = function(fs, dir) {
    +  goog.base(this, fs, dir);
    +
    +  /**
    +   * The underlying DirectoryEntry object.
    +   *
    +   * @type {!DirectoryEntry}
    +   * @private
    +   */
    +  this.dir_ = dir;
    +};
    +goog.inherits(goog.fs.DirectoryEntry, goog.fs.Entry);
    +
    +
    +/**
    + * Behaviors for getting files and directories.
    + * @enum {number}
    + */
    +goog.fs.DirectoryEntry.Behavior = {
    +  /**
    +   * Get the file if it exists, error out if it doesn't.
    +   */
    +  DEFAULT: 1,
    +  /**
    +   * Get the file if it exists, create it if it doesn't.
    +   */
    +  CREATE: 2,
    +  /**
    +   * Error out if the file exists, create it if it doesn't.
    +   */
    +  CREATE_EXCLUSIVE: 3
    +};
    +
    +
    +/**
    + * Get a file in the directory.
    + *
    + * @param {string} path The path to the file, relative to this directory.
    + * @param {goog.fs.DirectoryEntry.Behavior=} opt_behavior The behavior for
    + *     handling an existing file, or the lack thereof.
    + * @return {!goog.async.Deferred} The deferred {@link goog.fs.FileEntry}. If an
    + *     error occurs, the errback is called with a {@link goog.fs.Error}.
    + */
    +goog.fs.DirectoryEntry.prototype.getFile = function(path, opt_behavior) {
    +  var d = new goog.async.Deferred();
    +  this.dir_.getFile(
    +      path, this.getOptions_(opt_behavior),
    +      goog.bind(function(entry) {
    +        d.callback(new goog.fs.FileEntry(this.fs_, entry));
    +      }, this),
    +      goog.bind(function(err) {
    +        var msg = 'loading file ' + path + ' from ' + this.getFullPath();
    +        d.errback(new goog.fs.Error(err.code, msg));
    +      }, this));
    +  return d;
    +};
    +
    +
    +/**
    + * Get a directory within this directory.
    + *
    + * @param {string} path The path to the directory, relative to this directory.
    + * @param {goog.fs.DirectoryEntry.Behavior=} opt_behavior The behavior for
    + *     handling an existing directory, or the lack thereof.
    + * @return {!goog.async.Deferred} The deferred {@link goog.fs.DirectoryEntry}.
    + *     If an error occurs, the errback is called a {@link goog.fs.Error}.
    + */
    +goog.fs.DirectoryEntry.prototype.getDirectory = function(path, opt_behavior) {
    +  var d = new goog.async.Deferred();
    +  this.dir_.getDirectory(
    +      path, this.getOptions_(opt_behavior),
    +      goog.bind(function(entry) {
    +        d.callback(new goog.fs.DirectoryEntry(this.fs_, entry));
    +      }, this),
    +      goog.bind(function(err) {
    +        var msg = 'loading directory ' + path + ' from ' + this.getFullPath();
    +        d.errback(new goog.fs.Error(err.code, msg));
    +      }, this));
    +  return d;
    +};
    +
    +
    +/**
    + * Opens the directory for the specified path, creating the directory and any
    + * intermediate directories as necessary.
    + *
    + * @param {string} path The directory path to create. May be absolute or
    + *     relative to the current directory. The parent directory ".." and current
    + *     directory "." are supported.
    + * @return {!goog.async.Deferred} A deferred {@link goog.fs.DirectoryEntry} for
    + *     the requested path. If an error occurs, the errback is called with a
    + *     {@link goog.fs.Error}.
    + */
    +goog.fs.DirectoryEntry.prototype.createPath = function(path) {
    +  // If the path begins at the root, reinvoke createPath on the root directory.
    +  if (goog.string.startsWith(path, '/')) {
    +    var root = this.getFileSystem().getRoot();
    +    if (this.getFullPath() != root.getFullPath()) {
    +      return root.createPath(path);
    +    }
    +  }
    +
    +  // Filter out any empty path components caused by '//' or a leading slash.
    +  var parts = goog.array.filter(path.split('/'), goog.functions.identity);
    +  var existed = [];
    +
    +  function getNextDirectory(dir) {
    +    if (!parts.length) {
    +      return goog.async.Deferred.succeed(dir);
    +    }
    +
    +    var def;
    +    var nextDir = parts.shift();
    +
    +    if (nextDir == '..') {
    +      def = dir.getParent();
    +    } else if (nextDir == '.') {
    +      def = goog.async.Deferred.succeed(dir);
    +    } else {
    +      def = dir.getDirectory(nextDir, goog.fs.DirectoryEntry.Behavior.CREATE);
    +    }
    +    return def.addCallback(getNextDirectory);
    +  }
    +
    +  return getNextDirectory(this);
    +};
    +
    +
    +/**
    + * Gets a list of all entries in this directory.
    + *
    + * @return {!goog.async.Deferred} The deferred list of {@link goog.fs.Entry}
    + *     results. If an error occurs, the errback is called with a
    + *     {@link goog.fs.Error}.
    + */
    +goog.fs.DirectoryEntry.prototype.listDirectory = function() {
    +  var d = new goog.async.Deferred();
    +  var reader = this.dir_.createReader();
    +  var results = [];
    +
    +  var errorCallback = goog.bind(function(err) {
    +    var msg = 'listing directory ' + this.getFullPath();
    +    d.errback(new goog.fs.Error(err.code, msg));
    +  }, this);
    +
    +  var successCallback = goog.bind(function(entries) {
    +    if (entries.length) {
    +      for (var i = 0, entry; entry = entries[i]; i++) {
    +        results.push(this.wrapEntry(entry));
    +      }
    +      reader.readEntries(successCallback, errorCallback);
    +    } else {
    +      d.callback(results);
    +    }
    +  }, this);
    +
    +  reader.readEntries(successCallback, errorCallback);
    +  return d;
    +};
    +
    +
    +/**
    + * Removes this directory and all its contents.
    + *
    + * @return {!goog.async.Deferred} A deferred object. If the removal succeeds,
    + *     the callback is valled with no value. If an error occurs, the errback is
    + *     called a {@link goog.fs.Error}.
    + */
    +goog.fs.DirectoryEntry.prototype.removeRecursively = function() {
    +  var d = new goog.async.Deferred();
    +  this.dir_.removeRecursively(
    +      goog.bind(d.callback, d),
    +      goog.bind(function(err) {
    +        var msg = 'removing ' + this.getFullPath() + ' recursively';
    +        d.errback(new goog.fs.Error(err.code, msg));
    +      }, this));
    +  return d;
    +};
    +
    +
    +/**
    + * Converts a value in the Behavior enum into an options object expected by the
    + * File API.
    + *
    + * @param {goog.fs.DirectoryEntry.Behavior=} opt_behavior The behavior for
    + *     existing files.
    + * @return {Object.} The options object expected by the File API.
    + * @private
    + */
    +goog.fs.DirectoryEntry.prototype.getOptions_ = function(opt_behavior) {
    +  if (opt_behavior == goog.fs.DirectoryEntry.Behavior.CREATE) {
    +    return {'create': true};
    +  } else if (opt_behavior == goog.fs.DirectoryEntry.Behavior.CREATE_EXCLUSIVE) {
    +    return {'create': true, 'exclusive': true};
    +  } else {
    +    return {};
    +  }
    +};
    +
    +
    +
    +/**
    + * A file in a local filesystem.
    + *
    + * This should not be instantiated directly. Instead, it should be accessed via
    + * {@link goog.fs.DirectoryEntry#getDirectoryEntry}.
    + *
    + * @param {!goog.fs.FileSystem} fs The wrapped filesystem.
    + * @param {!FileEntry} file The underlying FileEntry object.
    + * @constructor
    + * @extends {goog.fs.Entry}
    + */
    +goog.fs.FileEntry = function(fs, file) {
    +  goog.base(this, fs, file);
    +
    +  /**
    +   * The underlying FileEntry object.
    +   *
    +   * @type {!FileEntry}
    +   * @private
    +   */
    +  this.file_ = file;
    +};
    +goog.inherits(goog.fs.FileEntry, goog.fs.Entry);
    +
    +
    +/**
    + * Create a writer for writing to the file.
    + *
    + * @return {!goog.async.Deferred} The deferred {@link goog.fs.FileWriter}. If an
    + *     error occurs, the errback is called with a {@link goog.fs.Error}.
    + */
    +goog.fs.FileEntry.prototype.createWriter = function() {
    +  var d = new goog.async.Deferred();
    +  this.file_.createWriter(
    +      function(w) { d.callback(new goog.fs.FileWriter(w)); },
    +      goog.bind(function(err) {
    +        var msg = 'creating writer for ' + this.getFullPath();
    +        d.errback(new goog.fs.Error(err.code, msg));
    +      }, this));
    +  return d;
    +};
    +
    +
    +/**
    + * Get the file contents as a File blob.
    + *
    + * @return {!goog.async.Deferred} The deferred File. If an error occurs, the
    + *     errback is called with a {@link goog.fs.Error}.
    + */
    +goog.fs.FileEntry.prototype.file = function() {
    +  var d = new goog.async.Deferred();
    +  this.file_.file(
    +      function(f) { d.callback(f); },
    +      goog.bind(function(err) {
    +        var msg = 'getting file for ' + this.getFullPath();
    +        d.errback(new goog.fs.Error(err.code, msg));
    +      }, this));
    +  return d;
    +};
    diff --git a/contrib/closure-library/goog/fs/error.js b/contrib/closure-library/goog/fs/error.js
    new file mode 100644
    index 0000000..a4a8565
    --- /dev/null
    +++ b/contrib/closure-library/goog/fs/error.js
    @@ -0,0 +1,102 @@
    +// Copyright 2011 The Closure Library Authors. All Rights Reserved.
    +//
    +// Licensed under the Apache License, Version 2.0 (the "License");
    +// you may not use this file except in compliance with the License.
    +// You may obtain a copy of the License at
    +//
    +//      http://www.apache.org/licenses/LICENSE-2.0
    +//
    +// Unless required by applicable law or agreed to in writing, software
    +// distributed under the License is distributed on an "AS-IS" BASIS,
    +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +// See the License for the specific language governing permissions and
    +// limitations under the License.
    +
    +/**
    + * @fileoverview A wrapper for the HTML5 FileError object.
    + *
    + */
    +
    +goog.provide('goog.fs.Error');
    +goog.provide('goog.fs.Error.ErrorCode');
    +
    +goog.require('goog.debug.Error');
    +goog.require('goog.string');
    +
    +
    +
    +/**
    + * A filesystem error. Since the filesystem API is asynchronous, stack traces
    + * are less useful for identifying where errors come from, so this includes a
    + * large amount of metadata in the message.
    + *
    + * @param {number} code The error code for the error.
    + * @param {string} action The action being undertaken when the error was raised.
    + * @constructor
    + * @extends {goog.debug.Error}
    + */
    +goog.fs.Error = function(code, action) {
    +  goog.base(this, goog.string.subs('Error %s: %s', action,
    +                                   goog.fs.Error.getDebugMessage(code)));
    +  this.code = /** @type {goog.fs.Error.ErrorCode} */ (code);
    +};
    +goog.inherits(goog.fs.Error, goog.debug.Error);
    +
    +
    +/**
    + * Error codes for file errors.
    + * @see http://www.w3.org/TR/file-system-api/#idl-def-FileException
    + *
    + * @enum {number}
    + */
    +goog.fs.Error.ErrorCode = {
    +  NOT_FOUND: 1,
    +  SECURITY: 2,
    +  ABORT: 3,
    +  NOT_READABLE: 4,
    +  ENCODING: 5,
    +  NO_MODIFICATION_ALLOWED: 6,
    +  INVALID_STATE: 7,
    +  SYNTAX: 8,
    +  INVALID_MODIFICATION: 9,
    +  QUOTA_EXCEEDED: 10,
    +  TYPE_MISMATCH: 11,
    +  PATH_EXISTS: 12
    +};
    +
    +
    +/**
    + * @param {number} errorCode The error code for the error.
    + * @return {string} A debug message for the given error code. These messages are
    + *     for debugging only and are not localized.
    + */
    +goog.fs.Error.getDebugMessage = function(errorCode) {
    +  switch (errorCode) {
    +    case goog.fs.Error.ErrorCode.NOT_FOUND:
    +      return 'File or directory not found';
    +    case goog.fs.Error.ErrorCode.SECURITY:
    +      return 'Insecure or disallowed operation';
    +    case goog.fs.Error.ErrorCode.ABORT:
    +      return 'Operation aborted';
    +    case goog.fs.Error.ErrorCode.NOT_READABLE:
    +      return 'File or directory not readable';
    +    case goog.fs.Error.ErrorCode.ENCODING:
    +      return 'Invalid encoding';
    +    case goog.fs.Error.ErrorCode.NO_MODIFICATION_ALLOWED:
    +      return 'Cannot modify file or directory';
    +    case goog.fs.Error.ErrorCode.INVALID_STATE:
    +      return 'Invalid state';
    +    case goog.fs.Error.ErrorCode.SYNTAX:
    +      return 'Invalid line-ending specifier';
    +    case goog.fs.Error.ErrorCode.INVALID_MODIFICATION:
    +      return 'Invalid modification';
    +    case goog.fs.Error.ErrorCode.QUOTA_EXCEEDED:
    +      return 'Quota exceeded';
    +    case goog.fs.Error.ErrorCode.TYPE_MISMATCH:
    +      return 'Invalid filetype';
    +    case goog.fs.Error.ErrorCode.PATH_EXISTS:
    +      return 'File or directory already exists at specified path';
    +    default:
    +      return 'Unrecognized error';
    +  }
    +};
    diff --git a/contrib/closure-library/goog/fs/filesaver.js b/contrib/closure-library/goog/fs/filesaver.js
    new file mode 100644
    index 0000000..ad0f2c6
    --- /dev/null
    +++ b/contrib/closure-library/goog/fs/filesaver.js
    @@ -0,0 +1,214 @@
    +// Copyright 2011 The Closure Library Authors. All Rights Reserved.
    +//
    +// Licensed under the Apache License, Version 2.0 (the "License");
    +// you may not use this file except in compliance with the License.
    +// You may obtain a copy of the License at
    +//
    +//      http://www.apache.org/licenses/LICENSE-2.0
    +//
    +// Unless required by applicable law or agreed to in writing, software
    +// distributed under the License is distributed on an "AS-IS" BASIS,
    +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +// See the License for the specific language governing permissions and
    +// limitations under the License.
    +
    +/**
    + * @fileoverview A wrapper for the HTML5 FileSaver object.
    + *
    + */
    +
    +goog.provide('goog.fs.FileSaver');
    +goog.provide('goog.fs.FileSaver.EventType');
    +goog.provide('goog.fs.FileSaver.ProgressEvent');
    +goog.provide('goog.fs.FileSaver.ReadyState');
    +
    +goog.require('goog.events.Event');
    +goog.require('goog.events.EventTarget');
    +goog.require('goog.fs.Error');
    +
    +
    +
    +/**
    + * An object for monitoring the saving of files. This emits ProgressEvents of
    + * the types listed in {@link goog.fs.FileSaver.EventType}.
    + *
    + * This should not be instantiated directly. Instead, its subclass
    + * {@link goog.fs.FileWriter} should be accessed via
    + * {@link goog.fs.FileEntry#createWriter}.
    + *
    + * @param {!FileSaver} fileSaver The underlying FileSaver object.
    + * @constructor
    + * @extends {goog.events.EventTarget}
    + */
    +goog.fs.FileSaver = function(fileSaver) {
    +  goog.base(this);
    +
    +  /**
    +   * The underlying FileSaver object.
    +   *
    +   * @type {!FileSaver}
    +   * @private
    +   */
    +  this.saver_ = fileSaver;
    +
    +  this.saver_.onwritestart = goog.bind(this.dispatchProgressEvent_, this);
    +  this.saver_.onprogress = goog.bind(this.dispatchProgressEvent_, this);
    +  this.saver_.onwrite = goog.bind(this.dispatchProgressEvent_, this);
    +  this.saver_.onabort = goog.bind(this.dispatchProgressEvent_, this);
    +  this.saver_.onerror = goog.bind(this.dispatchProgressEvent_, this);
    +  this.saver_.onwriteend = goog.bind(this.dispatchProgressEvent_, this);
    +};
    +goog.inherits(goog.fs.FileSaver, goog.events.EventTarget);
    +
    +
    +/**
    + * Possible states for a FileSaver.
    + *
    + * @enum {number}
    + */
    +goog.fs.FileSaver.ReadyState = {
    +  /**
    +   * The object has been constructed, but there is no pending write.
    +   */
    +  INIT: 0,
    +  /**
    +   * Data is being written.
    +   */
    +  WRITING: 1,
    +  /**
    +   * The data has been written to the file, the write was aborted, or an error
    +   * occurred.
    +   */
    +  DONE: 2
    +};
    +
    +
    +/**
    + * Events emitted by a FileSaver.
    + *
    + * @enum {string}
    + */
    +goog.fs.FileSaver.EventType = {
    +  /**
    +   * Emitted when the writing begins. readyState will be WRITING.
    +   */
    +  WRITE_START: 'writestart',
    +  /**
    +   * Emitted when progress has been made in saving the file. readyState will be
    +   * WRITING.
    +   */
    +  PROGRESS: 'progress',
    +  /**
    +   * Emitted when the data has been successfully written. readyState will be
    +   * WRITING.
    +   */
    +  WRITE: 'write',
    +  /**
    +   * Emitted when the writing has been aborted. readyState will be WRITING.
    +   */
    +  ABORT: 'abort',
    +  /**
    +   * Emitted when an error is encountered or the writing has been aborted.
    +   * readyState will be WRITING.
    +   */
    +  ERROR: 'error',
    +  /**
    +   * Emitted when the writing is finished, whether successfully or not.
    +   * readyState will be DONE.
    +   */
    +  WRITE_END: 'writeend'
    +};
    +
    +
    +/**
    + * Abort the writing of the file.
    + */
    +goog.fs.FileSaver.prototype.abort = function() {
    +  try {
    +    this.saver_.abort();
    +  } catch (e) {
    +    throw new goog.fs.Error(e.code, 'aborting save');
    +  }
    +};
    +
    +
    +/**
    + * @return {goog.fs.FileSaver.ReadyState} The current state of the FileSaver.
    + */
    +goog.fs.FileSaver.prototype.getReadyState = function() {
    +  return /** @type {goog.fs.FileSaver.ReadyState} */ (this.saver_.readyState);
    +};
    +
    +
    +/**
    + * @return {goog.fs.Error} The error encountered while writing, if any.
    + */
    +goog.fs.FileSaver.prototype.getError = function() {
    +  return this.saver_.error &&
    +      new goog.fs.Error(this.saver_.error.code, 'saving file');
    +};
    +
    +
    +/**
    + * Wrap a progress event emitted by the underlying file saver and re-emit it.
    + *
    + * @param {!ProgressEvent} event The underlying event.
    + * @private
    + */
    +goog.fs.FileSaver.prototype.dispatchProgressEvent_ = function(event) {
    +  this.dispatchEvent(new goog.fs.FileSaver.ProgressEvent(event, this));
    +};
    +
    +
    +/** @inheritDoc */
    +goog.fs.FileSaver.prototype.disposeInternal = function() {
    +  delete this.saver_;
    +  goog.base(this, 'disposeInternal');
    +};
    +
    +
    +
    +/**
    + * A wrapper for the progress events emitted by the FileSaver.
    + *
    + * @param {!ProgressEvent} event The underlying event object.
    + * @param {!goog.fs.FileSaver} target The FileSaver emitting the event.
    + * @extends {goog.events.Event}
    + * @constructor
    + */
    +goog.fs.FileSaver.ProgressEvent = function(event, target) {
    +  goog.base(this, event.type, target);
    +
    +  /**
    +   * The underlying event object.
    +   * @type {!ProgressEvent}
    +   * @private
    +   */
    +  this.event_ = event;
    +};
    +goog.inherits(goog.fs.FileSaver.ProgressEvent, goog.events.Event);
    +
    +
    +/**
    + * @return {boolean} Whether or not the total size of the of the file being
    + *     saved is known.
    + */
    +goog.fs.FileSaver.ProgressEvent.prototype.isLengthComputable = function() {
    +  return this.event_.lengthComputable;
    +};
    +
    +
    +/**
    + * @return {number} The number of bytes saved so far.
    + */
    +goog.fs.FileSaver.ProgressEvent.prototype.getLoaded = function() {
    +  return this.event_.loaded;
    +};
    +
    +
    +/**
    + * @return {number} The total number of bytes in the file being saved.
    + */
    +goog.fs.FileSaver.ProgressEvent.prototype.getTotal = function() {
    +  return this.event_.total;
    +};
    diff --git a/contrib/closure-library/goog/fs/filesystem.js b/contrib/closure-library/goog/fs/filesystem.js
    new file mode 100644
    index 0000000..303600c
    --- /dev/null
    +++ b/contrib/closure-library/goog/fs/filesystem.js
    @@ -0,0 +1,59 @@
    +// Copyright 2011 The Closure Library Authors. All Rights Reserved.
    +//
    +// Licensed under the Apache License, Version 2.0 (the "License");
    +// you may not use this file except in compliance with the License.
    +// You may obtain a copy of the License at
    +//
    +//      http://www.apache.org/licenses/LICENSE-2.0
    +//
    +// Unless required by applicable law or agreed to in writing, software
    +// distributed under the License is distributed on an "AS-IS" BASIS,
    +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +// See the License for the specific language governing permissions and
    +// limitations under the License.
    +
    +/**
    + * @fileoverview A wrapper for the HTML5 FileSystem object.
    + *
    + */
    +
    +goog.provide('goog.fs.FileSystem');
    +
    +goog.require('goog.fs.DirectoryEntry');
    +
    +
    +
    +/**
    + * A local filesystem.
    + *
    + * This shouldn't be instantiated directly. Instead, it should be accessed via
    + * {@link goog.fs.getTemporary} or {@link goog.fs.getPersistent}.
    + *
    + * @param {!FileSystem} fs The underlying FileSystem object.
    + * @constructor
    + */
    +goog.fs.FileSystem = function(fs) {
    +  /**
    +   * The underlying FileSystem object.
    +   *
    +   * @type {!FileSystem}
    +   * @private
    +   */
    +  this.fs_ = fs;
    +};
    +
    +
    +/**
    + * @return {string} The name of the filesystem.
    + */
    +goog.fs.FileSystem.prototype.getName = function() {
    +  return this.fs_.name;
    +};
    +
    +
    +/**
    + * @return {!goog.fs.DirectoryEntry} The root directory of the filesystem.
    + */
    +goog.fs.FileSystem.prototype.getRoot = function() {
    +  return new goog.fs.DirectoryEntry(this, this.fs_.root);
    +};
    diff --git a/contrib/closure-library/goog/fs/filewriter.js b/contrib/closure-library/goog/fs/filewriter.js
    new file mode 100644
    index 0000000..e4a0357
    --- /dev/null
    +++ b/contrib/closure-library/goog/fs/filewriter.js
    @@ -0,0 +1,110 @@
    +// Copyright 2011 The Closure Library Authors. All Rights Reserved.
    +//
    +// Licensed under the Apache License, Version 2.0 (the "License");
    +// you may not use this file except in compliance with the License.
    +// You may obtain a copy of the License at
    +//
    +//      http://www.apache.org/licenses/LICENSE-2.0
    +//
    +// Unless required by applicable law or agreed to in writing, software
    +// distributed under the License is distributed on an "AS-IS" BASIS,
    +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +// See the License for the specific language governing permissions and
    +// limitations under the License.
    +
    +/**
    + * @fileoverview A wrapper for the HTML5 FileWriter object.
    + *
    + * When adding or modifying functionality in this namespace, be sure to update
    + * the mock counterparts in goog.testing.fs.
    + *
    + */
    +
    +goog.provide('goog.fs.FileWriter');
    +
    +goog.require('goog.fs.Error');
    +goog.require('goog.fs.FileSaver');
    +
    +
    +
    +/**
    + * An object for monitoring the saving of files, as well as other fine-grained
    + * writing operations.
    + *
    + * This should not be instantiated directly. Instead, it should be accessed via
    + * {@link goog.fs.FileEntry#createWriter}.
    + *
    + * @param {!FileWriter} writer The underlying FileWriter object.
    + * @constructor
    + * @extends {goog.fs.FileSaver}
    + */
    +goog.fs.FileWriter = function(writer) {
    +  goog.base(this, writer);
    +
    +  /**
    +   * The underlying FileWriter object.
    +   *
    +   * @type {!FileWriter}
    +   * @private
    +   */
    +  this.writer_ = writer;
    +};
    +goog.inherits(goog.fs.FileWriter, goog.fs.FileSaver);
    +
    +
    +/**
    + * @return {number} The byte offset at which the next write will occur.
    + */
    +goog.fs.FileWriter.prototype.getPosition = function() {
    +  return this.writer_.position;
    +};
    +
    +
    +/**
    + * @return {number} The length of the file.
    + */
    +goog.fs.FileWriter.prototype.getLength = function() {
    +  return this.writer_.length;
    +};
    +
    +
    +/**
    + * Write data to the file.
    + *
    + * @param {!Blob} blob The data to write.
    + */
    +goog.fs.FileWriter.prototype.write = function(blob) {
    +  try {
    +    this.writer_.write(blob);
    +  } catch (e) {
    +    throw new goog.fs.Error(e.code, 'writing file');
    +  }
    +};
    +
    +
    +/**
    + * Set the file position at which the next write will occur.
    + *
    + * @param {number} offset An absolute byte offset into the file.
    + */
    +goog.fs.FileWriter.prototype.seek = function(offset) {
    +  try {
    +    this.writer_.seek(offset);
    +  } catch (e) {
    +    throw new goog.fs.Error(e.code, 'seeking in file');
    +  }
    +};
    +
    +
    +/**
    + * Changes the length of the file to that specified.
    + *
    + * @param {number} size The new size of the file, in bytes.
    + */
    +goog.fs.FileWriter.prototype.truncate = function(size) {
    +  try {
    +    this.writer_.truncate(size);
    +  } catch (e) {
    +    throw new goog.fs.Error(e.code, 'truncating file');
    +  }
    +};
    diff --git a/contrib/closure-library/goog/fs/fs.js b/contrib/closure-library/goog/fs/fs.js
    new file mode 100644
    index 0000000..55d41a9
    --- /dev/null
    +++ b/contrib/closure-library/goog/fs/fs.js
    @@ -0,0 +1,245 @@
    +// Copyright 2011 The Closure Library Authors. All Rights Reserved.
    +//
    +// Licensed under the Apache License, Version 2.0 (the "License");
    +// you may not use this file except in compliance with the License.
    +// You may obtain a copy of the License at
    +//
    +//      http://www.apache.org/licenses/LICENSE-2.0
    +//
    +// Unless required by applicable law or agreed to in writing, software
    +// distributed under the License is distributed on an "AS-IS" BASIS,
    +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +// See the License for the specific language governing permissions and
    +// limitations under the License.
    +
    +/**
    + * @fileoverview Wrappers for the HTML5 File API. These wrappers closely mirror
    + * the underlying APIs, but use Closure-style events and Deferred return values.
    + * Their existence also makes it possible to mock the FileSystem API for testing
    + * in browsers that don't support it natively.
    + *
    + * When adding public functions to anything under this namespace, be sure to add
    + * its mock counterpart to goog.testing.fs.
    + *
    + */
    +
    +goog.provide('goog.fs');
    +
    +goog.require('goog.async.Deferred');
    +goog.require('goog.events');
    +goog.require('goog.fs.Error');
    +goog.require('goog.fs.FileSystem');
    +
    +
    +/**
    + * Get a wrapped FileSystem object.
    + *
    + * @param {goog.fs.FileSystemType_} type The type of the filesystem to get.
    + * @param {number} size The size requested for the filesystem, in bytes.
    + * @return {!goog.async.Deferred} The deferred {@link goog.fs.FileSystem}. If an
    + *     error occurs, the errback is called with a {@link goog.fs.Error}.
    + * @private
    + */
    +goog.fs.get_ = function(type, size) {
    +  var requestFileSystem = goog.global.requestFileSystem ||
    +      goog.global.webkitRequestFileSystem;
    +
    +  if (!goog.isFunction(requestFileSystem)) {
    +    return goog.async.Deferred.fail(new Error('File API unsupported'));
    +  }
    +
    +  var d = new goog.async.Deferred();
    +  requestFileSystem(type, size, function(fs) {
    +    d.callback(new goog.fs.FileSystem(fs));
    +  }, function(err) {
    +    d.errback(new goog.fs.Error(err.code, 'requesting filesystem'));
    +  });
    +  return d;
    +};
    +
    +
    +/**
    + * The two types of filesystem.
    + *
    + * @enum {number}
    + * @private
    + */
    +goog.fs.FileSystemType_ = {
    +  /**
    +   * A temporary filesystem may be deleted by the user agent at its discretion.
    +   */
    +  TEMPORARY: 0,
    +  /**
    +   * A persistent filesystem will never be deleted without the user's or
    +   * application's authorization.
    +   */
    +  PERSISTENT: 1
    +};
    +
    +
    +/**
    + * Returns a temporary FileSystem object. A temporary filesystem may be deleted
    + * by the user agent at its discretion.
    + *
    + * @param {number} size The size requested for the filesystem, in bytes.
    + * @return {!goog.async.Deferred} The deferred {@link goog.fs.FileSystem}. If an
    + *     error occurs, the errback is called with a {@link goog.fs.Error}.
    + */
    +goog.fs.getTemporary = function(size) {
    +  return goog.fs.get_(goog.fs.FileSystemType_.TEMPORARY, size);
    +};
    +
    +
    +/**
    + * Returns a persistent FileSystem object. A persistent filesystem will never be
    + * deleted without the user's or application's authorization.
    + *
    + * @param {number} size The size requested for the filesystem, in bytes.
    + * @return {!goog.async.Deferred} The deferred {@link goog.fs.FileSystem}. If an
    + *     error occurs, the errback is called with a {@link goog.fs.Error}.
    + */
    +goog.fs.getPersistent = function(size) {
    +  return goog.fs.get_(goog.fs.FileSystemType_.PERSISTENT, size);
    +};
    +
    +
    +/**
    + * Creates a blob URL for a blob object.
    + *
    + * @param {!Blob} blob The object for which to create the URL.
    + * @return {string} The URL for the object.
    + */
    +goog.fs.createObjectUrl = function(blob) {
    +  return goog.fs.getUrlObject_().createObjectURL(blob);
    +};
    +
    +
    +/**
    + * Revokes a URL created by {@link goog.fs.createObjectUrl}.
    + *
    + * @param {string} url The URL to revoke.
    + */
    +goog.fs.revokeObjectUrl = function(url) {
    +  goog.fs.getUrlObject_().revokeObjectURL(url);
    +};
    +
    +
    +/**
    + * @typedef {!{createObjectURL: (function(!Blob): string),
    + *             revokeObjectURL: function(string): void}}
    + */
    +goog.fs.UrlObject_;
    +
    +
    +/**
    + * Get the object that has the createObjectURL and revokeObjectURL functions for
    + * this browser.
    + *
    + * @return {goog.fs.UrlObject_} The object for this browser.
    + * @private
    + */
    +goog.fs.getUrlObject_ = function() {
    +  // This is what the spec says to do
    +  // http://dev.w3.org/2006/webapi/FileAPI/#dfn-createObjectURL
    +  if (goog.isDef(goog.global.URL) &&
    +      goog.isDef(goog.global.URL.createObjectURL)) {
    +    return /** @type {goog.fs.UrlObject_} */ (goog.global.URL);
    +  // This is what Chrome does (as of 10.0.648.6 dev)
    +  } else if (goog.isDef(goog.global.webkitURL) &&
    +             goog.isDef(goog.global.webkitURL.createObjectURL)) {
    +    return /** @type {goog.fs.UrlObject_} */ (goog.global.webkitURL);
    +  // This is what the spec used to say to do
    +  } else if (goog.isDef(goog.global.createObjectURL)) {
    +    return /** @type {goog.fs.UrlObject_} */ (goog.global);
    +  } else {
    +    throw Error('This browser doesn\'t seem to support blob URLs');
    +  }
    +};
    +
    +
    +/**
    + * Concatenates one or more values together and converts them to a Blob.
    + *
    + * @param {...(string|!Blob|!ArrayBuffer)} var_args The values that will make up
    + *     the resulting blob.
    + * @return {!Blob} The blob.
    + */
    +goog.fs.getBlob = function(var_args) {
    +  var BlobBuilder = goog.global.BlobBuilder || goog.global.WebKitBlobBuilder;
    +  var bb = new BlobBuilder();
    +  for (var i = 0; i < arguments.length; i++) {
    +    bb.append(arguments[i]);
    +  }
    +  return bb.getBlob();
    +};
    +
    +
    +/**
    + * Converts a Blob or a File into a string. This should only be used when the
    + * blob is known to be small.
    + *
    + * @param {!Blob} blob The blob to convert.
    + * @param {string=} opt_encoding The name of the encoding to use.
    + * @return {!goog.async.Deferred} The deferred string. If an error occurrs, the
    + *     errback is called with a {@link goog.fs.Error}.
    + */
    +goog.fs.blobToString = function(blob, opt_encoding) {
    +  // TODO(user): write a proper wrapper for FileReader
    +  var reader = new FileReader();
    +  var d = new goog.async.Deferred();
    +  reader.onload = function() { d.callback(reader.result); };
    +  reader.onerror = function() {
    +    d.errback(
    +        new goog.fs.Error(reader.error.code, 'converting blob to string'));
    +  };
    +  reader.readAsText(blob, opt_encoding);
    +  return d;
    +};
    +
    +
    +/**
    + * Slices the blob. The returned blob contains data from the start byte
    + * (inclusive) till the end byte (exclusive). Negative indices can be used
    + * to count bytes from the end of the blob (-1 == blob.size - 1). Indices
    + * are always clamped to blob range. If end is omitted, all the data till
    + * the end of the blob is taken.
    + *
    + * @param {!Blob} blob The blob to be sliced.
    + * @param {number} start Index of the starting byte.
    + * @param {number=} opt_end Index of the ending byte.
    + * @return {Blob} The blob slice or null if not supported.
    + */
    +goog.fs.sliceBlob = function(blob, start, opt_end) {
    +  if (!goog.isDef(opt_end)) {
    +    opt_end = blob.size;
    +  }
    +  if (blob.webkitSlice) {
    +    // Natively accepts negative indices, clamping to the blob range and
    +    // range end is optional. See http://trac.webkit.org/changeset/83873
    +    return blob.webkitSlice(start, opt_end);
    +  } else if (blob.mozSlice) {
    +    // Natively accepts negative indices, clamping to the blob range and
    +    // range end is optional. See https://developer.mozilla.org/en/DOM/Blob
    +    // and http://hg.mozilla.org/mozilla-central/rev/dae833f4d934
    +    return blob.mozSlice(start, opt_end);
    +  } else if (blob.slice) {
    +    // This is the original specification. Negative indices are not accepted,
    +    // only range end is clamped and range end specification is obligatory.
    +    // See http://www.w3.org/TR/2009/WD-FileAPI-20091117/, this will be
    +    // replaced by http://dev.w3.org/2006/webapi/FileAPI/ in the future.
    +    if (start < 0) {
    +      start += blob.size;
    +    }
    +    if (start < 0) {
    +      start = 0;
    +    }
    +    if (opt_end < 0) {
    +      opt_end += blob.size;
    +    }
    +    if (opt_end < start) {
    +      opt_end = start;
    +    }
    +    return blob.slice(start, opt_end - start);
    +  }
    +  return null;
    +};
    diff --git a/contrib/closure-library/goog/fs/fs_test.html b/contrib/closure-library/goog/fs/fs_test.html
    new file mode 100644
    index 0000000..e7f927a
    --- /dev/null
    +++ b/contrib/closure-library/goog/fs/fs_test.html
    @@ -0,0 +1,572 @@
    +
    +
    +
    +
    +
    +Closure Integration Tests - goog.fs
    +
    +
    +
    +
    +
    +
    + + + diff --git a/contrib/closure-library/goog/functions/functions.js b/contrib/closure-library/goog/functions/functions.js index d976ffe..3338f1d 100644 --- a/contrib/closure-library/goog/functions/functions.js +++ b/contrib/closure-library/goog/functions/functions.js @@ -93,6 +93,18 @@ goog.functions.lock = function(f) { }; +/** + * Given a function, create a new function that swallows its return value + * and replaces it with a new one. + * @param {Function} f A function. + * @param {*} retValue A new return value. + * @return {!Function} A new function. + */ +goog.functions.withReturnValue = function(f, retValue) { + return goog.functions.sequence(f, goog.functions.constant(retValue)); +}; + + /** * Creates the composition of the functions passed in. * For example, (goog.functions.compose(f, g))(a) is equivalent to f(g(a)). @@ -180,6 +192,19 @@ goog.functions.or = function(var_args) { }; +/** + * Creates a function that returns the Boolean opposite of a provided function. + * For example, (goog.functions.not(f))(x) is equivalent to !f(x). + * @param {!Function} f The original function. + * @return {!Function} A function that delegates to f and returns opposite. + */ +goog.functions.not = function(f) { + return function() { + return !f.apply(this, arguments); + }; +}; + + /** * Generic factory function to construct an object given the constructor * and the arguments. Intended to be bound to create object factories. diff --git a/contrib/closure-library/goog/functions/functions_test.html b/contrib/closure-library/goog/functions/functions_test.html index 5df9150..a04348f 100644 --- a/contrib/closure-library/goog/functions/functions_test.html +++ b/contrib/closure-library/goog/functions/functions_test.html @@ -3,7 +3,7 @@ + + + +Closure Unit Tests - goog.fx.DragDropGroup + + + + + +
    +
    +
    +
    + + + + diff --git a/contrib/closure-library/goog/fx/dragger.js b/contrib/closure-library/goog/fx/dragger.js index 0ba9468..7d7a97e 100644 --- a/contrib/closure-library/goog/fx/dragger.js +++ b/contrib/closure-library/goog/fx/dragger.js @@ -38,8 +38,9 @@ goog.require('goog.math.Rect'); goog.require('goog.userAgent'); + /** - * A class that allows mouse based dragging (moving) of an element + * A class that allows mouse or touch-based dragging (moving) of an element * * @param {Element} target The element that will be dragged. * @param {Element=} opt_handle An optional handle to control the drag, if null @@ -51,6 +52,7 @@ goog.require('goog.userAgent'); * @constructor */ goog.fx.Dragger = function(target, opt_handle, opt_limits) { + goog.events.EventTarget.call(this); this.target = target; this.handle = opt_handle || target; this.limits = opt_limits || new goog.math.Rect(NaN, NaN, NaN, NaN); @@ -60,8 +62,9 @@ goog.fx.Dragger = function(target, opt_handle, opt_limits) { // Add listener. Do not use the event handler here since the event handler is // used for listeners added and removed during the drag operation. - goog.events.listen(this.handle, goog.events.EventType.MOUSEDOWN, - this.startDrag, false, this); + goog.events.listen(this.handle, + [goog.events.EventType.TOUCHSTART, goog.events.EventType.MOUSEDOWN], + this.startDrag, false, this); }; goog.inherits(goog.fx.Dragger, goog.events.EventTarget); @@ -83,6 +86,10 @@ goog.fx.Dragger.HAS_SET_CAPTURE_ = * @enum {string} */ goog.fx.Dragger.EventType = { + // The drag action was canceled before the START event. Possible reasons: + // disabled dragger, dragging with the right mouse button or releasing the + // button before reaching the hysteresis distance. + EARLY_CANCEL: 'earlycancel', START: 'start', BEFOREDRAG: 'beforedrag', DRAG: 'drag', @@ -98,7 +105,7 @@ goog.fx.Dragger.prototype.target; /** - * Reference to the handler that inititates the drag. + * Reference to the handler that initiates the drag. * @type {Element} */ goog.fx.Dragger.prototype.handle; @@ -112,28 +119,46 @@ goog.fx.Dragger.prototype.limits; /** - * Current x position of mouse relative to screen. + * Current x position of mouse or touch relative to viewport. * @type {number} */ +goog.fx.Dragger.prototype.clientX = 0; + + +/** + * Current y position of mouse or touch relative to viewport. + * @type {number} + */ +goog.fx.Dragger.prototype.clientY = 0; + + +/** + * Current x position of mouse or touch relative to screen. Deprecated because + * it doesn't take into affect zoom level or pixel density. + * @type {number} + * @deprecated Consider switching to clientX instead. + */ goog.fx.Dragger.prototype.screenX = 0; /** - * Current y position of mouse relative to screen. + * Current y position of mouse or touch relative to screen. Deprecated because + * it doesn't take into affect zoom level or pixel density. * @type {number} + * @deprecated Consider switching to clientY instead. */ goog.fx.Dragger.prototype.screenY = 0; /** - * The x position where the first mousedown occurred. + * The x position where the first mousedown or touchstart occurred. * @type {number} */ goog.fx.Dragger.prototype.startX = 0; /** - * The y position where the first mousedown occurred. + * The y position where the first mousedown or touchstart occurred. * @type {number} */ goog.fx.Dragger.prototype.startY = 0; @@ -177,8 +202,8 @@ goog.fx.Dragger.prototype.dragging_ = false; /** - * The amount of distance, in pixels, after which a mousedown is considered a - * drag. + * The amount of distance, in pixels, after which a mousedown or touchstart is + * considered a drag. * @type {number} * @private */ @@ -186,7 +211,7 @@ goog.fx.Dragger.prototype.hysteresisDistanceSquared_ = 0; /** - * Tiemstamp of when the mouse down occurred. + * Timestamp of when the mousedown or touchstart occurred. * @type {number} * @private */ @@ -310,8 +335,9 @@ goog.fx.Dragger.prototype.setEnabled = function(enabled) { goog.fx.Dragger.prototype.disposeInternal = function() { goog.fx.Dragger.superClass_.disposeInternal.call(this); - goog.events.unlisten(this.handle, goog.events.EventType.MOUSEDOWN, - this.startDrag, false, this); + goog.events.unlisten(this.handle, + [goog.events.EventType.TOUCHSTART, goog.events.EventType.MOUSEDOWN], + this.startDrag, false, this); this.eventHandler_.dispose(); delete this.target; @@ -325,13 +351,16 @@ goog.fx.Dragger.prototype.disposeInternal = function() { * @param {goog.events.BrowserEvent} e Event object. */ goog.fx.Dragger.prototype.startDrag = function(e) { + var isMouseDown = e.type == goog.events.EventType.MOUSEDOWN; + + // Dragger.startDrag() can be called by AbstractDragDrop with a mousemove + // event and IE does not report pressed mouse buttons on mousemove. Also, + // it does not make sense to check for the button if the user is already + // dragging. + if (this.enabled_ && !this.dragging_ && - // Dragger.startDrag() can be called by AbstractDragDrop with a mousemove - // event and IE does not report pressed mouse buttons on mousemove, also - // it does not make sense to check for the button if user is already - // dragging. - (e.type != goog.events.EventType.MOUSEDOWN || - e.isButton(goog.events.BrowserEvent.MouseButton.LEFT))) { + (!isMouseDown || e.isMouseActionButton())) { + this.maybeReinitTouchEvent_(e); if (this.hysteresisDistanceSquared_ == 0) { this.initializeDrag_(e); if (this.dragging_) { @@ -344,16 +373,19 @@ goog.fx.Dragger.prototype.startDrag = function(e) { // Need to preventDefault for hysteresis to prevent page getting selected. e.preventDefault(); } - this.setupDragHandlers(); - this.screenX = this.startX = e.screenX; - this.screenY = this.startY = e.screenY; + this.clientX = this.startX = e.clientX; + this.clientY = this.startY = e.clientY; + this.screenX = e.screenX; + this.screenY = e.screenY; this.deltaX = this.target.offsetLeft; this.deltaY = this.target.offsetTop; this.pageScroll = goog.dom.getDomHelper(this.document_).getDocumentScroll(); this.mouseDownTime_ = goog.now(); + } else { + this.dispatchEvent(goog.fx.Dragger.EventType.EARLY_CANCEL); } }; @@ -369,10 +401,12 @@ goog.fx.Dragger.prototype.setupDragHandlers = function() { // problems with the capturing events in combination with setCapture. var useCapture = !goog.fx.Dragger.HAS_SET_CAPTURE_; - this.eventHandler_.listen(doc, goog.events.EventType.MOUSEMOVE, - this.mouseMoved_, useCapture); - this.eventHandler_.listen(doc, goog.events.EventType.MOUSEUP, - this.endDrag, useCapture); + this.eventHandler_.listen(doc, + [goog.events.EventType.TOUCHMOVE, goog.events.EventType.MOUSEMOVE], + this.handleMove_, useCapture); + this.eventHandler_.listen(doc, + [goog.events.EventType.TOUCHEND, goog.events.EventType.MOUSEUP], + this.endDrag, useCapture); if (goog.fx.Dragger.HAS_SET_CAPTURE_) { docEl.setCapture(false); @@ -429,15 +463,27 @@ goog.fx.Dragger.prototype.endDrag = function(e, opt_dragCanceled) { this.document_.releaseCapture(); } + var x = this.limitX(this.deltaX); + var y = this.limitY(this.deltaY); + if (this.dragging_) { + this.maybeReinitTouchEvent_(e); this.dragging_ = false; - var x = this.limitX(this.deltaX); - var y = this.limitY(this.deltaY); - + var dragCancelled = opt_dragCanceled || + e.type == goog.events.EventType.TOUCHCANCEL; this.dispatchEvent(new goog.fx.DragEvent( goog.fx.Dragger.EventType.END, this, e.clientX, e.clientY, e, x, y, - opt_dragCanceled)); + dragCancelled)); + } else { + this.dispatchEvent(goog.fx.Dragger.EventType.EARLY_CANCEL); + } + + // Call preventDefault to prevent mouseup from being raised if this is a + // touchend event. + if (e.type == goog.events.EventType.TOUCHEND || + e.type == goog.events.EventType.TOUCHCANCEL) { + e.preventDefault(); } }; @@ -452,20 +498,42 @@ goog.fx.Dragger.prototype.endDragCancel = function(e) { /** - * Event handler that is used on mouse move to update the drag + * Re-initializes the event with the first target touch event or, in the case + * of a stop event, the last changed touch. + * @param {goog.events.BrowserEvent} e A TOUCH... event. + * @private + */ +goog.fx.Dragger.prototype.maybeReinitTouchEvent_ = function(e) { + var type = e.type; + + if (type == goog.events.EventType.TOUCHSTART || + type == goog.events.EventType.TOUCHMOVE) { + e.init(e.getBrowserEvent().targetTouches[0], e.currentTarget); + } else if (type == goog.events.EventType.TOUCHEND || + type == goog.events.EventType.TOUCHCANCEL) { + e.init(e.getBrowserEvent().changedTouches[0], e.currentTarget); + } +}; + + +/** + * Event handler that is used on mouse / touch move to update the drag * @param {goog.events.BrowserEvent} e Event object. * @private */ -goog.fx.Dragger.prototype.mouseMoved_ = function(e) { +goog.fx.Dragger.prototype.handleMove_ = function(e) { if (this.enabled_) { - var dx = e.screenX - this.screenX; - var dy = e.screenY - this.screenY; + this.maybeReinitTouchEvent_(e); + var dx = e.clientX - this.clientX; + var dy = e.clientY - this.clientY; + this.clientX = e.clientX; + this.clientY = e.clientY; this.screenX = e.screenX; this.screenY = e.screenY; if (!this.dragging_) { - var diffX = this.startX - this.screenX; - var diffY = this.startY - this.screenY; + var diffX = this.startX - this.clientX; + var diffY = this.startY - this.clientY; var distance = diffX * diffX + diffY * diffY; if (distance > this.hysteresisDistanceSquared_) { this.initializeDrag_(e); @@ -529,8 +597,8 @@ goog.fx.Dragger.prototype.calculatePosition_ = function(dx, dy) { */ goog.fx.Dragger.prototype.onScroll_ = function(e) { var pos = this.calculatePosition_(0, 0); - e.clientX = this.pageScroll.x - this.screenX; - e.clientY = this.pageScroll.x - this.screenY; + e.clientX = this.pageScroll.x - this.clientX; + e.clientY = this.pageScroll.y - this.clientY; this.doDrag(e, pos.x, pos.y, true); }; @@ -597,12 +665,13 @@ goog.fx.Dragger.prototype.defaultAction = function(x, y) { }; + /** * Object representing a drag event * @param {string} type Event type. * @param {goog.fx.Dragger} dragobj Drag object initiating event. - * @param {number} clientX X-coordinate relative to the window. - * @param {number} clientY Y-coordinate relative to the window. + * @param {number} clientX X-coordinate relative to the viewport. + * @param {number} clientY Y-coordinate relative to the viewport. * @param {goog.events.BrowserEvent} browserEvent The closure object * representing the browser event that caused this drag event. * @param {number=} opt_actX Optional actual x for drag if it has been limited. @@ -616,13 +685,13 @@ goog.fx.DragEvent = function(type, dragobj, clientX, clientY, browserEvent, goog.events.Event.call(this, type); /** - * X-coordinate relative to the window + * X-coordinate relative to the viewport * @type {number} */ this.clientX = clientX; /** - * Y-coordinate relative to the window + * Y-coordinate relative to the viewport * @type {number} */ this.clientY = clientY; @@ -656,10 +725,11 @@ goog.fx.DragEvent = function(type, dragobj, clientX, clientY, browserEvent, * Whether drag was canceled with this event. Used to differentiate between * a legitimate drag END that can result in an action and a drag END which is * a result of a drag cancelation. For now it can happen 1) with drag END - * event on FireFox when user drags the mouse out of the window, 2) With + * event on FireFox when user drags the mouse out of the window, 2) with * drag END event on IE7 which is generated on MOUSEMOVE event when user * moves the mouse into the document after the mouse button has been - * released. + * released, 3) when TOUCHCANCEL is raised instead of TOUCHEND (on touch + * events). * @type {boolean} */ this.dragCanceled = !!opt_dragCanceled; diff --git a/contrib/closure-library/goog/fx/dragger_test.html b/contrib/closure-library/goog/fx/dragger_test.html index 3122bfe..3788309 100644 --- a/contrib/closure-library/goog/fx/dragger_test.html +++ b/contrib/closure-library/goog/fx/dragger_test.html @@ -3,7 +3,7 @@ Closure Unit Tests - goog.fx.DragListGroup -
    -
    Sample text
    +
    +
    Sample text
    +
    + +
    +
    Sample text
    + + + + + + diff --git a/contrib/closure-library/goog/i18n/bidi.js b/contrib/closure-library/goog/i18n/bidi.js index b3aeaed..74c1b61 100644 --- a/contrib/closure-library/goog/i18n/bidi.js +++ b/contrib/closure-library/goog/i18n/bidi.js @@ -46,9 +46,21 @@ goog.i18n.bidi.FORCE_RTL = false; * {@see goog.LOCALE} * * @type {boolean} + * + * TODO(user): write a test that checks that this is a compile-time constant. + * For example, for the default goog.LOCALE, compiling + * "if (goog.i18n.bidi.IS_RTL) alert('rtl') else {}" should produce no code. */ goog.i18n.bidi.IS_RTL = goog.i18n.bidi.FORCE_RTL || - (goog.LOCALE == 'ar' || goog.LOCALE == 'iw' || goog.LOCALE == 'fa'); + (goog.LOCALE.substring(0, 2) == 'ar' || + goog.LOCALE.substring(0, 2) == 'fa' || + goog.LOCALE.substring(0, 2) == 'he' || + goog.LOCALE.substring(0, 2) == 'iw' || + goog.LOCALE.substring(0, 2) == 'ur' || + goog.LOCALE.substring(0, 2) == 'yi') && + (goog.LOCALE.length == 2 || + goog.LOCALE.substring(2, 3) == '-' || + goog.LOCALE.substring(2, 3) == '_'); /** diff --git a/contrib/closure-library/goog/i18n/bidi_test.html b/contrib/closure-library/goog/i18n/bidi_test.html index 8c4f2c5..9a0eda9 100644 --- a/contrib/closure-library/goog/i18n/bidi_test.html +++ b/contrib/closure-library/goog/i18n/bidi_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/i18n/bidiformatter_test.html b/contrib/closure-library/goog/i18n/bidiformatter_test.html index ea31997..a007378 100644 --- a/contrib/closure-library/goog/i18n/bidiformatter_test.html +++ b/contrib/closure-library/goog/i18n/bidiformatter_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/i18n/charlistdecompressor.js b/contrib/closure-library/goog/i18n/charlistdecompressor.js index 7099404..e41a5b0 100644 --- a/contrib/closure-library/goog/i18n/charlistdecompressor.js +++ b/contrib/closure-library/goog/i18n/charlistdecompressor.js @@ -39,6 +39,7 @@ goog.require('goog.array'); goog.require('goog.i18n.uChar'); + /** * Class to decompress base88 compressed character list. * @constructor diff --git a/contrib/closure-library/goog/i18n/charlistdecompressor_test.html b/contrib/closure-library/goog/i18n/charlistdecompressor_test.html index 7a83a0c..befc156 100644 --- a/contrib/closure-library/goog/i18n/charlistdecompressor_test.html +++ b/contrib/closure-library/goog/i18n/charlistdecompressor_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/i18n/datetimeformat.js b/contrib/closure-library/goog/i18n/datetimeformat.js index d9bc757..cb30e77 100644 --- a/contrib/closure-library/goog/i18n/datetimeformat.js +++ b/contrib/closure-library/goog/i18n/datetimeformat.js @@ -21,6 +21,7 @@ * Namespace for i18n date/time formatting functions */ goog.provide('goog.i18n.DateTimeFormat'); +goog.provide('goog.i18n.DateTimeFormat.Format'); goog.require('goog.asserts'); goog.require('goog.date.DateLike'); @@ -89,6 +90,7 @@ goog.require('goog.string'); */ + /** * Construct a DateTimeFormat object based on current locale. * @constructor diff --git a/contrib/closure-library/goog/i18n/datetimeformat_test.html b/contrib/closure-library/goog/i18n/datetimeformat_test.html index 176cdf2..c0f5673 100644 --- a/contrib/closure-library/goog/i18n/datetimeformat_test.html +++ b/contrib/closure-library/goog/i18n/datetimeformat_test.html @@ -3,7 +3,7 @@ @@ -13,6 +13,8 @@ diff --git a/contrib/closure-library/goog/i18n/mime_test.html b/contrib/closure-library/goog/i18n/mime_test.html index 41ad1ab..32b84a0 100644 --- a/contrib/closure-library/goog/i18n/mime_test.html +++ b/contrib/closure-library/goog/i18n/mime_test.html @@ -3,7 +3,7 @@ @@ -490,6 +490,13 @@ assertEquals('1E3', str); } +function testPlusSignInExponentPart() { + var fmt; + fmt = new goog.i18n.NumberFormat('0E+0'); + str = fmt.format(45678000); + assertEquals('5E+7', str); +} + function testGroupingParse2() { var value; var fmt; @@ -599,7 +606,6 @@ goog.userAgent.product.isVersion('3.6.3') && !goog.userAgent.product.isVersion('3.6.4'); } - diff --git a/contrib/closure-library/goog/i18n/numberformatsymbols.js b/contrib/closure-library/goog/i18n/numberformatsymbols.js index ceaa103..35c65b9 100644 --- a/contrib/closure-library/goog/i18n/numberformatsymbols.js +++ b/contrib/closure-library/goog/i18n/numberformatsymbols.js @@ -1,4 +1,4 @@ -// Copyright 2009 The Closure Library Authors. All Rights Reserved. +// Copyright 2011 The Closure Library Authors. All Rights Reserved // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -19,6 +19,14 @@ * http://go/generate_number_constants.py * using the --for_closure flag. * + * To reduce the file size (which may cause issues in some JS + * developing environments), this file will only contain locales + * that are frequently used by web applications. This is defined as + * closure_tier1_locales and will change (most likely addition) + * over time. Rest of the data can be found in another file named + * "numberformatsymbolsext.js", which will be generated at the + * same time together with this file. + * * Before checkin, this file could have been manually edited. This is * to incorporate changes before we could fix CLDR. All manual * modification must be documented in this section, and should be @@ -26,67 +34,18 @@ */ goog.provide('goog.i18n.NumberFormatSymbols'); -goog.provide('goog.i18n.NumberFormatSymbols_aa'); -goog.provide('goog.i18n.NumberFormatSymbols_aa_DJ'); -goog.provide('goog.i18n.NumberFormatSymbols_aa_ER'); -goog.provide('goog.i18n.NumberFormatSymbols_aa_ER_SAAHO'); -goog.provide('goog.i18n.NumberFormatSymbols_aa_ET'); -goog.provide('goog.i18n.NumberFormatSymbols_af'); -goog.provide('goog.i18n.NumberFormatSymbols_af_NA'); -goog.provide('goog.i18n.NumberFormatSymbols_af_ZA'); -goog.provide('goog.i18n.NumberFormatSymbols_ak'); -goog.provide('goog.i18n.NumberFormatSymbols_ak_GH'); goog.provide('goog.i18n.NumberFormatSymbols_am'); goog.provide('goog.i18n.NumberFormatSymbols_am_ET'); goog.provide('goog.i18n.NumberFormatSymbols_ar'); -goog.provide('goog.i18n.NumberFormatSymbols_ar_AE'); -goog.provide('goog.i18n.NumberFormatSymbols_ar_BH'); -goog.provide('goog.i18n.NumberFormatSymbols_ar_DZ'); goog.provide('goog.i18n.NumberFormatSymbols_ar_EG'); -goog.provide('goog.i18n.NumberFormatSymbols_ar_IQ'); -goog.provide('goog.i18n.NumberFormatSymbols_ar_JO'); -goog.provide('goog.i18n.NumberFormatSymbols_ar_KW'); -goog.provide('goog.i18n.NumberFormatSymbols_ar_LB'); -goog.provide('goog.i18n.NumberFormatSymbols_ar_LY'); -goog.provide('goog.i18n.NumberFormatSymbols_ar_MA'); -goog.provide('goog.i18n.NumberFormatSymbols_ar_OM'); -goog.provide('goog.i18n.NumberFormatSymbols_ar_QA'); -goog.provide('goog.i18n.NumberFormatSymbols_ar_SA'); -goog.provide('goog.i18n.NumberFormatSymbols_ar_SD'); -goog.provide('goog.i18n.NumberFormatSymbols_ar_SY'); -goog.provide('goog.i18n.NumberFormatSymbols_ar_TN'); -goog.provide('goog.i18n.NumberFormatSymbols_ar_YE'); -goog.provide('goog.i18n.NumberFormatSymbols_as'); -goog.provide('goog.i18n.NumberFormatSymbols_as_IN'); -goog.provide('goog.i18n.NumberFormatSymbols_az'); -goog.provide('goog.i18n.NumberFormatSymbols_az_AZ'); -goog.provide('goog.i18n.NumberFormatSymbols_az_Cyrl'); -goog.provide('goog.i18n.NumberFormatSymbols_az_Cyrl_AZ'); -goog.provide('goog.i18n.NumberFormatSymbols_az_Latn'); -goog.provide('goog.i18n.NumberFormatSymbols_az_Latn_AZ'); -goog.provide('goog.i18n.NumberFormatSymbols_be'); -goog.provide('goog.i18n.NumberFormatSymbols_be_BY'); goog.provide('goog.i18n.NumberFormatSymbols_bg'); goog.provide('goog.i18n.NumberFormatSymbols_bg_BG'); goog.provide('goog.i18n.NumberFormatSymbols_bn'); goog.provide('goog.i18n.NumberFormatSymbols_bn_BD'); -goog.provide('goog.i18n.NumberFormatSymbols_bn_IN'); -goog.provide('goog.i18n.NumberFormatSymbols_bo'); -goog.provide('goog.i18n.NumberFormatSymbols_bo_CN'); -goog.provide('goog.i18n.NumberFormatSymbols_bo_IN'); -goog.provide('goog.i18n.NumberFormatSymbols_bs'); -goog.provide('goog.i18n.NumberFormatSymbols_bs_BA'); -goog.provide('goog.i18n.NumberFormatSymbols_byn'); -goog.provide('goog.i18n.NumberFormatSymbols_byn_ER'); goog.provide('goog.i18n.NumberFormatSymbols_ca'); goog.provide('goog.i18n.NumberFormatSymbols_ca_ES'); -goog.provide('goog.i18n.NumberFormatSymbols_cch'); -goog.provide('goog.i18n.NumberFormatSymbols_cch_NG'); -goog.provide('goog.i18n.NumberFormatSymbols_cop'); goog.provide('goog.i18n.NumberFormatSymbols_cs'); goog.provide('goog.i18n.NumberFormatSymbols_cs_CZ'); -goog.provide('goog.i18n.NumberFormatSymbols_cy'); -goog.provide('goog.i18n.NumberFormatSymbols_cy_GB'); goog.provide('goog.i18n.NumberFormatSymbols_da'); goog.provide('goog.i18n.NumberFormatSymbols_da_DK'); goog.provide('goog.i18n.NumberFormatSymbols_de'); @@ -94,123 +53,54 @@ goog.provide('goog.i18n.NumberFormatSymbols_de_AT'); goog.provide('goog.i18n.NumberFormatSymbols_de_BE'); goog.provide('goog.i18n.NumberFormatSymbols_de_CH'); goog.provide('goog.i18n.NumberFormatSymbols_de_DE'); -goog.provide('goog.i18n.NumberFormatSymbols_de_LI'); goog.provide('goog.i18n.NumberFormatSymbols_de_LU'); -goog.provide('goog.i18n.NumberFormatSymbols_dv'); -goog.provide('goog.i18n.NumberFormatSymbols_dv_MV'); -goog.provide('goog.i18n.NumberFormatSymbols_dz'); -goog.provide('goog.i18n.NumberFormatSymbols_dz_BT'); -goog.provide('goog.i18n.NumberFormatSymbols_ee'); -goog.provide('goog.i18n.NumberFormatSymbols_ee_GH'); -goog.provide('goog.i18n.NumberFormatSymbols_ee_TG'); goog.provide('goog.i18n.NumberFormatSymbols_el'); -goog.provide('goog.i18n.NumberFormatSymbols_el_CY'); goog.provide('goog.i18n.NumberFormatSymbols_el_GR'); goog.provide('goog.i18n.NumberFormatSymbols_el_POLYTON'); goog.provide('goog.i18n.NumberFormatSymbols_en'); goog.provide('goog.i18n.NumberFormatSymbols_en_AS'); goog.provide('goog.i18n.NumberFormatSymbols_en_AU'); -goog.provide('goog.i18n.NumberFormatSymbols_en_BE'); -goog.provide('goog.i18n.NumberFormatSymbols_en_BW'); -goog.provide('goog.i18n.NumberFormatSymbols_en_BZ'); -goog.provide('goog.i18n.NumberFormatSymbols_en_CA'); goog.provide('goog.i18n.NumberFormatSymbols_en_Dsrt'); goog.provide('goog.i18n.NumberFormatSymbols_en_Dsrt_US'); goog.provide('goog.i18n.NumberFormatSymbols_en_GB'); goog.provide('goog.i18n.NumberFormatSymbols_en_GU'); -goog.provide('goog.i18n.NumberFormatSymbols_en_HK'); goog.provide('goog.i18n.NumberFormatSymbols_en_IE'); goog.provide('goog.i18n.NumberFormatSymbols_en_IN'); -goog.provide('goog.i18n.NumberFormatSymbols_en_JM'); goog.provide('goog.i18n.NumberFormatSymbols_en_MH'); goog.provide('goog.i18n.NumberFormatSymbols_en_MP'); -goog.provide('goog.i18n.NumberFormatSymbols_en_MT'); -goog.provide('goog.i18n.NumberFormatSymbols_en_NA'); -goog.provide('goog.i18n.NumberFormatSymbols_en_NZ'); -goog.provide('goog.i18n.NumberFormatSymbols_en_PH'); -goog.provide('goog.i18n.NumberFormatSymbols_en_PK'); goog.provide('goog.i18n.NumberFormatSymbols_en_SG'); -goog.provide('goog.i18n.NumberFormatSymbols_en_Shaw'); -goog.provide('goog.i18n.NumberFormatSymbols_en_TT'); goog.provide('goog.i18n.NumberFormatSymbols_en_UM'); goog.provide('goog.i18n.NumberFormatSymbols_en_US'); goog.provide('goog.i18n.NumberFormatSymbols_en_VI'); goog.provide('goog.i18n.NumberFormatSymbols_en_ZA'); -goog.provide('goog.i18n.NumberFormatSymbols_en_ZW'); -goog.provide('goog.i18n.NumberFormatSymbols_eo'); +goog.provide('goog.i18n.NumberFormatSymbols_en_ZZ'); goog.provide('goog.i18n.NumberFormatSymbols_es'); -goog.provide('goog.i18n.NumberFormatSymbols_es_AR'); -goog.provide('goog.i18n.NumberFormatSymbols_es_BO'); -goog.provide('goog.i18n.NumberFormatSymbols_es_CL'); -goog.provide('goog.i18n.NumberFormatSymbols_es_CO'); -goog.provide('goog.i18n.NumberFormatSymbols_es_CR'); -goog.provide('goog.i18n.NumberFormatSymbols_es_DO'); -goog.provide('goog.i18n.NumberFormatSymbols_es_EC'); goog.provide('goog.i18n.NumberFormatSymbols_es_ES'); -goog.provide('goog.i18n.NumberFormatSymbols_es_GT'); -goog.provide('goog.i18n.NumberFormatSymbols_es_HN'); -goog.provide('goog.i18n.NumberFormatSymbols_es_MX'); -goog.provide('goog.i18n.NumberFormatSymbols_es_NI'); -goog.provide('goog.i18n.NumberFormatSymbols_es_PA'); -goog.provide('goog.i18n.NumberFormatSymbols_es_PE'); -goog.provide('goog.i18n.NumberFormatSymbols_es_PR'); -goog.provide('goog.i18n.NumberFormatSymbols_es_PY'); -goog.provide('goog.i18n.NumberFormatSymbols_es_SV'); -goog.provide('goog.i18n.NumberFormatSymbols_es_US'); -goog.provide('goog.i18n.NumberFormatSymbols_es_UY'); -goog.provide('goog.i18n.NumberFormatSymbols_es_VE'); goog.provide('goog.i18n.NumberFormatSymbols_et'); goog.provide('goog.i18n.NumberFormatSymbols_et_EE'); goog.provide('goog.i18n.NumberFormatSymbols_eu'); goog.provide('goog.i18n.NumberFormatSymbols_eu_ES'); goog.provide('goog.i18n.NumberFormatSymbols_fa'); -goog.provide('goog.i18n.NumberFormatSymbols_fa_AF'); goog.provide('goog.i18n.NumberFormatSymbols_fa_IR'); goog.provide('goog.i18n.NumberFormatSymbols_fi'); goog.provide('goog.i18n.NumberFormatSymbols_fi_FI'); goog.provide('goog.i18n.NumberFormatSymbols_fil'); goog.provide('goog.i18n.NumberFormatSymbols_fil_PH'); -goog.provide('goog.i18n.NumberFormatSymbols_fo'); -goog.provide('goog.i18n.NumberFormatSymbols_fo_FO'); goog.provide('goog.i18n.NumberFormatSymbols_fr'); -goog.provide('goog.i18n.NumberFormatSymbols_fr_BE'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_BL'); goog.provide('goog.i18n.NumberFormatSymbols_fr_CA'); -goog.provide('goog.i18n.NumberFormatSymbols_fr_CH'); goog.provide('goog.i18n.NumberFormatSymbols_fr_FR'); -goog.provide('goog.i18n.NumberFormatSymbols_fr_LU'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_GP'); goog.provide('goog.i18n.NumberFormatSymbols_fr_MC'); -goog.provide('goog.i18n.NumberFormatSymbols_fr_SN'); -goog.provide('goog.i18n.NumberFormatSymbols_fur'); -goog.provide('goog.i18n.NumberFormatSymbols_fur_IT'); -goog.provide('goog.i18n.NumberFormatSymbols_ga'); -goog.provide('goog.i18n.NumberFormatSymbols_ga_IE'); -goog.provide('goog.i18n.NumberFormatSymbols_gaa'); -goog.provide('goog.i18n.NumberFormatSymbols_gaa_GH'); -goog.provide('goog.i18n.NumberFormatSymbols_gez'); -goog.provide('goog.i18n.NumberFormatSymbols_gez_ER'); -goog.provide('goog.i18n.NumberFormatSymbols_gez_ET'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_MF'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_MQ'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_RE'); goog.provide('goog.i18n.NumberFormatSymbols_gl'); goog.provide('goog.i18n.NumberFormatSymbols_gl_ES'); goog.provide('goog.i18n.NumberFormatSymbols_gsw'); goog.provide('goog.i18n.NumberFormatSymbols_gsw_CH'); goog.provide('goog.i18n.NumberFormatSymbols_gu'); goog.provide('goog.i18n.NumberFormatSymbols_gu_IN'); -goog.provide('goog.i18n.NumberFormatSymbols_gv'); -goog.provide('goog.i18n.NumberFormatSymbols_gv_GB'); -goog.provide('goog.i18n.NumberFormatSymbols_ha'); -goog.provide('goog.i18n.NumberFormatSymbols_ha_Arab'); -goog.provide('goog.i18n.NumberFormatSymbols_ha_Arab_NG'); -goog.provide('goog.i18n.NumberFormatSymbols_ha_Arab_SD'); -goog.provide('goog.i18n.NumberFormatSymbols_ha_GH'); -goog.provide('goog.i18n.NumberFormatSymbols_ha_Latn'); -goog.provide('goog.i18n.NumberFormatSymbols_ha_Latn_GH'); -goog.provide('goog.i18n.NumberFormatSymbols_ha_Latn_NE'); -goog.provide('goog.i18n.NumberFormatSymbols_ha_Latn_NG'); -goog.provide('goog.i18n.NumberFormatSymbols_ha_NE'); -goog.provide('goog.i18n.NumberFormatSymbols_ha_NG'); -goog.provide('goog.i18n.NumberFormatSymbols_ha_SD'); -goog.provide('goog.i18n.NumberFormatSymbols_haw'); -goog.provide('goog.i18n.NumberFormatSymbols_haw_US'); goog.provide('goog.i18n.NumberFormatSymbols_he'); goog.provide('goog.i18n.NumberFormatSymbols_he_IL'); goog.provide('goog.i18n.NumberFormatSymbols_hi'); @@ -219,286 +109,92 @@ goog.provide('goog.i18n.NumberFormatSymbols_hr'); goog.provide('goog.i18n.NumberFormatSymbols_hr_HR'); goog.provide('goog.i18n.NumberFormatSymbols_hu'); goog.provide('goog.i18n.NumberFormatSymbols_hu_HU'); -goog.provide('goog.i18n.NumberFormatSymbols_hy'); -goog.provide('goog.i18n.NumberFormatSymbols_hy_AM'); -goog.provide('goog.i18n.NumberFormatSymbols_ia'); goog.provide('goog.i18n.NumberFormatSymbols_id'); goog.provide('goog.i18n.NumberFormatSymbols_id_ID'); -goog.provide('goog.i18n.NumberFormatSymbols_ig'); -goog.provide('goog.i18n.NumberFormatSymbols_ig_NG'); -goog.provide('goog.i18n.NumberFormatSymbols_ii'); -goog.provide('goog.i18n.NumberFormatSymbols_ii_CN'); goog.provide('goog.i18n.NumberFormatSymbols_in'); goog.provide('goog.i18n.NumberFormatSymbols_is'); goog.provide('goog.i18n.NumberFormatSymbols_is_IS'); goog.provide('goog.i18n.NumberFormatSymbols_it'); -goog.provide('goog.i18n.NumberFormatSymbols_it_CH'); goog.provide('goog.i18n.NumberFormatSymbols_it_IT'); -goog.provide('goog.i18n.NumberFormatSymbols_iu'); goog.provide('goog.i18n.NumberFormatSymbols_iw'); goog.provide('goog.i18n.NumberFormatSymbols_ja'); goog.provide('goog.i18n.NumberFormatSymbols_ja_JP'); -goog.provide('goog.i18n.NumberFormatSymbols_ka'); -goog.provide('goog.i18n.NumberFormatSymbols_ka_GE'); -goog.provide('goog.i18n.NumberFormatSymbols_kaj'); -goog.provide('goog.i18n.NumberFormatSymbols_kaj_NG'); -goog.provide('goog.i18n.NumberFormatSymbols_kam'); -goog.provide('goog.i18n.NumberFormatSymbols_kam_KE'); -goog.provide('goog.i18n.NumberFormatSymbols_kcg'); -goog.provide('goog.i18n.NumberFormatSymbols_kcg_NG'); -goog.provide('goog.i18n.NumberFormatSymbols_kfo'); -goog.provide('goog.i18n.NumberFormatSymbols_kfo_CI'); -goog.provide('goog.i18n.NumberFormatSymbols_kk'); -goog.provide('goog.i18n.NumberFormatSymbols_kk_Cyrl'); -goog.provide('goog.i18n.NumberFormatSymbols_kk_Cyrl_KZ'); -goog.provide('goog.i18n.NumberFormatSymbols_kk_KZ'); -goog.provide('goog.i18n.NumberFormatSymbols_kl'); -goog.provide('goog.i18n.NumberFormatSymbols_kl_GL'); -goog.provide('goog.i18n.NumberFormatSymbols_km'); -goog.provide('goog.i18n.NumberFormatSymbols_km_KH'); goog.provide('goog.i18n.NumberFormatSymbols_kn'); goog.provide('goog.i18n.NumberFormatSymbols_kn_IN'); goog.provide('goog.i18n.NumberFormatSymbols_ko'); goog.provide('goog.i18n.NumberFormatSymbols_ko_KR'); -goog.provide('goog.i18n.NumberFormatSymbols_kok'); -goog.provide('goog.i18n.NumberFormatSymbols_kok_IN'); -goog.provide('goog.i18n.NumberFormatSymbols_kpe'); -goog.provide('goog.i18n.NumberFormatSymbols_kpe_GN'); -goog.provide('goog.i18n.NumberFormatSymbols_kpe_LR'); -goog.provide('goog.i18n.NumberFormatSymbols_ku'); -goog.provide('goog.i18n.NumberFormatSymbols_ku_Arab'); -goog.provide('goog.i18n.NumberFormatSymbols_ku_Arab_IQ'); -goog.provide('goog.i18n.NumberFormatSymbols_ku_Arab_IR'); -goog.provide('goog.i18n.NumberFormatSymbols_ku_Arab_SY'); -goog.provide('goog.i18n.NumberFormatSymbols_ku_IQ'); -goog.provide('goog.i18n.NumberFormatSymbols_ku_IR'); -goog.provide('goog.i18n.NumberFormatSymbols_ku_Latn'); -goog.provide('goog.i18n.NumberFormatSymbols_ku_Latn_TR'); -goog.provide('goog.i18n.NumberFormatSymbols_ku_SY'); -goog.provide('goog.i18n.NumberFormatSymbols_ku_TR'); -goog.provide('goog.i18n.NumberFormatSymbols_kw'); -goog.provide('goog.i18n.NumberFormatSymbols_kw_GB'); -goog.provide('goog.i18n.NumberFormatSymbols_ky'); -goog.provide('goog.i18n.NumberFormatSymbols_ky_KG'); goog.provide('goog.i18n.NumberFormatSymbols_ln'); goog.provide('goog.i18n.NumberFormatSymbols_ln_CD'); -goog.provide('goog.i18n.NumberFormatSymbols_ln_CG'); -goog.provide('goog.i18n.NumberFormatSymbols_lo'); -goog.provide('goog.i18n.NumberFormatSymbols_lo_LA'); goog.provide('goog.i18n.NumberFormatSymbols_lt'); goog.provide('goog.i18n.NumberFormatSymbols_lt_LT'); goog.provide('goog.i18n.NumberFormatSymbols_lv'); goog.provide('goog.i18n.NumberFormatSymbols_lv_LV'); -goog.provide('goog.i18n.NumberFormatSymbols_mk'); -goog.provide('goog.i18n.NumberFormatSymbols_mk_MK'); goog.provide('goog.i18n.NumberFormatSymbols_ml'); goog.provide('goog.i18n.NumberFormatSymbols_ml_IN'); -goog.provide('goog.i18n.NumberFormatSymbols_mn'); -goog.provide('goog.i18n.NumberFormatSymbols_mn_CN'); -goog.provide('goog.i18n.NumberFormatSymbols_mn_Cyrl'); -goog.provide('goog.i18n.NumberFormatSymbols_mn_Cyrl_MN'); -goog.provide('goog.i18n.NumberFormatSymbols_mn_MN'); -goog.provide('goog.i18n.NumberFormatSymbols_mn_Mong'); -goog.provide('goog.i18n.NumberFormatSymbols_mn_Mong_CN'); goog.provide('goog.i18n.NumberFormatSymbols_mo'); goog.provide('goog.i18n.NumberFormatSymbols_mr'); goog.provide('goog.i18n.NumberFormatSymbols_mr_IN'); goog.provide('goog.i18n.NumberFormatSymbols_ms'); -goog.provide('goog.i18n.NumberFormatSymbols_ms_BN'); goog.provide('goog.i18n.NumberFormatSymbols_ms_MY'); goog.provide('goog.i18n.NumberFormatSymbols_mt'); goog.provide('goog.i18n.NumberFormatSymbols_mt_MT'); -goog.provide('goog.i18n.NumberFormatSymbols_my'); -goog.provide('goog.i18n.NumberFormatSymbols_my_MM'); -goog.provide('goog.i18n.NumberFormatSymbols_nb'); -goog.provide('goog.i18n.NumberFormatSymbols_nb_NO'); -goog.provide('goog.i18n.NumberFormatSymbols_nds'); -goog.provide('goog.i18n.NumberFormatSymbols_nds_DE'); -goog.provide('goog.i18n.NumberFormatSymbols_ne'); -goog.provide('goog.i18n.NumberFormatSymbols_ne_IN'); -goog.provide('goog.i18n.NumberFormatSymbols_ne_NP'); goog.provide('goog.i18n.NumberFormatSymbols_nl'); -goog.provide('goog.i18n.NumberFormatSymbols_nl_BE'); goog.provide('goog.i18n.NumberFormatSymbols_nl_NL'); -goog.provide('goog.i18n.NumberFormatSymbols_nn'); -goog.provide('goog.i18n.NumberFormatSymbols_nn_NO'); goog.provide('goog.i18n.NumberFormatSymbols_no'); -goog.provide('goog.i18n.NumberFormatSymbols_nr'); -goog.provide('goog.i18n.NumberFormatSymbols_nr_ZA'); -goog.provide('goog.i18n.NumberFormatSymbols_nso'); -goog.provide('goog.i18n.NumberFormatSymbols_nso_ZA'); -goog.provide('goog.i18n.NumberFormatSymbols_ny'); -goog.provide('goog.i18n.NumberFormatSymbols_ny_MW'); -goog.provide('goog.i18n.NumberFormatSymbols_oc'); -goog.provide('goog.i18n.NumberFormatSymbols_oc_FR'); -goog.provide('goog.i18n.NumberFormatSymbols_om'); -goog.provide('goog.i18n.NumberFormatSymbols_om_ET'); -goog.provide('goog.i18n.NumberFormatSymbols_om_KE'); goog.provide('goog.i18n.NumberFormatSymbols_or'); goog.provide('goog.i18n.NumberFormatSymbols_or_IN'); -goog.provide('goog.i18n.NumberFormatSymbols_pa'); -goog.provide('goog.i18n.NumberFormatSymbols_pa_Arab'); -goog.provide('goog.i18n.NumberFormatSymbols_pa_Arab_PK'); -goog.provide('goog.i18n.NumberFormatSymbols_pa_Guru'); -goog.provide('goog.i18n.NumberFormatSymbols_pa_Guru_IN'); -goog.provide('goog.i18n.NumberFormatSymbols_pa_IN'); -goog.provide('goog.i18n.NumberFormatSymbols_pa_PK'); goog.provide('goog.i18n.NumberFormatSymbols_pl'); goog.provide('goog.i18n.NumberFormatSymbols_pl_PL'); -goog.provide('goog.i18n.NumberFormatSymbols_ps'); -goog.provide('goog.i18n.NumberFormatSymbols_ps_AF'); goog.provide('goog.i18n.NumberFormatSymbols_pt'); goog.provide('goog.i18n.NumberFormatSymbols_pt_BR'); goog.provide('goog.i18n.NumberFormatSymbols_pt_PT'); goog.provide('goog.i18n.NumberFormatSymbols_ro'); -goog.provide('goog.i18n.NumberFormatSymbols_ro_MD'); goog.provide('goog.i18n.NumberFormatSymbols_ro_RO'); goog.provide('goog.i18n.NumberFormatSymbols_ru'); goog.provide('goog.i18n.NumberFormatSymbols_ru_RU'); -goog.provide('goog.i18n.NumberFormatSymbols_ru_UA'); -goog.provide('goog.i18n.NumberFormatSymbols_rw'); -goog.provide('goog.i18n.NumberFormatSymbols_rw_RW'); -goog.provide('goog.i18n.NumberFormatSymbols_sa'); -goog.provide('goog.i18n.NumberFormatSymbols_sa_IN'); -goog.provide('goog.i18n.NumberFormatSymbols_se'); -goog.provide('goog.i18n.NumberFormatSymbols_se_FI'); -goog.provide('goog.i18n.NumberFormatSymbols_se_NO'); -goog.provide('goog.i18n.NumberFormatSymbols_sh'); -goog.provide('goog.i18n.NumberFormatSymbols_sh_BA'); -goog.provide('goog.i18n.NumberFormatSymbols_sh_CS'); -goog.provide('goog.i18n.NumberFormatSymbols_sh_YU'); -goog.provide('goog.i18n.NumberFormatSymbols_si'); -goog.provide('goog.i18n.NumberFormatSymbols_si_LK'); -goog.provide('goog.i18n.NumberFormatSymbols_sid'); -goog.provide('goog.i18n.NumberFormatSymbols_sid_ET'); goog.provide('goog.i18n.NumberFormatSymbols_sk'); goog.provide('goog.i18n.NumberFormatSymbols_sk_SK'); goog.provide('goog.i18n.NumberFormatSymbols_sl'); goog.provide('goog.i18n.NumberFormatSymbols_sl_SI'); -goog.provide('goog.i18n.NumberFormatSymbols_so'); -goog.provide('goog.i18n.NumberFormatSymbols_so_DJ'); -goog.provide('goog.i18n.NumberFormatSymbols_so_ET'); -goog.provide('goog.i18n.NumberFormatSymbols_so_KE'); -goog.provide('goog.i18n.NumberFormatSymbols_so_SO'); goog.provide('goog.i18n.NumberFormatSymbols_sq'); goog.provide('goog.i18n.NumberFormatSymbols_sq_AL'); goog.provide('goog.i18n.NumberFormatSymbols_sr'); -goog.provide('goog.i18n.NumberFormatSymbols_sr_BA'); -goog.provide('goog.i18n.NumberFormatSymbols_sr_CS'); -goog.provide('goog.i18n.NumberFormatSymbols_sr_Cyrl'); -goog.provide('goog.i18n.NumberFormatSymbols_sr_Cyrl_BA'); -goog.provide('goog.i18n.NumberFormatSymbols_sr_Cyrl_CS'); -goog.provide('goog.i18n.NumberFormatSymbols_sr_Cyrl_ME'); goog.provide('goog.i18n.NumberFormatSymbols_sr_Cyrl_RS'); -goog.provide('goog.i18n.NumberFormatSymbols_sr_Cyrl_YU'); -goog.provide('goog.i18n.NumberFormatSymbols_sr_Latn'); -goog.provide('goog.i18n.NumberFormatSymbols_sr_Latn_BA'); -goog.provide('goog.i18n.NumberFormatSymbols_sr_Latn_CS'); -goog.provide('goog.i18n.NumberFormatSymbols_sr_Latn_ME'); goog.provide('goog.i18n.NumberFormatSymbols_sr_Latn_RS'); -goog.provide('goog.i18n.NumberFormatSymbols_sr_Latn_YU'); -goog.provide('goog.i18n.NumberFormatSymbols_sr_ME'); goog.provide('goog.i18n.NumberFormatSymbols_sr_RS'); -goog.provide('goog.i18n.NumberFormatSymbols_sr_YU'); -goog.provide('goog.i18n.NumberFormatSymbols_ss'); -goog.provide('goog.i18n.NumberFormatSymbols_ss_SZ'); -goog.provide('goog.i18n.NumberFormatSymbols_ss_ZA'); -goog.provide('goog.i18n.NumberFormatSymbols_st'); -goog.provide('goog.i18n.NumberFormatSymbols_st_LS'); -goog.provide('goog.i18n.NumberFormatSymbols_st_ZA'); goog.provide('goog.i18n.NumberFormatSymbols_sv'); -goog.provide('goog.i18n.NumberFormatSymbols_sv_FI'); goog.provide('goog.i18n.NumberFormatSymbols_sv_SE'); goog.provide('goog.i18n.NumberFormatSymbols_sw'); -goog.provide('goog.i18n.NumberFormatSymbols_sw_KE'); goog.provide('goog.i18n.NumberFormatSymbols_sw_TZ'); -goog.provide('goog.i18n.NumberFormatSymbols_syr'); -goog.provide('goog.i18n.NumberFormatSymbols_syr_SY'); goog.provide('goog.i18n.NumberFormatSymbols_ta'); goog.provide('goog.i18n.NumberFormatSymbols_ta_IN'); goog.provide('goog.i18n.NumberFormatSymbols_te'); goog.provide('goog.i18n.NumberFormatSymbols_te_IN'); -goog.provide('goog.i18n.NumberFormatSymbols_tg'); -goog.provide('goog.i18n.NumberFormatSymbols_tg_Cyrl'); -goog.provide('goog.i18n.NumberFormatSymbols_tg_Cyrl_TJ'); -goog.provide('goog.i18n.NumberFormatSymbols_tg_TJ'); goog.provide('goog.i18n.NumberFormatSymbols_th'); goog.provide('goog.i18n.NumberFormatSymbols_th_TH'); -goog.provide('goog.i18n.NumberFormatSymbols_ti'); -goog.provide('goog.i18n.NumberFormatSymbols_ti_ER'); -goog.provide('goog.i18n.NumberFormatSymbols_ti_ET'); -goog.provide('goog.i18n.NumberFormatSymbols_tig'); -goog.provide('goog.i18n.NumberFormatSymbols_tig_ER'); goog.provide('goog.i18n.NumberFormatSymbols_tl'); goog.provide('goog.i18n.NumberFormatSymbols_tl_PH'); -goog.provide('goog.i18n.NumberFormatSymbols_tn'); -goog.provide('goog.i18n.NumberFormatSymbols_tn_ZA'); -goog.provide('goog.i18n.NumberFormatSymbols_to'); -goog.provide('goog.i18n.NumberFormatSymbols_to_TO'); goog.provide('goog.i18n.NumberFormatSymbols_tr'); goog.provide('goog.i18n.NumberFormatSymbols_tr_TR'); -goog.provide('goog.i18n.NumberFormatSymbols_trv'); -goog.provide('goog.i18n.NumberFormatSymbols_trv_TW'); -goog.provide('goog.i18n.NumberFormatSymbols_ts'); -goog.provide('goog.i18n.NumberFormatSymbols_ts_ZA'); -goog.provide('goog.i18n.NumberFormatSymbols_tt'); -goog.provide('goog.i18n.NumberFormatSymbols_tt_RU'); -goog.provide('goog.i18n.NumberFormatSymbols_ug'); -goog.provide('goog.i18n.NumberFormatSymbols_ug_Arab'); -goog.provide('goog.i18n.NumberFormatSymbols_ug_Arab_CN'); -goog.provide('goog.i18n.NumberFormatSymbols_ug_CN'); goog.provide('goog.i18n.NumberFormatSymbols_uk'); goog.provide('goog.i18n.NumberFormatSymbols_uk_UA'); goog.provide('goog.i18n.NumberFormatSymbols_ur'); -goog.provide('goog.i18n.NumberFormatSymbols_ur_IN'); goog.provide('goog.i18n.NumberFormatSymbols_ur_PK'); -goog.provide('goog.i18n.NumberFormatSymbols_uz'); -goog.provide('goog.i18n.NumberFormatSymbols_uz_AF'); -goog.provide('goog.i18n.NumberFormatSymbols_uz_Arab'); -goog.provide('goog.i18n.NumberFormatSymbols_uz_Arab_AF'); -goog.provide('goog.i18n.NumberFormatSymbols_uz_Cyrl'); -goog.provide('goog.i18n.NumberFormatSymbols_uz_Cyrl_UZ'); -goog.provide('goog.i18n.NumberFormatSymbols_uz_Latn'); -goog.provide('goog.i18n.NumberFormatSymbols_uz_Latn_UZ'); -goog.provide('goog.i18n.NumberFormatSymbols_uz_UZ'); -goog.provide('goog.i18n.NumberFormatSymbols_ve'); -goog.provide('goog.i18n.NumberFormatSymbols_ve_ZA'); goog.provide('goog.i18n.NumberFormatSymbols_vi'); goog.provide('goog.i18n.NumberFormatSymbols_vi_VN'); -goog.provide('goog.i18n.NumberFormatSymbols_wal'); -goog.provide('goog.i18n.NumberFormatSymbols_wal_ET'); -goog.provide('goog.i18n.NumberFormatSymbols_wo'); -goog.provide('goog.i18n.NumberFormatSymbols_wo_Latn'); -goog.provide('goog.i18n.NumberFormatSymbols_wo_Latn_SN'); -goog.provide('goog.i18n.NumberFormatSymbols_wo_SN'); -goog.provide('goog.i18n.NumberFormatSymbols_xh'); -goog.provide('goog.i18n.NumberFormatSymbols_xh_ZA'); -goog.provide('goog.i18n.NumberFormatSymbols_yo'); -goog.provide('goog.i18n.NumberFormatSymbols_yo_NG'); goog.provide('goog.i18n.NumberFormatSymbols_zh'); goog.provide('goog.i18n.NumberFormatSymbols_zh_CN'); goog.provide('goog.i18n.NumberFormatSymbols_zh_HK'); goog.provide('goog.i18n.NumberFormatSymbols_zh_Hans'); goog.provide('goog.i18n.NumberFormatSymbols_zh_Hans_CN'); -goog.provide('goog.i18n.NumberFormatSymbols_zh_Hans_HK'); -goog.provide('goog.i18n.NumberFormatSymbols_zh_Hans_MO'); -goog.provide('goog.i18n.NumberFormatSymbols_zh_Hans_SG'); -goog.provide('goog.i18n.NumberFormatSymbols_zh_Hant'); -goog.provide('goog.i18n.NumberFormatSymbols_zh_Hant_HK'); -goog.provide('goog.i18n.NumberFormatSymbols_zh_Hant_MO'); -goog.provide('goog.i18n.NumberFormatSymbols_zh_Hant_TW'); -goog.provide('goog.i18n.NumberFormatSymbols_zh_MO'); -goog.provide('goog.i18n.NumberFormatSymbols_zh_SG'); goog.provide('goog.i18n.NumberFormatSymbols_zh_TW'); -goog.provide('goog.i18n.NumberFormatSymbols_zu'); -goog.provide('goog.i18n.NumberFormatSymbols_zu_ZA'); /** - * Number formatting symbols for locale aa. + * Number formatting symbols for locale am. * @enum {string} */ -goog.i18n.NumberFormatSymbols_aa = { +goog.i18n.NumberFormatSymbols_am = { DECIMAL_SEP: '.', GROUP_SEP: ',', PERCENT: '%', @@ -512,25 +208,25 @@ goog.i18n.NumberFormatSymbols_aa = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'DJF' + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'ETB' }; /** - * Number formatting symbols for locale aa_DJ. + * Number formatting symbols for locale am_ET. * @enum {string} */ -goog.i18n.NumberFormatSymbols_aa_DJ = goog.i18n.NumberFormatSymbols_aa; +goog.i18n.NumberFormatSymbols_am_ET = goog.i18n.NumberFormatSymbols_am; /** - * Number formatting symbols for locale aa_ER. + * Number formatting symbols for locale ar. * @enum {string} */ -goog.i18n.NumberFormatSymbols_aa_ER = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', +goog.i18n.NumberFormatSymbols_ar = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -539,28 +235,28 @@ goog.i18n.NumberFormatSymbols_aa_ER = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', + DECIMAL_PATTERN: '#,##0.###;#,##0.###-', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ERN' + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', + DEF_CURRENCY_CODE: 'EGP' }; /** - * Number formatting symbols for locale aa_ER_SAAHO. + * Number formatting symbols for locale ar_EG. * @enum {string} */ -goog.i18n.NumberFormatSymbols_aa_ER_SAAHO = goog.i18n.NumberFormatSymbols_aa_ER; +goog.i18n.NumberFormatSymbols_ar_EG = goog.i18n.NumberFormatSymbols_ar; /** - * Number formatting symbols for locale aa_ET. + * Number formatting symbols for locale bg. * @enum {string} */ -goog.i18n.NumberFormatSymbols_aa_ET = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', +goog.i18n.NumberFormatSymbols_bg = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -568,45 +264,29 @@ goog.i18n.NumberFormatSymbols_aa_ET = { EXP_SYMBOL: 'E', PERMILL: '\u2030', INFINITY: '\u221E', - NAN: 'NaN', + NAN: '\u041D/\u0427', DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ETB' + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'BGN' }; /** - * Number formatting symbols for locale af. + * Number formatting symbols for locale bg_BG. * @enum {string} */ -goog.i18n.NumberFormatSymbols_af = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ZAR' -}; +goog.i18n.NumberFormatSymbols_bg_BG = goog.i18n.NumberFormatSymbols_bg; /** - * Number formatting symbols for locale af_NA. + * Number formatting symbols for locale bn. * @enum {string} */ -goog.i18n.NumberFormatSymbols_af_NA = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', +goog.i18n.NumberFormatSymbols_bn = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -615,28 +295,28 @@ goog.i18n.NumberFormatSymbols_af_NA = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', + DECIMAL_PATTERN: '#,##,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'ZAR' + PERCENT_PATTERN: '#,##,##0%', + CURRENCY_PATTERN: '#,##,##0.00\u00A4;(#,##,##0.00\u00A4)', + DEF_CURRENCY_CODE: 'BDT' }; /** - * Number formatting symbols for locale af_ZA. + * Number formatting symbols for locale bn_BD. * @enum {string} */ -goog.i18n.NumberFormatSymbols_af_ZA = goog.i18n.NumberFormatSymbols_af; +goog.i18n.NumberFormatSymbols_bn_BD = goog.i18n.NumberFormatSymbols_bn; /** - * Number formatting symbols for locale ak. + * Number formatting symbols for locale ca. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ak = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', +goog.i18n.NumberFormatSymbols_ca = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -648,25 +328,25 @@ goog.i18n.NumberFormatSymbols_ak = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'GHC' + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'EUR' }; /** - * Number formatting symbols for locale ak_GH. + * Number formatting symbols for locale ca_ES. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ak_GH = goog.i18n.NumberFormatSymbols_ak; +goog.i18n.NumberFormatSymbols_ca_ES = goog.i18n.NumberFormatSymbols_ca; /** - * Number formatting symbols for locale am. + * Number formatting symbols for locale cs. * @enum {string} */ -goog.i18n.NumberFormatSymbols_am = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', +goog.i18n.NumberFormatSymbols_cs = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -677,24 +357,24 @@ goog.i18n.NumberFormatSymbols_am = { NAN: 'NaN', DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', + PERCENT_PATTERN: '#,##0\u00A0%', CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'ETB' + DEF_CURRENCY_CODE: 'CZK' }; /** - * Number formatting symbols for locale am_ET. + * Number formatting symbols for locale cs_CZ. * @enum {string} */ -goog.i18n.NumberFormatSymbols_am_ET = goog.i18n.NumberFormatSymbols_am; +goog.i18n.NumberFormatSymbols_cs_CZ = goog.i18n.NumberFormatSymbols_cs; /** - * Number formatting symbols for locale ar. + * Number formatting symbols for locale da. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ar = { +goog.i18n.NumberFormatSymbols_da = { DECIMAL_SEP: ',', GROUP_SEP: '.', PERCENT: '%', @@ -705,26 +385,26 @@ goog.i18n.NumberFormatSymbols_ar = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', - DEF_CURRENCY_CODE: 'AED' + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'DKK' }; /** - * Number formatting symbols for locale ar_AE. + * Number formatting symbols for locale da_DK. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ar_AE = goog.i18n.NumberFormatSymbols_ar; +goog.i18n.NumberFormatSymbols_da_DK = goog.i18n.NumberFormatSymbols_da; /** - * Number formatting symbols for locale ar_BH. + * Number formatting symbols for locale de. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ar_BH = { +goog.i18n.NumberFormatSymbols_de = { DECIMAL_SEP: ',', GROUP_SEP: '.', PERCENT: '%', @@ -735,19 +415,19 @@ goog.i18n.NumberFormatSymbols_ar_BH = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', - DEF_CURRENCY_CODE: 'BHD' + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'EUR' }; /** - * Number formatting symbols for locale ar_DZ. + * Number formatting symbols for locale de_AT. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ar_DZ = { +goog.i18n.NumberFormatSymbols_de_AT = { DECIMAL_SEP: ',', GROUP_SEP: '.', PERCENT: '%', @@ -758,21 +438,28 @@ goog.i18n.NumberFormatSymbols_ar_DZ = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', - DEF_CURRENCY_CODE: 'DZD' + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'EUR' }; /** - * Number formatting symbols for locale ar_EG. + * Number formatting symbols for locale de_BE. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ar_EG = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', +goog.i18n.NumberFormatSymbols_de_BE = goog.i18n.NumberFormatSymbols_de; + + +/** + * Number formatting symbols for locale de_CH. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_de_CH = { + DECIMAL_SEP: '.', + GROUP_SEP: '\'', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -781,44 +468,72 @@ goog.i18n.NumberFormatSymbols_ar_EG = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', - DEF_CURRENCY_CODE: 'EGP' + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4-#,##0.00', + DEF_CURRENCY_CODE: 'CHF' }; /** - * Number formatting symbols for locale ar_IQ. + * Number formatting symbols for locale de_DE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_de_DE = goog.i18n.NumberFormatSymbols_de; + + +/** + * Number formatting symbols for locale de_LU. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_de_LU = goog.i18n.NumberFormatSymbols_de; + + +/** + * Number formatting symbols for locale el. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ar_IQ = { +goog.i18n.NumberFormatSymbols_el = { DECIMAL_SEP: ',', GROUP_SEP: '.', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', MINUS_SIGN: '-', - EXP_SYMBOL: 'E', + EXP_SYMBOL: 'e', PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', - DEF_CURRENCY_CODE: 'IQD' + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'EUR' }; /** - * Number formatting symbols for locale ar_JO. + * Number formatting symbols for locale el_GR. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ar_JO = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', +goog.i18n.NumberFormatSymbols_el_GR = goog.i18n.NumberFormatSymbols_el; + + +/** + * Number formatting symbols for locale el_POLYTON. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_el_POLYTON = goog.i18n.NumberFormatSymbols_el; + + +/** + * Number formatting symbols for locale en. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -827,21 +542,28 @@ goog.i18n.NumberFormatSymbols_ar_JO = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', - DEF_CURRENCY_CODE: 'JOD' + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'USD' }; /** - * Number formatting symbols for locale ar_KW. + * Number formatting symbols for locale en_AS. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ar_KW = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', +goog.i18n.NumberFormatSymbols_en_AS = goog.i18n.NumberFormatSymbols_en; + + +/** + * Number formatting symbols for locale en_AU. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_AU = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -850,21 +572,35 @@ goog.i18n.NumberFormatSymbols_ar_KW = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', - DEF_CURRENCY_CODE: 'KWD' + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'AUD' }; /** - * Number formatting symbols for locale ar_LB. + * Number formatting symbols for locale en_Dsrt. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ar_LB = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', +goog.i18n.NumberFormatSymbols_en_Dsrt = goog.i18n.NumberFormatSymbols_en; + + +/** + * Number formatting symbols for locale en_Dsrt_US. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_Dsrt_US = goog.i18n.NumberFormatSymbols_en; + + +/** + * Number formatting symbols for locale en_GB. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_GB = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -873,21 +609,28 @@ goog.i18n.NumberFormatSymbols_ar_LB = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', - DEF_CURRENCY_CODE: 'LBP' + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'GBP' }; /** - * Number formatting symbols for locale ar_LY. + * Number formatting symbols for locale en_GU. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ar_LY = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', +goog.i18n.NumberFormatSymbols_en_GU = goog.i18n.NumberFormatSymbols_en; + + +/** + * Number formatting symbols for locale en_IE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_IE = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -896,21 +639,21 @@ goog.i18n.NumberFormatSymbols_ar_LY = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', - DEF_CURRENCY_CODE: 'LYD' + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'EUR' }; /** - * Number formatting symbols for locale ar_MA. + * Number formatting symbols for locale en_IN. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ar_MA = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', +goog.i18n.NumberFormatSymbols_en_IN = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -919,21 +662,35 @@ goog.i18n.NumberFormatSymbols_ar_MA = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + DECIMAL_PATTERN: '#,##,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', - DEF_CURRENCY_CODE: 'MAD' + PERCENT_PATTERN: '#,##,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', + DEF_CURRENCY_CODE: 'INR' }; /** - * Number formatting symbols for locale ar_OM. + * Number formatting symbols for locale en_MH. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ar_OM = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', +goog.i18n.NumberFormatSymbols_en_MH = goog.i18n.NumberFormatSymbols_en; + + +/** + * Number formatting symbols for locale en_MP. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_MP = goog.i18n.NumberFormatSymbols_en; + + +/** + * Number formatting symbols for locale en_SG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_SG = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -942,21 +699,42 @@ goog.i18n.NumberFormatSymbols_ar_OM = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', - DEF_CURRENCY_CODE: 'OMR' + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'SGD' }; /** - * Number formatting symbols for locale ar_QA. + * Number formatting symbols for locale en_UM. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_UM = goog.i18n.NumberFormatSymbols_en; + + +/** + * Number formatting symbols for locale en_US. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_US = goog.i18n.NumberFormatSymbols_en; + + +/** + * Number formatting symbols for locale en_VI. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_VI = goog.i18n.NumberFormatSymbols_en; + + +/** + * Number formatting symbols for locale en_ZA. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ar_QA = { +goog.i18n.NumberFormatSymbols_en_ZA = { DECIMAL_SEP: ',', - GROUP_SEP: '.', + GROUP_SEP: '\u00A0', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -965,19 +743,26 @@ goog.i18n.NumberFormatSymbols_ar_QA = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#0.###;#0.###-', + DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#0.00', - DEF_CURRENCY_CODE: 'QAR' + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ZAR' }; /** - * Number formatting symbols for locale ar_SA. + * Number formatting symbols for locale en_ZZ. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ar_SA = { +goog.i18n.NumberFormatSymbols_en_ZZ = goog.i18n.NumberFormatSymbols_en; + + +/** + * Number formatting symbols for locale es. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es = { DECIMAL_SEP: ',', GROUP_SEP: '.', PERCENT: '%', @@ -988,21 +773,28 @@ goog.i18n.NumberFormatSymbols_ar_SA = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#0.###;#0.###-', + DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#0.00', - DEF_CURRENCY_CODE: 'SAR' + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'EUR' }; /** - * Number formatting symbols for locale ar_SD. + * Number formatting symbols for locale es_ES. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_ES = goog.i18n.NumberFormatSymbols_es; + + +/** + * Number formatting symbols for locale et. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ar_SD = { +goog.i18n.NumberFormatSymbols_et = { DECIMAL_SEP: ',', - GROUP_SEP: '.', + GROUP_SEP: '\u00A0', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -1011,19 +803,26 @@ goog.i18n.NumberFormatSymbols_ar_SD = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', - DEF_CURRENCY_CODE: 'SDD' + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'EUR' }; /** - * Number formatting symbols for locale ar_SY. + * Number formatting symbols for locale et_EE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_et_EE = goog.i18n.NumberFormatSymbols_et; + + +/** + * Number formatting symbols for locale eu. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ar_SY = { +goog.i18n.NumberFormatSymbols_eu = { DECIMAL_SEP: ',', GROUP_SEP: '.', PERCENT: '%', @@ -1034,44 +833,59 @@ goog.i18n.NumberFormatSymbols_ar_SY = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#0.###;#0.###-', + DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#0.00', - DEF_CURRENCY_CODE: 'SYP' + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'EUR' }; /** - * Number formatting symbols for locale ar_TN. + * Number formatting symbols for locale eu_ES. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ar_TN = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', +goog.i18n.NumberFormatSymbols_eu_ES = goog.i18n.NumberFormatSymbols_eu; + + +/** + * Number formatting symbols for locale fa. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fa = { + DECIMAL_SEP: '/', + GROUP_SEP: '\u060C', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', - MINUS_SIGN: '-', + MINUS_SIGN: '\u2212', EXP_SYMBOL: 'E', PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#0.###;#0.###-', + DECIMAL_PATTERN: '#,##0.###;\'\u202A\'-#,##0.###\'\u202C\'', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#0.00', - DEF_CURRENCY_CODE: 'TND' + PERCENT_PATTERN: '\'\u202A\'%#,##0\'\u202C\'', + CURRENCY_PATTERN: + '#,##0.00\u00A0\u00A4;\'\u202A\'-#,##0.00\'\u202C\'\u00A0\u00A4', + DEF_CURRENCY_CODE: 'IRR' }; /** - * Number formatting symbols for locale ar_YE. + * Number formatting symbols for locale fa_IR. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fa_IR = goog.i18n.NumberFormatSymbols_fa; + + +/** + * Number formatting symbols for locale fi. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ar_YE = { +goog.i18n.NumberFormatSymbols_fi = { DECIMAL_SEP: ',', - GROUP_SEP: '.', + GROUP_SEP: '\u00A0', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -1079,20 +893,27 @@ goog.i18n.NumberFormatSymbols_ar_YE = { EXP_SYMBOL: 'E', PERMILL: '\u2030', INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#0.###;#0.###-', + NAN: 'ep\u00E4luku', + DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#0.00', - DEF_CURRENCY_CODE: 'YER' + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'EUR' }; /** - * Number formatting symbols for locale as. + * Number formatting symbols for locale fi_FI. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fi_FI = goog.i18n.NumberFormatSymbols_fi; + + +/** + * Number formatting symbols for locale fil. * @enum {string} */ -goog.i18n.NumberFormatSymbols_as = { +goog.i18n.NumberFormatSymbols_fil = { DECIMAL_SEP: '.', GROUP_SEP: ',', PERCENT: '%', @@ -1103,28 +924,28 @@ goog.i18n.NumberFormatSymbols_as = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##,##0.###', + DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', - DEF_CURRENCY_CODE: 'INR' + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'PHP' }; /** - * Number formatting symbols for locale as_IN. + * Number formatting symbols for locale fil_PH. * @enum {string} */ -goog.i18n.NumberFormatSymbols_as_IN = goog.i18n.NumberFormatSymbols_as; +goog.i18n.NumberFormatSymbols_fil_PH = goog.i18n.NumberFormatSymbols_fil; /** - * Number formatting symbols for locale az. + * Number formatting symbols for locale fr. * @enum {string} */ -goog.i18n.NumberFormatSymbols_az = { +goog.i18n.NumberFormatSymbols_fr = { DECIMAL_SEP: ',', - GROUP_SEP: '.', + GROUP_SEP: '\u00A0', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -1135,84 +956,91 @@ goog.i18n.NumberFormatSymbols_az = { NAN: 'NaN', DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'AZN' + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'EUR' }; /** - * Number formatting symbols for locale az_AZ. + * Number formatting symbols for locale fr_BL. * @enum {string} */ -goog.i18n.NumberFormatSymbols_az_AZ = goog.i18n.NumberFormatSymbols_az; +goog.i18n.NumberFormatSymbols_fr_BL = goog.i18n.NumberFormatSymbols_fr; /** - * Number formatting symbols for locale az_Cyrl. + * Number formatting symbols for locale fr_CA. * @enum {string} */ -goog.i18n.NumberFormatSymbols_az_Cyrl = goog.i18n.NumberFormatSymbols_az; +goog.i18n.NumberFormatSymbols_fr_CA = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4;(#,##0.00\u00A0\u00A4)', + DEF_CURRENCY_CODE: 'CAD' +}; /** - * Number formatting symbols for locale az_Cyrl_AZ. + * Number formatting symbols for locale fr_FR. * @enum {string} */ -goog.i18n.NumberFormatSymbols_az_Cyrl_AZ = goog.i18n.NumberFormatSymbols_az; +goog.i18n.NumberFormatSymbols_fr_FR = goog.i18n.NumberFormatSymbols_fr; /** - * Number formatting symbols for locale az_Latn. + * Number formatting symbols for locale fr_GP. * @enum {string} */ -goog.i18n.NumberFormatSymbols_az_Latn = goog.i18n.NumberFormatSymbols_az; +goog.i18n.NumberFormatSymbols_fr_GP = goog.i18n.NumberFormatSymbols_fr; /** - * Number formatting symbols for locale az_Latn_AZ. + * Number formatting symbols for locale fr_MC. * @enum {string} */ -goog.i18n.NumberFormatSymbols_az_Latn_AZ = goog.i18n.NumberFormatSymbols_az; +goog.i18n.NumberFormatSymbols_fr_MC = goog.i18n.NumberFormatSymbols_fr; /** - * Number formatting symbols for locale be. + * Number formatting symbols for locale fr_MF. * @enum {string} */ -goog.i18n.NumberFormatSymbols_be = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'BYR' -}; +goog.i18n.NumberFormatSymbols_fr_MF = goog.i18n.NumberFormatSymbols_fr; /** - * Number formatting symbols for locale be_BY. + * Number formatting symbols for locale fr_MQ. * @enum {string} */ -goog.i18n.NumberFormatSymbols_be_BY = goog.i18n.NumberFormatSymbols_be; +goog.i18n.NumberFormatSymbols_fr_MQ = goog.i18n.NumberFormatSymbols_fr; /** - * Number formatting symbols for locale bg. + * Number formatting symbols for locale fr_RE. * @enum {string} */ -goog.i18n.NumberFormatSymbols_bg = { +goog.i18n.NumberFormatSymbols_fr_RE = goog.i18n.NumberFormatSymbols_fr; + + +/** + * Number formatting symbols for locale gl. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_gl = { DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', + GROUP_SEP: '.', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -1220,57 +1048,57 @@ goog.i18n.NumberFormatSymbols_bg = { EXP_SYMBOL: 'E', PERMILL: '\u2030', INFINITY: '\u221E', - NAN: '\u041D/\u0427', + NAN: 'NaN', DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'BGN' + DEF_CURRENCY_CODE: 'EUR' }; /** - * Number formatting symbols for locale bg_BG. + * Number formatting symbols for locale gl_ES. * @enum {string} */ -goog.i18n.NumberFormatSymbols_bg_BG = goog.i18n.NumberFormatSymbols_bg; +goog.i18n.NumberFormatSymbols_gl_ES = goog.i18n.NumberFormatSymbols_gl; /** - * Number formatting symbols for locale bn. + * Number formatting symbols for locale gsw. * @enum {string} */ -goog.i18n.NumberFormatSymbols_bn = { +goog.i18n.NumberFormatSymbols_gsw = { DECIMAL_SEP: '.', - GROUP_SEP: ',', + GROUP_SEP: '\u2019', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', - MINUS_SIGN: '-', + MINUS_SIGN: '\u2212', EXP_SYMBOL: 'E', PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##,##0.###', + DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##,##0%', - CURRENCY_PATTERN: '#,##,##0.00\u00A4;(#,##,##0.00\u00A4)', - DEF_CURRENCY_CODE: 'BDT' + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'CHF' }; /** - * Number formatting symbols for locale bn_BD. + * Number formatting symbols for locale gsw_CH. * @enum {string} */ -goog.i18n.NumberFormatSymbols_bn_BD = goog.i18n.NumberFormatSymbols_bn; +goog.i18n.NumberFormatSymbols_gsw_CH = goog.i18n.NumberFormatSymbols_gsw; /** - * Number formatting symbols for locale bn_IN. + * Number formatting symbols for locale gu. * @enum {string} */ -goog.i18n.NumberFormatSymbols_bn_IN = { +goog.i18n.NumberFormatSymbols_gu = { DECIMAL_SEP: '.', GROUP_SEP: ',', PERCENT: '%', @@ -1284,16 +1112,23 @@ goog.i18n.NumberFormatSymbols_bn_IN = { DECIMAL_PATTERN: '#,##,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##,##0%', - CURRENCY_PATTERN: '#,##,##0.00\u00A4;(#,##,##0.00\u00A4)', + CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', DEF_CURRENCY_CODE: 'INR' }; /** - * Number formatting symbols for locale bo. + * Number formatting symbols for locale gu_IN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_gu_IN = goog.i18n.NumberFormatSymbols_gu; + + +/** + * Number formatting symbols for locale he. * @enum {string} */ -goog.i18n.NumberFormatSymbols_bo = { +goog.i18n.NumberFormatSymbols_he = { DECIMAL_SEP: '.', GROUP_SEP: ',', PERCENT: '%', @@ -1307,23 +1142,23 @@ goog.i18n.NumberFormatSymbols_bo = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'CNY' + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'ILS' }; /** - * Number formatting symbols for locale bo_CN. + * Number formatting symbols for locale he_IL. * @enum {string} */ -goog.i18n.NumberFormatSymbols_bo_CN = goog.i18n.NumberFormatSymbols_bo; +goog.i18n.NumberFormatSymbols_he_IL = goog.i18n.NumberFormatSymbols_he; /** - * Number formatting symbols for locale bo_IN. + * Number formatting symbols for locale hi. * @enum {string} */ -goog.i18n.NumberFormatSymbols_bo_IN = { +goog.i18n.NumberFormatSymbols_hi = { DECIMAL_SEP: '.', GROUP_SEP: ',', PERCENT: '%', @@ -1334,19 +1169,26 @@ goog.i18n.NumberFormatSymbols_bo_IN = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', + DECIMAL_PATTERN: '#,##,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + PERCENT_PATTERN: '#,##,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', DEF_CURRENCY_CODE: 'INR' }; /** - * Number formatting symbols for locale bs. + * Number formatting symbols for locale hi_IN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_hi_IN = goog.i18n.NumberFormatSymbols_hi; + + +/** + * Number formatting symbols for locale hr. * @enum {string} */ -goog.i18n.NumberFormatSymbols_bs = { +goog.i18n.NumberFormatSymbols_hr = { DECIMAL_SEP: ',', GROUP_SEP: '.', PERCENT: '%', @@ -1360,25 +1202,25 @@ goog.i18n.NumberFormatSymbols_bs = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'BAM' + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'HRK' }; /** - * Number formatting symbols for locale bs_BA. + * Number formatting symbols for locale hr_HR. * @enum {string} */ -goog.i18n.NumberFormatSymbols_bs_BA = goog.i18n.NumberFormatSymbols_bs; +goog.i18n.NumberFormatSymbols_hr_HR = goog.i18n.NumberFormatSymbols_hr; /** - * Number formatting symbols for locale byn. + * Number formatting symbols for locale hu. * @enum {string} */ -goog.i18n.NumberFormatSymbols_byn = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', +goog.i18n.NumberFormatSymbols_hu = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -1390,23 +1232,23 @@ goog.i18n.NumberFormatSymbols_byn = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ERN' + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'HUF' }; /** - * Number formatting symbols for locale byn_ER. + * Number formatting symbols for locale hu_HU. * @enum {string} */ -goog.i18n.NumberFormatSymbols_byn_ER = goog.i18n.NumberFormatSymbols_byn; +goog.i18n.NumberFormatSymbols_hu_HU = goog.i18n.NumberFormatSymbols_hu; /** - * Number formatting symbols for locale ca. + * Number formatting symbols for locale id. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ca = { +goog.i18n.NumberFormatSymbols_id = { DECIMAL_SEP: ',', GROUP_SEP: '.', PERCENT: '%', @@ -1420,25 +1262,25 @@ goog.i18n.NumberFormatSymbols_ca = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'EUR' + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'IDR' }; /** - * Number formatting symbols for locale ca_ES. + * Number formatting symbols for locale id_ID. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ca_ES = goog.i18n.NumberFormatSymbols_ca; +goog.i18n.NumberFormatSymbols_id_ID = goog.i18n.NumberFormatSymbols_id; /** - * Number formatting symbols for locale cch. + * Number formatting symbols for locale in. * @enum {string} */ -goog.i18n.NumberFormatSymbols_cch = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', +goog.i18n.NumberFormatSymbols_in = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -1450,48 +1292,48 @@ goog.i18n.NumberFormatSymbols_cch = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'NGN' + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'IDR' }; /** - * Number formatting symbols for locale cch_NG. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_cch_NG = goog.i18n.NumberFormatSymbols_cch; - - -/** - * Number formatting symbols for locale cop. + * Number formatting symbols for locale is. * @enum {string} */ -goog.i18n.NumberFormatSymbols_cop = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', +goog.i18n.NumberFormatSymbols_is = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', + MINUS_SIGN: '\u2212', + EXP_SYMBOL: '\u00D710^', PERMILL: '\u2030', INFINITY: '\u221E', - NAN: 'NaN', + NAN: 'EiTa', DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'EGP' + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'ISK' }; /** - * Number formatting symbols for locale cs. + * Number formatting symbols for locale is_IS. * @enum {string} */ -goog.i18n.NumberFormatSymbols_cs = { +goog.i18n.NumberFormatSymbols_is_IS = goog.i18n.NumberFormatSymbols_is; + + +/** + * Number formatting symbols for locale it. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_it = { DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', + GROUP_SEP: '.', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -1503,23 +1345,23 @@ goog.i18n.NumberFormatSymbols_cs = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'CZK' + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'EUR' }; /** - * Number formatting symbols for locale cs_CZ. + * Number formatting symbols for locale it_IT. * @enum {string} */ -goog.i18n.NumberFormatSymbols_cs_CZ = goog.i18n.NumberFormatSymbols_cs; +goog.i18n.NumberFormatSymbols_it_IT = goog.i18n.NumberFormatSymbols_it; /** - * Number formatting symbols for locale cy. + * Number formatting symbols for locale iw. * @enum {string} */ -goog.i18n.NumberFormatSymbols_cy = { +goog.i18n.NumberFormatSymbols_iw = { DECIMAL_SEP: '.', GROUP_SEP: ',', PERCENT: '%', @@ -1533,25 +1375,18 @@ goog.i18n.NumberFormatSymbols_cy = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'GBP' + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'ILS' }; /** - * Number formatting symbols for locale cy_GB. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_cy_GB = goog.i18n.NumberFormatSymbols_cy; - - -/** - * Number formatting symbols for locale da. + * Number formatting symbols for locale ja. * @enum {string} */ -goog.i18n.NumberFormatSymbols_da = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', +goog.i18n.NumberFormatSymbols_ja = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -1562,26 +1397,26 @@ goog.i18n.NumberFormatSymbols_da = { NAN: 'NaN', DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'DKK' + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'JPY' }; /** - * Number formatting symbols for locale da_DK. + * Number formatting symbols for locale ja_JP. * @enum {string} */ -goog.i18n.NumberFormatSymbols_da_DK = goog.i18n.NumberFormatSymbols_da; +goog.i18n.NumberFormatSymbols_ja_JP = goog.i18n.NumberFormatSymbols_ja; /** - * Number formatting symbols for locale de. + * Number formatting symbols for locale kn. * @enum {string} */ -goog.i18n.NumberFormatSymbols_de = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', +goog.i18n.NumberFormatSymbols_kn = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -1590,21 +1425,28 @@ goog.i18n.NumberFormatSymbols_de = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', + DECIMAL_PATTERN: '#,##,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'EUR' + PERCENT_PATTERN: '#,##,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', + DEF_CURRENCY_CODE: 'INR' }; /** - * Number formatting symbols for locale de_AT. + * Number formatting symbols for locale kn_IN. * @enum {string} */ -goog.i18n.NumberFormatSymbols_de_AT = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', +goog.i18n.NumberFormatSymbols_kn_IN = goog.i18n.NumberFormatSymbols_kn; + + +/** + * Number formatting symbols for locale ko. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ko = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -1615,26 +1457,26 @@ goog.i18n.NumberFormatSymbols_de_AT = { NAN: 'NaN', DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'EUR' + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'KRW' }; /** - * Number formatting symbols for locale de_BE. + * Number formatting symbols for locale ko_KR. * @enum {string} */ -goog.i18n.NumberFormatSymbols_de_BE = goog.i18n.NumberFormatSymbols_de; +goog.i18n.NumberFormatSymbols_ko_KR = goog.i18n.NumberFormatSymbols_ko; /** - * Number formatting symbols for locale de_CH. + * Number formatting symbols for locale ln. * @enum {string} */ -goog.i18n.NumberFormatSymbols_de_CH = { +goog.i18n.NumberFormatSymbols_ln = { DECIMAL_SEP: '.', - GROUP_SEP: '\'', + GROUP_SEP: ',', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -1645,84 +1487,84 @@ goog.i18n.NumberFormatSymbols_de_CH = { NAN: 'NaN', DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4-#,##0.00', - DEF_CURRENCY_CODE: 'CHF' + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'CDF' }; /** - * Number formatting symbols for locale de_DE. + * Number formatting symbols for locale ln_CD. * @enum {string} */ -goog.i18n.NumberFormatSymbols_de_DE = goog.i18n.NumberFormatSymbols_de; +goog.i18n.NumberFormatSymbols_ln_CD = goog.i18n.NumberFormatSymbols_ln; /** - * Number formatting symbols for locale de_LI. + * Number formatting symbols for locale lt. * @enum {string} */ -goog.i18n.NumberFormatSymbols_de_LI = { - DECIMAL_SEP: '.', - GROUP_SEP: '\'', +goog.i18n.NumberFormatSymbols_lt = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', + MINUS_SIGN: '\u2212', + EXP_SYMBOL: '\u00D710^', PERMILL: '\u2030', INFINITY: '\u221E', - NAN: 'NaN', + NAN: '\u00A4\u00A4\u00A4', DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'CHF' + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'LTL' }; /** - * Number formatting symbols for locale de_LU. + * Number formatting symbols for locale lt_LT. * @enum {string} */ -goog.i18n.NumberFormatSymbols_de_LU = goog.i18n.NumberFormatSymbols_de; +goog.i18n.NumberFormatSymbols_lt_LT = goog.i18n.NumberFormatSymbols_lt; /** - * Number formatting symbols for locale dv. + * Number formatting symbols for locale lv. * @enum {string} */ -goog.i18n.NumberFormatSymbols_dv = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', +goog.i18n.NumberFormatSymbols_lv = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', - MINUS_SIGN: '-', + MINUS_SIGN: '\u2212', EXP_SYMBOL: 'E', PERMILL: '\u2030', INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##,##0.###', + NAN: 'nav\u00A0skaitlis', + DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', - DEF_CURRENCY_CODE: 'MVR' + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'LVL' }; /** - * Number formatting symbols for locale dv_MV. + * Number formatting symbols for locale lv_LV. * @enum {string} */ -goog.i18n.NumberFormatSymbols_dv_MV = goog.i18n.NumberFormatSymbols_dv; +goog.i18n.NumberFormatSymbols_lv_LV = goog.i18n.NumberFormatSymbols_lv; /** - * Number formatting symbols for locale dz. + * Number formatting symbols for locale ml. * @enum {string} */ -goog.i18n.NumberFormatSymbols_dz = { +goog.i18n.NumberFormatSymbols_ml = { DECIMAL_SEP: '.', GROUP_SEP: ',', PERCENT: '%', @@ -1734,27 +1576,27 @@ goog.i18n.NumberFormatSymbols_dz = { INFINITY: '\u221E', NAN: 'NaN', DECIMAL_PATTERN: '#,##,##0.###', - SCIENTIFIC_PATTERN: '#E+00', - PERCENT_PATTERN: '#,##,##0\u00A0%', - CURRENCY_PATTERN: '\u00A4#,##,##0.00', - DEF_CURRENCY_CODE: 'BTN' + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##,##0%', + CURRENCY_PATTERN: '#,##,##0.00\u00A4', + DEF_CURRENCY_CODE: 'INR' }; /** - * Number formatting symbols for locale dz_BT. + * Number formatting symbols for locale ml_IN. * @enum {string} */ -goog.i18n.NumberFormatSymbols_dz_BT = goog.i18n.NumberFormatSymbols_dz; +goog.i18n.NumberFormatSymbols_ml_IN = goog.i18n.NumberFormatSymbols_ml; /** - * Number formatting symbols for locale ee. + * Number formatting symbols for locale mo. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ee = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', +goog.i18n.NumberFormatSymbols_mo = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -1766,23 +1608,16 @@ goog.i18n.NumberFormatSymbols_ee = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'GHC' + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'MDL' }; /** - * Number formatting symbols for locale ee_GH. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ee_GH = goog.i18n.NumberFormatSymbols_ee; - - -/** - * Number formatting symbols for locale ee_TG. + * Number formatting symbols for locale mr. * @enum {string} */ -goog.i18n.NumberFormatSymbols_ee_TG = { +goog.i18n.NumberFormatSymbols_mr = { DECIMAL_SEP: '.', GROUP_SEP: ',', PERCENT: '%', @@ -1793,49 +1628,63 @@ goog.i18n.NumberFormatSymbols_ee_TG = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', + DECIMAL_PATTERN: '#,##,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'XOF' + PERCENT_PATTERN: '#,##,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', + DEF_CURRENCY_CODE: 'INR' }; /** - * Number formatting symbols for locale el. + * Number formatting symbols for locale mr_IN. * @enum {string} */ -goog.i18n.NumberFormatSymbols_el = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', +goog.i18n.NumberFormatSymbols_mr_IN = goog.i18n.NumberFormatSymbols_mr; + + +/** + * Number formatting symbols for locale ms. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ms = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', MINUS_SIGN: '-', - EXP_SYMBOL: 'e', + EXP_SYMBOL: 'E', PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'CYP' + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'MYR' }; /** - * Number formatting symbols for locale el_CY. + * Number formatting symbols for locale ms_MY. * @enum {string} */ -goog.i18n.NumberFormatSymbols_el_CY = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', +goog.i18n.NumberFormatSymbols_ms_MY = goog.i18n.NumberFormatSymbols_ms; + + +/** + * Number formatting symbols for locale mt. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mt = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', MINUS_SIGN: '-', - EXP_SYMBOL: 'e', + EXP_SYMBOL: 'E', PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', @@ -1843,47 +1692,54 @@ goog.i18n.NumberFormatSymbols_el_CY = { SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'CYP' + DEF_CURRENCY_CODE: 'MTL' }; /** - * Number formatting symbols for locale el_GR. + * Number formatting symbols for locale mt_MT. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mt_MT = goog.i18n.NumberFormatSymbols_mt; + + +/** + * Number formatting symbols for locale nl. * @enum {string} */ -goog.i18n.NumberFormatSymbols_el_GR = { +goog.i18n.NumberFormatSymbols_nl = { DECIMAL_SEP: ',', GROUP_SEP: '.', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', MINUS_SIGN: '-', - EXP_SYMBOL: 'e', + EXP_SYMBOL: 'E', PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', DEF_CURRENCY_CODE: 'EUR' }; /** - * Number formatting symbols for locale el_POLYTON. + * Number formatting symbols for locale nl_NL. * @enum {string} */ -goog.i18n.NumberFormatSymbols_el_POLYTON = goog.i18n.NumberFormatSymbols_el; +goog.i18n.NumberFormatSymbols_nl_NL = goog.i18n.NumberFormatSymbols_nl; /** - * Number formatting symbols for locale en. + * Number formatting symbols for locale no. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', +goog.i18n.NumberFormatSymbols_no = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -1894,24 +1750,17 @@ goog.i18n.NumberFormatSymbols_en = { NAN: 'NaN', DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', - DEF_CURRENCY_CODE: 'USD' + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'NOK' }; /** - * Number formatting symbols for locale en_AS. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_en_AS = goog.i18n.NumberFormatSymbols_en; - - -/** - * Number formatting symbols for locale en_AU. + * Number formatting symbols for locale or. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_AU = { +goog.i18n.NumberFormatSymbols_or = { DECIMAL_SEP: '.', GROUP_SEP: ',', PERCENT: '%', @@ -1922,21 +1771,28 @@ goog.i18n.NumberFormatSymbols_en_AU = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', + DECIMAL_PATTERN: '#,##,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'AUD' + PERCENT_PATTERN: '#,##,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', + DEF_CURRENCY_CODE: 'INR' }; /** - * Number formatting symbols for locale en_BE. + * Number formatting symbols for locale or_IN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_or_IN = goog.i18n.NumberFormatSymbols_or; + + +/** + * Number formatting symbols for locale pl. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_BE = { +goog.i18n.NumberFormatSymbols_pl = { DECIMAL_SEP: ',', - GROUP_SEP: '.', + GROUP_SEP: '\u00A0', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -1949,17 +1805,24 @@ goog.i18n.NumberFormatSymbols_en_BE = { SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'EUR' + DEF_CURRENCY_CODE: 'PLN' }; /** - * Number formatting symbols for locale en_BW. + * Number formatting symbols for locale pl_PL. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_BW = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', +goog.i18n.NumberFormatSymbols_pl_PL = goog.i18n.NumberFormatSymbols_pl; + + +/** + * Number formatting symbols for locale pt. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_pt = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -1971,18 +1834,25 @@ goog.i18n.NumberFormatSymbols_en_BW = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'BWP' + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'BRL' }; /** - * Number formatting symbols for locale en_BZ. + * Number formatting symbols for locale pt_BR. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_BZ = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', +goog.i18n.NumberFormatSymbols_pt_BR = goog.i18n.NumberFormatSymbols_pt; + + +/** + * Number formatting symbols for locale pt_PT. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_pt_PT = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -1994,18 +1864,18 @@ goog.i18n.NumberFormatSymbols_en_BZ = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'BZD' + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'EUR' }; /** - * Number formatting symbols for locale en_CA. + * Number formatting symbols for locale ro. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_CA = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', +goog.i18n.NumberFormatSymbols_ro = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -2017,32 +1887,25 @@ goog.i18n.NumberFormatSymbols_en_CA = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', - DEF_CURRENCY_CODE: 'CAD' + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'RON' }; /** - * Number formatting symbols for locale en_Dsrt. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_en_Dsrt = goog.i18n.NumberFormatSymbols_en; - - -/** - * Number formatting symbols for locale en_Dsrt_US. + * Number formatting symbols for locale ro_RO. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_Dsrt_US = goog.i18n.NumberFormatSymbols_en; +goog.i18n.NumberFormatSymbols_ro_RO = goog.i18n.NumberFormatSymbols_ro; /** - * Number formatting symbols for locale en_GB. + * Number formatting symbols for locale ru. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_GB = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', +goog.i18n.NumberFormatSymbols_ru = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -2053,26 +1916,26 @@ goog.i18n.NumberFormatSymbols_en_GB = { NAN: 'NaN', DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'GBP' + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'RUB' }; /** - * Number formatting symbols for locale en_GU. + * Number formatting symbols for locale ru_RU. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_GU = goog.i18n.NumberFormatSymbols_en; +goog.i18n.NumberFormatSymbols_ru_RU = goog.i18n.NumberFormatSymbols_ru; /** - * Number formatting symbols for locale en_HK. + * Number formatting symbols for locale sk. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_HK = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', +goog.i18n.NumberFormatSymbols_sk = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -2084,41 +1947,55 @@ goog.i18n.NumberFormatSymbols_en_HK = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', - DEF_CURRENCY_CODE: 'HKD' + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'SKK' }; /** - * Number formatting symbols for locale en_IE. + * Number formatting symbols for locale sk_SK. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_IE = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', +goog.i18n.NumberFormatSymbols_sk_SK = goog.i18n.NumberFormatSymbols_sk; + + +/** + * Number formatting symbols for locale sl. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sl = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', MINUS_SIGN: '-', - EXP_SYMBOL: 'E', + EXP_SYMBOL: 'e', PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', DEF_CURRENCY_CODE: 'EUR' }; /** - * Number formatting symbols for locale en_IN. + * Number formatting symbols for locale sl_SI. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_IN = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', +goog.i18n.NumberFormatSymbols_sl_SI = goog.i18n.NumberFormatSymbols_sl; + + +/** + * Number formatting symbols for locale sq. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sq = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -2127,19 +2004,26 @@ goog.i18n.NumberFormatSymbols_en_IN = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##,##0.###', + DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', - DEF_CURRENCY_CODE: 'INR' + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ALL' }; /** - * Number formatting symbols for locale en_JM. + * Number formatting symbols for locale sq_AL. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sq_AL = goog.i18n.NumberFormatSymbols_sq; + + +/** + * Number formatting symbols for locale sr. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_JM = { +goog.i18n.NumberFormatSymbols_sr = { DECIMAL_SEP: '.', GROUP_SEP: ',', PERCENT: '%', @@ -2153,76 +2037,67 @@ goog.i18n.NumberFormatSymbols_en_JM = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'JMD' + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'RSD' }; /** - * Number formatting symbols for locale en_MH. + * Number formatting symbols for locale sr_Cyrl_RS. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_MH = goog.i18n.NumberFormatSymbols_en; +goog.i18n.NumberFormatSymbols_sr_Cyrl_RS = goog.i18n.NumberFormatSymbols_sr; /** - * Number formatting symbols for locale en_MP. + * Number formatting symbols for locale sr_Latn_RS. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_MP = goog.i18n.NumberFormatSymbols_en; +goog.i18n.NumberFormatSymbols_sr_Latn_RS = goog.i18n.NumberFormatSymbols_sr; /** - * Number formatting symbols for locale en_MT. + * Number formatting symbols for locale sr_RS. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_MT = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', +goog.i18n.NumberFormatSymbols_sr_RS = goog.i18n.NumberFormatSymbols_sr; + + +/** + * Number formatting symbols for locale sv. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sv = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', + MINUS_SIGN: '\u2212', + EXP_SYMBOL: '\u00D710^', PERMILL: '\u2030', INFINITY: '\u221E', - NAN: 'NaN', + NAN: '\u00A4\u00A4\u00A4', DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'MTL' + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'SEK' }; /** - * Number formatting symbols for locale en_NA. + * Number formatting symbols for locale sv_SE. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_NA = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ZAR' -}; +goog.i18n.NumberFormatSymbols_sv_SE = goog.i18n.NumberFormatSymbols_sv; /** - * Number formatting symbols for locale en_NZ. + * Number formatting symbols for locale sw. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_NZ = { +goog.i18n.NumberFormatSymbols_sw = { DECIMAL_SEP: '.', GROUP_SEP: ',', PERCENT: '%', @@ -2236,39 +2111,23 @@ goog.i18n.NumberFormatSymbols_en_NZ = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'NZD' + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'TZS' }; /** - * Number formatting symbols for locale en_PH. + * Number formatting symbols for locale sw_TZ. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_PH = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', - DEF_CURRENCY_CODE: 'PHP' -}; +goog.i18n.NumberFormatSymbols_sw_TZ = goog.i18n.NumberFormatSymbols_sw; /** - * Number formatting symbols for locale en_PK. + * Number formatting symbols for locale ta. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_PK = { +goog.i18n.NumberFormatSymbols_ta = { DECIMAL_SEP: '.', GROUP_SEP: ',', PERCENT: '%', @@ -2283,15 +2142,22 @@ goog.i18n.NumberFormatSymbols_en_PK = { SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##,##0%', CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', - DEF_CURRENCY_CODE: 'PKR' + DEF_CURRENCY_CODE: 'INR' }; /** - * Number formatting symbols for locale en_SG. + * Number formatting symbols for locale ta_IN. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_SG = { +goog.i18n.NumberFormatSymbols_ta_IN = goog.i18n.NumberFormatSymbols_ta; + + +/** + * Number formatting symbols for locale te. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_te = { DECIMAL_SEP: '.', GROUP_SEP: ',', PERCENT: '%', @@ -2302,19 +2168,26 @@ goog.i18n.NumberFormatSymbols_en_SG = { PERMILL: '\u2030', INFINITY: '\u221E', NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', + DECIMAL_PATTERN: '#,##,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', - DEF_CURRENCY_CODE: 'SGD' + PERCENT_PATTERN: '#,##,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', + DEF_CURRENCY_CODE: 'INR' }; /** - * Number formatting symbols for locale en_Shaw. + * Number formatting symbols for locale te_IN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_te_IN = goog.i18n.NumberFormatSymbols_te; + + +/** + * Number formatting symbols for locale th. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_Shaw = { +goog.i18n.NumberFormatSymbols_th = { DECIMAL_SEP: '.', GROUP_SEP: ',', PERCENT: '%', @@ -2328,16 +2201,23 @@ goog.i18n.NumberFormatSymbols_en_Shaw = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', - DEF_CURRENCY_CODE: 'GBP' + CURRENCY_PATTERN: '\u00A4#,##0.00;\u00A4-#,##0.00', + DEF_CURRENCY_CODE: 'THB' }; /** - * Number formatting symbols for locale en_TT. + * Number formatting symbols for locale th_TH. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_th_TH = goog.i18n.NumberFormatSymbols_th; + + +/** + * Number formatting symbols for locale tl. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_TT = { +goog.i18n.NumberFormatSymbols_tl = { DECIMAL_SEP: '.', GROUP_SEP: ',', PERCENT: '%', @@ -2351,39 +2231,25 @@ goog.i18n.NumberFormatSymbols_en_TT = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'TTD' + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'PHP' }; /** - * Number formatting symbols for locale en_UM. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_en_UM = goog.i18n.NumberFormatSymbols_en; - - -/** - * Number formatting symbols for locale en_US. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_en_US = goog.i18n.NumberFormatSymbols_en; - - -/** - * Number formatting symbols for locale en_VI. + * Number formatting symbols for locale tl_PH. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_VI = goog.i18n.NumberFormatSymbols_en; +goog.i18n.NumberFormatSymbols_tl_PH = goog.i18n.NumberFormatSymbols_tl; /** - * Number formatting symbols for locale en_ZA. + * Number formatting symbols for locale tr. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_ZA = { +goog.i18n.NumberFormatSymbols_tr = { DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', + GROUP_SEP: '.', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -2394,40 +2260,24 @@ goog.i18n.NumberFormatSymbols_en_ZA = { NAN: 'NaN', DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ZAR' + PERCENT_PATTERN: '%\u00A0#,##0', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'TRY' }; /** - * Number formatting symbols for locale en_ZW. + * Number formatting symbols for locale tr_TR. * @enum {string} */ -goog.i18n.NumberFormatSymbols_en_ZW = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ZWD' -}; +goog.i18n.NumberFormatSymbols_tr_TR = goog.i18n.NumberFormatSymbols_tr; /** - * Number formatting symbols for locale eo. + * Number formatting symbols for locale uk. * @enum {string} */ -goog.i18n.NumberFormatSymbols_eo = { +goog.i18n.NumberFormatSymbols_uk = { DECIMAL_SEP: ',', GROUP_SEP: '\u00A0', PERCENT: '%', @@ -2441,18 +2291,25 @@ goog.i18n.NumberFormatSymbols_eo = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'USD' + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'UAH' }; /** - * Number formatting symbols for locale es. + * Number formatting symbols for locale uk_UA. * @enum {string} */ -goog.i18n.NumberFormatSymbols_es = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', +goog.i18n.NumberFormatSymbols_uk_UA = goog.i18n.NumberFormatSymbols_uk; + + +/** + * Number formatting symbols for locale ur. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ur = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -2464,23 +2321,23 @@ goog.i18n.NumberFormatSymbols_es = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'ARS' + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'PKR' }; /** - * Number formatting symbols for locale es_AR. + * Number formatting symbols for locale ur_PK. * @enum {string} */ -goog.i18n.NumberFormatSymbols_es_AR = goog.i18n.NumberFormatSymbols_es; +goog.i18n.NumberFormatSymbols_ur_PK = goog.i18n.NumberFormatSymbols_ur; /** - * Number formatting symbols for locale es_BO. + * Number formatting symbols for locale vi. * @enum {string} */ -goog.i18n.NumberFormatSymbols_es_BO = { +goog.i18n.NumberFormatSymbols_vi = { DECIMAL_SEP: ',', GROUP_SEP: '.', PERCENT: '%', @@ -2494,41 +2351,25 @@ goog.i18n.NumberFormatSymbols_es_BO = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'BOB' + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'VND' }; /** - * Number formatting symbols for locale es_CL. + * Number formatting symbols for locale vi_VN. * @enum {string} */ -goog.i18n.NumberFormatSymbols_es_CL = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00;\u00A4-#,##0.00', - DEF_CURRENCY_CODE: 'CLP' -}; +goog.i18n.NumberFormatSymbols_vi_VN = goog.i18n.NumberFormatSymbols_vi; /** - * Number formatting symbols for locale es_CO. + * Number formatting symbols for locale zh. * @enum {string} */ -goog.i18n.NumberFormatSymbols_es_CO = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', +goog.i18n.NumberFormatSymbols_zh = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', PERCENT: '%', ZERO_DIGIT: '0', PLUS_SIGN: '+', @@ -2540,39 +2381,23 @@ goog.i18n.NumberFormatSymbols_es_CO = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'COP' + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'CNY' }; /** - * Number formatting symbols for locale es_CR. + * Number formatting symbols for locale zh_CN. * @enum {string} */ -goog.i18n.NumberFormatSymbols_es_CR = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'CRC' -}; +goog.i18n.NumberFormatSymbols_zh_CN = goog.i18n.NumberFormatSymbols_zh; /** - * Number formatting symbols for locale es_DO. + * Number formatting symbols for locale zh_HK. * @enum {string} */ -goog.i18n.NumberFormatSymbols_es_DO = { +goog.i18n.NumberFormatSymbols_zh_HK = { DECIMAL_SEP: '.', GROUP_SEP: ',', PERCENT: '%', @@ -2586,62 +2411,30 @@ goog.i18n.NumberFormatSymbols_es_DO = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'DOP' + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'HKD' }; /** - * Number formatting symbols for locale es_EC. + * Number formatting symbols for locale zh_Hans. * @enum {string} */ -goog.i18n.NumberFormatSymbols_es_EC = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00;\u00A4-#,##0.00', - DEF_CURRENCY_CODE: 'USD' -}; +goog.i18n.NumberFormatSymbols_zh_Hans = goog.i18n.NumberFormatSymbols_zh; /** - * Number formatting symbols for locale es_ES. + * Number formatting symbols for locale zh_Hans_CN. * @enum {string} */ -goog.i18n.NumberFormatSymbols_es_ES = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'EUR' -}; +goog.i18n.NumberFormatSymbols_zh_Hans_CN = goog.i18n.NumberFormatSymbols_zh; /** - * Number formatting symbols for locale es_GT. + * Number formatting symbols for locale zh_TW. * @enum {string} */ -goog.i18n.NumberFormatSymbols_es_GT = { +goog.i18n.NumberFormatSymbols_zh_TW = { DECIMAL_SEP: '.', GROUP_SEP: ',', PERCENT: '%', @@ -2655,7637 +2448,606 @@ goog.i18n.NumberFormatSymbols_es_GT = { DECIMAL_PATTERN: '#,##0.###', SCIENTIFIC_PATTERN: '#E0', PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'GTQ' -}; - - -/** - * Number formatting symbols for locale es_HN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_es_HN = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'HNL' -}; - - -/** - * Number formatting symbols for locale es_MX. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_es_MX = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'MXN' -}; - - -/** - * Number formatting symbols for locale es_NI. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_es_NI = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'NIO' -}; - - -/** - * Number formatting symbols for locale es_PA. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_es_PA = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'PAB' -}; - - -/** - * Number formatting symbols for locale es_PE. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_es_PE = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'PEN' -}; - - -/** - * Number formatting symbols for locale es_PR. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_es_PR = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'USD' -}; - - -/** - * Number formatting symbols for locale es_PY. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_es_PY = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0-#,##0.00', - DEF_CURRENCY_CODE: 'PYG' -}; - - -/** - * Number formatting symbols for locale es_SV. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_es_SV = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'SVC' -}; - - -/** - * Number formatting symbols for locale es_US. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_es_US = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'USD' -}; - - -/** - * Number formatting symbols for locale es_UY. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_es_UY = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;(\u00A4\u00A0#,##0.00)', - DEF_CURRENCY_CODE: 'UYU' -}; - - -/** - * Number formatting symbols for locale es_VE. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_es_VE = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00;\u00A4-#,##0.00', - DEF_CURRENCY_CODE: 'VEB' -}; - - -/** - * Number formatting symbols for locale et. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_et = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '\u2212', - EXP_SYMBOL: '\u00D710^', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: '\u00A4\u00A4\u00A4', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'EEK' -}; - - -/** - * Number formatting symbols for locale et_EE. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_et_EE = goog.i18n.NumberFormatSymbols_et; - - -/** - * Number formatting symbols for locale eu. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_eu = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale eu_ES. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_eu_ES = goog.i18n.NumberFormatSymbols_eu; - - -/** - * Number formatting symbols for locale fa. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_fa = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '\u2212', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###;\'\u202A\'-#,##0.###\'\u202C\'', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '\'\u202A\'%#,##0\'\u202C\'', - CURRENCY_PATTERN: - '#,##0.00\u00A0\u00A4;\'\u202A\'-#,##0.00\'\u202C\'\u00A0\u00A4', - DEF_CURRENCY_CODE: 'AFN' -}; - - -/** - * Number formatting symbols for locale fa_AF. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_fa_AF = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '\u2212', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###;\'\u202A\'-#,##0.###\'\u202C\'', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '\'\u202A\'#,##0%\'\u202C\'', - CURRENCY_PATTERN: - '#,##0.00\u00A0\u00A4;\'\u202A\'-#,##0.00\'\u202C\'\u00A0\u00A4', - DEF_CURRENCY_CODE: 'AFN' -}; - - -/** - * Number formatting symbols for locale fa_IR. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_fa_IR = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '\u2212', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###;\'\u202A\'-#,##0.###\'\u202C\'', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '\'\u202A\'%#,##0\'\u202C\'', - CURRENCY_PATTERN: - '#,##0.00\u00A0\u00A4;\'\u202A\'-#,##0.00\'\u202C\'\u00A0\u00A4', - DEF_CURRENCY_CODE: 'IRR' -}; - - -/** - * Number formatting symbols for locale fi. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_fi = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'ep\u00E4luku', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale fi_FI. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_fi_FI = goog.i18n.NumberFormatSymbols_fi; - - -/** - * Number formatting symbols for locale fil. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_fil = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'PHP' -}; - - -/** - * Number formatting symbols for locale fil_PH. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_fil_PH = goog.i18n.NumberFormatSymbols_fil; - - -/** - * Number formatting symbols for locale fo. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_fo = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '\u2212', - EXP_SYMBOL: '\u00D710^', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: '\u00A4\u00A4\u00A4', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '\u00A4#,##0.00;\u00A4-#,##0.00', - DEF_CURRENCY_CODE: 'DKK' -}; - - -/** - * Number formatting symbols for locale fo_FO. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_fo_FO = goog.i18n.NumberFormatSymbols_fo; - - -/** - * Number formatting symbols for locale fr. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_fr = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale fr_BE. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_fr_BE = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale fr_CA. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_fr_CA = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4;(#,##0.00\u00A0\u00A4)', - DEF_CURRENCY_CODE: 'CAD' -}; - - -/** - * Number formatting symbols for locale fr_CH. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_fr_CH = { - DECIMAL_SEP: '.', - GROUP_SEP: '\'', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4-#,##0.00', - DEF_CURRENCY_CODE: 'CHF' -}; - - -/** - * Number formatting symbols for locale fr_FR. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_fr_FR = goog.i18n.NumberFormatSymbols_fr; - - -/** - * Number formatting symbols for locale fr_LU. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_fr_LU = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale fr_MC. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_fr_MC = goog.i18n.NumberFormatSymbols_fr; - - -/** - * Number formatting symbols for locale fr_SN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_fr_SN = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'XOF' -}; - - -/** - * Number formatting symbols for locale fur. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_fur = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale fur_IT. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_fur_IT = goog.i18n.NumberFormatSymbols_fur; - - -/** - * Number formatting symbols for locale ga. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ga = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale ga_IE. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ga_IE = goog.i18n.NumberFormatSymbols_ga; - - -/** - * Number formatting symbols for locale gaa. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_gaa = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'GHC' -}; - - -/** - * Number formatting symbols for locale gaa_GH. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_gaa_GH = goog.i18n.NumberFormatSymbols_gaa; - - -/** - * Number formatting symbols for locale gez. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_gez = { - DECIMAL_SEP: '.', - GROUP_SEP: '\u12C8', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ERN' -}; - - -/** - * Number formatting symbols for locale gez_ER. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_gez_ER = goog.i18n.NumberFormatSymbols_gez; - - -/** - * Number formatting symbols for locale gez_ET. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_gez_ET = { - DECIMAL_SEP: '.', - GROUP_SEP: '\u12C8', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ETB' -}; - - -/** - * Number formatting symbols for locale gl. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_gl = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale gl_ES. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_gl_ES = goog.i18n.NumberFormatSymbols_gl; - - -/** - * Number formatting symbols for locale gsw. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_gsw = { - DECIMAL_SEP: '.', - GROUP_SEP: '\u2019', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '\u2212', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'CHF' -}; - - -/** - * Number formatting symbols for locale gsw_CH. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_gsw_CH = goog.i18n.NumberFormatSymbols_gsw; - - -/** - * Number formatting symbols for locale gu. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_gu = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', - DEF_CURRENCY_CODE: 'INR' -}; - - -/** - * Number formatting symbols for locale gu_IN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_gu_IN = goog.i18n.NumberFormatSymbols_gu; - - -/** - * Number formatting symbols for locale gv. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_gv = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'GBP' -}; - - -/** - * Number formatting symbols for locale gv_GB. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_gv_GB = goog.i18n.NumberFormatSymbols_gv; - - -/** - * Number formatting symbols for locale ha. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ha = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'NGN' -}; - - -/** - * Number formatting symbols for locale ha_Arab. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ha_Arab = goog.i18n.NumberFormatSymbols_ha; - - -/** - * Number formatting symbols for locale ha_Arab_NG. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ha_Arab_NG = goog.i18n.NumberFormatSymbols_ha; - - -/** - * Number formatting symbols for locale ha_Arab_SD. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ha_Arab_SD = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'SDD' -}; - - -/** - * Number formatting symbols for locale ha_GH. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ha_GH = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'GHC' -}; - - -/** - * Number formatting symbols for locale ha_Latn. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ha_Latn = goog.i18n.NumberFormatSymbols_ha; - - -/** - * Number formatting symbols for locale ha_Latn_GH. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ha_Latn_GH = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'GHC' -}; - - -/** - * Number formatting symbols for locale ha_Latn_NE. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ha_Latn_NE = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'XOF' -}; - - -/** - * Number formatting symbols for locale ha_Latn_NG. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ha_Latn_NG = goog.i18n.NumberFormatSymbols_ha; - - -/** - * Number formatting symbols for locale ha_NE. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ha_NE = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'XOF' -}; - - -/** - * Number formatting symbols for locale ha_NG. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ha_NG = goog.i18n.NumberFormatSymbols_ha; - - -/** - * Number formatting symbols for locale ha_SD. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ha_SD = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'SDD' -}; - - -/** - * Number formatting symbols for locale haw. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_haw = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', - DEF_CURRENCY_CODE: 'USD' -}; - - -/** - * Number formatting symbols for locale haw_US. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_haw_US = goog.i18n.NumberFormatSymbols_haw; - - -/** - * Number formatting symbols for locale he. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_he = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'ILS' -}; - - -/** - * Number formatting symbols for locale he_IL. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_he_IL = goog.i18n.NumberFormatSymbols_he; - - -/** - * Number formatting symbols for locale hi. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_hi = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', - DEF_CURRENCY_CODE: 'INR' -}; - - -/** - * Number formatting symbols for locale hi_IN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_hi_IN = goog.i18n.NumberFormatSymbols_hi; - - -/** - * Number formatting symbols for locale hr. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_hr = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'HRK' -}; - - -/** - * Number formatting symbols for locale hr_HR. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_hr_HR = goog.i18n.NumberFormatSymbols_hr; - - -/** - * Number formatting symbols for locale hu. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_hu = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'HUF' -}; - - -/** - * Number formatting symbols for locale hu_HU. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_hu_HU = goog.i18n.NumberFormatSymbols_hu; - - -/** - * Number formatting symbols for locale hy. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_hy = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#0%', - CURRENCY_PATTERN: '#0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'AMD' -}; - - -/** - * Number formatting symbols for locale hy_AM. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_hy_AM = goog.i18n.NumberFormatSymbols_hy; - - -/** - * Number formatting symbols for locale ia. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ia = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'USD' -}; - - -/** - * Number formatting symbols for locale id. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_id = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'IDR' -}; - - -/** - * Number formatting symbols for locale id_ID. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_id_ID = goog.i18n.NumberFormatSymbols_id; - - -/** - * Number formatting symbols for locale ig. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ig = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'NGN' -}; - - -/** - * Number formatting symbols for locale ig_NG. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ig_NG = goog.i18n.NumberFormatSymbols_ig; - - -/** - * Number formatting symbols for locale ii. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ii = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'CNY' -}; - - -/** - * Number formatting symbols for locale ii_CN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ii_CN = goog.i18n.NumberFormatSymbols_ii; - - -/** - * Number formatting symbols for locale in. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_in = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'IDR' -}; - - -/** - * Number formatting symbols for locale is. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_is = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '\u2212', - EXP_SYMBOL: '\u00D710^', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'EiTa', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'ISK' -}; - - -/** - * Number formatting symbols for locale is_IS. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_is_IS = goog.i18n.NumberFormatSymbols_is; - - -/** - * Number formatting symbols for locale it. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_it = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'CHF' -}; - - -/** - * Number formatting symbols for locale it_CH. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_it_CH = { - DECIMAL_SEP: '.', - GROUP_SEP: '\'', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4-#,##0.00', - DEF_CURRENCY_CODE: 'CHF' -}; - - -/** - * Number formatting symbols for locale it_IT. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_it_IT = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale iu. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_iu = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'CAD' -}; - - -/** - * Number formatting symbols for locale iw. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_iw = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'ILS' -}; - - -/** - * Number formatting symbols for locale ja. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ja = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'JPY' -}; - - -/** - * Number formatting symbols for locale ja_JP. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ja_JP = goog.i18n.NumberFormatSymbols_ja; - - -/** - * Number formatting symbols for locale ka. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ka = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'GEL' -}; - - -/** - * Number formatting symbols for locale ka_GE. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ka_GE = goog.i18n.NumberFormatSymbols_ka; - - -/** - * Number formatting symbols for locale kaj. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kaj = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'NGN' -}; - - -/** - * Number formatting symbols for locale kaj_NG. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kaj_NG = goog.i18n.NumberFormatSymbols_kaj; - - -/** - * Number formatting symbols for locale kam. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kam = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'KES' -}; - - -/** - * Number formatting symbols for locale kam_KE. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kam_KE = goog.i18n.NumberFormatSymbols_kam; - - -/** - * Number formatting symbols for locale kcg. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kcg = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'NGN' -}; - - -/** - * Number formatting symbols for locale kcg_NG. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kcg_NG = goog.i18n.NumberFormatSymbols_kcg; - - -/** - * Number formatting symbols for locale kfo. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kfo = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'NGN' -}; - - -/** - * Number formatting symbols for locale kfo_CI. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kfo_CI = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'XOF' -}; - - -/** - * Number formatting symbols for locale kk. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kk = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'KZT' -}; - - -/** - * Number formatting symbols for locale kk_Cyrl. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kk_Cyrl = goog.i18n.NumberFormatSymbols_kk; - - -/** - * Number formatting symbols for locale kk_Cyrl_KZ. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kk_Cyrl_KZ = goog.i18n.NumberFormatSymbols_kk; - - -/** - * Number formatting symbols for locale kk_KZ. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kk_KZ = goog.i18n.NumberFormatSymbols_kk; - - -/** - * Number formatting symbols for locale kl. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kl = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00;\u00A4-#,##0.00', - DEF_CURRENCY_CODE: 'DKK' -}; - - -/** - * Number formatting symbols for locale kl_GL. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kl_GL = goog.i18n.NumberFormatSymbols_kl; - - -/** - * Number formatting symbols for locale km. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_km = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A4', - DEF_CURRENCY_CODE: 'KHR' -}; - - -/** - * Number formatting symbols for locale km_KH. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_km_KH = goog.i18n.NumberFormatSymbols_km; - - -/** - * Number formatting symbols for locale kn. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kn = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', - DEF_CURRENCY_CODE: 'INR' -}; - - -/** - * Number formatting symbols for locale kn_IN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kn_IN = goog.i18n.NumberFormatSymbols_kn; - - -/** - * Number formatting symbols for locale ko. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ko = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'KPW' -}; - - -/** - * Number formatting symbols for locale ko_KR. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ko_KR = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'KRW' -}; - - -/** - * Number formatting symbols for locale kok. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kok = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', - DEF_CURRENCY_CODE: 'INR' -}; - - -/** - * Number formatting symbols for locale kok_IN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kok_IN = goog.i18n.NumberFormatSymbols_kok; - - -/** - * Number formatting symbols for locale kpe. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kpe = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'GNF' -}; - - -/** - * Number formatting symbols for locale kpe_GN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kpe_GN = goog.i18n.NumberFormatSymbols_kpe; - - -/** - * Number formatting symbols for locale kpe_LR. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kpe_LR = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'LRD' -}; - - -/** - * Number formatting symbols for locale ku. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ku = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'IQD' -}; - - -/** - * Number formatting symbols for locale ku_Arab. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ku_Arab = goog.i18n.NumberFormatSymbols_ku; - - -/** - * Number formatting symbols for locale ku_Arab_IQ. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ku_Arab_IQ = goog.i18n.NumberFormatSymbols_ku; - - -/** - * Number formatting symbols for locale ku_Arab_IR. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ku_Arab_IR = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'IRR' -}; - - -/** - * Number formatting symbols for locale ku_Arab_SY. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ku_Arab_SY = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'SYP' -}; - - -/** - * Number formatting symbols for locale ku_IQ. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ku_IQ = goog.i18n.NumberFormatSymbols_ku; - - -/** - * Number formatting symbols for locale ku_IR. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ku_IR = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'IRR' -}; - - -/** - * Number formatting symbols for locale ku_Latn. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ku_Latn = goog.i18n.NumberFormatSymbols_ku; - - -/** - * Number formatting symbols for locale ku_Latn_TR. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ku_Latn_TR = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'TRY' -}; - - -/** - * Number formatting symbols for locale ku_SY. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ku_SY = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'SYP' -}; - - -/** - * Number formatting symbols for locale ku_TR. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ku_TR = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'TRY' -}; - - -/** - * Number formatting symbols for locale kw. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kw = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'GBP' -}; - - -/** - * Number formatting symbols for locale kw_GB. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_kw_GB = goog.i18n.NumberFormatSymbols_kw; - - -/** - * Number formatting symbols for locale ky. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ky = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'KGS' -}; - - -/** - * Number formatting symbols for locale ky_KG. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ky_KG = goog.i18n.NumberFormatSymbols_ky; - - -/** - * Number formatting symbols for locale ln. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ln = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'CDF' -}; - - -/** - * Number formatting symbols for locale ln_CD. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ln_CD = goog.i18n.NumberFormatSymbols_ln; - - -/** - * Number formatting symbols for locale ln_CG. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ln_CG = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'XAF' -}; - - -/** - * Number formatting symbols for locale lo. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_lo = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00;\u00A4-#,##0.00', - DEF_CURRENCY_CODE: 'LAK' -}; - - -/** - * Number formatting symbols for locale lo_LA. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_lo_LA = goog.i18n.NumberFormatSymbols_lo; - - -/** - * Number formatting symbols for locale lt. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_lt = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '\u2212', - EXP_SYMBOL: '\u00D710^', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: '\u00A4\u00A4\u00A4', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'LTL' -}; - - -/** - * Number formatting symbols for locale lt_LT. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_lt_LT = goog.i18n.NumberFormatSymbols_lt; - - -/** - * Number formatting symbols for locale lv. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_lv = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '\u2212', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'nav\u00A0skaitlis', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'LVL' -}; - - -/** - * Number formatting symbols for locale lv_LV. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_lv_LV = goog.i18n.NumberFormatSymbols_lv; - - -/** - * Number formatting symbols for locale mk. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_mk = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###;(#,##0.###)', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'MKD' -}; - - -/** - * Number formatting symbols for locale mk_MK. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_mk_MK = goog.i18n.NumberFormatSymbols_mk; - - -/** - * Number formatting symbols for locale ml. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ml = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##,##0%', - CURRENCY_PATTERN: '#,##,##0.00\u00A4', - DEF_CURRENCY_CODE: 'INR' -}; - - -/** - * Number formatting symbols for locale ml_IN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ml_IN = goog.i18n.NumberFormatSymbols_ml; - - -/** - * Number formatting symbols for locale mn. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_mn = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'MNT' -}; - - -/** - * Number formatting symbols for locale mn_CN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_mn_CN = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'CNY' -}; - - -/** - * Number formatting symbols for locale mn_Cyrl. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_mn_Cyrl = goog.i18n.NumberFormatSymbols_mn; - - -/** - * Number formatting symbols for locale mn_Cyrl_MN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_mn_Cyrl_MN = goog.i18n.NumberFormatSymbols_mn; - - -/** - * Number formatting symbols for locale mn_MN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_mn_MN = goog.i18n.NumberFormatSymbols_mn; - - -/** - * Number formatting symbols for locale mn_Mong. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_mn_Mong = goog.i18n.NumberFormatSymbols_mn; - - -/** - * Number formatting symbols for locale mn_Mong_CN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_mn_Mong_CN = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'CNY' -}; - - -/** - * Number formatting symbols for locale mo. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_mo = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'MDL' -}; - - -/** - * Number formatting symbols for locale mr. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_mr = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', - DEF_CURRENCY_CODE: 'INR' -}; - - -/** - * Number formatting symbols for locale mr_IN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_mr_IN = goog.i18n.NumberFormatSymbols_mr; - - -/** - * Number formatting symbols for locale ms. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ms = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', - DEF_CURRENCY_CODE: 'AUD' -}; - - -/** - * Number formatting symbols for locale ms_BN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ms_BN = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'BND' -}; - - -/** - * Number formatting symbols for locale ms_MY. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ms_MY = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', - DEF_CURRENCY_CODE: 'MYR' -}; - - -/** - * Number formatting symbols for locale mt. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_mt = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'MTL' -}; - - -/** - * Number formatting symbols for locale mt_MT. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_mt_MT = goog.i18n.NumberFormatSymbols_mt; - - -/** - * Number formatting symbols for locale my. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_my = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'MMK' -}; - - -/** - * Number formatting symbols for locale my_MM. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_my_MM = goog.i18n.NumberFormatSymbols_my; - - -/** - * Number formatting symbols for locale nb. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_nb = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'NOK' -}; - - -/** - * Number formatting symbols for locale nb_NO. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_nb_NO = goog.i18n.NumberFormatSymbols_nb; - - -/** - * Number formatting symbols for locale nds. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_nds = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale nds_DE. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_nds_DE = goog.i18n.NumberFormatSymbols_nds; - - -/** - * Number formatting symbols for locale ne. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ne = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'NPR' -}; - - -/** - * Number formatting symbols for locale ne_IN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ne_IN = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'INR' -}; - - -/** - * Number formatting symbols for locale ne_NP. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ne_NP = goog.i18n.NumberFormatSymbols_ne; - - -/** - * Number formatting symbols for locale nl. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_nl = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale nl_BE. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_nl_BE = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale nl_NL. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_nl_NL = goog.i18n.NumberFormatSymbols_nl; - - -/** - * Number formatting symbols for locale nn. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_nn = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '\u2212', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'NOK' -}; - - -/** - * Number formatting symbols for locale nn_NO. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_nn_NO = goog.i18n.NumberFormatSymbols_nn; - - -/** - * Number formatting symbols for locale no. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_no = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'NOK' -}; - - -/** - * Number formatting symbols for locale nr. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_nr = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ZAR' -}; - - -/** - * Number formatting symbols for locale nr_ZA. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_nr_ZA = goog.i18n.NumberFormatSymbols_nr; - - -/** - * Number formatting symbols for locale nso. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_nso = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ZAR' -}; - - -/** - * Number formatting symbols for locale nso_ZA. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_nso_ZA = goog.i18n.NumberFormatSymbols_nso; - - -/** - * Number formatting symbols for locale ny. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ny = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'MWK' -}; - - -/** - * Number formatting symbols for locale ny_MW. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ny_MW = goog.i18n.NumberFormatSymbols_ny; - - -/** - * Number formatting symbols for locale oc. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_oc = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale oc_FR. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_oc_FR = goog.i18n.NumberFormatSymbols_oc; - - -/** - * Number formatting symbols for locale om. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_om = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ETB' -}; - - -/** - * Number formatting symbols for locale om_ET. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_om_ET = goog.i18n.NumberFormatSymbols_om; - - -/** - * Number formatting symbols for locale om_KE. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_om_KE = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'KES' -}; - - -/** - * Number formatting symbols for locale or. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_or = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', - DEF_CURRENCY_CODE: 'INR' -}; - - -/** - * Number formatting symbols for locale or_IN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_or_IN = goog.i18n.NumberFormatSymbols_or; - - -/** - * Number formatting symbols for locale pa. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_pa = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', - DEF_CURRENCY_CODE: 'PKR' -}; - - -/** - * Number formatting symbols for locale pa_Arab. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_pa_Arab = goog.i18n.NumberFormatSymbols_pa; - - -/** - * Number formatting symbols for locale pa_Arab_PK. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_pa_Arab_PK = goog.i18n.NumberFormatSymbols_pa; - - -/** - * Number formatting symbols for locale pa_Guru. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_pa_Guru = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', - DEF_CURRENCY_CODE: 'INR' -}; - - -/** - * Number formatting symbols for locale pa_Guru_IN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_pa_Guru_IN = - goog.i18n.NumberFormatSymbols_pa_Guru; - - -/** - * Number formatting symbols for locale pa_IN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_pa_IN = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', - DEF_CURRENCY_CODE: 'INR' -}; - - -/** - * Number formatting symbols for locale pa_PK. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_pa_PK = goog.i18n.NumberFormatSymbols_pa; - - -/** - * Number formatting symbols for locale pl. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_pl = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'PLN' -}; - - -/** - * Number formatting symbols for locale pl_PL. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_pl_PL = goog.i18n.NumberFormatSymbols_pl; - - -/** - * Number formatting symbols for locale ps. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ps = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '\u2212', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'AFN' -}; - - -/** - * Number formatting symbols for locale ps_AF. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ps_AF = goog.i18n.NumberFormatSymbols_ps; - - -/** - * Number formatting symbols for locale pt. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_pt = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', - DEF_CURRENCY_CODE: 'AOA' -}; - - -/** - * Number formatting symbols for locale pt_BR. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_pt_BR = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', - DEF_CURRENCY_CODE: 'BRL' -}; - - -/** - * Number formatting symbols for locale pt_PT. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_pt_PT = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale ro. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ro = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'MDL' -}; - - -/** - * Number formatting symbols for locale ro_MD. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ro_MD = goog.i18n.NumberFormatSymbols_ro; - - -/** - * Number formatting symbols for locale ro_RO. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ro_RO = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'RON' -}; - - -/** - * Number formatting symbols for locale ru. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ru = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'BYR' -}; - - -/** - * Number formatting symbols for locale ru_RU. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ru_RU = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'RUB' -}; - - -/** - * Number formatting symbols for locale ru_UA. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ru_UA = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'UAH' -}; - - -/** - * Number formatting symbols for locale rw. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_rw = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'RWF' -}; - - -/** - * Number formatting symbols for locale rw_RW. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_rw_RW = goog.i18n.NumberFormatSymbols_rw; - - -/** - * Number formatting symbols for locale sa. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sa = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##,##0%', - CURRENCY_PATTERN: '\u00A4#,##,##0.00', - DEF_CURRENCY_CODE: 'INR' -}; - - -/** - * Number formatting symbols for locale sa_IN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sa_IN = goog.i18n.NumberFormatSymbols_sa; - - -/** - * Number formatting symbols for locale se. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_se = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '\u2212', - EXP_SYMBOL: '\u00D710^', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: '\u00A4\u00A4\u00A4', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale se_FI. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_se_FI = goog.i18n.NumberFormatSymbols_se; - - -/** - * Number formatting symbols for locale se_NO. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_se_NO = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '\u2212', - EXP_SYMBOL: '\u00D710^', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: '\u00A4\u00A4\u00A4', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'NOK' -}; - - -/** - * Number formatting symbols for locale sh. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sh = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'RSD' -}; - - -/** - * Number formatting symbols for locale sh_BA. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sh_BA = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'BAM' -}; - - -/** - * Number formatting symbols for locale sh_CS. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sh_CS = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale sh_YU. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sh_YU = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'YUM' -}; - - -/** - * Number formatting symbols for locale si. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_si = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##,##0%', - CURRENCY_PATTERN: '\u00A4#,##,##0.00;(\u00A4#,##,##0.00)', - DEF_CURRENCY_CODE: 'LKR' -}; - - -/** - * Number formatting symbols for locale si_LK. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_si_LK = goog.i18n.NumberFormatSymbols_si; - - -/** - * Number formatting symbols for locale sid. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sid = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ETB' -}; - - -/** - * Number formatting symbols for locale sid_ET. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sid_ET = goog.i18n.NumberFormatSymbols_sid; - - -/** - * Number formatting symbols for locale sk. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sk = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'SKK' -}; - - -/** - * Number formatting symbols for locale sk_SK. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sk_SK = goog.i18n.NumberFormatSymbols_sk; - - -/** - * Number formatting symbols for locale sl. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sl = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'e', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale sl_SI. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sl_SI = goog.i18n.NumberFormatSymbols_sl; - - -/** - * Number formatting symbols for locale so. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_so = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'DJF' -}; - - -/** - * Number formatting symbols for locale so_DJ. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_so_DJ = goog.i18n.NumberFormatSymbols_so; - - -/** - * Number formatting symbols for locale so_ET. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_so_ET = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ETB' -}; - - -/** - * Number formatting symbols for locale so_KE. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_so_KE = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'KES' -}; - - -/** - * Number formatting symbols for locale so_SO. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_so_SO = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'SOS' -}; - - -/** - * Number formatting symbols for locale sq. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sq = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'MKD' -}; - - -/** - * Number formatting symbols for locale sq_AL. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sq_AL = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ALL' -}; - - -/** - * Number formatting symbols for locale sr. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sr = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'BAM' -}; - - -/** - * Number formatting symbols for locale sr_BA. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sr_BA = goog.i18n.NumberFormatSymbols_sr; - - -/** - * Number formatting symbols for locale sr_CS. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sr_CS = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale sr_Cyrl. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sr_Cyrl = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale sr_Cyrl_BA. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sr_Cyrl_BA = goog.i18n.NumberFormatSymbols_sr; - - -/** - * Number formatting symbols for locale sr_Cyrl_CS. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sr_Cyrl_CS = - goog.i18n.NumberFormatSymbols_sr_Cyrl; - - -/** - * Number formatting symbols for locale sr_Cyrl_ME. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sr_Cyrl_ME = - goog.i18n.NumberFormatSymbols_sr_Cyrl; - - -/** - * Number formatting symbols for locale sr_Cyrl_RS. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sr_Cyrl_RS = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'USD' -}; - - -/** - * Number formatting symbols for locale sr_Cyrl_YU. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sr_Cyrl_YU = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'YUM' -}; - - -/** - * Number formatting symbols for locale sr_Latn. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sr_Latn = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'USD' -}; - - -/** - * Number formatting symbols for locale sr_Latn_BA. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sr_Latn_BA = goog.i18n.NumberFormatSymbols_sr; - - -/** - * Number formatting symbols for locale sr_Latn_CS. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sr_Latn_CS = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale sr_Latn_ME. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sr_Latn_ME = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale sr_Latn_RS. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sr_Latn_RS = - goog.i18n.NumberFormatSymbols_sr_Latn; - - -/** - * Number formatting symbols for locale sr_Latn_YU. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sr_Latn_YU = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'YUM' -}; - - -/** - * Number formatting symbols for locale sr_ME. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sr_ME = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale sr_RS. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sr_RS = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'USD' -}; - - -/** - * Number formatting symbols for locale sr_YU. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sr_YU = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'YUM' -}; - - -/** - * Number formatting symbols for locale ss. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ss = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ZAR' -}; - - -/** - * Number formatting symbols for locale ss_SZ. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ss_SZ = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'SZL' -}; - - -/** - * Number formatting symbols for locale ss_ZA. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ss_ZA = goog.i18n.NumberFormatSymbols_ss; - - -/** - * Number formatting symbols for locale st. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_st = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ZAR' -}; - - -/** - * Number formatting symbols for locale st_LS. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_st_LS = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'LSL' -}; - - -/** - * Number formatting symbols for locale st_ZA. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_st_ZA = goog.i18n.NumberFormatSymbols_st; - - -/** - * Number formatting symbols for locale sv. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sv = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '\u2212', - EXP_SYMBOL: '\u00D710^', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: '\u00A4\u00A4\u00A4', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'EUR' -}; - - -/** - * Number formatting symbols for locale sv_FI. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sv_FI = goog.i18n.NumberFormatSymbols_sv; - - -/** - * Number formatting symbols for locale sv_SE. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sv_SE = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '\u2212', - EXP_SYMBOL: '\u00D710^', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: '\u00A4\u00A4\u00A4', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0\u00A0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'SEK' -}; - - -/** - * Number formatting symbols for locale sw. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sw = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'KES' -}; - - -/** - * Number formatting symbols for locale sw_KE. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sw_KE = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'KES' -}; - - -/** - * Number formatting symbols for locale sw_TZ. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_sw_TZ = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'TZS' -}; - - -/** - * Number formatting symbols for locale syr. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_syr = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###;#,##0.###-', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', - DEF_CURRENCY_CODE: 'SYP' -}; - - -/** - * Number formatting symbols for locale syr_SY. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_syr_SY = goog.i18n.NumberFormatSymbols_syr; - - -/** - * Number formatting symbols for locale ta. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ta = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', - DEF_CURRENCY_CODE: 'INR' -}; - - -/** - * Number formatting symbols for locale ta_IN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ta_IN = goog.i18n.NumberFormatSymbols_ta; - - -/** - * Number formatting symbols for locale te. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_te = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', - DEF_CURRENCY_CODE: 'INR' -}; - - -/** - * Number formatting symbols for locale te_IN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_te_IN = goog.i18n.NumberFormatSymbols_te; - - -/** - * Number formatting symbols for locale tg. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_tg = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'TJS' -}; - - -/** - * Number formatting symbols for locale tg_Cyrl. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_tg_Cyrl = goog.i18n.NumberFormatSymbols_tg; - - -/** - * Number formatting symbols for locale tg_Cyrl_TJ. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_tg_Cyrl_TJ = goog.i18n.NumberFormatSymbols_tg; - - -/** - * Number formatting symbols for locale tg_TJ. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_tg_TJ = goog.i18n.NumberFormatSymbols_tg; - - -/** - * Number formatting symbols for locale th. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_th = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00;\u00A4-#,##0.00', - DEF_CURRENCY_CODE: 'THB' -}; - - -/** - * Number formatting symbols for locale th_TH. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_th_TH = goog.i18n.NumberFormatSymbols_th; - - -/** - * Number formatting symbols for locale ti. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ti = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ERN' -}; - - -/** - * Number formatting symbols for locale ti_ER. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ti_ER = goog.i18n.NumberFormatSymbols_ti; - - -/** - * Number formatting symbols for locale ti_ET. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ti_ET = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ETB' -}; - - -/** - * Number formatting symbols for locale tig. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_tig = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ERN' -}; - - -/** - * Number formatting symbols for locale tig_ER. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_tig_ER = goog.i18n.NumberFormatSymbols_tig; - - -/** - * Number formatting symbols for locale tl. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_tl = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'PHP' -}; - - -/** - * Number formatting symbols for locale tl_PH. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_tl_PH = goog.i18n.NumberFormatSymbols_tl; - - -/** - * Number formatting symbols for locale tn. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_tn = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'BWP' -}; - - -/** - * Number formatting symbols for locale tn_ZA. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_tn_ZA = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ZAR' -}; - - -/** - * Number formatting symbols for locale to. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_to = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'TOP' -}; - - -/** - * Number formatting symbols for locale to_TO. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_to_TO = goog.i18n.NumberFormatSymbols_to; - - -/** - * Number formatting symbols for locale tr. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_tr = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '%\u00A0#,##0', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'CYP' -}; - - -/** - * Number formatting symbols for locale tr_TR. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_tr_TR = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '%\u00A0#,##0', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'TRY' -}; - - -/** - * Number formatting symbols for locale trv. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_trv = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'TWD' -}; - - -/** - * Number formatting symbols for locale trv_TW. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_trv_TW = goog.i18n.NumberFormatSymbols_trv; - - -/** - * Number formatting symbols for locale ts. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ts = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ZAR' -}; - - -/** - * Number formatting symbols for locale ts_ZA. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ts_ZA = goog.i18n.NumberFormatSymbols_ts; - - -/** - * Number formatting symbols for locale tt. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_tt = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A4', - DEF_CURRENCY_CODE: 'RUB' -}; - - -/** - * Number formatting symbols for locale tt_RU. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_tt_RU = goog.i18n.NumberFormatSymbols_tt; - - -/** - * Number formatting symbols for locale ug. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ug = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'CNY' -}; - - -/** - * Number formatting symbols for locale ug_Arab. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ug_Arab = goog.i18n.NumberFormatSymbols_ug; - - -/** - * Number formatting symbols for locale ug_Arab_CN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ug_Arab_CN = goog.i18n.NumberFormatSymbols_ug; - - -/** - * Number formatting symbols for locale ug_CN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ug_CN = goog.i18n.NumberFormatSymbols_ug; - - -/** - * Number formatting symbols for locale uk. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_uk = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'UAH' -}; - - -/** - * Number formatting symbols for locale uk_UA. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_uk_UA = goog.i18n.NumberFormatSymbols_uk; - - -/** - * Number formatting symbols for locale ur. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ur = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'INR' -}; - - -/** - * Number formatting symbols for locale ur_IN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ur_IN = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', - DEF_CURRENCY_CODE: 'INR' -}; - - -/** - * Number formatting symbols for locale ur_PK. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ur_PK = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'PKR' -}; - - -/** - * Number formatting symbols for locale uz. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_uz = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'AFN' -}; - - -/** - * Number formatting symbols for locale uz_AF. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_uz_AF = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '\u2212', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'AFN' -}; - - -/** - * Number formatting symbols for locale uz_Arab. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_uz_Arab = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '\u2212', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'AFN' -}; - - -/** - * Number formatting symbols for locale uz_Arab_AF. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_uz_Arab_AF = - goog.i18n.NumberFormatSymbols_uz_Arab; - - -/** - * Number formatting symbols for locale uz_Cyrl. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_uz_Cyrl = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'UZS' -}; - - -/** - * Number formatting symbols for locale uz_Cyrl_UZ. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_uz_Cyrl_UZ = - goog.i18n.NumberFormatSymbols_uz_Cyrl; - - -/** - * Number formatting symbols for locale uz_Latn. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_uz_Latn = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'UZS' -}; - - -/** - * Number formatting symbols for locale uz_Latn_UZ. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_uz_Latn_UZ = - goog.i18n.NumberFormatSymbols_uz_Latn; - - -/** - * Number formatting symbols for locale uz_UZ. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_uz_UZ = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'UZS' -}; - - -/** - * Number formatting symbols for locale ve. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ve = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ZAR' -}; - - -/** - * Number formatting symbols for locale ve_ZA. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_ve_ZA = goog.i18n.NumberFormatSymbols_ve; - - -/** - * Number formatting symbols for locale vi. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_vi = { - DECIMAL_SEP: ',', - GROUP_SEP: '.', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', - DEF_CURRENCY_CODE: 'VND' -}; - - -/** - * Number formatting symbols for locale vi_VN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_vi_VN = goog.i18n.NumberFormatSymbols_vi; - - -/** - * Number formatting symbols for locale wal. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_wal = { - DECIMAL_SEP: '.', - GROUP_SEP: '\u2019', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ETB' -}; - - -/** - * Number formatting symbols for locale wal_ET. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_wal_ET = goog.i18n.NumberFormatSymbols_wal; - - -/** - * Number formatting symbols for locale wo. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_wo = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'XOF' -}; - - -/** - * Number formatting symbols for locale wo_Latn. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_wo_Latn = goog.i18n.NumberFormatSymbols_wo; - - -/** - * Number formatting symbols for locale wo_Latn_SN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_wo_Latn_SN = goog.i18n.NumberFormatSymbols_wo; - - -/** - * Number formatting symbols for locale wo_SN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_wo_SN = goog.i18n.NumberFormatSymbols_wo; - - -/** - * Number formatting symbols for locale xh. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_xh = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ZAR' -}; - - -/** - * Number formatting symbols for locale xh_ZA. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_xh_ZA = goog.i18n.NumberFormatSymbols_xh; - - -/** - * Number formatting symbols for locale yo. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_yo = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', - DEF_CURRENCY_CODE: 'NGN' -}; - - -/** - * Number formatting symbols for locale yo_NG. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_yo_NG = goog.i18n.NumberFormatSymbols_yo; - - -/** - * Number formatting symbols for locale zh. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_zh = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'CNY' -}; - - -/** - * Number formatting symbols for locale zh_CN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_zh_CN = goog.i18n.NumberFormatSymbols_zh; - - -/** - * Number formatting symbols for locale zh_HK. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_zh_HK = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', - DEF_CURRENCY_CODE: 'HKD' -}; - - -/** - * Number formatting symbols for locale zh_Hans. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_zh_Hans = goog.i18n.NumberFormatSymbols_zh; - - -/** - * Number formatting symbols for locale zh_Hans_CN. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_zh_Hans_CN = goog.i18n.NumberFormatSymbols_zh; - - -/** - * Number formatting symbols for locale zh_Hans_HK. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_zh_Hans_HK = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'HKD' -}; - - -/** - * Number formatting symbols for locale zh_Hans_MO. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_zh_Hans_MO = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'MOP' -}; - - -/** - * Number formatting symbols for locale zh_Hans_SG. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_zh_Hans_SG = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'SGD' -}; - - -/** - * Number formatting symbols for locale zh_Hant. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_zh_Hant = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'TWD' -}; - - -/** - * Number formatting symbols for locale zh_Hant_HK. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_zh_Hant_HK = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', - DEF_CURRENCY_CODE: 'HKD' -}; - - -/** - * Number formatting symbols for locale zh_Hant_MO. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_zh_Hant_MO = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'MOP' -}; - - -/** - * Number formatting symbols for locale zh_Hant_TW. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_zh_Hant_TW = - goog.i18n.NumberFormatSymbols_zh_Hant; - - -/** - * Number formatting symbols for locale zh_MO. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_zh_MO = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'MOP' -}; - - -/** - * Number formatting symbols for locale zh_SG. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_zh_SG = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'SGD' -}; - - -/** - * Number formatting symbols for locale zh_TW. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_zh_TW = { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'TWD' -}; - - -/** - * Number formatting symbols for locale zu. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_zu = { - DECIMAL_SEP: ',', - GROUP_SEP: '\u00A0', - PERCENT: '%', - ZERO_DIGIT: '0', - PLUS_SIGN: '+', - MINUS_SIGN: '-', - EXP_SYMBOL: 'E', - PERMILL: '\u2030', - INFINITY: '\u221E', - NAN: 'NaN', - DECIMAL_PATTERN: '#,##0.###', - SCIENTIFIC_PATTERN: '#E0', - PERCENT_PATTERN: '#,##0%', - CURRENCY_PATTERN: '\u00A4#,##0.00', - DEF_CURRENCY_CODE: 'ZAR' -}; - - -/** - * Number formatting symbols for locale zu_ZA. - * @enum {string} - */ -goog.i18n.NumberFormatSymbols_zu_ZA = goog.i18n.NumberFormatSymbols_zu; - - -/** - * Selected number formatting symbols by locale. - */ -goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; - -if (goog.LOCALE == 'aa') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_aa; -} - -if (goog.LOCALE == 'aa_DJ' || goog.LOCALE == 'aa-DJ') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_aa; -} - -if (goog.LOCALE == 'aa_ER' || goog.LOCALE == 'aa-ER') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_aa_ER; -} - -if (goog.LOCALE == 'aa_ER_SAAHO' || goog.LOCALE == 'aa-ER-SAAHO') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_aa_ER; -} - -if (goog.LOCALE == 'aa_ET' || goog.LOCALE == 'aa-ET') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_aa_ET; -} - -if (goog.LOCALE == 'af') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_af; -} - -if (goog.LOCALE == 'af_NA' || goog.LOCALE == 'af-NA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_af_NA; -} - -if (goog.LOCALE == 'af_ZA' || goog.LOCALE == 'af-ZA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_af; -} - -if (goog.LOCALE == 'ak') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ak; -} - -if (goog.LOCALE == 'ak_GH' || goog.LOCALE == 'ak-GH') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ak; -} - -if (goog.LOCALE == 'am') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_am; -} - -if (goog.LOCALE == 'am_ET' || goog.LOCALE == 'am-ET') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_am; -} - -if (goog.LOCALE == 'ar') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar; -} - -if (goog.LOCALE == 'ar_AE' || goog.LOCALE == 'ar-AE') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar; -} - -if (goog.LOCALE == 'ar_BH' || goog.LOCALE == 'ar-BH') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_BH; -} - -if (goog.LOCALE == 'ar_DZ' || goog.LOCALE == 'ar-DZ') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_DZ; -} - -if (goog.LOCALE == 'ar_EG' || goog.LOCALE == 'ar-EG') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_EG; -} - -if (goog.LOCALE == 'ar_IQ' || goog.LOCALE == 'ar-IQ') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_IQ; -} - -if (goog.LOCALE == 'ar_JO' || goog.LOCALE == 'ar-JO') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_JO; -} - -if (goog.LOCALE == 'ar_KW' || goog.LOCALE == 'ar-KW') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_KW; -} - -if (goog.LOCALE == 'ar_LB' || goog.LOCALE == 'ar-LB') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_LB; -} - -if (goog.LOCALE == 'ar_LY' || goog.LOCALE == 'ar-LY') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_LY; -} - -if (goog.LOCALE == 'ar_MA' || goog.LOCALE == 'ar-MA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_MA; -} - -if (goog.LOCALE == 'ar_OM' || goog.LOCALE == 'ar-OM') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_OM; -} - -if (goog.LOCALE == 'ar_QA' || goog.LOCALE == 'ar-QA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_QA; -} - -if (goog.LOCALE == 'ar_SA' || goog.LOCALE == 'ar-SA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_SA; -} - -if (goog.LOCALE == 'ar_SD' || goog.LOCALE == 'ar-SD') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_SD; -} - -if (goog.LOCALE == 'ar_SY' || goog.LOCALE == 'ar-SY') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_SY; -} - -if (goog.LOCALE == 'ar_TN' || goog.LOCALE == 'ar-TN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_TN; -} - -if (goog.LOCALE == 'ar_YE' || goog.LOCALE == 'ar-YE') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_YE; -} - -if (goog.LOCALE == 'as') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_as; -} - -if (goog.LOCALE == 'as_IN' || goog.LOCALE == 'as-IN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_as; -} - -if (goog.LOCALE == 'az') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_az; -} - -if (goog.LOCALE == 'az_AZ' || goog.LOCALE == 'az-AZ') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_az; -} - -if (goog.LOCALE == 'az_Cyrl' || goog.LOCALE == 'az-Cyrl') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_az; -} - -if (goog.LOCALE == 'az_Cyrl_AZ' || goog.LOCALE == 'az-Cyrl-AZ') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_az; -} - -if (goog.LOCALE == 'az_Latn' || goog.LOCALE == 'az-Latn') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_az; -} - -if (goog.LOCALE == 'az_Latn_AZ' || goog.LOCALE == 'az-Latn-AZ') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_az; -} - -if (goog.LOCALE == 'be') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_be; -} - -if (goog.LOCALE == 'be_BY' || goog.LOCALE == 'be-BY') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_be; -} - -if (goog.LOCALE == 'bg') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bg; -} - -if (goog.LOCALE == 'bg_BG' || goog.LOCALE == 'bg-BG') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bg; -} - -if (goog.LOCALE == 'bn') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bn; -} - -if (goog.LOCALE == 'bn_BD' || goog.LOCALE == 'bn-BD') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bn; -} - -if (goog.LOCALE == 'bn_IN' || goog.LOCALE == 'bn-IN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bn_IN; -} - -if (goog.LOCALE == 'bo') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bo; -} - -if (goog.LOCALE == 'bo_CN' || goog.LOCALE == 'bo-CN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bo; -} - -if (goog.LOCALE == 'bo_IN' || goog.LOCALE == 'bo-IN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bo_IN; -} - -if (goog.LOCALE == 'bs') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bs; -} - -if (goog.LOCALE == 'bs_BA' || goog.LOCALE == 'bs-BA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bs; -} - -if (goog.LOCALE == 'byn') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_byn; -} - -if (goog.LOCALE == 'byn_ER' || goog.LOCALE == 'byn-ER') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_byn; -} - -if (goog.LOCALE == 'ca') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ca; -} - -if (goog.LOCALE == 'ca_ES' || goog.LOCALE == 'ca-ES') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ca; -} - -if (goog.LOCALE == 'cch') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_cch; -} - -if (goog.LOCALE == 'cch_NG' || goog.LOCALE == 'cch-NG') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_cch; -} - -if (goog.LOCALE == 'cop') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_cop; -} - -if (goog.LOCALE == 'cs') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_cs; -} - -if (goog.LOCALE == 'cs_CZ' || goog.LOCALE == 'cs-CZ') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_cs; -} - -if (goog.LOCALE == 'cy') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_cy; -} - -if (goog.LOCALE == 'cy_GB' || goog.LOCALE == 'cy-GB') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_cy; -} - -if (goog.LOCALE == 'da') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_da; -} - -if (goog.LOCALE == 'da_DK' || goog.LOCALE == 'da-DK') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_da; -} - -if (goog.LOCALE == 'de') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de; -} - -if (goog.LOCALE == 'de_AT' || goog.LOCALE == 'de-AT') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de_AT; -} - -if (goog.LOCALE == 'de_BE' || goog.LOCALE == 'de-BE') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de; -} - -if (goog.LOCALE == 'de_CH' || goog.LOCALE == 'de-CH') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de_CH; -} - -if (goog.LOCALE == 'de_DE' || goog.LOCALE == 'de-DE') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de; -} - -if (goog.LOCALE == 'de_LI' || goog.LOCALE == 'de-LI') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de_LI; -} - -if (goog.LOCALE == 'de_LU' || goog.LOCALE == 'de-LU') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de; -} - -if (goog.LOCALE == 'dv') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dv; -} - -if (goog.LOCALE == 'dv_MV' || goog.LOCALE == 'dv-MV') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dv; -} - -if (goog.LOCALE == 'dz') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dz; -} - -if (goog.LOCALE == 'dz_BT' || goog.LOCALE == 'dz-BT') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dz; -} - -if (goog.LOCALE == 'ee') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ee; -} - -if (goog.LOCALE == 'ee_GH' || goog.LOCALE == 'ee-GH') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ee; -} - -if (goog.LOCALE == 'ee_TG' || goog.LOCALE == 'ee-TG') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ee_TG; -} - -if (goog.LOCALE == 'el') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_el; -} - -if (goog.LOCALE == 'el_CY' || goog.LOCALE == 'el-CY') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_el_CY; -} - -if (goog.LOCALE == 'el_GR' || goog.LOCALE == 'el-GR') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_el_GR; -} - -if (goog.LOCALE == 'el_POLYTON' || goog.LOCALE == 'el-POLYTON') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_el; -} - -if (goog.LOCALE == 'en') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; -} - -if (goog.LOCALE == 'en_AS' || goog.LOCALE == 'en-AS') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; -} - -if (goog.LOCALE == 'en_AU' || goog.LOCALE == 'en-AU') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_AU; -} - -if (goog.LOCALE == 'en_BE' || goog.LOCALE == 'en-BE') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_BE; -} - -if (goog.LOCALE == 'en_BW' || goog.LOCALE == 'en-BW') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_BW; -} - -if (goog.LOCALE == 'en_BZ' || goog.LOCALE == 'en-BZ') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_BZ; -} - -if (goog.LOCALE == 'en_CA' || goog.LOCALE == 'en-CA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_CA; -} - -if (goog.LOCALE == 'en_Dsrt' || goog.LOCALE == 'en-Dsrt') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; -} - -if (goog.LOCALE == 'en_Dsrt_US' || goog.LOCALE == 'en-Dsrt-US') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; -} - -if (goog.LOCALE == 'en_GB' || goog.LOCALE == 'en-GB') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_GB; -} - -if (goog.LOCALE == 'en_GU' || goog.LOCALE == 'en-GU') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; -} - -if (goog.LOCALE == 'en_HK' || goog.LOCALE == 'en-HK') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_HK; -} - -if (goog.LOCALE == 'en_IE' || goog.LOCALE == 'en-IE') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_IE; -} - -if (goog.LOCALE == 'en_IN' || goog.LOCALE == 'en-IN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_IN; -} - -if (goog.LOCALE == 'en_JM' || goog.LOCALE == 'en-JM') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_JM; -} - -if (goog.LOCALE == 'en_MH' || goog.LOCALE == 'en-MH') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; -} - -if (goog.LOCALE == 'en_MP' || goog.LOCALE == 'en-MP') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; -} - -if (goog.LOCALE == 'en_MT' || goog.LOCALE == 'en-MT') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_MT; -} - -if (goog.LOCALE == 'en_NA' || goog.LOCALE == 'en-NA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_NA; -} - -if (goog.LOCALE == 'en_NZ' || goog.LOCALE == 'en-NZ') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_NZ; -} - -if (goog.LOCALE == 'en_PH' || goog.LOCALE == 'en-PH') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_PH; -} - -if (goog.LOCALE == 'en_PK' || goog.LOCALE == 'en-PK') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_PK; -} - -if (goog.LOCALE == 'en_SG' || goog.LOCALE == 'en-SG') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_SG; -} - -if (goog.LOCALE == 'en_Shaw' || goog.LOCALE == 'en-Shaw') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_Shaw; -} - -if (goog.LOCALE == 'en_TT' || goog.LOCALE == 'en-TT') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_TT; -} - -if (goog.LOCALE == 'en_UM' || goog.LOCALE == 'en-UM') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; -} - -if (goog.LOCALE == 'en_US' || goog.LOCALE == 'en-US') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; -} - -if (goog.LOCALE == 'en_VI' || goog.LOCALE == 'en-VI') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; -} - -if (goog.LOCALE == 'en_ZA' || goog.LOCALE == 'en-ZA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_ZA; -} - -if (goog.LOCALE == 'en_ZW' || goog.LOCALE == 'en-ZW') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_ZW; -} - -if (goog.LOCALE == 'eo') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_eo; -} - -if (goog.LOCALE == 'es') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es; -} - -if (goog.LOCALE == 'es_AR' || goog.LOCALE == 'es-AR') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es; -} - -if (goog.LOCALE == 'es_BO' || goog.LOCALE == 'es-BO') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_BO; -} - -if (goog.LOCALE == 'es_CL' || goog.LOCALE == 'es-CL') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_CL; -} - -if (goog.LOCALE == 'es_CO' || goog.LOCALE == 'es-CO') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_CO; -} - -if (goog.LOCALE == 'es_CR' || goog.LOCALE == 'es-CR') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_CR; -} - -if (goog.LOCALE == 'es_DO' || goog.LOCALE == 'es-DO') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_DO; -} - -if (goog.LOCALE == 'es_EC' || goog.LOCALE == 'es-EC') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_EC; -} - -if (goog.LOCALE == 'es_ES' || goog.LOCALE == 'es-ES') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_ES; -} - -if (goog.LOCALE == 'es_GT' || goog.LOCALE == 'es-GT') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_GT; -} - -if (goog.LOCALE == 'es_HN' || goog.LOCALE == 'es-HN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_HN; -} - -if (goog.LOCALE == 'es_MX' || goog.LOCALE == 'es-MX') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_MX; -} - -if (goog.LOCALE == 'es_NI' || goog.LOCALE == 'es-NI') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_NI; -} - -if (goog.LOCALE == 'es_PA' || goog.LOCALE == 'es-PA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_PA; -} - -if (goog.LOCALE == 'es_PE' || goog.LOCALE == 'es-PE') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_PE; -} - -if (goog.LOCALE == 'es_PR' || goog.LOCALE == 'es-PR') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_PR; -} - -if (goog.LOCALE == 'es_PY' || goog.LOCALE == 'es-PY') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_PY; -} - -if (goog.LOCALE == 'es_SV' || goog.LOCALE == 'es-SV') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_SV; -} - -if (goog.LOCALE == 'es_US' || goog.LOCALE == 'es-US') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_US; -} - -if (goog.LOCALE == 'es_UY' || goog.LOCALE == 'es-UY') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_UY; -} - -if (goog.LOCALE == 'es_VE' || goog.LOCALE == 'es-VE') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_VE; -} - -if (goog.LOCALE == 'et') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_et; -} - -if (goog.LOCALE == 'et_EE' || goog.LOCALE == 'et-EE') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_et; -} - -if (goog.LOCALE == 'eu') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_eu; -} - -if (goog.LOCALE == 'eu_ES' || goog.LOCALE == 'eu-ES') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_eu; -} - -if (goog.LOCALE == 'fa') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fa; -} - -if (goog.LOCALE == 'fa_AF' || goog.LOCALE == 'fa-AF') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fa_AF; -} - -if (goog.LOCALE == 'fa_IR' || goog.LOCALE == 'fa-IR') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fa_IR; -} - -if (goog.LOCALE == 'fi') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fi; -} - -if (goog.LOCALE == 'fi_FI' || goog.LOCALE == 'fi-FI') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fi; -} - -if (goog.LOCALE == 'fil') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fil; -} - -if (goog.LOCALE == 'fil_PH' || goog.LOCALE == 'fil-PH') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fil; -} - -if (goog.LOCALE == 'fo') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fo; -} - -if (goog.LOCALE == 'fo_FO' || goog.LOCALE == 'fo-FO') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fo; -} - -if (goog.LOCALE == 'fr') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr; -} - -if (goog.LOCALE == 'fr_BE' || goog.LOCALE == 'fr-BE') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_BE; -} - -if (goog.LOCALE == 'fr_CA' || goog.LOCALE == 'fr-CA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_CA; -} - -if (goog.LOCALE == 'fr_CH' || goog.LOCALE == 'fr-CH') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_CH; -} - -if (goog.LOCALE == 'fr_FR' || goog.LOCALE == 'fr-FR') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr; -} - -if (goog.LOCALE == 'fr_LU' || goog.LOCALE == 'fr-LU') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_LU; -} - -if (goog.LOCALE == 'fr_MC' || goog.LOCALE == 'fr-MC') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr; -} - -if (goog.LOCALE == 'fr_SN' || goog.LOCALE == 'fr-SN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_SN; -} - -if (goog.LOCALE == 'fur') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fur; -} - -if (goog.LOCALE == 'fur_IT' || goog.LOCALE == 'fur-IT') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fur; -} - -if (goog.LOCALE == 'ga') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ga; -} - -if (goog.LOCALE == 'ga_IE' || goog.LOCALE == 'ga-IE') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ga; -} - -if (goog.LOCALE == 'gaa') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gaa; -} - -if (goog.LOCALE == 'gaa_GH' || goog.LOCALE == 'gaa-GH') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gaa; -} - -if (goog.LOCALE == 'gez') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gez; -} - -if (goog.LOCALE == 'gez_ER' || goog.LOCALE == 'gez-ER') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gez; -} - -if (goog.LOCALE == 'gez_ET' || goog.LOCALE == 'gez-ET') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gez_ET; -} - -if (goog.LOCALE == 'gl') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gl; -} - -if (goog.LOCALE == 'gl_ES' || goog.LOCALE == 'gl-ES') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gl; -} - -if (goog.LOCALE == 'gsw') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gsw; -} - -if (goog.LOCALE == 'gsw_CH' || goog.LOCALE == 'gsw-CH') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gsw; -} - -if (goog.LOCALE == 'gu') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gu; -} - -if (goog.LOCALE == 'gu_IN' || goog.LOCALE == 'gu-IN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gu; -} - -if (goog.LOCALE == 'gv') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gv; -} - -if (goog.LOCALE == 'gv_GB' || goog.LOCALE == 'gv-GB') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gv; -} - -if (goog.LOCALE == 'ha') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha; -} - -if (goog.LOCALE == 'ha_Arab' || goog.LOCALE == 'ha-Arab') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha; -} - -if (goog.LOCALE == 'ha_Arab_NG' || goog.LOCALE == 'ha-Arab-NG') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha; -} - -if (goog.LOCALE == 'ha_Arab_SD' || goog.LOCALE == 'ha-Arab-SD') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha_Arab_SD; -} - -if (goog.LOCALE == 'ha_GH' || goog.LOCALE == 'ha-GH') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha_GH; -} - -if (goog.LOCALE == 'ha_Latn' || goog.LOCALE == 'ha-Latn') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha; -} - -if (goog.LOCALE == 'ha_Latn_GH' || goog.LOCALE == 'ha-Latn-GH') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha_Latn_GH; -} - -if (goog.LOCALE == 'ha_Latn_NE' || goog.LOCALE == 'ha-Latn-NE') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha_Latn_NE; -} - -if (goog.LOCALE == 'ha_Latn_NG' || goog.LOCALE == 'ha-Latn-NG') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha; -} - -if (goog.LOCALE == 'ha_NE' || goog.LOCALE == 'ha-NE') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha_NE; -} - -if (goog.LOCALE == 'ha_NG' || goog.LOCALE == 'ha-NG') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha; -} - -if (goog.LOCALE == 'ha_SD' || goog.LOCALE == 'ha-SD') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha_SD; -} - -if (goog.LOCALE == 'haw') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_haw; -} - -if (goog.LOCALE == 'haw_US' || goog.LOCALE == 'haw-US') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_haw; -} - -if (goog.LOCALE == 'he') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_he; -} - -if (goog.LOCALE == 'he_IL' || goog.LOCALE == 'he-IL') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_he; -} - -if (goog.LOCALE == 'hi') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hi; -} - -if (goog.LOCALE == 'hi_IN' || goog.LOCALE == 'hi-IN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hi; -} - -if (goog.LOCALE == 'hr') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hr; -} - -if (goog.LOCALE == 'hr_HR' || goog.LOCALE == 'hr-HR') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hr; -} - -if (goog.LOCALE == 'hu') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hu; -} - -if (goog.LOCALE == 'hu_HU' || goog.LOCALE == 'hu-HU') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hu; -} - -if (goog.LOCALE == 'hy') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hy; -} - -if (goog.LOCALE == 'hy_AM' || goog.LOCALE == 'hy-AM') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hy; -} - -if (goog.LOCALE == 'ia') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ia; -} - -if (goog.LOCALE == 'id') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_id; -} - -if (goog.LOCALE == 'id_ID' || goog.LOCALE == 'id-ID') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_id; -} - -if (goog.LOCALE == 'ig') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ig; -} - -if (goog.LOCALE == 'ig_NG' || goog.LOCALE == 'ig-NG') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ig; -} - -if (goog.LOCALE == 'ii') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ii; -} - -if (goog.LOCALE == 'ii_CN' || goog.LOCALE == 'ii-CN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ii; -} - -if (goog.LOCALE == 'in') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_in; -} - -if (goog.LOCALE == 'is') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_is; -} - -if (goog.LOCALE == 'is_IS' || goog.LOCALE == 'is-IS') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_is; -} - -if (goog.LOCALE == 'it') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_it; -} - -if (goog.LOCALE == 'it_CH' || goog.LOCALE == 'it-CH') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_it_CH; -} - -if (goog.LOCALE == 'it_IT' || goog.LOCALE == 'it-IT') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_it_IT; -} - -if (goog.LOCALE == 'iu') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_iu; -} - -if (goog.LOCALE == 'iw') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_iw; -} - -if (goog.LOCALE == 'ja') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ja; -} - -if (goog.LOCALE == 'ja_JP' || goog.LOCALE == 'ja-JP') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ja; -} - -if (goog.LOCALE == 'ka') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ka; -} - -if (goog.LOCALE == 'ka_GE' || goog.LOCALE == 'ka-GE') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ka; -} - -if (goog.LOCALE == 'kaj') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kaj; -} - -if (goog.LOCALE == 'kaj_NG' || goog.LOCALE == 'kaj-NG') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kaj; -} - -if (goog.LOCALE == 'kam') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kam; -} - -if (goog.LOCALE == 'kam_KE' || goog.LOCALE == 'kam-KE') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kam; -} - -if (goog.LOCALE == 'kcg') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kcg; -} - -if (goog.LOCALE == 'kcg_NG' || goog.LOCALE == 'kcg-NG') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kcg; -} - -if (goog.LOCALE == 'kfo') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kfo; -} - -if (goog.LOCALE == 'kfo_CI' || goog.LOCALE == 'kfo-CI') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kfo_CI; -} - -if (goog.LOCALE == 'kk') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kk; -} - -if (goog.LOCALE == 'kk_Cyrl' || goog.LOCALE == 'kk-Cyrl') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kk; -} - -if (goog.LOCALE == 'kk_Cyrl_KZ' || goog.LOCALE == 'kk-Cyrl-KZ') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kk; -} - -if (goog.LOCALE == 'kk_KZ' || goog.LOCALE == 'kk-KZ') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kk; -} - -if (goog.LOCALE == 'kl') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kl; -} - -if (goog.LOCALE == 'kl_GL' || goog.LOCALE == 'kl-GL') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kl; -} - -if (goog.LOCALE == 'km') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_km; -} - -if (goog.LOCALE == 'km_KH' || goog.LOCALE == 'km-KH') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_km; -} - -if (goog.LOCALE == 'kn') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kn; -} - -if (goog.LOCALE == 'kn_IN' || goog.LOCALE == 'kn-IN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kn; -} - -if (goog.LOCALE == 'ko') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ko; -} - -if (goog.LOCALE == 'ko_KR' || goog.LOCALE == 'ko-KR') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ko_KR; -} - -if (goog.LOCALE == 'kok') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kok; -} - -if (goog.LOCALE == 'kok_IN' || goog.LOCALE == 'kok-IN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kok; -} - -if (goog.LOCALE == 'kpe') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kpe; -} - -if (goog.LOCALE == 'kpe_GN' || goog.LOCALE == 'kpe-GN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kpe; -} - -if (goog.LOCALE == 'kpe_LR' || goog.LOCALE == 'kpe-LR') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kpe_LR; -} - -if (goog.LOCALE == 'ku') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku; -} - -if (goog.LOCALE == 'ku_Arab' || goog.LOCALE == 'ku-Arab') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku; -} - -if (goog.LOCALE == 'ku_Arab_IQ' || goog.LOCALE == 'ku-Arab-IQ') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku; -} - -if (goog.LOCALE == 'ku_Arab_IR' || goog.LOCALE == 'ku-Arab-IR') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku_Arab_IR; -} - -if (goog.LOCALE == 'ku_Arab_SY' || goog.LOCALE == 'ku-Arab-SY') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku_Arab_SY; -} - -if (goog.LOCALE == 'ku_IQ' || goog.LOCALE == 'ku-IQ') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku; -} - -if (goog.LOCALE == 'ku_IR' || goog.LOCALE == 'ku-IR') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku_IR; -} - -if (goog.LOCALE == 'ku_Latn' || goog.LOCALE == 'ku-Latn') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku; -} - -if (goog.LOCALE == 'ku_Latn_TR' || goog.LOCALE == 'ku-Latn-TR') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku_Latn_TR; -} - -if (goog.LOCALE == 'ku_SY' || goog.LOCALE == 'ku-SY') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku_SY; -} - -if (goog.LOCALE == 'ku_TR' || goog.LOCALE == 'ku-TR') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku_TR; -} - -if (goog.LOCALE == 'kw') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kw; -} - -if (goog.LOCALE == 'kw_GB' || goog.LOCALE == 'kw-GB') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kw; -} - -if (goog.LOCALE == 'ky') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ky; -} - -if (goog.LOCALE == 'ky_KG' || goog.LOCALE == 'ky-KG') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ky; -} - -if (goog.LOCALE == 'ln') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ln; -} - -if (goog.LOCALE == 'ln_CD' || goog.LOCALE == 'ln-CD') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ln; -} - -if (goog.LOCALE == 'ln_CG' || goog.LOCALE == 'ln-CG') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ln_CG; -} - -if (goog.LOCALE == 'lo') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lo; -} - -if (goog.LOCALE == 'lo_LA' || goog.LOCALE == 'lo-LA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lo; -} - -if (goog.LOCALE == 'lt') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lt; -} - -if (goog.LOCALE == 'lt_LT' || goog.LOCALE == 'lt-LT') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lt; -} - -if (goog.LOCALE == 'lv') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lv; -} - -if (goog.LOCALE == 'lv_LV' || goog.LOCALE == 'lv-LV') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lv; -} - -if (goog.LOCALE == 'mk') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mk; -} - -if (goog.LOCALE == 'mk_MK' || goog.LOCALE == 'mk-MK') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mk; -} - -if (goog.LOCALE == 'ml') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ml; -} - -if (goog.LOCALE == 'ml_IN' || goog.LOCALE == 'ml-IN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ml; -} - -if (goog.LOCALE == 'mn') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mn; -} - -if (goog.LOCALE == 'mn_CN' || goog.LOCALE == 'mn-CN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mn_CN; -} - -if (goog.LOCALE == 'mn_Cyrl' || goog.LOCALE == 'mn-Cyrl') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mn; -} - -if (goog.LOCALE == 'mn_Cyrl_MN' || goog.LOCALE == 'mn-Cyrl-MN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mn; -} - -if (goog.LOCALE == 'mn_MN' || goog.LOCALE == 'mn-MN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mn; -} - -if (goog.LOCALE == 'mn_Mong' || goog.LOCALE == 'mn-Mong') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mn; -} - -if (goog.LOCALE == 'mn_Mong_CN' || goog.LOCALE == 'mn-Mong-CN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mn_Mong_CN; -} - -if (goog.LOCALE == 'mo') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mo; -} - -if (goog.LOCALE == 'mr') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mr; -} - -if (goog.LOCALE == 'mr_IN' || goog.LOCALE == 'mr-IN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mr; -} - -if (goog.LOCALE == 'ms') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ms; -} - -if (goog.LOCALE == 'ms_BN' || goog.LOCALE == 'ms-BN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ms_BN; -} - -if (goog.LOCALE == 'ms_MY' || goog.LOCALE == 'ms-MY') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ms_MY; -} - -if (goog.LOCALE == 'mt') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mt; -} - -if (goog.LOCALE == 'mt_MT' || goog.LOCALE == 'mt-MT') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mt; -} - -if (goog.LOCALE == 'my') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_my; -} - -if (goog.LOCALE == 'my_MM' || goog.LOCALE == 'my-MM') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_my; -} - -if (goog.LOCALE == 'nb') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nb; -} - -if (goog.LOCALE == 'nb_NO' || goog.LOCALE == 'nb-NO') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nb; -} - -if (goog.LOCALE == 'nds') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nds; -} - -if (goog.LOCALE == 'nds_DE' || goog.LOCALE == 'nds-DE') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nds; -} - -if (goog.LOCALE == 'ne') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ne; -} - -if (goog.LOCALE == 'ne_IN' || goog.LOCALE == 'ne-IN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ne_IN; -} - -if (goog.LOCALE == 'ne_NP' || goog.LOCALE == 'ne-NP') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ne; -} - -if (goog.LOCALE == 'nl') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nl; -} - -if (goog.LOCALE == 'nl_BE' || goog.LOCALE == 'nl-BE') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nl_BE; -} - -if (goog.LOCALE == 'nl_NL' || goog.LOCALE == 'nl-NL') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nl; -} - -if (goog.LOCALE == 'nn') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nn; -} - -if (goog.LOCALE == 'nn_NO' || goog.LOCALE == 'nn-NO') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nn; -} - -if (goog.LOCALE == 'no') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_no; -} - -if (goog.LOCALE == 'nr') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nr; -} - -if (goog.LOCALE == 'nr_ZA' || goog.LOCALE == 'nr-ZA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nr; -} + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'TWD' +}; -if (goog.LOCALE == 'nso') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nso; -} -if (goog.LOCALE == 'nso_ZA' || goog.LOCALE == 'nso-ZA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nso; -} +/** + * Selected number formatting symbols by locale. + */ +goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; -if (goog.LOCALE == 'ny') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ny; +if (goog.LOCALE == 'am') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_am; } -if (goog.LOCALE == 'ny_MW' || goog.LOCALE == 'ny-MW') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ny; +if (goog.LOCALE == 'am_ET' || goog.LOCALE == 'am-ET') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_am; } -if (goog.LOCALE == 'oc') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_oc; +if (goog.LOCALE == 'ar') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar; } -if (goog.LOCALE == 'oc_FR' || goog.LOCALE == 'oc-FR') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_oc; +if (goog.LOCALE == 'ar_EG' || goog.LOCALE == 'ar-EG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar; } -if (goog.LOCALE == 'om') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_om; +if (goog.LOCALE == 'bg') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bg; } -if (goog.LOCALE == 'om_ET' || goog.LOCALE == 'om-ET') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_om; +if (goog.LOCALE == 'bg_BG' || goog.LOCALE == 'bg-BG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bg; } -if (goog.LOCALE == 'om_KE' || goog.LOCALE == 'om-KE') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_om_KE; +if (goog.LOCALE == 'bn') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bn; } -if (goog.LOCALE == 'or') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_or; +if (goog.LOCALE == 'bn_BD' || goog.LOCALE == 'bn-BD') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bn; } -if (goog.LOCALE == 'or_IN' || goog.LOCALE == 'or-IN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_or; +if (goog.LOCALE == 'ca') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ca; } -if (goog.LOCALE == 'pa') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pa; +if (goog.LOCALE == 'ca_ES' || goog.LOCALE == 'ca-ES') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ca; } -if (goog.LOCALE == 'pa_Arab' || goog.LOCALE == 'pa-Arab') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pa; +if (goog.LOCALE == 'cs') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_cs; } -if (goog.LOCALE == 'pa_Arab_PK' || goog.LOCALE == 'pa-Arab-PK') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pa; +if (goog.LOCALE == 'cs_CZ' || goog.LOCALE == 'cs-CZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_cs; } -if (goog.LOCALE == 'pa_Guru' || goog.LOCALE == 'pa-Guru') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pa_Guru; +if (goog.LOCALE == 'da') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_da; } -if (goog.LOCALE == 'pa_Guru_IN' || goog.LOCALE == 'pa-Guru-IN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pa_Guru; +if (goog.LOCALE == 'da_DK' || goog.LOCALE == 'da-DK') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_da; } -if (goog.LOCALE == 'pa_IN' || goog.LOCALE == 'pa-IN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pa_IN; +if (goog.LOCALE == 'de') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de; } -if (goog.LOCALE == 'pa_PK' || goog.LOCALE == 'pa-PK') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pa; +if (goog.LOCALE == 'de_AT' || goog.LOCALE == 'de-AT') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de_AT; } -if (goog.LOCALE == 'pl') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pl; +if (goog.LOCALE == 'de_BE' || goog.LOCALE == 'de-BE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de; } -if (goog.LOCALE == 'pl_PL' || goog.LOCALE == 'pl-PL') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pl; +if (goog.LOCALE == 'de_CH' || goog.LOCALE == 'de-CH') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de_CH; } -if (goog.LOCALE == 'ps') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ps; +if (goog.LOCALE == 'de_DE' || goog.LOCALE == 'de-DE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de; } -if (goog.LOCALE == 'ps_AF' || goog.LOCALE == 'ps-AF') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ps; +if (goog.LOCALE == 'de_LU' || goog.LOCALE == 'de-LU') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de; } -if (goog.LOCALE == 'pt') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt; +if (goog.LOCALE == 'el') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_el; } -if (goog.LOCALE == 'pt_BR' || goog.LOCALE == 'pt-BR') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt_BR; +if (goog.LOCALE == 'el_GR' || goog.LOCALE == 'el-GR') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_el; } -if (goog.LOCALE == 'pt_PT' || goog.LOCALE == 'pt-PT') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt_PT; +if (goog.LOCALE == 'el_POLYTON' || goog.LOCALE == 'el-POLYTON') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_el; } -if (goog.LOCALE == 'ro') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ro; +if (goog.LOCALE == 'en') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; } -if (goog.LOCALE == 'ro_MD' || goog.LOCALE == 'ro-MD') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ro; +if (goog.LOCALE == 'en_AS' || goog.LOCALE == 'en-AS') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; } -if (goog.LOCALE == 'ro_RO' || goog.LOCALE == 'ro-RO') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ro_RO; +if (goog.LOCALE == 'en_AU' || goog.LOCALE == 'en-AU') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_AU; } -if (goog.LOCALE == 'ru') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ru; +if (goog.LOCALE == 'en_Dsrt' || goog.LOCALE == 'en-Dsrt') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; } -if (goog.LOCALE == 'ru_RU' || goog.LOCALE == 'ru-RU') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ru_RU; +if (goog.LOCALE == 'en_Dsrt_US' || goog.LOCALE == 'en-Dsrt-US') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; } -if (goog.LOCALE == 'ru_UA' || goog.LOCALE == 'ru-UA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ru_UA; +if (goog.LOCALE == 'en_GB' || goog.LOCALE == 'en-GB') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_GB; } -if (goog.LOCALE == 'rw') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_rw; +if (goog.LOCALE == 'en_GU' || goog.LOCALE == 'en-GU') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; } -if (goog.LOCALE == 'rw_RW' || goog.LOCALE == 'rw-RW') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_rw; +if (goog.LOCALE == 'en_IE' || goog.LOCALE == 'en-IE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_IE; } -if (goog.LOCALE == 'sa') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sa; +if (goog.LOCALE == 'en_IN' || goog.LOCALE == 'en-IN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_IN; } -if (goog.LOCALE == 'sa_IN' || goog.LOCALE == 'sa-IN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sa; +if (goog.LOCALE == 'en_MH' || goog.LOCALE == 'en-MH') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; } -if (goog.LOCALE == 'se') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_se; +if (goog.LOCALE == 'en_MP' || goog.LOCALE == 'en-MP') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; } -if (goog.LOCALE == 'se_FI' || goog.LOCALE == 'se-FI') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_se; +if (goog.LOCALE == 'en_SG' || goog.LOCALE == 'en-SG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_SG; } -if (goog.LOCALE == 'se_NO' || goog.LOCALE == 'se-NO') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_se_NO; +if (goog.LOCALE == 'en_UM' || goog.LOCALE == 'en-UM') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; } -if (goog.LOCALE == 'sh') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sh; +if (goog.LOCALE == 'en_US' || goog.LOCALE == 'en-US') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; } -if (goog.LOCALE == 'sh_BA' || goog.LOCALE == 'sh-BA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sh_BA; +if (goog.LOCALE == 'en_VI' || goog.LOCALE == 'en-VI') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; } -if (goog.LOCALE == 'sh_CS' || goog.LOCALE == 'sh-CS') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sh_CS; +if (goog.LOCALE == 'en_ZA' || goog.LOCALE == 'en-ZA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_ZA; } -if (goog.LOCALE == 'sh_YU' || goog.LOCALE == 'sh-YU') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sh_YU; +if (goog.LOCALE == 'en_ZZ' || goog.LOCALE == 'en-ZZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en; } -if (goog.LOCALE == 'si') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_si; +if (goog.LOCALE == 'es') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es; } -if (goog.LOCALE == 'si_LK' || goog.LOCALE == 'si-LK') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_si; +if (goog.LOCALE == 'es_ES' || goog.LOCALE == 'es-ES') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es; } -if (goog.LOCALE == 'sid') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sid; +if (goog.LOCALE == 'et') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_et; } -if (goog.LOCALE == 'sid_ET' || goog.LOCALE == 'sid-ET') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sid; +if (goog.LOCALE == 'et_EE' || goog.LOCALE == 'et-EE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_et; } -if (goog.LOCALE == 'sk') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sk; +if (goog.LOCALE == 'eu') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_eu; } -if (goog.LOCALE == 'sk_SK' || goog.LOCALE == 'sk-SK') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sk; +if (goog.LOCALE == 'eu_ES' || goog.LOCALE == 'eu-ES') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_eu; } -if (goog.LOCALE == 'sl') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sl; +if (goog.LOCALE == 'fa') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fa; } -if (goog.LOCALE == 'sl_SI' || goog.LOCALE == 'sl-SI') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sl; +if (goog.LOCALE == 'fa_IR' || goog.LOCALE == 'fa-IR') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fa; } -if (goog.LOCALE == 'so') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_so; +if (goog.LOCALE == 'fi') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fi; } -if (goog.LOCALE == 'so_DJ' || goog.LOCALE == 'so-DJ') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_so; +if (goog.LOCALE == 'fi_FI' || goog.LOCALE == 'fi-FI') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fi; } -if (goog.LOCALE == 'so_ET' || goog.LOCALE == 'so-ET') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_so_ET; +if (goog.LOCALE == 'fil') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fil; } -if (goog.LOCALE == 'so_KE' || goog.LOCALE == 'so-KE') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_so_KE; +if (goog.LOCALE == 'fil_PH' || goog.LOCALE == 'fil-PH') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fil; } -if (goog.LOCALE == 'so_SO' || goog.LOCALE == 'so-SO') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_so_SO; +if (goog.LOCALE == 'fr') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr; } -if (goog.LOCALE == 'sq') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sq; +if (goog.LOCALE == 'fr_BL' || goog.LOCALE == 'fr-BL') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr; } -if (goog.LOCALE == 'sq_AL' || goog.LOCALE == 'sq-AL') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sq_AL; +if (goog.LOCALE == 'fr_CA' || goog.LOCALE == 'fr-CA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_CA; } -if (goog.LOCALE == 'sr') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr; +if (goog.LOCALE == 'fr_FR' || goog.LOCALE == 'fr-FR') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr; } -if (goog.LOCALE == 'sr_BA' || goog.LOCALE == 'sr-BA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr; +if (goog.LOCALE == 'fr_GP' || goog.LOCALE == 'fr-GP') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr; } -if (goog.LOCALE == 'sr_CS' || goog.LOCALE == 'sr-CS') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_CS; +if (goog.LOCALE == 'fr_MC' || goog.LOCALE == 'fr-MC') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr; } -if (goog.LOCALE == 'sr_Cyrl' || goog.LOCALE == 'sr-Cyrl') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Cyrl; +if (goog.LOCALE == 'fr_MF' || goog.LOCALE == 'fr-MF') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr; } -if (goog.LOCALE == 'sr_Cyrl_BA' || goog.LOCALE == 'sr-Cyrl-BA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr; +if (goog.LOCALE == 'fr_MQ' || goog.LOCALE == 'fr-MQ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr; } -if (goog.LOCALE == 'sr_Cyrl_CS' || goog.LOCALE == 'sr-Cyrl-CS') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Cyrl; +if (goog.LOCALE == 'fr_RE' || goog.LOCALE == 'fr-RE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr; } -if (goog.LOCALE == 'sr_Cyrl_ME' || goog.LOCALE == 'sr-Cyrl-ME') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Cyrl; +if (goog.LOCALE == 'gl') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gl; } -if (goog.LOCALE == 'sr_Cyrl_RS' || goog.LOCALE == 'sr-Cyrl-RS') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Cyrl_RS; +if (goog.LOCALE == 'gl_ES' || goog.LOCALE == 'gl-ES') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gl; } -if (goog.LOCALE == 'sr_Cyrl_YU' || goog.LOCALE == 'sr-Cyrl-YU') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Cyrl_YU; +if (goog.LOCALE == 'gsw') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gsw; } -if (goog.LOCALE == 'sr_Latn' || goog.LOCALE == 'sr-Latn') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Latn; +if (goog.LOCALE == 'gsw_CH' || goog.LOCALE == 'gsw-CH') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gsw; } -if (goog.LOCALE == 'sr_Latn_BA' || goog.LOCALE == 'sr-Latn-BA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr; +if (goog.LOCALE == 'gu') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gu; } -if (goog.LOCALE == 'sr_Latn_CS' || goog.LOCALE == 'sr-Latn-CS') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Latn_CS; +if (goog.LOCALE == 'gu_IN' || goog.LOCALE == 'gu-IN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gu; } -if (goog.LOCALE == 'sr_Latn_ME' || goog.LOCALE == 'sr-Latn-ME') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Latn_ME; +if (goog.LOCALE == 'he') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_he; } -if (goog.LOCALE == 'sr_Latn_RS' || goog.LOCALE == 'sr-Latn-RS') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Latn; +if (goog.LOCALE == 'he_IL' || goog.LOCALE == 'he-IL') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_he; } -if (goog.LOCALE == 'sr_Latn_YU' || goog.LOCALE == 'sr-Latn-YU') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Latn_YU; +if (goog.LOCALE == 'hi') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hi; } -if (goog.LOCALE == 'sr_ME' || goog.LOCALE == 'sr-ME') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_ME; +if (goog.LOCALE == 'hi_IN' || goog.LOCALE == 'hi-IN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hi; } -if (goog.LOCALE == 'sr_RS' || goog.LOCALE == 'sr-RS') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_RS; +if (goog.LOCALE == 'hr') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hr; } -if (goog.LOCALE == 'sr_YU' || goog.LOCALE == 'sr-YU') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_YU; +if (goog.LOCALE == 'hr_HR' || goog.LOCALE == 'hr-HR') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hr; } -if (goog.LOCALE == 'ss') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ss; +if (goog.LOCALE == 'hu') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hu; } -if (goog.LOCALE == 'ss_SZ' || goog.LOCALE == 'ss-SZ') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ss_SZ; +if (goog.LOCALE == 'hu_HU' || goog.LOCALE == 'hu-HU') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hu; } -if (goog.LOCALE == 'ss_ZA' || goog.LOCALE == 'ss-ZA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ss; +if (goog.LOCALE == 'id') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_id; } -if (goog.LOCALE == 'st') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_st; +if (goog.LOCALE == 'id_ID' || goog.LOCALE == 'id-ID') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_id; } -if (goog.LOCALE == 'st_LS' || goog.LOCALE == 'st-LS') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_st_LS; +if (goog.LOCALE == 'in') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_in; } -if (goog.LOCALE == 'st_ZA' || goog.LOCALE == 'st-ZA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_st; +if (goog.LOCALE == 'is') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_is; } -if (goog.LOCALE == 'sv') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sv; +if (goog.LOCALE == 'is_IS' || goog.LOCALE == 'is-IS') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_is; } -if (goog.LOCALE == 'sv_FI' || goog.LOCALE == 'sv-FI') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sv; +if (goog.LOCALE == 'it') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_it; } -if (goog.LOCALE == 'sv_SE' || goog.LOCALE == 'sv-SE') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sv_SE; +if (goog.LOCALE == 'it_IT' || goog.LOCALE == 'it-IT') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_it; } -if (goog.LOCALE == 'sw') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sw; +if (goog.LOCALE == 'iw') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_iw; } -if (goog.LOCALE == 'sw_KE' || goog.LOCALE == 'sw-KE') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sw_KE; +if (goog.LOCALE == 'ja') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ja; } -if (goog.LOCALE == 'sw_TZ' || goog.LOCALE == 'sw-TZ') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sw_TZ; +if (goog.LOCALE == 'ja_JP' || goog.LOCALE == 'ja-JP') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ja; } -if (goog.LOCALE == 'syr') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_syr; +if (goog.LOCALE == 'kn') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kn; } -if (goog.LOCALE == 'syr_SY' || goog.LOCALE == 'syr-SY') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_syr; +if (goog.LOCALE == 'kn_IN' || goog.LOCALE == 'kn-IN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kn; } -if (goog.LOCALE == 'ta') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ta; +if (goog.LOCALE == 'ko') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ko; } -if (goog.LOCALE == 'ta_IN' || goog.LOCALE == 'ta-IN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ta; +if (goog.LOCALE == 'ko_KR' || goog.LOCALE == 'ko-KR') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ko; } -if (goog.LOCALE == 'te') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_te; +if (goog.LOCALE == 'ln') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ln; } -if (goog.LOCALE == 'te_IN' || goog.LOCALE == 'te-IN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_te; +if (goog.LOCALE == 'ln_CD' || goog.LOCALE == 'ln-CD') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ln; } -if (goog.LOCALE == 'tg') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tg; +if (goog.LOCALE == 'lt') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lt; } -if (goog.LOCALE == 'tg_Cyrl' || goog.LOCALE == 'tg-Cyrl') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tg; +if (goog.LOCALE == 'lt_LT' || goog.LOCALE == 'lt-LT') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lt; } -if (goog.LOCALE == 'tg_Cyrl_TJ' || goog.LOCALE == 'tg-Cyrl-TJ') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tg; +if (goog.LOCALE == 'lv') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lv; } -if (goog.LOCALE == 'tg_TJ' || goog.LOCALE == 'tg-TJ') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tg; +if (goog.LOCALE == 'lv_LV' || goog.LOCALE == 'lv-LV') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lv; } -if (goog.LOCALE == 'th') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_th; +if (goog.LOCALE == 'ml') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ml; } -if (goog.LOCALE == 'th_TH' || goog.LOCALE == 'th-TH') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_th; +if (goog.LOCALE == 'ml_IN' || goog.LOCALE == 'ml-IN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ml; } -if (goog.LOCALE == 'ti') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ti; +if (goog.LOCALE == 'mo') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mo; } -if (goog.LOCALE == 'ti_ER' || goog.LOCALE == 'ti-ER') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ti; +if (goog.LOCALE == 'mr') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mr; } -if (goog.LOCALE == 'ti_ET' || goog.LOCALE == 'ti-ET') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ti_ET; +if (goog.LOCALE == 'mr_IN' || goog.LOCALE == 'mr-IN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mr; } -if (goog.LOCALE == 'tig') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tig; +if (goog.LOCALE == 'ms') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ms; } -if (goog.LOCALE == 'tig_ER' || goog.LOCALE == 'tig-ER') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tig; +if (goog.LOCALE == 'ms_MY' || goog.LOCALE == 'ms-MY') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ms; } -if (goog.LOCALE == 'tl') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tl; +if (goog.LOCALE == 'mt') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mt; } -if (goog.LOCALE == 'tl_PH' || goog.LOCALE == 'tl-PH') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tl; +if (goog.LOCALE == 'mt_MT' || goog.LOCALE == 'mt-MT') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mt; } -if (goog.LOCALE == 'tn') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tn; +if (goog.LOCALE == 'nl') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nl; } -if (goog.LOCALE == 'tn_ZA' || goog.LOCALE == 'tn-ZA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tn_ZA; +if (goog.LOCALE == 'nl_NL' || goog.LOCALE == 'nl-NL') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nl; } -if (goog.LOCALE == 'to') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_to; +if (goog.LOCALE == 'no') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_no; } -if (goog.LOCALE == 'to_TO' || goog.LOCALE == 'to-TO') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_to; +if (goog.LOCALE == 'or') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_or; } -if (goog.LOCALE == 'tr') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tr; +if (goog.LOCALE == 'or_IN' || goog.LOCALE == 'or-IN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_or; } -if (goog.LOCALE == 'tr_TR' || goog.LOCALE == 'tr-TR') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tr_TR; +if (goog.LOCALE == 'pl') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pl; } -if (goog.LOCALE == 'trv') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_trv; +if (goog.LOCALE == 'pl_PL' || goog.LOCALE == 'pl-PL') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pl; } -if (goog.LOCALE == 'trv_TW' || goog.LOCALE == 'trv-TW') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_trv; +if (goog.LOCALE == 'pt') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt; } -if (goog.LOCALE == 'ts') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ts; +if (goog.LOCALE == 'pt_BR' || goog.LOCALE == 'pt-BR') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt; } -if (goog.LOCALE == 'ts_ZA' || goog.LOCALE == 'ts-ZA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ts; +if (goog.LOCALE == 'pt_PT' || goog.LOCALE == 'pt-PT') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt_PT; } -if (goog.LOCALE == 'tt') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tt; +if (goog.LOCALE == 'ro') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ro; } -if (goog.LOCALE == 'tt_RU' || goog.LOCALE == 'tt-RU') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tt; +if (goog.LOCALE == 'ro_RO' || goog.LOCALE == 'ro-RO') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ro; } -if (goog.LOCALE == 'ug') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ug; +if (goog.LOCALE == 'ru') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ru; } -if (goog.LOCALE == 'ug_Arab' || goog.LOCALE == 'ug-Arab') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ug; +if (goog.LOCALE == 'ru_RU' || goog.LOCALE == 'ru-RU') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ru; } -if (goog.LOCALE == 'ug_Arab_CN' || goog.LOCALE == 'ug-Arab-CN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ug; +if (goog.LOCALE == 'sk') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sk; } -if (goog.LOCALE == 'ug_CN' || goog.LOCALE == 'ug-CN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ug; +if (goog.LOCALE == 'sk_SK' || goog.LOCALE == 'sk-SK') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sk; } -if (goog.LOCALE == 'uk') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uk; +if (goog.LOCALE == 'sl') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sl; } -if (goog.LOCALE == 'uk_UA' || goog.LOCALE == 'uk-UA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uk; +if (goog.LOCALE == 'sl_SI' || goog.LOCALE == 'sl-SI') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sl; } -if (goog.LOCALE == 'ur') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ur; +if (goog.LOCALE == 'sq') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sq; } -if (goog.LOCALE == 'ur_IN' || goog.LOCALE == 'ur-IN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ur_IN; +if (goog.LOCALE == 'sq_AL' || goog.LOCALE == 'sq-AL') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sq; } -if (goog.LOCALE == 'ur_PK' || goog.LOCALE == 'ur-PK') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ur_PK; +if (goog.LOCALE == 'sr') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr; } -if (goog.LOCALE == 'uz') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz; +if (goog.LOCALE == 'sr_Cyrl_RS' || goog.LOCALE == 'sr-Cyrl-RS') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr; } -if (goog.LOCALE == 'uz_AF' || goog.LOCALE == 'uz-AF') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz_AF; +if (goog.LOCALE == 'sr_Latn_RS' || goog.LOCALE == 'sr-Latn-RS') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr; } -if (goog.LOCALE == 'uz_Arab' || goog.LOCALE == 'uz-Arab') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz_Arab; +if (goog.LOCALE == 'sr_RS' || goog.LOCALE == 'sr-RS') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr; } -if (goog.LOCALE == 'uz_Arab_AF' || goog.LOCALE == 'uz-Arab-AF') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz_Arab; +if (goog.LOCALE == 'sv') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sv; } -if (goog.LOCALE == 'uz_Cyrl' || goog.LOCALE == 'uz-Cyrl') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz_Cyrl; +if (goog.LOCALE == 'sv_SE' || goog.LOCALE == 'sv-SE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sv; } -if (goog.LOCALE == 'uz_Cyrl_UZ' || goog.LOCALE == 'uz-Cyrl-UZ') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz_Cyrl; +if (goog.LOCALE == 'sw') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sw; } -if (goog.LOCALE == 'uz_Latn' || goog.LOCALE == 'uz-Latn') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz_Latn; +if (goog.LOCALE == 'sw_TZ' || goog.LOCALE == 'sw-TZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sw; } -if (goog.LOCALE == 'uz_Latn_UZ' || goog.LOCALE == 'uz-Latn-UZ') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz_Latn; +if (goog.LOCALE == 'ta') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ta; } -if (goog.LOCALE == 'uz_UZ' || goog.LOCALE == 'uz-UZ') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz_UZ; +if (goog.LOCALE == 'ta_IN' || goog.LOCALE == 'ta-IN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ta; } -if (goog.LOCALE == 've') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ve; +if (goog.LOCALE == 'te') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_te; } -if (goog.LOCALE == 've_ZA' || goog.LOCALE == 've-ZA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ve; +if (goog.LOCALE == 'te_IN' || goog.LOCALE == 'te-IN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_te; } -if (goog.LOCALE == 'vi') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_vi; +if (goog.LOCALE == 'th') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_th; } -if (goog.LOCALE == 'vi_VN' || goog.LOCALE == 'vi-VN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_vi; +if (goog.LOCALE == 'th_TH' || goog.LOCALE == 'th-TH') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_th; } -if (goog.LOCALE == 'wal') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_wal; +if (goog.LOCALE == 'tl') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tl; } -if (goog.LOCALE == 'wal_ET' || goog.LOCALE == 'wal-ET') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_wal; +if (goog.LOCALE == 'tl_PH' || goog.LOCALE == 'tl-PH') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tl; } -if (goog.LOCALE == 'wo') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_wo; +if (goog.LOCALE == 'tr') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tr; } -if (goog.LOCALE == 'wo_Latn' || goog.LOCALE == 'wo-Latn') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_wo; +if (goog.LOCALE == 'tr_TR' || goog.LOCALE == 'tr-TR') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tr; } -if (goog.LOCALE == 'wo_Latn_SN' || goog.LOCALE == 'wo-Latn-SN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_wo; +if (goog.LOCALE == 'uk') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uk; } -if (goog.LOCALE == 'wo_SN' || goog.LOCALE == 'wo-SN') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_wo; +if (goog.LOCALE == 'uk_UA' || goog.LOCALE == 'uk-UA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uk; } -if (goog.LOCALE == 'xh') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_xh; +if (goog.LOCALE == 'ur') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ur; } -if (goog.LOCALE == 'xh_ZA' || goog.LOCALE == 'xh-ZA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_xh; +if (goog.LOCALE == 'ur_PK' || goog.LOCALE == 'ur-PK') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ur; } -if (goog.LOCALE == 'yo') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_yo; +if (goog.LOCALE == 'vi') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_vi; } -if (goog.LOCALE == 'yo_NG' || goog.LOCALE == 'yo-NG') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_yo; +if (goog.LOCALE == 'vi_VN' || goog.LOCALE == 'vi-VN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_vi; } if (goog.LOCALE == 'zh') { @@ -10308,51 +3070,7 @@ if (goog.LOCALE == 'zh_Hans_CN' || goog.LOCALE == 'zh-Hans-CN') { goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh; } -if (goog.LOCALE == 'zh_Hans_HK' || goog.LOCALE == 'zh-Hans-HK') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hans_HK; -} - -if (goog.LOCALE == 'zh_Hans_MO' || goog.LOCALE == 'zh-Hans-MO') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hans_MO; -} - -if (goog.LOCALE == 'zh_Hans_SG' || goog.LOCALE == 'zh-Hans-SG') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hans_SG; -} - -if (goog.LOCALE == 'zh_Hant' || goog.LOCALE == 'zh-Hant') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hant; -} - -if (goog.LOCALE == 'zh_Hant_HK' || goog.LOCALE == 'zh-Hant-HK') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hant_HK; -} - -if (goog.LOCALE == 'zh_Hant_MO' || goog.LOCALE == 'zh-Hant-MO') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hant_MO; -} - -if (goog.LOCALE == 'zh_Hant_TW' || goog.LOCALE == 'zh-Hant-TW') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hant; -} - -if (goog.LOCALE == 'zh_MO' || goog.LOCALE == 'zh-MO') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_MO; -} - -if (goog.LOCALE == 'zh_SG' || goog.LOCALE == 'zh-SG') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_SG; -} - if (goog.LOCALE == 'zh_TW' || goog.LOCALE == 'zh-TW') { goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_TW; } -if (goog.LOCALE == 'zu') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zu; -} - -if (goog.LOCALE == 'zu_ZA' || goog.LOCALE == 'zu-ZA') { - goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zu; -} - diff --git a/contrib/closure-library/goog/i18n/numberformatsymbolsext.js b/contrib/closure-library/goog/i18n/numberformatsymbolsext.js new file mode 100644 index 0000000..af0bc78 --- /dev/null +++ b/contrib/closure-library/goog/i18n/numberformatsymbolsext.js @@ -0,0 +1,10097 @@ +// Copyright 2011 The Closure Library Authors. All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Number formatting symbols. + * + * This file is autogenerated by script: + * http://go/generate_number_constants.py + * using the --for_closure flag. + * + * This file coveres those locales that are not covered in + * "numberformatsymbols.js". + * + * Before checkin, this file could have been manually edited. This is + * to incorporate changes before we could fix CLDR. All manual + * modification must be documented in this section, and should be + * removed after those changes land to CLDR. + */ + +goog.provide('goog.i18n.NumberFormatSymbolsExt'); +goog.provide('goog.i18n.NumberFormatSymbols_aa'); +goog.provide('goog.i18n.NumberFormatSymbols_aa_DJ'); +goog.provide('goog.i18n.NumberFormatSymbols_aa_ER'); +goog.provide('goog.i18n.NumberFormatSymbols_aa_ET'); +goog.provide('goog.i18n.NumberFormatSymbols_af'); +goog.provide('goog.i18n.NumberFormatSymbols_af_NA'); +goog.provide('goog.i18n.NumberFormatSymbols_af_ZA'); +goog.provide('goog.i18n.NumberFormatSymbols_ak'); +goog.provide('goog.i18n.NumberFormatSymbols_ak_GH'); +goog.provide('goog.i18n.NumberFormatSymbols_ar_AE'); +goog.provide('goog.i18n.NumberFormatSymbols_ar_BH'); +goog.provide('goog.i18n.NumberFormatSymbols_ar_DZ'); +goog.provide('goog.i18n.NumberFormatSymbols_ar_IQ'); +goog.provide('goog.i18n.NumberFormatSymbols_ar_JO'); +goog.provide('goog.i18n.NumberFormatSymbols_ar_KW'); +goog.provide('goog.i18n.NumberFormatSymbols_ar_LB'); +goog.provide('goog.i18n.NumberFormatSymbols_ar_LY'); +goog.provide('goog.i18n.NumberFormatSymbols_ar_MA'); +goog.provide('goog.i18n.NumberFormatSymbols_ar_OM'); +goog.provide('goog.i18n.NumberFormatSymbols_ar_QA'); +goog.provide('goog.i18n.NumberFormatSymbols_ar_SA'); +goog.provide('goog.i18n.NumberFormatSymbols_ar_SD'); +goog.provide('goog.i18n.NumberFormatSymbols_ar_SY'); +goog.provide('goog.i18n.NumberFormatSymbols_ar_TN'); +goog.provide('goog.i18n.NumberFormatSymbols_ar_YE'); +goog.provide('goog.i18n.NumberFormatSymbols_as'); +goog.provide('goog.i18n.NumberFormatSymbols_as_IN'); +goog.provide('goog.i18n.NumberFormatSymbols_asa'); +goog.provide('goog.i18n.NumberFormatSymbols_asa_TZ'); +goog.provide('goog.i18n.NumberFormatSymbols_az'); +goog.provide('goog.i18n.NumberFormatSymbols_az_AZ'); +goog.provide('goog.i18n.NumberFormatSymbols_az_Arab'); +goog.provide('goog.i18n.NumberFormatSymbols_az_Arab_IR'); +goog.provide('goog.i18n.NumberFormatSymbols_az_Cyrl'); +goog.provide('goog.i18n.NumberFormatSymbols_az_Cyrl_AZ'); +goog.provide('goog.i18n.NumberFormatSymbols_az_IR'); +goog.provide('goog.i18n.NumberFormatSymbols_az_Latn'); +goog.provide('goog.i18n.NumberFormatSymbols_az_Latn_AZ'); +goog.provide('goog.i18n.NumberFormatSymbols_be'); +goog.provide('goog.i18n.NumberFormatSymbols_be_BY'); +goog.provide('goog.i18n.NumberFormatSymbols_bem'); +goog.provide('goog.i18n.NumberFormatSymbols_bem_ZM'); +goog.provide('goog.i18n.NumberFormatSymbols_bez'); +goog.provide('goog.i18n.NumberFormatSymbols_bez_TZ'); +goog.provide('goog.i18n.NumberFormatSymbols_bm'); +goog.provide('goog.i18n.NumberFormatSymbols_bm_ML'); +goog.provide('goog.i18n.NumberFormatSymbols_bn_IN'); +goog.provide('goog.i18n.NumberFormatSymbols_bo'); +goog.provide('goog.i18n.NumberFormatSymbols_bo_CN'); +goog.provide('goog.i18n.NumberFormatSymbols_bo_IN'); +goog.provide('goog.i18n.NumberFormatSymbols_br'); +goog.provide('goog.i18n.NumberFormatSymbols_br_FR'); +goog.provide('goog.i18n.NumberFormatSymbols_brx'); +goog.provide('goog.i18n.NumberFormatSymbols_brx_IN'); +goog.provide('goog.i18n.NumberFormatSymbols_bs'); +goog.provide('goog.i18n.NumberFormatSymbols_bs_BA'); +goog.provide('goog.i18n.NumberFormatSymbols_byn'); +goog.provide('goog.i18n.NumberFormatSymbols_byn_ER'); +goog.provide('goog.i18n.NumberFormatSymbols_cch'); +goog.provide('goog.i18n.NumberFormatSymbols_cch_NG'); +goog.provide('goog.i18n.NumberFormatSymbols_cgg'); +goog.provide('goog.i18n.NumberFormatSymbols_cgg_UG'); +goog.provide('goog.i18n.NumberFormatSymbols_chr'); +goog.provide('goog.i18n.NumberFormatSymbols_chr_US'); +goog.provide('goog.i18n.NumberFormatSymbols_ckb'); +goog.provide('goog.i18n.NumberFormatSymbols_ckb_Arab'); +goog.provide('goog.i18n.NumberFormatSymbols_ckb_Arab_IQ'); +goog.provide('goog.i18n.NumberFormatSymbols_ckb_Arab_IR'); +goog.provide('goog.i18n.NumberFormatSymbols_ckb_IQ'); +goog.provide('goog.i18n.NumberFormatSymbols_ckb_IR'); +goog.provide('goog.i18n.NumberFormatSymbols_ckb_Latn'); +goog.provide('goog.i18n.NumberFormatSymbols_ckb_Latn_IQ'); +goog.provide('goog.i18n.NumberFormatSymbols_cy'); +goog.provide('goog.i18n.NumberFormatSymbols_cy_GB'); +goog.provide('goog.i18n.NumberFormatSymbols_dav'); +goog.provide('goog.i18n.NumberFormatSymbols_dav_KE'); +goog.provide('goog.i18n.NumberFormatSymbols_de_LI'); +goog.provide('goog.i18n.NumberFormatSymbols_dv'); +goog.provide('goog.i18n.NumberFormatSymbols_dv_MV'); +goog.provide('goog.i18n.NumberFormatSymbols_dz'); +goog.provide('goog.i18n.NumberFormatSymbols_dz_BT'); +goog.provide('goog.i18n.NumberFormatSymbols_ebu'); +goog.provide('goog.i18n.NumberFormatSymbols_ebu_KE'); +goog.provide('goog.i18n.NumberFormatSymbols_ee'); +goog.provide('goog.i18n.NumberFormatSymbols_ee_GH'); +goog.provide('goog.i18n.NumberFormatSymbols_ee_TG'); +goog.provide('goog.i18n.NumberFormatSymbols_el_CY'); +goog.provide('goog.i18n.NumberFormatSymbols_en_BE'); +goog.provide('goog.i18n.NumberFormatSymbols_en_BW'); +goog.provide('goog.i18n.NumberFormatSymbols_en_BZ'); +goog.provide('goog.i18n.NumberFormatSymbols_en_CA'); +goog.provide('goog.i18n.NumberFormatSymbols_en_HK'); +goog.provide('goog.i18n.NumberFormatSymbols_en_JM'); +goog.provide('goog.i18n.NumberFormatSymbols_en_MT'); +goog.provide('goog.i18n.NumberFormatSymbols_en_MU'); +goog.provide('goog.i18n.NumberFormatSymbols_en_NA'); +goog.provide('goog.i18n.NumberFormatSymbols_en_NZ'); +goog.provide('goog.i18n.NumberFormatSymbols_en_PH'); +goog.provide('goog.i18n.NumberFormatSymbols_en_PK'); +goog.provide('goog.i18n.NumberFormatSymbols_en_Shaw'); +goog.provide('goog.i18n.NumberFormatSymbols_en_TT'); +goog.provide('goog.i18n.NumberFormatSymbols_en_ZW'); +goog.provide('goog.i18n.NumberFormatSymbols_eo'); +goog.provide('goog.i18n.NumberFormatSymbols_es_419'); +goog.provide('goog.i18n.NumberFormatSymbols_es_AR'); +goog.provide('goog.i18n.NumberFormatSymbols_es_BO'); +goog.provide('goog.i18n.NumberFormatSymbols_es_CL'); +goog.provide('goog.i18n.NumberFormatSymbols_es_CO'); +goog.provide('goog.i18n.NumberFormatSymbols_es_CR'); +goog.provide('goog.i18n.NumberFormatSymbols_es_DO'); +goog.provide('goog.i18n.NumberFormatSymbols_es_EC'); +goog.provide('goog.i18n.NumberFormatSymbols_es_GQ'); +goog.provide('goog.i18n.NumberFormatSymbols_es_GT'); +goog.provide('goog.i18n.NumberFormatSymbols_es_HN'); +goog.provide('goog.i18n.NumberFormatSymbols_es_MX'); +goog.provide('goog.i18n.NumberFormatSymbols_es_NI'); +goog.provide('goog.i18n.NumberFormatSymbols_es_PA'); +goog.provide('goog.i18n.NumberFormatSymbols_es_PE'); +goog.provide('goog.i18n.NumberFormatSymbols_es_PR'); +goog.provide('goog.i18n.NumberFormatSymbols_es_PY'); +goog.provide('goog.i18n.NumberFormatSymbols_es_SV'); +goog.provide('goog.i18n.NumberFormatSymbols_es_US'); +goog.provide('goog.i18n.NumberFormatSymbols_es_UY'); +goog.provide('goog.i18n.NumberFormatSymbols_es_VE'); +goog.provide('goog.i18n.NumberFormatSymbols_fa_AF'); +goog.provide('goog.i18n.NumberFormatSymbols_ff'); +goog.provide('goog.i18n.NumberFormatSymbols_ff_SN'); +goog.provide('goog.i18n.NumberFormatSymbols_fo'); +goog.provide('goog.i18n.NumberFormatSymbols_fo_FO'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_BE'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_BF'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_BI'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_BJ'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_CD'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_CF'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_CG'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_CH'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_CI'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_CM'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_DJ'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_GA'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_GN'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_GQ'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_KM'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_LU'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_MG'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_ML'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_NE'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_RW'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_SN'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_TD'); +goog.provide('goog.i18n.NumberFormatSymbols_fr_TG'); +goog.provide('goog.i18n.NumberFormatSymbols_fur'); +goog.provide('goog.i18n.NumberFormatSymbols_fur_IT'); +goog.provide('goog.i18n.NumberFormatSymbols_ga'); +goog.provide('goog.i18n.NumberFormatSymbols_ga_IE'); +goog.provide('goog.i18n.NumberFormatSymbols_gaa'); +goog.provide('goog.i18n.NumberFormatSymbols_gaa_GH'); +goog.provide('goog.i18n.NumberFormatSymbols_gez'); +goog.provide('goog.i18n.NumberFormatSymbols_gez_ER'); +goog.provide('goog.i18n.NumberFormatSymbols_gez_ET'); +goog.provide('goog.i18n.NumberFormatSymbols_guz'); +goog.provide('goog.i18n.NumberFormatSymbols_guz_KE'); +goog.provide('goog.i18n.NumberFormatSymbols_gv'); +goog.provide('goog.i18n.NumberFormatSymbols_gv_GB'); +goog.provide('goog.i18n.NumberFormatSymbols_ha'); +goog.provide('goog.i18n.NumberFormatSymbols_ha_Arab'); +goog.provide('goog.i18n.NumberFormatSymbols_ha_Arab_NG'); +goog.provide('goog.i18n.NumberFormatSymbols_ha_Arab_SD'); +goog.provide('goog.i18n.NumberFormatSymbols_ha_GH'); +goog.provide('goog.i18n.NumberFormatSymbols_ha_Latn'); +goog.provide('goog.i18n.NumberFormatSymbols_ha_Latn_GH'); +goog.provide('goog.i18n.NumberFormatSymbols_ha_Latn_NE'); +goog.provide('goog.i18n.NumberFormatSymbols_ha_Latn_NG'); +goog.provide('goog.i18n.NumberFormatSymbols_ha_NE'); +goog.provide('goog.i18n.NumberFormatSymbols_ha_NG'); +goog.provide('goog.i18n.NumberFormatSymbols_ha_SD'); +goog.provide('goog.i18n.NumberFormatSymbols_haw'); +goog.provide('goog.i18n.NumberFormatSymbols_haw_US'); +goog.provide('goog.i18n.NumberFormatSymbols_hy'); +goog.provide('goog.i18n.NumberFormatSymbols_hy_AM'); +goog.provide('goog.i18n.NumberFormatSymbols_ia'); +goog.provide('goog.i18n.NumberFormatSymbols_ig'); +goog.provide('goog.i18n.NumberFormatSymbols_ig_NG'); +goog.provide('goog.i18n.NumberFormatSymbols_ii'); +goog.provide('goog.i18n.NumberFormatSymbols_ii_CN'); +goog.provide('goog.i18n.NumberFormatSymbols_it_CH'); +goog.provide('goog.i18n.NumberFormatSymbols_iu'); +goog.provide('goog.i18n.NumberFormatSymbols_jmc'); +goog.provide('goog.i18n.NumberFormatSymbols_jmc_TZ'); +goog.provide('goog.i18n.NumberFormatSymbols_ka'); +goog.provide('goog.i18n.NumberFormatSymbols_ka_GE'); +goog.provide('goog.i18n.NumberFormatSymbols_kab'); +goog.provide('goog.i18n.NumberFormatSymbols_kab_DZ'); +goog.provide('goog.i18n.NumberFormatSymbols_kaj'); +goog.provide('goog.i18n.NumberFormatSymbols_kaj_NG'); +goog.provide('goog.i18n.NumberFormatSymbols_kam'); +goog.provide('goog.i18n.NumberFormatSymbols_kam_KE'); +goog.provide('goog.i18n.NumberFormatSymbols_kcg'); +goog.provide('goog.i18n.NumberFormatSymbols_kcg_NG'); +goog.provide('goog.i18n.NumberFormatSymbols_kde'); +goog.provide('goog.i18n.NumberFormatSymbols_kde_TZ'); +goog.provide('goog.i18n.NumberFormatSymbols_kea'); +goog.provide('goog.i18n.NumberFormatSymbols_kea_CV'); +goog.provide('goog.i18n.NumberFormatSymbols_kfo'); +goog.provide('goog.i18n.NumberFormatSymbols_kfo_CI'); +goog.provide('goog.i18n.NumberFormatSymbols_khq'); +goog.provide('goog.i18n.NumberFormatSymbols_khq_ML'); +goog.provide('goog.i18n.NumberFormatSymbols_ki'); +goog.provide('goog.i18n.NumberFormatSymbols_ki_KE'); +goog.provide('goog.i18n.NumberFormatSymbols_kk'); +goog.provide('goog.i18n.NumberFormatSymbols_kk_Cyrl'); +goog.provide('goog.i18n.NumberFormatSymbols_kk_Cyrl_KZ'); +goog.provide('goog.i18n.NumberFormatSymbols_kk_KZ'); +goog.provide('goog.i18n.NumberFormatSymbols_kl'); +goog.provide('goog.i18n.NumberFormatSymbols_kl_GL'); +goog.provide('goog.i18n.NumberFormatSymbols_kln'); +goog.provide('goog.i18n.NumberFormatSymbols_kln_KE'); +goog.provide('goog.i18n.NumberFormatSymbols_km'); +goog.provide('goog.i18n.NumberFormatSymbols_km_KH'); +goog.provide('goog.i18n.NumberFormatSymbols_kok'); +goog.provide('goog.i18n.NumberFormatSymbols_kok_IN'); +goog.provide('goog.i18n.NumberFormatSymbols_kpe'); +goog.provide('goog.i18n.NumberFormatSymbols_kpe_GN'); +goog.provide('goog.i18n.NumberFormatSymbols_kpe_LR'); +goog.provide('goog.i18n.NumberFormatSymbols_ksb'); +goog.provide('goog.i18n.NumberFormatSymbols_ksb_TZ'); +goog.provide('goog.i18n.NumberFormatSymbols_ksh'); +goog.provide('goog.i18n.NumberFormatSymbols_ksh_DE'); +goog.provide('goog.i18n.NumberFormatSymbols_ku'); +goog.provide('goog.i18n.NumberFormatSymbols_ku_Arab'); +goog.provide('goog.i18n.NumberFormatSymbols_ku_Arab_IQ'); +goog.provide('goog.i18n.NumberFormatSymbols_ku_Arab_IR'); +goog.provide('goog.i18n.NumberFormatSymbols_ku_IQ'); +goog.provide('goog.i18n.NumberFormatSymbols_ku_IR'); +goog.provide('goog.i18n.NumberFormatSymbols_ku_Latn'); +goog.provide('goog.i18n.NumberFormatSymbols_ku_Latn_SY'); +goog.provide('goog.i18n.NumberFormatSymbols_ku_Latn_TR'); +goog.provide('goog.i18n.NumberFormatSymbols_ku_SY'); +goog.provide('goog.i18n.NumberFormatSymbols_ku_TR'); +goog.provide('goog.i18n.NumberFormatSymbols_kw'); +goog.provide('goog.i18n.NumberFormatSymbols_kw_GB'); +goog.provide('goog.i18n.NumberFormatSymbols_ky'); +goog.provide('goog.i18n.NumberFormatSymbols_ky_KG'); +goog.provide('goog.i18n.NumberFormatSymbols_lag'); +goog.provide('goog.i18n.NumberFormatSymbols_lag_TZ'); +goog.provide('goog.i18n.NumberFormatSymbols_lg'); +goog.provide('goog.i18n.NumberFormatSymbols_lg_UG'); +goog.provide('goog.i18n.NumberFormatSymbols_ln_CG'); +goog.provide('goog.i18n.NumberFormatSymbols_lo'); +goog.provide('goog.i18n.NumberFormatSymbols_lo_LA'); +goog.provide('goog.i18n.NumberFormatSymbols_luo'); +goog.provide('goog.i18n.NumberFormatSymbols_luo_KE'); +goog.provide('goog.i18n.NumberFormatSymbols_luy'); +goog.provide('goog.i18n.NumberFormatSymbols_luy_KE'); +goog.provide('goog.i18n.NumberFormatSymbols_mas'); +goog.provide('goog.i18n.NumberFormatSymbols_mas_KE'); +goog.provide('goog.i18n.NumberFormatSymbols_mas_TZ'); +goog.provide('goog.i18n.NumberFormatSymbols_mer'); +goog.provide('goog.i18n.NumberFormatSymbols_mer_KE'); +goog.provide('goog.i18n.NumberFormatSymbols_mfe'); +goog.provide('goog.i18n.NumberFormatSymbols_mfe_MU'); +goog.provide('goog.i18n.NumberFormatSymbols_mg'); +goog.provide('goog.i18n.NumberFormatSymbols_mg_MG'); +goog.provide('goog.i18n.NumberFormatSymbols_mi'); +goog.provide('goog.i18n.NumberFormatSymbols_mi_NZ'); +goog.provide('goog.i18n.NumberFormatSymbols_mk'); +goog.provide('goog.i18n.NumberFormatSymbols_mk_MK'); +goog.provide('goog.i18n.NumberFormatSymbols_mn'); +goog.provide('goog.i18n.NumberFormatSymbols_mn_CN'); +goog.provide('goog.i18n.NumberFormatSymbols_mn_Cyrl'); +goog.provide('goog.i18n.NumberFormatSymbols_mn_Cyrl_MN'); +goog.provide('goog.i18n.NumberFormatSymbols_mn_MN'); +goog.provide('goog.i18n.NumberFormatSymbols_mn_Mong'); +goog.provide('goog.i18n.NumberFormatSymbols_mn_Mong_CN'); +goog.provide('goog.i18n.NumberFormatSymbols_ms_BN'); +goog.provide('goog.i18n.NumberFormatSymbols_my'); +goog.provide('goog.i18n.NumberFormatSymbols_my_MM'); +goog.provide('goog.i18n.NumberFormatSymbols_naq'); +goog.provide('goog.i18n.NumberFormatSymbols_naq_NA'); +goog.provide('goog.i18n.NumberFormatSymbols_nb'); +goog.provide('goog.i18n.NumberFormatSymbols_nb_NO'); +goog.provide('goog.i18n.NumberFormatSymbols_nd'); +goog.provide('goog.i18n.NumberFormatSymbols_nd_ZW'); +goog.provide('goog.i18n.NumberFormatSymbols_nds'); +goog.provide('goog.i18n.NumberFormatSymbols_nds_DE'); +goog.provide('goog.i18n.NumberFormatSymbols_ne'); +goog.provide('goog.i18n.NumberFormatSymbols_ne_IN'); +goog.provide('goog.i18n.NumberFormatSymbols_ne_NP'); +goog.provide('goog.i18n.NumberFormatSymbols_nl_BE'); +goog.provide('goog.i18n.NumberFormatSymbols_nn'); +goog.provide('goog.i18n.NumberFormatSymbols_nn_NO'); +goog.provide('goog.i18n.NumberFormatSymbols_nr'); +goog.provide('goog.i18n.NumberFormatSymbols_nr_ZA'); +goog.provide('goog.i18n.NumberFormatSymbols_nso'); +goog.provide('goog.i18n.NumberFormatSymbols_nso_ZA'); +goog.provide('goog.i18n.NumberFormatSymbols_ny'); +goog.provide('goog.i18n.NumberFormatSymbols_ny_MW'); +goog.provide('goog.i18n.NumberFormatSymbols_nyn'); +goog.provide('goog.i18n.NumberFormatSymbols_nyn_UG'); +goog.provide('goog.i18n.NumberFormatSymbols_oc'); +goog.provide('goog.i18n.NumberFormatSymbols_oc_FR'); +goog.provide('goog.i18n.NumberFormatSymbols_om'); +goog.provide('goog.i18n.NumberFormatSymbols_om_ET'); +goog.provide('goog.i18n.NumberFormatSymbols_om_KE'); +goog.provide('goog.i18n.NumberFormatSymbols_pa'); +goog.provide('goog.i18n.NumberFormatSymbols_pa_Arab'); +goog.provide('goog.i18n.NumberFormatSymbols_pa_Arab_PK'); +goog.provide('goog.i18n.NumberFormatSymbols_pa_Guru'); +goog.provide('goog.i18n.NumberFormatSymbols_pa_Guru_IN'); +goog.provide('goog.i18n.NumberFormatSymbols_pa_IN'); +goog.provide('goog.i18n.NumberFormatSymbols_pa_PK'); +goog.provide('goog.i18n.NumberFormatSymbols_ps'); +goog.provide('goog.i18n.NumberFormatSymbols_ps_AF'); +goog.provide('goog.i18n.NumberFormatSymbols_pt_AO'); +goog.provide('goog.i18n.NumberFormatSymbols_pt_GW'); +goog.provide('goog.i18n.NumberFormatSymbols_pt_MZ'); +goog.provide('goog.i18n.NumberFormatSymbols_rm'); +goog.provide('goog.i18n.NumberFormatSymbols_rm_CH'); +goog.provide('goog.i18n.NumberFormatSymbols_ro_MD'); +goog.provide('goog.i18n.NumberFormatSymbols_rof'); +goog.provide('goog.i18n.NumberFormatSymbols_rof_TZ'); +goog.provide('goog.i18n.NumberFormatSymbols_ru_MD'); +goog.provide('goog.i18n.NumberFormatSymbols_ru_UA'); +goog.provide('goog.i18n.NumberFormatSymbols_rw'); +goog.provide('goog.i18n.NumberFormatSymbols_rw_RW'); +goog.provide('goog.i18n.NumberFormatSymbols_rwk'); +goog.provide('goog.i18n.NumberFormatSymbols_rwk_TZ'); +goog.provide('goog.i18n.NumberFormatSymbols_sa'); +goog.provide('goog.i18n.NumberFormatSymbols_sa_IN'); +goog.provide('goog.i18n.NumberFormatSymbols_saq'); +goog.provide('goog.i18n.NumberFormatSymbols_saq_KE'); +goog.provide('goog.i18n.NumberFormatSymbols_se'); +goog.provide('goog.i18n.NumberFormatSymbols_se_FI'); +goog.provide('goog.i18n.NumberFormatSymbols_se_NO'); +goog.provide('goog.i18n.NumberFormatSymbols_seh'); +goog.provide('goog.i18n.NumberFormatSymbols_seh_MZ'); +goog.provide('goog.i18n.NumberFormatSymbols_ses'); +goog.provide('goog.i18n.NumberFormatSymbols_ses_ML'); +goog.provide('goog.i18n.NumberFormatSymbols_sg'); +goog.provide('goog.i18n.NumberFormatSymbols_sg_CF'); +goog.provide('goog.i18n.NumberFormatSymbols_sh'); +goog.provide('goog.i18n.NumberFormatSymbols_sh_BA'); +goog.provide('goog.i18n.NumberFormatSymbols_sh_CS'); +goog.provide('goog.i18n.NumberFormatSymbols_sh_YU'); +goog.provide('goog.i18n.NumberFormatSymbols_shi'); +goog.provide('goog.i18n.NumberFormatSymbols_shi_Latn'); +goog.provide('goog.i18n.NumberFormatSymbols_shi_Latn_MA'); +goog.provide('goog.i18n.NumberFormatSymbols_shi_MA'); +goog.provide('goog.i18n.NumberFormatSymbols_shi_Tfng'); +goog.provide('goog.i18n.NumberFormatSymbols_shi_Tfng_MA'); +goog.provide('goog.i18n.NumberFormatSymbols_si'); +goog.provide('goog.i18n.NumberFormatSymbols_si_LK'); +goog.provide('goog.i18n.NumberFormatSymbols_sid'); +goog.provide('goog.i18n.NumberFormatSymbols_sid_ET'); +goog.provide('goog.i18n.NumberFormatSymbols_sn'); +goog.provide('goog.i18n.NumberFormatSymbols_sn_ZW'); +goog.provide('goog.i18n.NumberFormatSymbols_so'); +goog.provide('goog.i18n.NumberFormatSymbols_so_DJ'); +goog.provide('goog.i18n.NumberFormatSymbols_so_ET'); +goog.provide('goog.i18n.NumberFormatSymbols_so_KE'); +goog.provide('goog.i18n.NumberFormatSymbols_so_SO'); +goog.provide('goog.i18n.NumberFormatSymbols_sr_BA'); +goog.provide('goog.i18n.NumberFormatSymbols_sr_CS'); +goog.provide('goog.i18n.NumberFormatSymbols_sr_Cyrl'); +goog.provide('goog.i18n.NumberFormatSymbols_sr_Cyrl_BA'); +goog.provide('goog.i18n.NumberFormatSymbols_sr_Cyrl_CS'); +goog.provide('goog.i18n.NumberFormatSymbols_sr_Cyrl_ME'); +goog.provide('goog.i18n.NumberFormatSymbols_sr_Cyrl_YU'); +goog.provide('goog.i18n.NumberFormatSymbols_sr_Latn'); +goog.provide('goog.i18n.NumberFormatSymbols_sr_Latn_BA'); +goog.provide('goog.i18n.NumberFormatSymbols_sr_Latn_CS'); +goog.provide('goog.i18n.NumberFormatSymbols_sr_Latn_ME'); +goog.provide('goog.i18n.NumberFormatSymbols_sr_Latn_YU'); +goog.provide('goog.i18n.NumberFormatSymbols_sr_ME'); +goog.provide('goog.i18n.NumberFormatSymbols_sr_YU'); +goog.provide('goog.i18n.NumberFormatSymbols_ss'); +goog.provide('goog.i18n.NumberFormatSymbols_ss_SZ'); +goog.provide('goog.i18n.NumberFormatSymbols_ss_ZA'); +goog.provide('goog.i18n.NumberFormatSymbols_ssy'); +goog.provide('goog.i18n.NumberFormatSymbols_ssy_ER'); +goog.provide('goog.i18n.NumberFormatSymbols_st'); +goog.provide('goog.i18n.NumberFormatSymbols_st_LS'); +goog.provide('goog.i18n.NumberFormatSymbols_st_ZA'); +goog.provide('goog.i18n.NumberFormatSymbols_sv_FI'); +goog.provide('goog.i18n.NumberFormatSymbols_sw_KE'); +goog.provide('goog.i18n.NumberFormatSymbols_syr'); +goog.provide('goog.i18n.NumberFormatSymbols_syr_SY'); +goog.provide('goog.i18n.NumberFormatSymbols_ta_LK'); +goog.provide('goog.i18n.NumberFormatSymbols_teo'); +goog.provide('goog.i18n.NumberFormatSymbols_teo_KE'); +goog.provide('goog.i18n.NumberFormatSymbols_teo_UG'); +goog.provide('goog.i18n.NumberFormatSymbols_tg'); +goog.provide('goog.i18n.NumberFormatSymbols_tg_Cyrl'); +goog.provide('goog.i18n.NumberFormatSymbols_tg_Cyrl_TJ'); +goog.provide('goog.i18n.NumberFormatSymbols_tg_TJ'); +goog.provide('goog.i18n.NumberFormatSymbols_ti'); +goog.provide('goog.i18n.NumberFormatSymbols_ti_ER'); +goog.provide('goog.i18n.NumberFormatSymbols_ti_ET'); +goog.provide('goog.i18n.NumberFormatSymbols_tig'); +goog.provide('goog.i18n.NumberFormatSymbols_tig_ER'); +goog.provide('goog.i18n.NumberFormatSymbols_tn'); +goog.provide('goog.i18n.NumberFormatSymbols_tn_ZA'); +goog.provide('goog.i18n.NumberFormatSymbols_to'); +goog.provide('goog.i18n.NumberFormatSymbols_to_TO'); +goog.provide('goog.i18n.NumberFormatSymbols_trv'); +goog.provide('goog.i18n.NumberFormatSymbols_trv_TW'); +goog.provide('goog.i18n.NumberFormatSymbols_ts'); +goog.provide('goog.i18n.NumberFormatSymbols_ts_ZA'); +goog.provide('goog.i18n.NumberFormatSymbols_tt'); +goog.provide('goog.i18n.NumberFormatSymbols_tt_RU'); +goog.provide('goog.i18n.NumberFormatSymbols_tzm'); +goog.provide('goog.i18n.NumberFormatSymbols_tzm_Latn'); +goog.provide('goog.i18n.NumberFormatSymbols_tzm_Latn_MA'); +goog.provide('goog.i18n.NumberFormatSymbols_tzm_MA'); +goog.provide('goog.i18n.NumberFormatSymbols_ug'); +goog.provide('goog.i18n.NumberFormatSymbols_ug_Arab'); +goog.provide('goog.i18n.NumberFormatSymbols_ug_Arab_CN'); +goog.provide('goog.i18n.NumberFormatSymbols_ug_CN'); +goog.provide('goog.i18n.NumberFormatSymbols_ur_IN'); +goog.provide('goog.i18n.NumberFormatSymbols_uz'); +goog.provide('goog.i18n.NumberFormatSymbols_uz_AF'); +goog.provide('goog.i18n.NumberFormatSymbols_uz_Arab'); +goog.provide('goog.i18n.NumberFormatSymbols_uz_Arab_AF'); +goog.provide('goog.i18n.NumberFormatSymbols_uz_Cyrl'); +goog.provide('goog.i18n.NumberFormatSymbols_uz_Cyrl_UZ'); +goog.provide('goog.i18n.NumberFormatSymbols_uz_Latn'); +goog.provide('goog.i18n.NumberFormatSymbols_uz_Latn_UZ'); +goog.provide('goog.i18n.NumberFormatSymbols_uz_UZ'); +goog.provide('goog.i18n.NumberFormatSymbols_ve'); +goog.provide('goog.i18n.NumberFormatSymbols_ve_ZA'); +goog.provide('goog.i18n.NumberFormatSymbols_vun'); +goog.provide('goog.i18n.NumberFormatSymbols_vun_TZ'); +goog.provide('goog.i18n.NumberFormatSymbols_wal'); +goog.provide('goog.i18n.NumberFormatSymbols_wal_ET'); +goog.provide('goog.i18n.NumberFormatSymbols_wo'); +goog.provide('goog.i18n.NumberFormatSymbols_wo_Latn'); +goog.provide('goog.i18n.NumberFormatSymbols_wo_Latn_SN'); +goog.provide('goog.i18n.NumberFormatSymbols_wo_SN'); +goog.provide('goog.i18n.NumberFormatSymbols_xh'); +goog.provide('goog.i18n.NumberFormatSymbols_xh_ZA'); +goog.provide('goog.i18n.NumberFormatSymbols_xog'); +goog.provide('goog.i18n.NumberFormatSymbols_xog_UG'); +goog.provide('goog.i18n.NumberFormatSymbols_yo'); +goog.provide('goog.i18n.NumberFormatSymbols_yo_NG'); +goog.provide('goog.i18n.NumberFormatSymbols_zh_Hans_HK'); +goog.provide('goog.i18n.NumberFormatSymbols_zh_Hans_MO'); +goog.provide('goog.i18n.NumberFormatSymbols_zh_Hans_SG'); +goog.provide('goog.i18n.NumberFormatSymbols_zh_Hant'); +goog.provide('goog.i18n.NumberFormatSymbols_zh_Hant_HK'); +goog.provide('goog.i18n.NumberFormatSymbols_zh_Hant_MO'); +goog.provide('goog.i18n.NumberFormatSymbols_zh_Hant_TW'); +goog.provide('goog.i18n.NumberFormatSymbols_zh_MO'); +goog.provide('goog.i18n.NumberFormatSymbols_zh_SG'); +goog.provide('goog.i18n.NumberFormatSymbols_zu'); +goog.provide('goog.i18n.NumberFormatSymbols_zu_ZA'); + +goog.require('goog.i18n.NumberFormatSymbols'); + + +/** + * Number formatting symbols for locale aa. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_aa = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ETB' +}; + + +/** + * Number formatting symbols for locale aa_DJ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_aa_DJ = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'DJF' +}; + + +/** + * Number formatting symbols for locale aa_ER. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_aa_ER = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ERN' +}; + + +/** + * Number formatting symbols for locale aa_ET. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_aa_ET = goog.i18n.NumberFormatSymbols_aa; + + +/** + * Number formatting symbols for locale af. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_af = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: '\u00A4\u00A4\u00A4', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ZAR' +}; + + +/** + * Number formatting symbols for locale af_NA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_af_NA = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: '\u00A4\u00A4\u00A4', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'ZAR' +}; + + +/** + * Number formatting symbols for locale af_ZA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_af_ZA = goog.i18n.NumberFormatSymbols_af; + + +/** + * Number formatting symbols for locale ak. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ak = { + DECIMAL_SEP: '.', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'GHC' +}; + + +/** + * Number formatting symbols for locale ak_GH. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ak_GH = goog.i18n.NumberFormatSymbols_ak; + + +/** + * Number formatting symbols for locale ar_AE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ar_AE = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', + DEF_CURRENCY_CODE: 'AED' +}; + + +/** + * Number formatting symbols for locale ar_BH. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ar_BH = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', + DEF_CURRENCY_CODE: 'BHD' +}; + + +/** + * Number formatting symbols for locale ar_DZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ar_DZ = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', + DEF_CURRENCY_CODE: 'DZD' +}; + + +/** + * Number formatting symbols for locale ar_IQ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ar_IQ = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', + DEF_CURRENCY_CODE: 'IQD' +}; + + +/** + * Number formatting symbols for locale ar_JO. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ar_JO = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', + DEF_CURRENCY_CODE: 'JOD' +}; + + +/** + * Number formatting symbols for locale ar_KW. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ar_KW = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', + DEF_CURRENCY_CODE: 'KWD' +}; + + +/** + * Number formatting symbols for locale ar_LB. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ar_LB = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', + DEF_CURRENCY_CODE: 'LBP' +}; + + +/** + * Number formatting symbols for locale ar_LY. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ar_LY = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', + DEF_CURRENCY_CODE: 'LYD' +}; + + +/** + * Number formatting symbols for locale ar_MA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ar_MA = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', + DEF_CURRENCY_CODE: 'MAD' +}; + + +/** + * Number formatting symbols for locale ar_OM. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ar_OM = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', + DEF_CURRENCY_CODE: 'OMR' +}; + + +/** + * Number formatting symbols for locale ar_QA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ar_QA = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#0.###;#0.###-', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#0.00', + DEF_CURRENCY_CODE: 'QAR' +}; + + +/** + * Number formatting symbols for locale ar_SA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ar_SA = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#0.###;#0.###-', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#0.00', + DEF_CURRENCY_CODE: 'SAR' +}; + + +/** + * Number formatting symbols for locale ar_SD. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ar_SD = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', + DEF_CURRENCY_CODE: 'SDD' +}; + + +/** + * Number formatting symbols for locale ar_SY. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ar_SY = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#0.###;#0.###-', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#0.00', + DEF_CURRENCY_CODE: 'SYP' +}; + + +/** + * Number formatting symbols for locale ar_TN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ar_TN = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#0.###;#0.###-', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#0.00', + DEF_CURRENCY_CODE: 'TND' +}; + + +/** + * Number formatting symbols for locale ar_YE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ar_YE = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#0.###;#0.###-', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#0.00', + DEF_CURRENCY_CODE: 'YER' +}; + + +/** + * Number formatting symbols for locale as. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_as = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', + DEF_CURRENCY_CODE: 'INR' +}; + + +/** + * Number formatting symbols for locale as_IN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_as_IN = goog.i18n.NumberFormatSymbols_as; + + +/** + * Number formatting symbols for locale asa. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_asa = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'TZS' +}; + + +/** + * Number formatting symbols for locale asa_TZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_asa_TZ = goog.i18n.NumberFormatSymbols_asa; + + +/** + * Number formatting symbols for locale az. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_az = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'AZN' +}; + + +/** + * Number formatting symbols for locale az_AZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_az_AZ = goog.i18n.NumberFormatSymbols_az; + + +/** + * Number formatting symbols for locale az_Arab. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_az_Arab = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'IRR' +}; + + +/** + * Number formatting symbols for locale az_Arab_IR. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_az_Arab_IR = + goog.i18n.NumberFormatSymbols_az_Arab; + + +/** + * Number formatting symbols for locale az_Cyrl. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_az_Cyrl = goog.i18n.NumberFormatSymbols_az; + + +/** + * Number formatting symbols for locale az_Cyrl_AZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_az_Cyrl_AZ = goog.i18n.NumberFormatSymbols_az; + + +/** + * Number formatting symbols for locale az_IR. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_az_IR = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'IRR' +}; + + +/** + * Number formatting symbols for locale az_Latn. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_az_Latn = goog.i18n.NumberFormatSymbols_az; + + +/** + * Number formatting symbols for locale az_Latn_AZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_az_Latn_AZ = goog.i18n.NumberFormatSymbols_az; + + +/** + * Number formatting symbols for locale be. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_be = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'BYR' +}; + + +/** + * Number formatting symbols for locale be_BY. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_be_BY = goog.i18n.NumberFormatSymbols_be; + + +/** + * Number formatting symbols for locale bem. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_bem = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'ZMK' +}; + + +/** + * Number formatting symbols for locale bem_ZM. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_bem_ZM = goog.i18n.NumberFormatSymbols_bem; + + +/** + * Number formatting symbols for locale bez. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_bez = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A4', + DEF_CURRENCY_CODE: 'TZS' +}; + + +/** + * Number formatting symbols for locale bez_TZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_bez_TZ = goog.i18n.NumberFormatSymbols_bez; + + +/** + * Number formatting symbols for locale bm. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_bm = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'XOF' +}; + + +/** + * Number formatting symbols for locale bm_ML. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_bm_ML = goog.i18n.NumberFormatSymbols_bm; + + +/** + * Number formatting symbols for locale bn_IN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_bn_IN = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##,##0%', + CURRENCY_PATTERN: '#,##,##0.00\u00A4;(#,##,##0.00\u00A4)', + DEF_CURRENCY_CODE: 'INR' +}; + + +/** + * Number formatting symbols for locale bo. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_bo = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'CNY' +}; + + +/** + * Number formatting symbols for locale bo_CN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_bo_CN = goog.i18n.NumberFormatSymbols_bo; + + +/** + * Number formatting symbols for locale bo_IN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_bo_IN = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'INR' +}; + + +/** + * Number formatting symbols for locale br. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_br = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'EUR' +}; + + +/** + * Number formatting symbols for locale br_FR. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_br_FR = goog.i18n.NumberFormatSymbols_br; + + +/** + * Number formatting symbols for locale brx. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_brx = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', + DEF_CURRENCY_CODE: 'INR' +}; + + +/** + * Number formatting symbols for locale brx_IN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_brx_IN = goog.i18n.NumberFormatSymbols_brx; + + +/** + * Number formatting symbols for locale bs. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_bs = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'BAM' +}; + + +/** + * Number formatting symbols for locale bs_BA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_bs_BA = goog.i18n.NumberFormatSymbols_bs; + + +/** + * Number formatting symbols for locale byn. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_byn = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ERN' +}; + + +/** + * Number formatting symbols for locale byn_ER. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_byn_ER = goog.i18n.NumberFormatSymbols_byn; + + +/** + * Number formatting symbols for locale cch. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_cch = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'NGN' +}; + + +/** + * Number formatting symbols for locale cch_NG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_cch_NG = goog.i18n.NumberFormatSymbols_cch; + + +/** + * Number formatting symbols for locale cgg. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_cgg = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;-#,##0.00\u00A4', + DEF_CURRENCY_CODE: 'UGX' +}; + + +/** + * Number formatting symbols for locale cgg_UG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_cgg_UG = goog.i18n.NumberFormatSymbols_cgg; + + +/** + * Number formatting symbols for locale chr. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_chr = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'USD' +}; + + +/** + * Number formatting symbols for locale chr_US. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_chr_US = goog.i18n.NumberFormatSymbols_chr; + + +/** + * Number formatting symbols for locale ckb. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ckb = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'IQD' +}; + + +/** + * Number formatting symbols for locale ckb_Arab. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ckb_Arab = goog.i18n.NumberFormatSymbols_ckb; + + +/** + * Number formatting symbols for locale ckb_Arab_IQ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ckb_Arab_IQ = goog.i18n.NumberFormatSymbols_ckb; + + +/** + * Number formatting symbols for locale ckb_Arab_IR. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ckb_Arab_IR = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'IRR' +}; + + +/** + * Number formatting symbols for locale ckb_IQ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ckb_IQ = goog.i18n.NumberFormatSymbols_ckb; + + +/** + * Number formatting symbols for locale ckb_IR. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ckb_IR = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'IRR' +}; + + +/** + * Number formatting symbols for locale ckb_Latn. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ckb_Latn = goog.i18n.NumberFormatSymbols_ckb; + + +/** + * Number formatting symbols for locale ckb_Latn_IQ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ckb_Latn_IQ = goog.i18n.NumberFormatSymbols_ckb; + + +/** + * Number formatting symbols for locale cy. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_cy = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'GBP' +}; + + +/** + * Number formatting symbols for locale cy_GB. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_cy_GB = goog.i18n.NumberFormatSymbols_cy; + + +/** + * Number formatting symbols for locale dav. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_dav = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'KES' +}; + + +/** + * Number formatting symbols for locale dav_KE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_dav_KE = goog.i18n.NumberFormatSymbols_dav; + + +/** + * Number formatting symbols for locale de_LI. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_de_LI = { + DECIMAL_SEP: '.', + GROUP_SEP: '\'', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'CHF' +}; + + +/** + * Number formatting symbols for locale dv. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_dv = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', + DEF_CURRENCY_CODE: 'MVR' +}; + + +/** + * Number formatting symbols for locale dv_MV. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_dv_MV = goog.i18n.NumberFormatSymbols_dv; + + +/** + * Number formatting symbols for locale dz. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_dz = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##,##0.###', + SCIENTIFIC_PATTERN: '#E+00', + PERCENT_PATTERN: '#,##,##0\u00A0%', + CURRENCY_PATTERN: '\u00A4#,##,##0.00', + DEF_CURRENCY_CODE: 'BTN' +}; + + +/** + * Number formatting symbols for locale dz_BT. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_dz_BT = goog.i18n.NumberFormatSymbols_dz; + + +/** + * Number formatting symbols for locale ebu. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ebu = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'KES' +}; + + +/** + * Number formatting symbols for locale ebu_KE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ebu_KE = goog.i18n.NumberFormatSymbols_ebu; + + +/** + * Number formatting symbols for locale ee. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ee = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'GHC' +}; + + +/** + * Number formatting symbols for locale ee_GH. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ee_GH = goog.i18n.NumberFormatSymbols_ee; + + +/** + * Number formatting symbols for locale ee_TG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ee_TG = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'XOF' +}; + + +/** + * Number formatting symbols for locale el_CY. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_el_CY = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'e', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'CYP' +}; + + +/** + * Number formatting symbols for locale en_BE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_BE = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'EUR' +}; + + +/** + * Number formatting symbols for locale en_BW. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_BW = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'BWP' +}; + + +/** + * Number formatting symbols for locale en_BZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_BZ = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'BZD' +}; + + +/** + * Number formatting symbols for locale en_CA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_CA = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'CAD' +}; + + +/** + * Number formatting symbols for locale en_HK. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_HK = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'HKD' +}; + + +/** + * Number formatting symbols for locale en_JM. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_JM = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'JMD' +}; + + +/** + * Number formatting symbols for locale en_MT. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_MT = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'MTL' +}; + + +/** + * Number formatting symbols for locale en_MU. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_MU = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'MUR' +}; + + +/** + * Number formatting symbols for locale en_NA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_NA = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ZAR' +}; + + +/** + * Number formatting symbols for locale en_NZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_NZ = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'NZD' +}; + + +/** + * Number formatting symbols for locale en_PH. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_PH = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'PHP' +}; + + +/** + * Number formatting symbols for locale en_PK. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_PK = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', + DEF_CURRENCY_CODE: 'PKR' +}; + + +/** + * Number formatting symbols for locale en_Shaw. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_Shaw = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'GBP' +}; + + +/** + * Number formatting symbols for locale en_TT. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_TT = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'TTD' +}; + + +/** + * Number formatting symbols for locale en_ZW. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_en_ZW = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ZWD' +}; + + +/** + * Number formatting symbols for locale eo. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_eo = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'USD' +}; + + +/** + * Number formatting symbols for locale es_419. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_419 = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'MXN' +}; + + +/** + * Number formatting symbols for locale es_AR. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_AR = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'ARS' +}; + + +/** + * Number formatting symbols for locale es_BO. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_BO = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'BOB' +}; + + +/** + * Number formatting symbols for locale es_CL. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_CL = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;\u00A4-#,##0.00', + DEF_CURRENCY_CODE: 'CLP' +}; + + +/** + * Number formatting symbols for locale es_CO. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_CO = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'COP' +}; + + +/** + * Number formatting symbols for locale es_CR. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_CR = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'CRC' +}; + + +/** + * Number formatting symbols for locale es_DO. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_DO = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'DOP' +}; + + +/** + * Number formatting symbols for locale es_EC. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_EC = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;\u00A4-#,##0.00', + DEF_CURRENCY_CODE: 'USD' +}; + + +/** + * Number formatting symbols for locale es_GQ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_GQ = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'XAF' +}; + + +/** + * Number formatting symbols for locale es_GT. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_GT = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'GTQ' +}; + + +/** + * Number formatting symbols for locale es_HN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_HN = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'HNL' +}; + + +/** + * Number formatting symbols for locale es_MX. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_MX = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'MXN' +}; + + +/** + * Number formatting symbols for locale es_NI. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_NI = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'NIO' +}; + + +/** + * Number formatting symbols for locale es_PA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_PA = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'PAB' +}; + + +/** + * Number formatting symbols for locale es_PE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_PE = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'PEN' +}; + + +/** + * Number formatting symbols for locale es_PR. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_PR = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'USD' +}; + + +/** + * Number formatting symbols for locale es_PY. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_PY = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0-#,##0.00', + DEF_CURRENCY_CODE: 'PYG' +}; + + +/** + * Number formatting symbols for locale es_SV. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_SV = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'SVC' +}; + + +/** + * Number formatting symbols for locale es_US. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_US = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'USD' +}; + + +/** + * Number formatting symbols for locale es_UY. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_UY = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;(\u00A4\u00A0#,##0.00)', + DEF_CURRENCY_CODE: 'UYU' +}; + + +/** + * Number formatting symbols for locale es_VE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_es_VE = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;\u00A4-#,##0.00', + DEF_CURRENCY_CODE: 'VEB' +}; + + +/** + * Number formatting symbols for locale fa_AF. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fa_AF = { + DECIMAL_SEP: '/', + GROUP_SEP: '\u060C', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '\u2212', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###;\'\u202A\'-#,##0.###\'\u202C\'', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '\'\u202A\'#,##0%\'\u202C\'', + CURRENCY_PATTERN: + '#,##0.00\u00A0\u00A4;\'\u202A\'-#,##0.00\'\u202C\'\u00A0\u00A4', + DEF_CURRENCY_CODE: 'AFN' +}; + + +/** + * Number formatting symbols for locale ff. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ff = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'XOF' +}; + + +/** + * Number formatting symbols for locale ff_SN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ff_SN = goog.i18n.NumberFormatSymbols_ff; + + +/** + * Number formatting symbols for locale fo. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fo = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '\u2212', + EXP_SYMBOL: '\u00D710^', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: '\u00A4\u00A4\u00A4', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;\u00A4-#,##0.00', + DEF_CURRENCY_CODE: 'DKK' +}; + + +/** + * Number formatting symbols for locale fo_FO. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fo_FO = goog.i18n.NumberFormatSymbols_fo; + + +/** + * Number formatting symbols for locale fr_BE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_BE = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'EUR' +}; + + +/** + * Number formatting symbols for locale fr_BF. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_BF = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'XOF' +}; + + +/** + * Number formatting symbols for locale fr_BI. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_BI = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'BIF' +}; + + +/** + * Number formatting symbols for locale fr_BJ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_BJ = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'XOF' +}; + + +/** + * Number formatting symbols for locale fr_CD. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_CD = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'CDF' +}; + + +/** + * Number formatting symbols for locale fr_CF. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_CF = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'XAF' +}; + + +/** + * Number formatting symbols for locale fr_CG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_CG = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'XAF' +}; + + +/** + * Number formatting symbols for locale fr_CH. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_CH = { + DECIMAL_SEP: '.', + GROUP_SEP: '\'', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4-#,##0.00', + DEF_CURRENCY_CODE: 'CHF' +}; + + +/** + * Number formatting symbols for locale fr_CI. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_CI = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'XOF' +}; + + +/** + * Number formatting symbols for locale fr_CM. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_CM = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'XAF' +}; + + +/** + * Number formatting symbols for locale fr_DJ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_DJ = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'DJF' +}; + + +/** + * Number formatting symbols for locale fr_GA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_GA = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'XAF' +}; + + +/** + * Number formatting symbols for locale fr_GN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_GN = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'GNF' +}; + + +/** + * Number formatting symbols for locale fr_GQ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_GQ = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'XAF' +}; + + +/** + * Number formatting symbols for locale fr_KM. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_KM = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'KMF' +}; + + +/** + * Number formatting symbols for locale fr_LU. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_LU = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'EUR' +}; + + +/** + * Number formatting symbols for locale fr_MG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_MG = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'MGA' +}; + + +/** + * Number formatting symbols for locale fr_ML. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_ML = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'XOF' +}; + + +/** + * Number formatting symbols for locale fr_NE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_NE = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'XOF' +}; + + +/** + * Number formatting symbols for locale fr_RW. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_RW = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'RWF' +}; + + +/** + * Number formatting symbols for locale fr_SN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_SN = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'XOF' +}; + + +/** + * Number formatting symbols for locale fr_TD. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_TD = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'XAF' +}; + + +/** + * Number formatting symbols for locale fr_TG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fr_TG = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'XOF' +}; + + +/** + * Number formatting symbols for locale fur. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fur = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'EUR' +}; + + +/** + * Number formatting symbols for locale fur_IT. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_fur_IT = goog.i18n.NumberFormatSymbols_fur; + + +/** + * Number formatting symbols for locale ga. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ga = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'EUR' +}; + + +/** + * Number formatting symbols for locale ga_IE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ga_IE = goog.i18n.NumberFormatSymbols_ga; + + +/** + * Number formatting symbols for locale gaa. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_gaa = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'GHC' +}; + + +/** + * Number formatting symbols for locale gaa_GH. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_gaa_GH = goog.i18n.NumberFormatSymbols_gaa; + + +/** + * Number formatting symbols for locale gez. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_gez = { + DECIMAL_SEP: '.', + GROUP_SEP: '\u12C8', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ETB' +}; + + +/** + * Number formatting symbols for locale gez_ER. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_gez_ER = { + DECIMAL_SEP: '.', + GROUP_SEP: '\u12C8', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ERN' +}; + + +/** + * Number formatting symbols for locale gez_ET. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_gez_ET = goog.i18n.NumberFormatSymbols_gez; + + +/** + * Number formatting symbols for locale guz. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_guz = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'KES' +}; + + +/** + * Number formatting symbols for locale guz_KE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_guz_KE = goog.i18n.NumberFormatSymbols_guz; + + +/** + * Number formatting symbols for locale gv. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_gv = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'GBP' +}; + + +/** + * Number formatting symbols for locale gv_GB. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_gv_GB = goog.i18n.NumberFormatSymbols_gv; + + +/** + * Number formatting symbols for locale ha. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ha = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'NGN' +}; + + +/** + * Number formatting symbols for locale ha_Arab. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ha_Arab = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'SDD' +}; + + +/** + * Number formatting symbols for locale ha_Arab_NG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ha_Arab_NG = goog.i18n.NumberFormatSymbols_ha; + + +/** + * Number formatting symbols for locale ha_Arab_SD. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ha_Arab_SD = + goog.i18n.NumberFormatSymbols_ha_Arab; + + +/** + * Number formatting symbols for locale ha_GH. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ha_GH = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'GHC' +}; + + +/** + * Number formatting symbols for locale ha_Latn. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ha_Latn = goog.i18n.NumberFormatSymbols_ha; + + +/** + * Number formatting symbols for locale ha_Latn_GH. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ha_Latn_GH = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'GHC' +}; + + +/** + * Number formatting symbols for locale ha_Latn_NE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ha_Latn_NE = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'XOF' +}; + + +/** + * Number formatting symbols for locale ha_Latn_NG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ha_Latn_NG = goog.i18n.NumberFormatSymbols_ha; + + +/** + * Number formatting symbols for locale ha_NE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ha_NE = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'XOF' +}; + + +/** + * Number formatting symbols for locale ha_NG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ha_NG = goog.i18n.NumberFormatSymbols_ha; + + +/** + * Number formatting symbols for locale ha_SD. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ha_SD = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'SDD' +}; + + +/** + * Number formatting symbols for locale haw. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_haw = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'USD' +}; + + +/** + * Number formatting symbols for locale haw_US. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_haw_US = goog.i18n.NumberFormatSymbols_haw; + + +/** + * Number formatting symbols for locale hy. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_hy = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#0%', + CURRENCY_PATTERN: '#0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'AMD' +}; + + +/** + * Number formatting symbols for locale hy_AM. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_hy_AM = goog.i18n.NumberFormatSymbols_hy; + + +/** + * Number formatting symbols for locale ia. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ia = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'USD' +}; + + +/** + * Number formatting symbols for locale ig. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ig = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'NGN' +}; + + +/** + * Number formatting symbols for locale ig_NG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ig_NG = goog.i18n.NumberFormatSymbols_ig; + + +/** + * Number formatting symbols for locale ii. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ii = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'CNY' +}; + + +/** + * Number formatting symbols for locale ii_CN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ii_CN = goog.i18n.NumberFormatSymbols_ii; + + +/** + * Number formatting symbols for locale it_CH. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_it_CH = { + DECIMAL_SEP: '.', + GROUP_SEP: '\'', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4-#,##0.00', + DEF_CURRENCY_CODE: 'CHF' +}; + + +/** + * Number formatting symbols for locale iu. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_iu = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'CAD' +}; + + +/** + * Number formatting symbols for locale jmc. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_jmc = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'TZS' +}; + + +/** + * Number formatting symbols for locale jmc_TZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_jmc_TZ = goog.i18n.NumberFormatSymbols_jmc; + + +/** + * Number formatting symbols for locale ka. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ka = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'GEL' +}; + + +/** + * Number formatting symbols for locale ka_GE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ka_GE = goog.i18n.NumberFormatSymbols_ka; + + +/** + * Number formatting symbols for locale kab. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kab = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A4', + DEF_CURRENCY_CODE: 'DZD' +}; + + +/** + * Number formatting symbols for locale kab_DZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kab_DZ = goog.i18n.NumberFormatSymbols_kab; + + +/** + * Number formatting symbols for locale kaj. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kaj = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'NGN' +}; + + +/** + * Number formatting symbols for locale kaj_NG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kaj_NG = goog.i18n.NumberFormatSymbols_kaj; + + +/** + * Number formatting symbols for locale kam. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kam = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'KES' +}; + + +/** + * Number formatting symbols for locale kam_KE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kam_KE = goog.i18n.NumberFormatSymbols_kam; + + +/** + * Number formatting symbols for locale kcg. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kcg = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'NGN' +}; + + +/** + * Number formatting symbols for locale kcg_NG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kcg_NG = goog.i18n.NumberFormatSymbols_kcg; + + +/** + * Number formatting symbols for locale kde. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kde = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'TZS' +}; + + +/** + * Number formatting symbols for locale kde_TZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kde_TZ = goog.i18n.NumberFormatSymbols_kde; + + +/** + * Number formatting symbols for locale kea. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kea = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A4', + DEF_CURRENCY_CODE: 'CVE' +}; + + +/** + * Number formatting symbols for locale kea_CV. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kea_CV = goog.i18n.NumberFormatSymbols_kea; + + +/** + * Number formatting symbols for locale kfo. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kfo = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'XOF' +}; + + +/** + * Number formatting symbols for locale kfo_CI. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kfo_CI = goog.i18n.NumberFormatSymbols_kfo; + + +/** + * Number formatting symbols for locale khq. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_khq = { + DECIMAL_SEP: '.', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A4', + DEF_CURRENCY_CODE: 'XOF' +}; + + +/** + * Number formatting symbols for locale khq_ML. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_khq_ML = goog.i18n.NumberFormatSymbols_khq; + + +/** + * Number formatting symbols for locale ki. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ki = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'KES' +}; + + +/** + * Number formatting symbols for locale ki_KE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ki_KE = goog.i18n.NumberFormatSymbols_ki; + + +/** + * Number formatting symbols for locale kk. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kk = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'KZT' +}; + + +/** + * Number formatting symbols for locale kk_Cyrl. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kk_Cyrl = goog.i18n.NumberFormatSymbols_kk; + + +/** + * Number formatting symbols for locale kk_Cyrl_KZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kk_Cyrl_KZ = goog.i18n.NumberFormatSymbols_kk; + + +/** + * Number formatting symbols for locale kk_KZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kk_KZ = goog.i18n.NumberFormatSymbols_kk; + + +/** + * Number formatting symbols for locale kl. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kl = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '\u2212', + EXP_SYMBOL: '\u00D710^', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: '\u00A4\u00A4\u00A4', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;\u00A4-#,##0.00', + DEF_CURRENCY_CODE: 'DKK' +}; + + +/** + * Number formatting symbols for locale kl_GL. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kl_GL = goog.i18n.NumberFormatSymbols_kl; + + +/** + * Number formatting symbols for locale kln. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kln = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'KES' +}; + + +/** + * Number formatting symbols for locale kln_KE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kln_KE = goog.i18n.NumberFormatSymbols_kln; + + +/** + * Number formatting symbols for locale km. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_km = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A4', + DEF_CURRENCY_CODE: 'KHR' +}; + + +/** + * Number formatting symbols for locale km_KH. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_km_KH = goog.i18n.NumberFormatSymbols_km; + + +/** + * Number formatting symbols for locale kok. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kok = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', + DEF_CURRENCY_CODE: 'INR' +}; + + +/** + * Number formatting symbols for locale kok_IN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kok_IN = goog.i18n.NumberFormatSymbols_kok; + + +/** + * Number formatting symbols for locale kpe. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kpe = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'GNF' +}; + + +/** + * Number formatting symbols for locale kpe_GN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kpe_GN = goog.i18n.NumberFormatSymbols_kpe; + + +/** + * Number formatting symbols for locale kpe_LR. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kpe_LR = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'LRD' +}; + + +/** + * Number formatting symbols for locale ksb. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ksb = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A4', + DEF_CURRENCY_CODE: 'TZS' +}; + + +/** + * Number formatting symbols for locale ksb_TZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ksb_TZ = goog.i18n.NumberFormatSymbols_ksb; + + +/** + * Number formatting symbols for locale ksh. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ksh = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '\u2212', + EXP_SYMBOL: '\u00D710^', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: '\u00A4\u00A4\u00A4', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'EUR' +}; + + +/** + * Number formatting symbols for locale ksh_DE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ksh_DE = goog.i18n.NumberFormatSymbols_ksh; + + +/** + * Number formatting symbols for locale ku. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ku = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'IQD' +}; + + +/** + * Number formatting symbols for locale ku_Arab. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ku_Arab = goog.i18n.NumberFormatSymbols_ku; + + +/** + * Number formatting symbols for locale ku_Arab_IQ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ku_Arab_IQ = goog.i18n.NumberFormatSymbols_ku; + + +/** + * Number formatting symbols for locale ku_Arab_IR. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ku_Arab_IR = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'IRR' +}; + + +/** + * Number formatting symbols for locale ku_IQ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ku_IQ = goog.i18n.NumberFormatSymbols_ku; + + +/** + * Number formatting symbols for locale ku_IR. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ku_IR = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'IRR' +}; + + +/** + * Number formatting symbols for locale ku_Latn. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ku_Latn = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'TRY' +}; + + +/** + * Number formatting symbols for locale ku_Latn_SY. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ku_Latn_SY = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'SYP' +}; + + +/** + * Number formatting symbols for locale ku_Latn_TR. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ku_Latn_TR = + goog.i18n.NumberFormatSymbols_ku_Latn; + + +/** + * Number formatting symbols for locale ku_SY. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ku_SY = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'SYP' +}; + + +/** + * Number formatting symbols for locale ku_TR. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ku_TR = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'TRY' +}; + + +/** + * Number formatting symbols for locale kw. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kw = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'GBP' +}; + + +/** + * Number formatting symbols for locale kw_GB. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_kw_GB = goog.i18n.NumberFormatSymbols_kw; + + +/** + * Number formatting symbols for locale ky. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ky = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'KGS' +}; + + +/** + * Number formatting symbols for locale ky_KG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ky_KG = goog.i18n.NumberFormatSymbols_ky; + + +/** + * Number formatting symbols for locale lag. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_lag = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'TZS' +}; + + +/** + * Number formatting symbols for locale lag_TZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_lag_TZ = goog.i18n.NumberFormatSymbols_lag; + + +/** + * Number formatting symbols for locale lg. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_lg = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A4', + DEF_CURRENCY_CODE: 'UGX' +}; + + +/** + * Number formatting symbols for locale lg_UG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_lg_UG = goog.i18n.NumberFormatSymbols_lg; + + +/** + * Number formatting symbols for locale ln_CG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ln_CG = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'XAF' +}; + + +/** + * Number formatting symbols for locale lo. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_lo = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;\u00A4-#,##0.00', + DEF_CURRENCY_CODE: 'LAK' +}; + + +/** + * Number formatting symbols for locale lo_LA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_lo_LA = goog.i18n.NumberFormatSymbols_lo; + + +/** + * Number formatting symbols for locale luo. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_luo = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A4', + DEF_CURRENCY_CODE: 'KES' +}; + + +/** + * Number formatting symbols for locale luo_KE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_luo_KE = goog.i18n.NumberFormatSymbols_luo; + + +/** + * Number formatting symbols for locale luy. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_luy = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;\u00A4-\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'KES' +}; + + +/** + * Number formatting symbols for locale luy_KE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_luy_KE = goog.i18n.NumberFormatSymbols_luy; + + +/** + * Number formatting symbols for locale mas. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mas = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'KES' +}; + + +/** + * Number formatting symbols for locale mas_KE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mas_KE = goog.i18n.NumberFormatSymbols_mas; + + +/** + * Number formatting symbols for locale mas_TZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mas_TZ = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'TZS' +}; + + +/** + * Number formatting symbols for locale mer. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mer = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'KES' +}; + + +/** + * Number formatting symbols for locale mer_KE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mer_KE = goog.i18n.NumberFormatSymbols_mer; + + +/** + * Number formatting symbols for locale mfe. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mfe = { + DECIMAL_SEP: '.', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'MUR' +}; + + +/** + * Number formatting symbols for locale mfe_MU. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mfe_MU = goog.i18n.NumberFormatSymbols_mfe; + + +/** + * Number formatting symbols for locale mg. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mg = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'MGA' +}; + + +/** + * Number formatting symbols for locale mg_MG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mg_MG = goog.i18n.NumberFormatSymbols_mg; + + +/** + * Number formatting symbols for locale mi. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mi = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'NZD' +}; + + +/** + * Number formatting symbols for locale mi_NZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mi_NZ = goog.i18n.NumberFormatSymbols_mi; + + +/** + * Number formatting symbols for locale mk. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mk = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'MKD' +}; + + +/** + * Number formatting symbols for locale mk_MK. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mk_MK = goog.i18n.NumberFormatSymbols_mk; + + +/** + * Number formatting symbols for locale mn. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mn = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'MNT' +}; + + +/** + * Number formatting symbols for locale mn_CN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mn_CN = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'CNY' +}; + + +/** + * Number formatting symbols for locale mn_Cyrl. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mn_Cyrl = goog.i18n.NumberFormatSymbols_mn; + + +/** + * Number formatting symbols for locale mn_Cyrl_MN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mn_Cyrl_MN = goog.i18n.NumberFormatSymbols_mn; + + +/** + * Number formatting symbols for locale mn_MN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mn_MN = goog.i18n.NumberFormatSymbols_mn; + + +/** + * Number formatting symbols for locale mn_Mong. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mn_Mong = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'CNY' +}; + + +/** + * Number formatting symbols for locale mn_Mong_CN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_mn_Mong_CN = + goog.i18n.NumberFormatSymbols_mn_Mong; + + +/** + * Number formatting symbols for locale ms_BN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ms_BN = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'BND' +}; + + +/** + * Number formatting symbols for locale my. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_my = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'MMK' +}; + + +/** + * Number formatting symbols for locale my_MM. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_my_MM = goog.i18n.NumberFormatSymbols_my; + + +/** + * Number formatting symbols for locale naq. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_naq = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ZAR' +}; + + +/** + * Number formatting symbols for locale naq_NA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_naq_NA = goog.i18n.NumberFormatSymbols_naq; + + +/** + * Number formatting symbols for locale nb. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_nb = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'NOK' +}; + + +/** + * Number formatting symbols for locale nb_NO. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_nb_NO = goog.i18n.NumberFormatSymbols_nb; + + +/** + * Number formatting symbols for locale nd. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_nd = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'ZWD' +}; + + +/** + * Number formatting symbols for locale nd_ZW. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_nd_ZW = goog.i18n.NumberFormatSymbols_nd; + + +/** + * Number formatting symbols for locale nds. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_nds = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'EUR' +}; + + +/** + * Number formatting symbols for locale nds_DE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_nds_DE = goog.i18n.NumberFormatSymbols_nds; + + +/** + * Number formatting symbols for locale ne. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ne = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'NPR' +}; + + +/** + * Number formatting symbols for locale ne_IN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ne_IN = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'INR' +}; + + +/** + * Number formatting symbols for locale ne_NP. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ne_NP = goog.i18n.NumberFormatSymbols_ne; + + +/** + * Number formatting symbols for locale nl_BE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_nl_BE = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'EUR' +}; + + +/** + * Number formatting symbols for locale nn. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_nn = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '\u2212', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'NOK' +}; + + +/** + * Number formatting symbols for locale nn_NO. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_nn_NO = goog.i18n.NumberFormatSymbols_nn; + + +/** + * Number formatting symbols for locale nr. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_nr = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ZAR' +}; + + +/** + * Number formatting symbols for locale nr_ZA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_nr_ZA = goog.i18n.NumberFormatSymbols_nr; + + +/** + * Number formatting symbols for locale nso. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_nso = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ZAR' +}; + + +/** + * Number formatting symbols for locale nso_ZA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_nso_ZA = goog.i18n.NumberFormatSymbols_nso; + + +/** + * Number formatting symbols for locale ny. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ny = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'MWK' +}; + + +/** + * Number formatting symbols for locale ny_MW. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ny_MW = goog.i18n.NumberFormatSymbols_ny; + + +/** + * Number formatting symbols for locale nyn. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_nyn = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;-#,##0.00\u00A4', + DEF_CURRENCY_CODE: 'UGX' +}; + + +/** + * Number formatting symbols for locale nyn_UG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_nyn_UG = goog.i18n.NumberFormatSymbols_nyn; + + +/** + * Number formatting symbols for locale oc. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_oc = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'EUR' +}; + + +/** + * Number formatting symbols for locale oc_FR. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_oc_FR = goog.i18n.NumberFormatSymbols_oc; + + +/** + * Number formatting symbols for locale om. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_om = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ETB' +}; + + +/** + * Number formatting symbols for locale om_ET. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_om_ET = goog.i18n.NumberFormatSymbols_om; + + +/** + * Number formatting symbols for locale om_KE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_om_KE = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'KES' +}; + + +/** + * Number formatting symbols for locale pa. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_pa = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', + DEF_CURRENCY_CODE: 'INR' +}; + + +/** + * Number formatting symbols for locale pa_Arab. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_pa_Arab = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', + DEF_CURRENCY_CODE: 'PKR' +}; + + +/** + * Number formatting symbols for locale pa_Arab_PK. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_pa_Arab_PK = + goog.i18n.NumberFormatSymbols_pa_Arab; + + +/** + * Number formatting symbols for locale pa_Guru. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_pa_Guru = goog.i18n.NumberFormatSymbols_pa; + + +/** + * Number formatting symbols for locale pa_Guru_IN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_pa_Guru_IN = goog.i18n.NumberFormatSymbols_pa; + + +/** + * Number formatting symbols for locale pa_IN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_pa_IN = goog.i18n.NumberFormatSymbols_pa; + + +/** + * Number formatting symbols for locale pa_PK. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_pa_PK = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', + DEF_CURRENCY_CODE: 'PKR' +}; + + +/** + * Number formatting symbols for locale ps. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ps = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '\u2212', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'AFN' +}; + + +/** + * Number formatting symbols for locale ps_AF. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ps_AF = goog.i18n.NumberFormatSymbols_ps; + + +/** + * Number formatting symbols for locale pt_AO. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_pt_AO = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'AOA' +}; + + +/** + * Number formatting symbols for locale pt_GW. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_pt_GW = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'XOF' +}; + + +/** + * Number formatting symbols for locale pt_MZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_pt_MZ = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'MZN' +}; + + +/** + * Number formatting symbols for locale rm. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_rm = { + DECIMAL_SEP: '.', + GROUP_SEP: '\u2019', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '\u2212', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'CHF' +}; + + +/** + * Number formatting symbols for locale rm_CH. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_rm_CH = goog.i18n.NumberFormatSymbols_rm; + + +/** + * Number formatting symbols for locale ro_MD. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ro_MD = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'MDL' +}; + + +/** + * Number formatting symbols for locale rof. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_rof = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'TZS' +}; + + +/** + * Number formatting symbols for locale rof_TZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_rof_TZ = goog.i18n.NumberFormatSymbols_rof; + + +/** + * Number formatting symbols for locale ru_MD. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ru_MD = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'MDL' +}; + + +/** + * Number formatting symbols for locale ru_UA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ru_UA = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'UAH' +}; + + +/** + * Number formatting symbols for locale rw. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_rw = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'RWF' +}; + + +/** + * Number formatting symbols for locale rw_RW. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_rw_RW = goog.i18n.NumberFormatSymbols_rw; + + +/** + * Number formatting symbols for locale rwk. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_rwk = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A4', + DEF_CURRENCY_CODE: 'TZS' +}; + + +/** + * Number formatting symbols for locale rwk_TZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_rwk_TZ = goog.i18n.NumberFormatSymbols_rwk; + + +/** + * Number formatting symbols for locale sa. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sa = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##,##0%', + CURRENCY_PATTERN: '\u00A4#,##,##0.00', + DEF_CURRENCY_CODE: 'INR' +}; + + +/** + * Number formatting symbols for locale sa_IN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sa_IN = goog.i18n.NumberFormatSymbols_sa; + + +/** + * Number formatting symbols for locale saq. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_saq = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'KES' +}; + + +/** + * Number formatting symbols for locale saq_KE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_saq_KE = goog.i18n.NumberFormatSymbols_saq; + + +/** + * Number formatting symbols for locale se. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_se = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '\u2212', + EXP_SYMBOL: '\u00D710^', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: '\u00A4\u00A4\u00A4', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'NOK' +}; + + +/** + * Number formatting symbols for locale se_FI. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_se_FI = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '\u2212', + EXP_SYMBOL: '\u00D710^', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: '\u00A4\u00A4\u00A4', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'EUR' +}; + + +/** + * Number formatting symbols for locale se_NO. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_se_NO = goog.i18n.NumberFormatSymbols_se; + + +/** + * Number formatting symbols for locale seh. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_seh = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A4', + DEF_CURRENCY_CODE: 'MZN' +}; + + +/** + * Number formatting symbols for locale seh_MZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_seh_MZ = goog.i18n.NumberFormatSymbols_seh; + + +/** + * Number formatting symbols for locale ses. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ses = { + DECIMAL_SEP: '.', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A4', + DEF_CURRENCY_CODE: 'XOF' +}; + + +/** + * Number formatting symbols for locale ses_ML. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ses_ML = goog.i18n.NumberFormatSymbols_ses; + + +/** + * Number formatting symbols for locale sg. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sg = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;\u00A4-#,##0.00', + DEF_CURRENCY_CODE: 'XAF' +}; + + +/** + * Number formatting symbols for locale sg_CF. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sg_CF = goog.i18n.NumberFormatSymbols_sg; + + +/** + * Number formatting symbols for locale sh. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sh = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'RSD' +}; + + +/** + * Number formatting symbols for locale sh_BA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sh_BA = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'BAM' +}; + + +/** + * Number formatting symbols for locale sh_CS. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sh_CS = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'EUR' +}; + + +/** + * Number formatting symbols for locale sh_YU. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sh_YU = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'YUM' +}; + + +/** + * Number formatting symbols for locale shi. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_shi = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A4', + DEF_CURRENCY_CODE: 'MAD' +}; + + +/** + * Number formatting symbols for locale shi_Latn. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_shi_Latn = goog.i18n.NumberFormatSymbols_shi; + + +/** + * Number formatting symbols for locale shi_Latn_MA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_shi_Latn_MA = goog.i18n.NumberFormatSymbols_shi; + + +/** + * Number formatting symbols for locale shi_MA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_shi_MA = goog.i18n.NumberFormatSymbols_shi; + + +/** + * Number formatting symbols for locale shi_Tfng. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_shi_Tfng = goog.i18n.NumberFormatSymbols_shi; + + +/** + * Number formatting symbols for locale shi_Tfng_MA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_shi_Tfng_MA = goog.i18n.NumberFormatSymbols_shi; + + +/** + * Number formatting symbols for locale si. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_si = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##,##0%', + CURRENCY_PATTERN: '\u00A4#,##,##0.00;(\u00A4#,##,##0.00)', + DEF_CURRENCY_CODE: 'LKR' +}; + + +/** + * Number formatting symbols for locale si_LK. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_si_LK = goog.i18n.NumberFormatSymbols_si; + + +/** + * Number formatting symbols for locale sid. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sid = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ETB' +}; + + +/** + * Number formatting symbols for locale sid_ET. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sid_ET = goog.i18n.NumberFormatSymbols_sid; + + +/** + * Number formatting symbols for locale sn. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sn = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'ZWD' +}; + + +/** + * Number formatting symbols for locale sn_ZW. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sn_ZW = goog.i18n.NumberFormatSymbols_sn; + + +/** + * Number formatting symbols for locale so. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_so = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'SOS' +}; + + +/** + * Number formatting symbols for locale so_DJ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_so_DJ = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'DJF' +}; + + +/** + * Number formatting symbols for locale so_ET. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_so_ET = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ETB' +}; + + +/** + * Number formatting symbols for locale so_KE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_so_KE = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'KES' +}; + + +/** + * Number formatting symbols for locale so_SO. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_so_SO = goog.i18n.NumberFormatSymbols_so; + + +/** + * Number formatting symbols for locale sr_BA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sr_BA = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'BAM' +}; + + +/** + * Number formatting symbols for locale sr_CS. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sr_CS = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'EUR' +}; + + +/** + * Number formatting symbols for locale sr_Cyrl. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sr_Cyrl = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'EUR' +}; + + +/** + * Number formatting symbols for locale sr_Cyrl_BA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sr_Cyrl_BA = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'BAM' +}; + + +/** + * Number formatting symbols for locale sr_Cyrl_CS. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sr_Cyrl_CS = + goog.i18n.NumberFormatSymbols_sr_Cyrl; + + +/** + * Number formatting symbols for locale sr_Cyrl_ME. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sr_Cyrl_ME = + goog.i18n.NumberFormatSymbols_sr_Cyrl; + + +/** + * Number formatting symbols for locale sr_Cyrl_YU. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sr_Cyrl_YU = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'YUM' +}; + + +/** + * Number formatting symbols for locale sr_Latn. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sr_Latn = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'USD' +}; + + +/** + * Number formatting symbols for locale sr_Latn_BA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sr_Latn_BA = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'BAM' +}; + + +/** + * Number formatting symbols for locale sr_Latn_CS. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sr_Latn_CS = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'EUR' +}; + + +/** + * Number formatting symbols for locale sr_Latn_ME. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sr_Latn_ME = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'EUR' +}; + + +/** + * Number formatting symbols for locale sr_Latn_YU. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sr_Latn_YU = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'YUM' +}; + + +/** + * Number formatting symbols for locale sr_ME. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sr_ME = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'EUR' +}; + + +/** + * Number formatting symbols for locale sr_YU. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sr_YU = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'YUM' +}; + + +/** + * Number formatting symbols for locale ss. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ss = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ZAR' +}; + + +/** + * Number formatting symbols for locale ss_SZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ss_SZ = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'SZL' +}; + + +/** + * Number formatting symbols for locale ss_ZA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ss_ZA = goog.i18n.NumberFormatSymbols_ss; + + +/** + * Number formatting symbols for locale ssy. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ssy = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ERN' +}; + + +/** + * Number formatting symbols for locale ssy_ER. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ssy_ER = goog.i18n.NumberFormatSymbols_ssy; + + +/** + * Number formatting symbols for locale st. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_st = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ZAR' +}; + + +/** + * Number formatting symbols for locale st_LS. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_st_LS = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'LSL' +}; + + +/** + * Number formatting symbols for locale st_ZA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_st_ZA = goog.i18n.NumberFormatSymbols_st; + + +/** + * Number formatting symbols for locale sv_FI. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sv_FI = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '\u2212', + EXP_SYMBOL: '\u00D710^', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: '\u00A4\u00A4\u00A4', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0\u00A0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'EUR' +}; + + +/** + * Number formatting symbols for locale sw_KE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_sw_KE = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'KES' +}; + + +/** + * Number formatting symbols for locale syr. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_syr = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###;#,##0.###-', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-', + DEF_CURRENCY_CODE: 'SYP' +}; + + +/** + * Number formatting symbols for locale syr_SY. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_syr_SY = goog.i18n.NumberFormatSymbols_syr; + + +/** + * Number formatting symbols for locale ta_LK. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ta_LK = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', + DEF_CURRENCY_CODE: 'LKR' +}; + + +/** + * Number formatting symbols for locale teo. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_teo = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'UGX' +}; + + +/** + * Number formatting symbols for locale teo_KE. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_teo_KE = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'KES' +}; + + +/** + * Number formatting symbols for locale teo_UG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_teo_UG = goog.i18n.NumberFormatSymbols_teo; + + +/** + * Number formatting symbols for locale tg. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_tg = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'TJS' +}; + + +/** + * Number formatting symbols for locale tg_Cyrl. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_tg_Cyrl = goog.i18n.NumberFormatSymbols_tg; + + +/** + * Number formatting symbols for locale tg_Cyrl_TJ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_tg_Cyrl_TJ = goog.i18n.NumberFormatSymbols_tg; + + +/** + * Number formatting symbols for locale tg_TJ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_tg_TJ = goog.i18n.NumberFormatSymbols_tg; + + +/** + * Number formatting symbols for locale ti. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ti = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ETB' +}; + + +/** + * Number formatting symbols for locale ti_ER. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ti_ER = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ERN' +}; + + +/** + * Number formatting symbols for locale ti_ET. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ti_ET = goog.i18n.NumberFormatSymbols_ti; + + +/** + * Number formatting symbols for locale tig. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_tig = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ERN' +}; + + +/** + * Number formatting symbols for locale tig_ER. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_tig_ER = goog.i18n.NumberFormatSymbols_tig; + + +/** + * Number formatting symbols for locale tn. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_tn = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ZAR' +}; + + +/** + * Number formatting symbols for locale tn_ZA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_tn_ZA = goog.i18n.NumberFormatSymbols_tn; + + +/** + * Number formatting symbols for locale to. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_to = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'TOP' +}; + + +/** + * Number formatting symbols for locale to_TO. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_to_TO = goog.i18n.NumberFormatSymbols_to; + + +/** + * Number formatting symbols for locale trv. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_trv = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'TWD' +}; + + +/** + * Number formatting symbols for locale trv_TW. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_trv_TW = goog.i18n.NumberFormatSymbols_trv; + + +/** + * Number formatting symbols for locale ts. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ts = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ZAR' +}; + + +/** + * Number formatting symbols for locale ts_ZA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ts_ZA = goog.i18n.NumberFormatSymbols_ts; + + +/** + * Number formatting symbols for locale tt. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_tt = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A4', + DEF_CURRENCY_CODE: 'RUB' +}; + + +/** + * Number formatting symbols for locale tt_RU. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_tt_RU = goog.i18n.NumberFormatSymbols_tt; + + +/** + * Number formatting symbols for locale tzm. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_tzm = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'MAD' +}; + + +/** + * Number formatting symbols for locale tzm_Latn. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_tzm_Latn = goog.i18n.NumberFormatSymbols_tzm; + + +/** + * Number formatting symbols for locale tzm_Latn_MA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_tzm_Latn_MA = goog.i18n.NumberFormatSymbols_tzm; + + +/** + * Number formatting symbols for locale tzm_MA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_tzm_MA = goog.i18n.NumberFormatSymbols_tzm; + + +/** + * Number formatting symbols for locale ug. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ug = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'CNY' +}; + + +/** + * Number formatting symbols for locale ug_Arab. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ug_Arab = goog.i18n.NumberFormatSymbols_ug; + + +/** + * Number formatting symbols for locale ug_Arab_CN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ug_Arab_CN = goog.i18n.NumberFormatSymbols_ug; + + +/** + * Number formatting symbols for locale ug_CN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ug_CN = goog.i18n.NumberFormatSymbols_ug; + + +/** + * Number formatting symbols for locale ur_IN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ur_IN = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00', + DEF_CURRENCY_CODE: 'INR' +}; + + +/** + * Number formatting symbols for locale uz. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_uz = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'UZS' +}; + + +/** + * Number formatting symbols for locale uz_AF. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_uz_AF = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '\u066A', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '\u2212', + EXP_SYMBOL: '\u00D7\u06F1\u06F0^', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'AFN' +}; + + +/** + * Number formatting symbols for locale uz_Arab. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_uz_Arab = { + DECIMAL_SEP: ',', + GROUP_SEP: '.', + PERCENT: '\u066A', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '\u2212', + EXP_SYMBOL: '\u00D7\u06F1\u06F0^', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'AFN' +}; + + +/** + * Number formatting symbols for locale uz_Arab_AF. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_uz_Arab_AF = + goog.i18n.NumberFormatSymbols_uz_Arab; + + +/** + * Number formatting symbols for locale uz_Cyrl. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_uz_Cyrl = goog.i18n.NumberFormatSymbols_uz; + + +/** + * Number formatting symbols for locale uz_Cyrl_UZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_uz_Cyrl_UZ = goog.i18n.NumberFormatSymbols_uz; + + +/** + * Number formatting symbols for locale uz_Latn. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_uz_Latn = goog.i18n.NumberFormatSymbols_uz; + + +/** + * Number formatting symbols for locale uz_Latn_UZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_uz_Latn_UZ = goog.i18n.NumberFormatSymbols_uz; + + +/** + * Number formatting symbols for locale uz_UZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_uz_UZ = goog.i18n.NumberFormatSymbols_uz; + + +/** + * Number formatting symbols for locale ve. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ve = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ZAR' +}; + + +/** + * Number formatting symbols for locale ve_ZA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_ve_ZA = goog.i18n.NumberFormatSymbols_ve; + + +/** + * Number formatting symbols for locale vun. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_vun = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'TZS' +}; + + +/** + * Number formatting symbols for locale vun_TZ. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_vun_TZ = goog.i18n.NumberFormatSymbols_vun; + + +/** + * Number formatting symbols for locale wal. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_wal = { + DECIMAL_SEP: '.', + GROUP_SEP: '\u2019', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ETB' +}; + + +/** + * Number formatting symbols for locale wal_ET. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_wal_ET = goog.i18n.NumberFormatSymbols_wal; + + +/** + * Number formatting symbols for locale wo. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_wo = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00', + DEF_CURRENCY_CODE: 'XOF' +}; + + +/** + * Number formatting symbols for locale wo_Latn. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_wo_Latn = goog.i18n.NumberFormatSymbols_wo; + + +/** + * Number formatting symbols for locale wo_Latn_SN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_wo_Latn_SN = goog.i18n.NumberFormatSymbols_wo; + + +/** + * Number formatting symbols for locale wo_SN. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_wo_SN = goog.i18n.NumberFormatSymbols_wo; + + +/** + * Number formatting symbols for locale xh. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_xh = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ZAR' +}; + + +/** + * Number formatting symbols for locale xh_ZA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_xh_ZA = goog.i18n.NumberFormatSymbols_xh; + + +/** + * Number formatting symbols for locale xog. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_xog = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4', + DEF_CURRENCY_CODE: 'UGX' +}; + + +/** + * Number formatting symbols for locale xog_UG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_xog_UG = goog.i18n.NumberFormatSymbols_xog; + + +/** + * Number formatting symbols for locale yo. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_yo = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'NGN' +}; + + +/** + * Number formatting symbols for locale yo_NG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_yo_NG = goog.i18n.NumberFormatSymbols_yo; + + +/** + * Number formatting symbols for locale zh_Hans_HK. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_zh_Hans_HK = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'HKD' +}; + + +/** + * Number formatting symbols for locale zh_Hans_MO. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_zh_Hans_MO = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'MOP' +}; + + +/** + * Number formatting symbols for locale zh_Hans_SG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_zh_Hans_SG = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'SGD' +}; + + +/** + * Number formatting symbols for locale zh_Hant. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_zh_Hant = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'TWD' +}; + + +/** + * Number formatting symbols for locale zh_Hant_HK. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_zh_Hant_HK = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00;(\u00A4#,##0.00)', + DEF_CURRENCY_CODE: 'HKD' +}; + + +/** + * Number formatting symbols for locale zh_Hant_MO. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_zh_Hant_MO = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'MOP' +}; + + +/** + * Number formatting symbols for locale zh_Hant_TW. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_zh_Hant_TW = + goog.i18n.NumberFormatSymbols_zh_Hant; + + +/** + * Number formatting symbols for locale zh_MO. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_zh_MO = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'MOP' +}; + + +/** + * Number formatting symbols for locale zh_SG. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_zh_SG = { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'SGD' +}; + + +/** + * Number formatting symbols for locale zu. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_zu = { + DECIMAL_SEP: ',', + GROUP_SEP: '\u00A0', + PERCENT: '%', + ZERO_DIGIT: '0', + PLUS_SIGN: '+', + MINUS_SIGN: '-', + EXP_SYMBOL: 'E', + PERMILL: '\u2030', + INFINITY: '\u221E', + NAN: 'NaN', + DECIMAL_PATTERN: '#,##0.###', + SCIENTIFIC_PATTERN: '#E0', + PERCENT_PATTERN: '#,##0%', + CURRENCY_PATTERN: '\u00A4#,##0.00', + DEF_CURRENCY_CODE: 'ZAR' +}; + + +/** + * Number formatting symbols for locale zu_ZA. + * @enum {string} + */ +goog.i18n.NumberFormatSymbols_zu_ZA = goog.i18n.NumberFormatSymbols_zu; + + +/** + * Selected number formatting symbols by locale. + */ + +if (goog.LOCALE == 'aa') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_aa; +} + +if (goog.LOCALE == 'aa_DJ' || goog.LOCALE == 'aa-DJ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_aa_DJ; +} + +if (goog.LOCALE == 'aa_ER' || goog.LOCALE == 'aa-ER') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_aa_ER; +} + +if (goog.LOCALE == 'aa_ET' || goog.LOCALE == 'aa-ET') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_aa; +} + +if (goog.LOCALE == 'af') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_af; +} + +if (goog.LOCALE == 'af_NA' || goog.LOCALE == 'af-NA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_af_NA; +} + +if (goog.LOCALE == 'af_ZA' || goog.LOCALE == 'af-ZA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_af; +} + +if (goog.LOCALE == 'ak') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ak; +} + +if (goog.LOCALE == 'ak_GH' || goog.LOCALE == 'ak-GH') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ak; +} + +if (goog.LOCALE == 'ar_AE' || goog.LOCALE == 'ar-AE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_AE; +} + +if (goog.LOCALE == 'ar_BH' || goog.LOCALE == 'ar-BH') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_BH; +} + +if (goog.LOCALE == 'ar_DZ' || goog.LOCALE == 'ar-DZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_DZ; +} + +if (goog.LOCALE == 'ar_IQ' || goog.LOCALE == 'ar-IQ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_IQ; +} + +if (goog.LOCALE == 'ar_JO' || goog.LOCALE == 'ar-JO') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_JO; +} + +if (goog.LOCALE == 'ar_KW' || goog.LOCALE == 'ar-KW') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_KW; +} + +if (goog.LOCALE == 'ar_LB' || goog.LOCALE == 'ar-LB') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_LB; +} + +if (goog.LOCALE == 'ar_LY' || goog.LOCALE == 'ar-LY') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_LY; +} + +if (goog.LOCALE == 'ar_MA' || goog.LOCALE == 'ar-MA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_MA; +} + +if (goog.LOCALE == 'ar_OM' || goog.LOCALE == 'ar-OM') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_OM; +} + +if (goog.LOCALE == 'ar_QA' || goog.LOCALE == 'ar-QA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_QA; +} + +if (goog.LOCALE == 'ar_SA' || goog.LOCALE == 'ar-SA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_SA; +} + +if (goog.LOCALE == 'ar_SD' || goog.LOCALE == 'ar-SD') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_SD; +} + +if (goog.LOCALE == 'ar_SY' || goog.LOCALE == 'ar-SY') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_SY; +} + +if (goog.LOCALE == 'ar_TN' || goog.LOCALE == 'ar-TN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_TN; +} + +if (goog.LOCALE == 'ar_YE' || goog.LOCALE == 'ar-YE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_YE; +} + +if (goog.LOCALE == 'as') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_as; +} + +if (goog.LOCALE == 'as_IN' || goog.LOCALE == 'as-IN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_as; +} + +if (goog.LOCALE == 'asa') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_asa; +} + +if (goog.LOCALE == 'asa_TZ' || goog.LOCALE == 'asa-TZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_asa; +} + +if (goog.LOCALE == 'az') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_az; +} + +if (goog.LOCALE == 'az_AZ' || goog.LOCALE == 'az-AZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_az; +} + +if (goog.LOCALE == 'az_Arab' || goog.LOCALE == 'az-Arab') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_az_Arab; +} + +if (goog.LOCALE == 'az_Arab_IR' || goog.LOCALE == 'az-Arab-IR') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_az_Arab; +} + +if (goog.LOCALE == 'az_Cyrl' || goog.LOCALE == 'az-Cyrl') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_az; +} + +if (goog.LOCALE == 'az_Cyrl_AZ' || goog.LOCALE == 'az-Cyrl-AZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_az; +} + +if (goog.LOCALE == 'az_IR' || goog.LOCALE == 'az-IR') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_az_IR; +} + +if (goog.LOCALE == 'az_Latn' || goog.LOCALE == 'az-Latn') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_az; +} + +if (goog.LOCALE == 'az_Latn_AZ' || goog.LOCALE == 'az-Latn-AZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_az; +} + +if (goog.LOCALE == 'be') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_be; +} + +if (goog.LOCALE == 'be_BY' || goog.LOCALE == 'be-BY') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_be; +} + +if (goog.LOCALE == 'bem') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bem; +} + +if (goog.LOCALE == 'bem_ZM' || goog.LOCALE == 'bem-ZM') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bem; +} + +if (goog.LOCALE == 'bez') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bez; +} + +if (goog.LOCALE == 'bez_TZ' || goog.LOCALE == 'bez-TZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bez; +} + +if (goog.LOCALE == 'bm') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bm; +} + +if (goog.LOCALE == 'bm_ML' || goog.LOCALE == 'bm-ML') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bm; +} + +if (goog.LOCALE == 'bn_IN' || goog.LOCALE == 'bn-IN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bn_IN; +} + +if (goog.LOCALE == 'bo') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bo; +} + +if (goog.LOCALE == 'bo_CN' || goog.LOCALE == 'bo-CN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bo; +} + +if (goog.LOCALE == 'bo_IN' || goog.LOCALE == 'bo-IN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bo_IN; +} + +if (goog.LOCALE == 'br') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_br; +} + +if (goog.LOCALE == 'br_FR' || goog.LOCALE == 'br-FR') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_br; +} + +if (goog.LOCALE == 'brx') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_brx; +} + +if (goog.LOCALE == 'brx_IN' || goog.LOCALE == 'brx-IN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_brx; +} + +if (goog.LOCALE == 'bs') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bs; +} + +if (goog.LOCALE == 'bs_BA' || goog.LOCALE == 'bs-BA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bs; +} + +if (goog.LOCALE == 'byn') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_byn; +} + +if (goog.LOCALE == 'byn_ER' || goog.LOCALE == 'byn-ER') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_byn; +} + +if (goog.LOCALE == 'cch') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_cch; +} + +if (goog.LOCALE == 'cch_NG' || goog.LOCALE == 'cch-NG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_cch; +} + +if (goog.LOCALE == 'cgg') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_cgg; +} + +if (goog.LOCALE == 'cgg_UG' || goog.LOCALE == 'cgg-UG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_cgg; +} + +if (goog.LOCALE == 'chr') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_chr; +} + +if (goog.LOCALE == 'chr_US' || goog.LOCALE == 'chr-US') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_chr; +} + +if (goog.LOCALE == 'ckb') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ckb; +} + +if (goog.LOCALE == 'ckb_Arab' || goog.LOCALE == 'ckb-Arab') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ckb; +} + +if (goog.LOCALE == 'ckb_Arab_IQ' || goog.LOCALE == 'ckb-Arab-IQ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ckb; +} + +if (goog.LOCALE == 'ckb_Arab_IR' || goog.LOCALE == 'ckb-Arab-IR') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ckb_Arab_IR; +} + +if (goog.LOCALE == 'ckb_IQ' || goog.LOCALE == 'ckb-IQ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ckb; +} + +if (goog.LOCALE == 'ckb_IR' || goog.LOCALE == 'ckb-IR') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ckb_IR; +} + +if (goog.LOCALE == 'ckb_Latn' || goog.LOCALE == 'ckb-Latn') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ckb; +} + +if (goog.LOCALE == 'ckb_Latn_IQ' || goog.LOCALE == 'ckb-Latn-IQ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ckb; +} + +if (goog.LOCALE == 'cy') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_cy; +} + +if (goog.LOCALE == 'cy_GB' || goog.LOCALE == 'cy-GB') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_cy; +} + +if (goog.LOCALE == 'dav') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dav; +} + +if (goog.LOCALE == 'dav_KE' || goog.LOCALE == 'dav-KE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dav; +} + +if (goog.LOCALE == 'de_LI' || goog.LOCALE == 'de-LI') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de_LI; +} + +if (goog.LOCALE == 'dv') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dv; +} + +if (goog.LOCALE == 'dv_MV' || goog.LOCALE == 'dv-MV') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dv; +} + +if (goog.LOCALE == 'dz') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dz; +} + +if (goog.LOCALE == 'dz_BT' || goog.LOCALE == 'dz-BT') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dz; +} + +if (goog.LOCALE == 'ebu') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ebu; +} + +if (goog.LOCALE == 'ebu_KE' || goog.LOCALE == 'ebu-KE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ebu; +} + +if (goog.LOCALE == 'ee') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ee; +} + +if (goog.LOCALE == 'ee_GH' || goog.LOCALE == 'ee-GH') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ee; +} + +if (goog.LOCALE == 'ee_TG' || goog.LOCALE == 'ee-TG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ee_TG; +} + +if (goog.LOCALE == 'el_CY' || goog.LOCALE == 'el-CY') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_el_CY; +} + +if (goog.LOCALE == 'en_BE' || goog.LOCALE == 'en-BE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_BE; +} + +if (goog.LOCALE == 'en_BW' || goog.LOCALE == 'en-BW') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_BW; +} + +if (goog.LOCALE == 'en_BZ' || goog.LOCALE == 'en-BZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_BZ; +} + +if (goog.LOCALE == 'en_CA' || goog.LOCALE == 'en-CA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_CA; +} + +if (goog.LOCALE == 'en_HK' || goog.LOCALE == 'en-HK') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_HK; +} + +if (goog.LOCALE == 'en_JM' || goog.LOCALE == 'en-JM') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_JM; +} + +if (goog.LOCALE == 'en_MT' || goog.LOCALE == 'en-MT') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_MT; +} + +if (goog.LOCALE == 'en_MU' || goog.LOCALE == 'en-MU') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_MU; +} + +if (goog.LOCALE == 'en_NA' || goog.LOCALE == 'en-NA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_NA; +} + +if (goog.LOCALE == 'en_NZ' || goog.LOCALE == 'en-NZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_NZ; +} + +if (goog.LOCALE == 'en_PH' || goog.LOCALE == 'en-PH') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_PH; +} + +if (goog.LOCALE == 'en_PK' || goog.LOCALE == 'en-PK') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_PK; +} + +if (goog.LOCALE == 'en_Shaw' || goog.LOCALE == 'en-Shaw') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_Shaw; +} + +if (goog.LOCALE == 'en_TT' || goog.LOCALE == 'en-TT') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_TT; +} + +if (goog.LOCALE == 'en_ZW' || goog.LOCALE == 'en-ZW') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_ZW; +} + +if (goog.LOCALE == 'eo') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_eo; +} + +if (goog.LOCALE == 'es_419' || goog.LOCALE == 'es-419') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_419; +} + +if (goog.LOCALE == 'es_AR' || goog.LOCALE == 'es-AR') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_AR; +} + +if (goog.LOCALE == 'es_BO' || goog.LOCALE == 'es-BO') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_BO; +} + +if (goog.LOCALE == 'es_CL' || goog.LOCALE == 'es-CL') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_CL; +} + +if (goog.LOCALE == 'es_CO' || goog.LOCALE == 'es-CO') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_CO; +} + +if (goog.LOCALE == 'es_CR' || goog.LOCALE == 'es-CR') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_CR; +} + +if (goog.LOCALE == 'es_DO' || goog.LOCALE == 'es-DO') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_DO; +} + +if (goog.LOCALE == 'es_EC' || goog.LOCALE == 'es-EC') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_EC; +} + +if (goog.LOCALE == 'es_GQ' || goog.LOCALE == 'es-GQ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_GQ; +} + +if (goog.LOCALE == 'es_GT' || goog.LOCALE == 'es-GT') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_GT; +} + +if (goog.LOCALE == 'es_HN' || goog.LOCALE == 'es-HN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_HN; +} + +if (goog.LOCALE == 'es_MX' || goog.LOCALE == 'es-MX') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_MX; +} + +if (goog.LOCALE == 'es_NI' || goog.LOCALE == 'es-NI') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_NI; +} + +if (goog.LOCALE == 'es_PA' || goog.LOCALE == 'es-PA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_PA; +} + +if (goog.LOCALE == 'es_PE' || goog.LOCALE == 'es-PE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_PE; +} + +if (goog.LOCALE == 'es_PR' || goog.LOCALE == 'es-PR') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_PR; +} + +if (goog.LOCALE == 'es_PY' || goog.LOCALE == 'es-PY') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_PY; +} + +if (goog.LOCALE == 'es_SV' || goog.LOCALE == 'es-SV') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_SV; +} + +if (goog.LOCALE == 'es_US' || goog.LOCALE == 'es-US') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_US; +} + +if (goog.LOCALE == 'es_UY' || goog.LOCALE == 'es-UY') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_UY; +} + +if (goog.LOCALE == 'es_VE' || goog.LOCALE == 'es-VE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_VE; +} + +if (goog.LOCALE == 'fa_AF' || goog.LOCALE == 'fa-AF') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fa_AF; +} + +if (goog.LOCALE == 'ff') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ff; +} + +if (goog.LOCALE == 'ff_SN' || goog.LOCALE == 'ff-SN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ff; +} + +if (goog.LOCALE == 'fo') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fo; +} + +if (goog.LOCALE == 'fo_FO' || goog.LOCALE == 'fo-FO') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fo; +} + +if (goog.LOCALE == 'fr_BE' || goog.LOCALE == 'fr-BE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_BE; +} + +if (goog.LOCALE == 'fr_BF' || goog.LOCALE == 'fr-BF') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_BF; +} + +if (goog.LOCALE == 'fr_BI' || goog.LOCALE == 'fr-BI') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_BI; +} + +if (goog.LOCALE == 'fr_BJ' || goog.LOCALE == 'fr-BJ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_BJ; +} + +if (goog.LOCALE == 'fr_CD' || goog.LOCALE == 'fr-CD') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_CD; +} + +if (goog.LOCALE == 'fr_CF' || goog.LOCALE == 'fr-CF') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_CF; +} + +if (goog.LOCALE == 'fr_CG' || goog.LOCALE == 'fr-CG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_CG; +} + +if (goog.LOCALE == 'fr_CH' || goog.LOCALE == 'fr-CH') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_CH; +} + +if (goog.LOCALE == 'fr_CI' || goog.LOCALE == 'fr-CI') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_CI; +} + +if (goog.LOCALE == 'fr_CM' || goog.LOCALE == 'fr-CM') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_CM; +} + +if (goog.LOCALE == 'fr_DJ' || goog.LOCALE == 'fr-DJ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_DJ; +} + +if (goog.LOCALE == 'fr_GA' || goog.LOCALE == 'fr-GA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_GA; +} + +if (goog.LOCALE == 'fr_GN' || goog.LOCALE == 'fr-GN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_GN; +} + +if (goog.LOCALE == 'fr_GQ' || goog.LOCALE == 'fr-GQ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_GQ; +} + +if (goog.LOCALE == 'fr_KM' || goog.LOCALE == 'fr-KM') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_KM; +} + +if (goog.LOCALE == 'fr_LU' || goog.LOCALE == 'fr-LU') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_LU; +} + +if (goog.LOCALE == 'fr_MG' || goog.LOCALE == 'fr-MG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_MG; +} + +if (goog.LOCALE == 'fr_ML' || goog.LOCALE == 'fr-ML') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_ML; +} + +if (goog.LOCALE == 'fr_NE' || goog.LOCALE == 'fr-NE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_NE; +} + +if (goog.LOCALE == 'fr_RW' || goog.LOCALE == 'fr-RW') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_RW; +} + +if (goog.LOCALE == 'fr_SN' || goog.LOCALE == 'fr-SN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_SN; +} + +if (goog.LOCALE == 'fr_TD' || goog.LOCALE == 'fr-TD') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_TD; +} + +if (goog.LOCALE == 'fr_TG' || goog.LOCALE == 'fr-TG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_TG; +} + +if (goog.LOCALE == 'fur') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fur; +} + +if (goog.LOCALE == 'fur_IT' || goog.LOCALE == 'fur-IT') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fur; +} + +if (goog.LOCALE == 'ga') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ga; +} + +if (goog.LOCALE == 'ga_IE' || goog.LOCALE == 'ga-IE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ga; +} + +if (goog.LOCALE == 'gaa') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gaa; +} + +if (goog.LOCALE == 'gaa_GH' || goog.LOCALE == 'gaa-GH') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gaa; +} + +if (goog.LOCALE == 'gez') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gez; +} + +if (goog.LOCALE == 'gez_ER' || goog.LOCALE == 'gez-ER') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gez_ER; +} + +if (goog.LOCALE == 'gez_ET' || goog.LOCALE == 'gez-ET') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gez; +} + +if (goog.LOCALE == 'guz') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_guz; +} + +if (goog.LOCALE == 'guz_KE' || goog.LOCALE == 'guz-KE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_guz; +} + +if (goog.LOCALE == 'gv') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gv; +} + +if (goog.LOCALE == 'gv_GB' || goog.LOCALE == 'gv-GB') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gv; +} + +if (goog.LOCALE == 'ha') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha; +} + +if (goog.LOCALE == 'ha_Arab' || goog.LOCALE == 'ha-Arab') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha_Arab; +} + +if (goog.LOCALE == 'ha_Arab_NG' || goog.LOCALE == 'ha-Arab-NG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha; +} + +if (goog.LOCALE == 'ha_Arab_SD' || goog.LOCALE == 'ha-Arab-SD') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha_Arab; +} + +if (goog.LOCALE == 'ha_GH' || goog.LOCALE == 'ha-GH') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha_GH; +} + +if (goog.LOCALE == 'ha_Latn' || goog.LOCALE == 'ha-Latn') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha; +} + +if (goog.LOCALE == 'ha_Latn_GH' || goog.LOCALE == 'ha-Latn-GH') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha_Latn_GH; +} + +if (goog.LOCALE == 'ha_Latn_NE' || goog.LOCALE == 'ha-Latn-NE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha_Latn_NE; +} + +if (goog.LOCALE == 'ha_Latn_NG' || goog.LOCALE == 'ha-Latn-NG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha; +} + +if (goog.LOCALE == 'ha_NE' || goog.LOCALE == 'ha-NE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha_NE; +} + +if (goog.LOCALE == 'ha_NG' || goog.LOCALE == 'ha-NG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha; +} + +if (goog.LOCALE == 'ha_SD' || goog.LOCALE == 'ha-SD') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha_SD; +} + +if (goog.LOCALE == 'haw') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_haw; +} + +if (goog.LOCALE == 'haw_US' || goog.LOCALE == 'haw-US') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_haw; +} + +if (goog.LOCALE == 'hy') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hy; +} + +if (goog.LOCALE == 'hy_AM' || goog.LOCALE == 'hy-AM') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hy; +} + +if (goog.LOCALE == 'ia') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ia; +} + +if (goog.LOCALE == 'ig') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ig; +} + +if (goog.LOCALE == 'ig_NG' || goog.LOCALE == 'ig-NG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ig; +} + +if (goog.LOCALE == 'ii') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ii; +} + +if (goog.LOCALE == 'ii_CN' || goog.LOCALE == 'ii-CN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ii; +} + +if (goog.LOCALE == 'it_CH' || goog.LOCALE == 'it-CH') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_it_CH; +} + +if (goog.LOCALE == 'iu') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_iu; +} + +if (goog.LOCALE == 'jmc') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_jmc; +} + +if (goog.LOCALE == 'jmc_TZ' || goog.LOCALE == 'jmc-TZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_jmc; +} + +if (goog.LOCALE == 'ka') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ka; +} + +if (goog.LOCALE == 'ka_GE' || goog.LOCALE == 'ka-GE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ka; +} + +if (goog.LOCALE == 'kab') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kab; +} + +if (goog.LOCALE == 'kab_DZ' || goog.LOCALE == 'kab-DZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kab; +} + +if (goog.LOCALE == 'kaj') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kaj; +} + +if (goog.LOCALE == 'kaj_NG' || goog.LOCALE == 'kaj-NG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kaj; +} + +if (goog.LOCALE == 'kam') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kam; +} + +if (goog.LOCALE == 'kam_KE' || goog.LOCALE == 'kam-KE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kam; +} + +if (goog.LOCALE == 'kcg') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kcg; +} + +if (goog.LOCALE == 'kcg_NG' || goog.LOCALE == 'kcg-NG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kcg; +} + +if (goog.LOCALE == 'kde') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kde; +} + +if (goog.LOCALE == 'kde_TZ' || goog.LOCALE == 'kde-TZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kde; +} + +if (goog.LOCALE == 'kea') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kea; +} + +if (goog.LOCALE == 'kea_CV' || goog.LOCALE == 'kea-CV') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kea; +} + +if (goog.LOCALE == 'kfo') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kfo; +} + +if (goog.LOCALE == 'kfo_CI' || goog.LOCALE == 'kfo-CI') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kfo; +} + +if (goog.LOCALE == 'khq') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_khq; +} + +if (goog.LOCALE == 'khq_ML' || goog.LOCALE == 'khq-ML') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_khq; +} + +if (goog.LOCALE == 'ki') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ki; +} + +if (goog.LOCALE == 'ki_KE' || goog.LOCALE == 'ki-KE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ki; +} + +if (goog.LOCALE == 'kk') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kk; +} + +if (goog.LOCALE == 'kk_Cyrl' || goog.LOCALE == 'kk-Cyrl') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kk; +} + +if (goog.LOCALE == 'kk_Cyrl_KZ' || goog.LOCALE == 'kk-Cyrl-KZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kk; +} + +if (goog.LOCALE == 'kk_KZ' || goog.LOCALE == 'kk-KZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kk; +} + +if (goog.LOCALE == 'kl') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kl; +} + +if (goog.LOCALE == 'kl_GL' || goog.LOCALE == 'kl-GL') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kl; +} + +if (goog.LOCALE == 'kln') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kln; +} + +if (goog.LOCALE == 'kln_KE' || goog.LOCALE == 'kln-KE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kln; +} + +if (goog.LOCALE == 'km') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_km; +} + +if (goog.LOCALE == 'km_KH' || goog.LOCALE == 'km-KH') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_km; +} + +if (goog.LOCALE == 'kok') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kok; +} + +if (goog.LOCALE == 'kok_IN' || goog.LOCALE == 'kok-IN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kok; +} + +if (goog.LOCALE == 'kpe') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kpe; +} + +if (goog.LOCALE == 'kpe_GN' || goog.LOCALE == 'kpe-GN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kpe; +} + +if (goog.LOCALE == 'kpe_LR' || goog.LOCALE == 'kpe-LR') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kpe_LR; +} + +if (goog.LOCALE == 'ksb') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ksb; +} + +if (goog.LOCALE == 'ksb_TZ' || goog.LOCALE == 'ksb-TZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ksb; +} + +if (goog.LOCALE == 'ksh') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ksh; +} + +if (goog.LOCALE == 'ksh_DE' || goog.LOCALE == 'ksh-DE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ksh; +} + +if (goog.LOCALE == 'ku') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku; +} + +if (goog.LOCALE == 'ku_Arab' || goog.LOCALE == 'ku-Arab') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku; +} + +if (goog.LOCALE == 'ku_Arab_IQ' || goog.LOCALE == 'ku-Arab-IQ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku; +} + +if (goog.LOCALE == 'ku_Arab_IR' || goog.LOCALE == 'ku-Arab-IR') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku_Arab_IR; +} + +if (goog.LOCALE == 'ku_IQ' || goog.LOCALE == 'ku-IQ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku; +} + +if (goog.LOCALE == 'ku_IR' || goog.LOCALE == 'ku-IR') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku_IR; +} + +if (goog.LOCALE == 'ku_Latn' || goog.LOCALE == 'ku-Latn') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku_Latn; +} + +if (goog.LOCALE == 'ku_Latn_SY' || goog.LOCALE == 'ku-Latn-SY') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku_Latn_SY; +} + +if (goog.LOCALE == 'ku_Latn_TR' || goog.LOCALE == 'ku-Latn-TR') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku_Latn; +} + +if (goog.LOCALE == 'ku_SY' || goog.LOCALE == 'ku-SY') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku_SY; +} + +if (goog.LOCALE == 'ku_TR' || goog.LOCALE == 'ku-TR') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku_TR; +} + +if (goog.LOCALE == 'kw') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kw; +} + +if (goog.LOCALE == 'kw_GB' || goog.LOCALE == 'kw-GB') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kw; +} + +if (goog.LOCALE == 'ky') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ky; +} + +if (goog.LOCALE == 'ky_KG' || goog.LOCALE == 'ky-KG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ky; +} + +if (goog.LOCALE == 'lag') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lag; +} + +if (goog.LOCALE == 'lag_TZ' || goog.LOCALE == 'lag-TZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lag; +} + +if (goog.LOCALE == 'lg') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lg; +} + +if (goog.LOCALE == 'lg_UG' || goog.LOCALE == 'lg-UG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lg; +} + +if (goog.LOCALE == 'ln_CG' || goog.LOCALE == 'ln-CG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ln_CG; +} + +if (goog.LOCALE == 'lo') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lo; +} + +if (goog.LOCALE == 'lo_LA' || goog.LOCALE == 'lo-LA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lo; +} + +if (goog.LOCALE == 'luo') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_luo; +} + +if (goog.LOCALE == 'luo_KE' || goog.LOCALE == 'luo-KE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_luo; +} + +if (goog.LOCALE == 'luy') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_luy; +} + +if (goog.LOCALE == 'luy_KE' || goog.LOCALE == 'luy-KE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_luy; +} + +if (goog.LOCALE == 'mas') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mas; +} + +if (goog.LOCALE == 'mas_KE' || goog.LOCALE == 'mas-KE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mas; +} + +if (goog.LOCALE == 'mas_TZ' || goog.LOCALE == 'mas-TZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mas_TZ; +} + +if (goog.LOCALE == 'mer') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mer; +} + +if (goog.LOCALE == 'mer_KE' || goog.LOCALE == 'mer-KE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mer; +} + +if (goog.LOCALE == 'mfe') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mfe; +} + +if (goog.LOCALE == 'mfe_MU' || goog.LOCALE == 'mfe-MU') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mfe; +} + +if (goog.LOCALE == 'mg') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mg; +} + +if (goog.LOCALE == 'mg_MG' || goog.LOCALE == 'mg-MG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mg; +} + +if (goog.LOCALE == 'mi') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mi; +} + +if (goog.LOCALE == 'mi_NZ' || goog.LOCALE == 'mi-NZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mi; +} + +if (goog.LOCALE == 'mk') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mk; +} + +if (goog.LOCALE == 'mk_MK' || goog.LOCALE == 'mk-MK') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mk; +} + +if (goog.LOCALE == 'mn') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mn; +} + +if (goog.LOCALE == 'mn_CN' || goog.LOCALE == 'mn-CN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mn_CN; +} + +if (goog.LOCALE == 'mn_Cyrl' || goog.LOCALE == 'mn-Cyrl') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mn; +} + +if (goog.LOCALE == 'mn_Cyrl_MN' || goog.LOCALE == 'mn-Cyrl-MN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mn; +} + +if (goog.LOCALE == 'mn_MN' || goog.LOCALE == 'mn-MN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mn; +} + +if (goog.LOCALE == 'mn_Mong' || goog.LOCALE == 'mn-Mong') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mn_Mong; +} + +if (goog.LOCALE == 'mn_Mong_CN' || goog.LOCALE == 'mn-Mong-CN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mn_Mong; +} + +if (goog.LOCALE == 'ms_BN' || goog.LOCALE == 'ms-BN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ms_BN; +} + +if (goog.LOCALE == 'my') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_my; +} + +if (goog.LOCALE == 'my_MM' || goog.LOCALE == 'my-MM') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_my; +} + +if (goog.LOCALE == 'naq') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_naq; +} + +if (goog.LOCALE == 'naq_NA' || goog.LOCALE == 'naq-NA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_naq; +} + +if (goog.LOCALE == 'nb') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nb; +} + +if (goog.LOCALE == 'nb_NO' || goog.LOCALE == 'nb-NO') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nb; +} + +if (goog.LOCALE == 'nd') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nd; +} + +if (goog.LOCALE == 'nd_ZW' || goog.LOCALE == 'nd-ZW') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nd; +} + +if (goog.LOCALE == 'nds') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nds; +} + +if (goog.LOCALE == 'nds_DE' || goog.LOCALE == 'nds-DE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nds; +} + +if (goog.LOCALE == 'ne') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ne; +} + +if (goog.LOCALE == 'ne_IN' || goog.LOCALE == 'ne-IN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ne_IN; +} + +if (goog.LOCALE == 'ne_NP' || goog.LOCALE == 'ne-NP') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ne; +} + +if (goog.LOCALE == 'nl_BE' || goog.LOCALE == 'nl-BE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nl_BE; +} + +if (goog.LOCALE == 'nn') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nn; +} + +if (goog.LOCALE == 'nn_NO' || goog.LOCALE == 'nn-NO') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nn; +} + +if (goog.LOCALE == 'nr') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nr; +} + +if (goog.LOCALE == 'nr_ZA' || goog.LOCALE == 'nr-ZA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nr; +} + +if (goog.LOCALE == 'nso') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nso; +} + +if (goog.LOCALE == 'nso_ZA' || goog.LOCALE == 'nso-ZA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nso; +} + +if (goog.LOCALE == 'ny') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ny; +} + +if (goog.LOCALE == 'ny_MW' || goog.LOCALE == 'ny-MW') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ny; +} + +if (goog.LOCALE == 'nyn') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nyn; +} + +if (goog.LOCALE == 'nyn_UG' || goog.LOCALE == 'nyn-UG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nyn; +} + +if (goog.LOCALE == 'oc') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_oc; +} + +if (goog.LOCALE == 'oc_FR' || goog.LOCALE == 'oc-FR') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_oc; +} + +if (goog.LOCALE == 'om') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_om; +} + +if (goog.LOCALE == 'om_ET' || goog.LOCALE == 'om-ET') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_om; +} + +if (goog.LOCALE == 'om_KE' || goog.LOCALE == 'om-KE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_om_KE; +} + +if (goog.LOCALE == 'pa') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pa; +} + +if (goog.LOCALE == 'pa_Arab' || goog.LOCALE == 'pa-Arab') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pa_Arab; +} + +if (goog.LOCALE == 'pa_Arab_PK' || goog.LOCALE == 'pa-Arab-PK') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pa_Arab; +} + +if (goog.LOCALE == 'pa_Guru' || goog.LOCALE == 'pa-Guru') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pa; +} + +if (goog.LOCALE == 'pa_Guru_IN' || goog.LOCALE == 'pa-Guru-IN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pa; +} + +if (goog.LOCALE == 'pa_IN' || goog.LOCALE == 'pa-IN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pa; +} + +if (goog.LOCALE == 'pa_PK' || goog.LOCALE == 'pa-PK') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pa_PK; +} + +if (goog.LOCALE == 'ps') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ps; +} + +if (goog.LOCALE == 'ps_AF' || goog.LOCALE == 'ps-AF') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ps; +} + +if (goog.LOCALE == 'pt_AO' || goog.LOCALE == 'pt-AO') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt_AO; +} + +if (goog.LOCALE == 'pt_GW' || goog.LOCALE == 'pt-GW') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt_GW; +} + +if (goog.LOCALE == 'pt_MZ' || goog.LOCALE == 'pt-MZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt_MZ; +} + +if (goog.LOCALE == 'rm') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_rm; +} + +if (goog.LOCALE == 'rm_CH' || goog.LOCALE == 'rm-CH') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_rm; +} + +if (goog.LOCALE == 'ro_MD' || goog.LOCALE == 'ro-MD') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ro_MD; +} + +if (goog.LOCALE == 'rof') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_rof; +} + +if (goog.LOCALE == 'rof_TZ' || goog.LOCALE == 'rof-TZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_rof; +} + +if (goog.LOCALE == 'ru_MD' || goog.LOCALE == 'ru-MD') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ru_MD; +} + +if (goog.LOCALE == 'ru_UA' || goog.LOCALE == 'ru-UA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ru_UA; +} + +if (goog.LOCALE == 'rw') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_rw; +} + +if (goog.LOCALE == 'rw_RW' || goog.LOCALE == 'rw-RW') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_rw; +} + +if (goog.LOCALE == 'rwk') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_rwk; +} + +if (goog.LOCALE == 'rwk_TZ' || goog.LOCALE == 'rwk-TZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_rwk; +} + +if (goog.LOCALE == 'sa') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sa; +} + +if (goog.LOCALE == 'sa_IN' || goog.LOCALE == 'sa-IN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sa; +} + +if (goog.LOCALE == 'saq') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_saq; +} + +if (goog.LOCALE == 'saq_KE' || goog.LOCALE == 'saq-KE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_saq; +} + +if (goog.LOCALE == 'se') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_se; +} + +if (goog.LOCALE == 'se_FI' || goog.LOCALE == 'se-FI') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_se_FI; +} + +if (goog.LOCALE == 'se_NO' || goog.LOCALE == 'se-NO') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_se; +} + +if (goog.LOCALE == 'seh') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_seh; +} + +if (goog.LOCALE == 'seh_MZ' || goog.LOCALE == 'seh-MZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_seh; +} + +if (goog.LOCALE == 'ses') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ses; +} + +if (goog.LOCALE == 'ses_ML' || goog.LOCALE == 'ses-ML') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ses; +} + +if (goog.LOCALE == 'sg') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sg; +} + +if (goog.LOCALE == 'sg_CF' || goog.LOCALE == 'sg-CF') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sg; +} + +if (goog.LOCALE == 'sh') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sh; +} + +if (goog.LOCALE == 'sh_BA' || goog.LOCALE == 'sh-BA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sh_BA; +} + +if (goog.LOCALE == 'sh_CS' || goog.LOCALE == 'sh-CS') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sh_CS; +} + +if (goog.LOCALE == 'sh_YU' || goog.LOCALE == 'sh-YU') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sh_YU; +} + +if (goog.LOCALE == 'shi') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_shi; +} + +if (goog.LOCALE == 'shi_Latn' || goog.LOCALE == 'shi-Latn') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_shi; +} + +if (goog.LOCALE == 'shi_Latn_MA' || goog.LOCALE == 'shi-Latn-MA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_shi; +} + +if (goog.LOCALE == 'shi_MA' || goog.LOCALE == 'shi-MA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_shi; +} + +if (goog.LOCALE == 'shi_Tfng' || goog.LOCALE == 'shi-Tfng') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_shi; +} + +if (goog.LOCALE == 'shi_Tfng_MA' || goog.LOCALE == 'shi-Tfng-MA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_shi; +} + +if (goog.LOCALE == 'si') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_si; +} + +if (goog.LOCALE == 'si_LK' || goog.LOCALE == 'si-LK') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_si; +} + +if (goog.LOCALE == 'sid') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sid; +} + +if (goog.LOCALE == 'sid_ET' || goog.LOCALE == 'sid-ET') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sid; +} + +if (goog.LOCALE == 'sn') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sn; +} + +if (goog.LOCALE == 'sn_ZW' || goog.LOCALE == 'sn-ZW') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sn; +} + +if (goog.LOCALE == 'so') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_so; +} + +if (goog.LOCALE == 'so_DJ' || goog.LOCALE == 'so-DJ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_so_DJ; +} + +if (goog.LOCALE == 'so_ET' || goog.LOCALE == 'so-ET') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_so_ET; +} + +if (goog.LOCALE == 'so_KE' || goog.LOCALE == 'so-KE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_so_KE; +} + +if (goog.LOCALE == 'so_SO' || goog.LOCALE == 'so-SO') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_so; +} + +if (goog.LOCALE == 'sr_BA' || goog.LOCALE == 'sr-BA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_BA; +} + +if (goog.LOCALE == 'sr_CS' || goog.LOCALE == 'sr-CS') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_CS; +} + +if (goog.LOCALE == 'sr_Cyrl' || goog.LOCALE == 'sr-Cyrl') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Cyrl; +} + +if (goog.LOCALE == 'sr_Cyrl_BA' || goog.LOCALE == 'sr-Cyrl-BA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Cyrl_BA; +} + +if (goog.LOCALE == 'sr_Cyrl_CS' || goog.LOCALE == 'sr-Cyrl-CS') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Cyrl; +} + +if (goog.LOCALE == 'sr_Cyrl_ME' || goog.LOCALE == 'sr-Cyrl-ME') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Cyrl; +} + +if (goog.LOCALE == 'sr_Cyrl_YU' || goog.LOCALE == 'sr-Cyrl-YU') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Cyrl_YU; +} + +if (goog.LOCALE == 'sr_Latn' || goog.LOCALE == 'sr-Latn') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Latn; +} + +if (goog.LOCALE == 'sr_Latn_BA' || goog.LOCALE == 'sr-Latn-BA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Latn_BA; +} + +if (goog.LOCALE == 'sr_Latn_CS' || goog.LOCALE == 'sr-Latn-CS') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Latn_CS; +} + +if (goog.LOCALE == 'sr_Latn_ME' || goog.LOCALE == 'sr-Latn-ME') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Latn_ME; +} + +if (goog.LOCALE == 'sr_Latn_YU' || goog.LOCALE == 'sr-Latn-YU') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Latn_YU; +} + +if (goog.LOCALE == 'sr_ME' || goog.LOCALE == 'sr-ME') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_ME; +} + +if (goog.LOCALE == 'sr_YU' || goog.LOCALE == 'sr-YU') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_YU; +} + +if (goog.LOCALE == 'ss') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ss; +} + +if (goog.LOCALE == 'ss_SZ' || goog.LOCALE == 'ss-SZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ss_SZ; +} + +if (goog.LOCALE == 'ss_ZA' || goog.LOCALE == 'ss-ZA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ss; +} + +if (goog.LOCALE == 'ssy') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ssy; +} + +if (goog.LOCALE == 'ssy_ER' || goog.LOCALE == 'ssy-ER') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ssy; +} + +if (goog.LOCALE == 'st') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_st; +} + +if (goog.LOCALE == 'st_LS' || goog.LOCALE == 'st-LS') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_st_LS; +} + +if (goog.LOCALE == 'st_ZA' || goog.LOCALE == 'st-ZA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_st; +} + +if (goog.LOCALE == 'sv_FI' || goog.LOCALE == 'sv-FI') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sv_FI; +} + +if (goog.LOCALE == 'sw_KE' || goog.LOCALE == 'sw-KE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sw_KE; +} + +if (goog.LOCALE == 'syr') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_syr; +} + +if (goog.LOCALE == 'syr_SY' || goog.LOCALE == 'syr-SY') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_syr; +} + +if (goog.LOCALE == 'ta_LK' || goog.LOCALE == 'ta-LK') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ta_LK; +} + +if (goog.LOCALE == 'teo') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_teo; +} + +if (goog.LOCALE == 'teo_KE' || goog.LOCALE == 'teo-KE') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_teo_KE; +} + +if (goog.LOCALE == 'teo_UG' || goog.LOCALE == 'teo-UG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_teo; +} + +if (goog.LOCALE == 'tg') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tg; +} + +if (goog.LOCALE == 'tg_Cyrl' || goog.LOCALE == 'tg-Cyrl') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tg; +} + +if (goog.LOCALE == 'tg_Cyrl_TJ' || goog.LOCALE == 'tg-Cyrl-TJ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tg; +} + +if (goog.LOCALE == 'tg_TJ' || goog.LOCALE == 'tg-TJ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tg; +} + +if (goog.LOCALE == 'ti') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ti; +} + +if (goog.LOCALE == 'ti_ER' || goog.LOCALE == 'ti-ER') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ti_ER; +} + +if (goog.LOCALE == 'ti_ET' || goog.LOCALE == 'ti-ET') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ti; +} + +if (goog.LOCALE == 'tig') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tig; +} + +if (goog.LOCALE == 'tig_ER' || goog.LOCALE == 'tig-ER') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tig; +} + +if (goog.LOCALE == 'tn') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tn; +} + +if (goog.LOCALE == 'tn_ZA' || goog.LOCALE == 'tn-ZA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tn; +} + +if (goog.LOCALE == 'to') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_to; +} + +if (goog.LOCALE == 'to_TO' || goog.LOCALE == 'to-TO') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_to; +} + +if (goog.LOCALE == 'trv') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_trv; +} + +if (goog.LOCALE == 'trv_TW' || goog.LOCALE == 'trv-TW') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_trv; +} + +if (goog.LOCALE == 'ts') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ts; +} + +if (goog.LOCALE == 'ts_ZA' || goog.LOCALE == 'ts-ZA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ts; +} + +if (goog.LOCALE == 'tt') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tt; +} + +if (goog.LOCALE == 'tt_RU' || goog.LOCALE == 'tt-RU') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tt; +} + +if (goog.LOCALE == 'tzm') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tzm; +} + +if (goog.LOCALE == 'tzm_Latn' || goog.LOCALE == 'tzm-Latn') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tzm; +} + +if (goog.LOCALE == 'tzm_Latn_MA' || goog.LOCALE == 'tzm-Latn-MA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tzm; +} + +if (goog.LOCALE == 'tzm_MA' || goog.LOCALE == 'tzm-MA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tzm; +} + +if (goog.LOCALE == 'ug') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ug; +} + +if (goog.LOCALE == 'ug_Arab' || goog.LOCALE == 'ug-Arab') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ug; +} + +if (goog.LOCALE == 'ug_Arab_CN' || goog.LOCALE == 'ug-Arab-CN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ug; +} + +if (goog.LOCALE == 'ug_CN' || goog.LOCALE == 'ug-CN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ug; +} + +if (goog.LOCALE == 'ur_IN' || goog.LOCALE == 'ur-IN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ur_IN; +} + +if (goog.LOCALE == 'uz') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz; +} + +if (goog.LOCALE == 'uz_AF' || goog.LOCALE == 'uz-AF') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz_AF; +} + +if (goog.LOCALE == 'uz_Arab' || goog.LOCALE == 'uz-Arab') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz_Arab; +} + +if (goog.LOCALE == 'uz_Arab_AF' || goog.LOCALE == 'uz-Arab-AF') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz_Arab; +} + +if (goog.LOCALE == 'uz_Cyrl' || goog.LOCALE == 'uz-Cyrl') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz; +} + +if (goog.LOCALE == 'uz_Cyrl_UZ' || goog.LOCALE == 'uz-Cyrl-UZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz; +} + +if (goog.LOCALE == 'uz_Latn' || goog.LOCALE == 'uz-Latn') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz; +} + +if (goog.LOCALE == 'uz_Latn_UZ' || goog.LOCALE == 'uz-Latn-UZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz; +} + +if (goog.LOCALE == 'uz_UZ' || goog.LOCALE == 'uz-UZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz; +} + +if (goog.LOCALE == 've') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ve; +} + +if (goog.LOCALE == 've_ZA' || goog.LOCALE == 've-ZA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ve; +} + +if (goog.LOCALE == 'vun') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_vun; +} + +if (goog.LOCALE == 'vun_TZ' || goog.LOCALE == 'vun-TZ') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_vun; +} + +if (goog.LOCALE == 'wal') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_wal; +} + +if (goog.LOCALE == 'wal_ET' || goog.LOCALE == 'wal-ET') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_wal; +} + +if (goog.LOCALE == 'wo') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_wo; +} + +if (goog.LOCALE == 'wo_Latn' || goog.LOCALE == 'wo-Latn') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_wo; +} + +if (goog.LOCALE == 'wo_Latn_SN' || goog.LOCALE == 'wo-Latn-SN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_wo; +} + +if (goog.LOCALE == 'wo_SN' || goog.LOCALE == 'wo-SN') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_wo; +} + +if (goog.LOCALE == 'xh') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_xh; +} + +if (goog.LOCALE == 'xh_ZA' || goog.LOCALE == 'xh-ZA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_xh; +} + +if (goog.LOCALE == 'xog') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_xog; +} + +if (goog.LOCALE == 'xog_UG' || goog.LOCALE == 'xog-UG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_xog; +} + +if (goog.LOCALE == 'yo') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_yo; +} + +if (goog.LOCALE == 'yo_NG' || goog.LOCALE == 'yo-NG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_yo; +} + +if (goog.LOCALE == 'zh_Hans_HK' || goog.LOCALE == 'zh-Hans-HK') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hans_HK; +} + +if (goog.LOCALE == 'zh_Hans_MO' || goog.LOCALE == 'zh-Hans-MO') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hans_MO; +} + +if (goog.LOCALE == 'zh_Hans_SG' || goog.LOCALE == 'zh-Hans-SG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hans_SG; +} + +if (goog.LOCALE == 'zh_Hant' || goog.LOCALE == 'zh-Hant') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hant; +} + +if (goog.LOCALE == 'zh_Hant_HK' || goog.LOCALE == 'zh-Hant-HK') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hant_HK; +} + +if (goog.LOCALE == 'zh_Hant_MO' || goog.LOCALE == 'zh-Hant-MO') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hant_MO; +} + +if (goog.LOCALE == 'zh_Hant_TW' || goog.LOCALE == 'zh-Hant-TW') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hant; +} + +if (goog.LOCALE == 'zh_MO' || goog.LOCALE == 'zh-MO') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_MO; +} + +if (goog.LOCALE == 'zh_SG' || goog.LOCALE == 'zh-SG') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_SG; +} + +if (goog.LOCALE == 'zu') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zu; +} + +if (goog.LOCALE == 'zu_ZA' || goog.LOCALE == 'zu-ZA') { + goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zu; +} + diff --git a/contrib/closure-library/goog/i18n/pluralrules.js b/contrib/closure-library/goog/i18n/pluralrules.js index 6a4b104..5f9dd41 100644 --- a/contrib/closure-library/goog/i18n/pluralrules.js +++ b/contrib/closure-library/goog/i18n/pluralrules.js @@ -1,4 +1,4 @@ -// Copyright 2010 The Closure Library Authors. All Rights Reserved +// Copyright 2011 The Closure Library Authors. All Rights Reserved // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -15,7 +15,9 @@ /** * @fileoverview Plural rules. * - * This file is auto-generated. + * This file is autogenerated by script: + * http://go/generate_pluralrules.py + * using the --for_closure flag. * * To reduce the file size (which may cause issues in some JS * developing environments), this file will only contain locales @@ -261,6 +263,11 @@ goog.i18n.pluralRules.plSelect_ = function(n) { ((n % 100) < 12 || (n % 100) > 14) && n == Math.floor(n)) { return goog.i18n.pluralRules.Keyword.FEW; } + if ((n % 10) == 0 || n != 1 && (n % 10) == 1 || + ((n % 10) >= 5 && (n % 10) <= 9 || (n % 100) >= 12 && (n % 100) <= 14) && + n == Math.floor(n)) { + return goog.i18n.pluralRules.Keyword.MANY; + } return goog.i18n.pluralRules.Keyword.OTHER; }; @@ -330,13 +337,19 @@ goog.i18n.pluralRules.mkSelect_ = function(n) { * @private */ goog.i18n.pluralRules.cySelect_ = function(n) { + if (n == 0) { + return goog.i18n.pluralRules.Keyword.ZERO; + } if (n == 1) { return goog.i18n.pluralRules.Keyword.ONE; } if (n == 2) { return goog.i18n.pluralRules.Keyword.TWO; } - if (n == 8 || n == 11) { + if (n == 3) { + return goog.i18n.pluralRules.Keyword.FEW; + } + if (n == 6) { return goog.i18n.pluralRules.Keyword.MANY; } return goog.i18n.pluralRules.Keyword.OTHER; @@ -379,6 +392,33 @@ goog.i18n.pluralRules.shiSelect_ = function(n) { }; +/** + * Plural select rules for br locale + * + * @param {number} n The count of items. + * @return {goog.i18n.pluralRules.Keyword} Locale specific plural value. + * @private + */ +goog.i18n.pluralRules.brSelect_ = function(n) { + if (n == 0) { + return goog.i18n.pluralRules.Keyword.ZERO; + } + if (n == 1) { + return goog.i18n.pluralRules.Keyword.ONE; + } + if (n == 2) { + return goog.i18n.pluralRules.Keyword.TWO; + } + if (n == 3) { + return goog.i18n.pluralRules.Keyword.FEW; + } + if (n == 6) { + return goog.i18n.pluralRules.Keyword.MANY; + } + return goog.i18n.pluralRules.Keyword.OTHER; +}; + + /** * Selected plural rules by locale. */ @@ -400,6 +440,10 @@ if (goog.LOCALE == 'bn') { goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_; } +if (goog.LOCALE == 'br') { + goog.i18n.pluralRules.select = goog.i18n.pluralRules.brSelect_; +} + if (goog.LOCALE == 'ca') { goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_; } diff --git a/contrib/closure-library/goog/i18n/timezone.js b/contrib/closure-library/goog/i18n/timezone.js index f000a2a..dc65711 100644 --- a/contrib/closure-library/goog/i18n/timezone.js +++ b/contrib/closure-library/goog/i18n/timezone.js @@ -24,6 +24,7 @@ goog.require('goog.date.DateLike'); goog.require('goog.string'); + /** * TimeZone class implemented a time zone resolution and name information * source for client applications. The time zone object is initiated from diff --git a/contrib/closure-library/goog/i18n/timezone_test.html b/contrib/closure-library/goog/i18n/timezone_test.html index c64fc2c..bbc4446 100644 --- a/contrib/closure-library/goog/i18n/timezone_test.html +++ b/contrib/closure-library/goog/i18n/timezone_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/i18n/uchar.js b/contrib/closure-library/goog/i18n/uchar.js index b207bd5..4b1e6cb 100644 --- a/contrib/closure-library/goog/i18n/uchar.js +++ b/contrib/closure-library/goog/i18n/uchar.js @@ -135,6 +135,7 @@ goog.i18n.uChar.toName = function(ch) { * Details: https://sites/cibu/character-picker. **/ + /** * Sets up the character map, lazily. Some characters are indexed by their * decimal value. diff --git a/contrib/closure-library/goog/i18n/uchar_test.html b/contrib/closure-library/goog/i18n/uchar_test.html index ff228be..0646cc7 100644 --- a/contrib/closure-library/goog/i18n/uchar_test.html +++ b/contrib/closure-library/goog/i18n/uchar_test.html @@ -3,7 +3,7 @@ @@ -104,14 +104,7 @@ assertEquals('', goog.iter.join(iter, '')); // a step of 0 is not allowed - try { - iter = goog.iter.range(0, 5, 0); - fail('Step 0 is not allowed'); - } catch(ex) { - if (ex === goog.iter.StopIteration) { - fail('Invalid exception thrown'); - } - } + goog.iter.range(0, 5, 0); // test the opt args iter = goog.iter.range(0, 5); @@ -385,6 +378,66 @@ -1, goog.iter.nextOrValue(iter, -1)); } +// Return the product of several arrays as an array +function productAsArray(var_args) { + var iter = goog.iter.product.apply(null, arguments); + return goog.iter.toArray(iter); +} + +function testProduct() { + assertArrayEquals([[1, 3], [1, 4], [2, 3], [2, 4]], + productAsArray([1, 2], [3, 4])); + + assertArrayEquals([ + [1, 3, 5], [1, 3, 6], [1, 4, 5], [1, 4, 6], + [2, 3, 5], [2, 3, 6], [2, 4, 5], [2, 4, 6] + ], productAsArray([1, 2], [3, 4], [5, 6])); + + assertArrayEquals([[1]], productAsArray([1])); + assertArrayEquals([], productAsArray([1], [])); + assertArrayEquals([], productAsArray()); + + var expectedResult = []; + var a = [1, 2, 3]; + var b = [4, 5, 6]; + var c = [7, 8, 9]; + for (var i = 0; i < a.length; i ++) { + for (var j = 0; j < b.length; j ++) { + for (var k = 0; k < c.length; k ++) { + expectedResult.push([a[i], b[j], c[k]]); + } + } + } + + assertArrayEquals(expectedResult, productAsArray(a, b, c)); +} + +function testProductIteration() { + var iter = goog.iter.product([1, 2], [3, 4]); + + assertArrayEquals([1, 3], iter.next()); + assertArrayEquals([1, 4], iter.next()); + assertArrayEquals([2, 3], iter.next()); + assertArrayEquals([2, 4], iter.next()); + + var ex = assertThrows(function() { iter.next() }); + assertEquals(goog.iter.StopIteration, ex); + + // Ensure the iterator forever throws StopIteration. + for (var i = 0; i < 5; i++) { + var ex = assertThrows(function() { iter.next() }); + assertEquals(goog.iter.StopIteration, ex); + } + + iter = goog.iter.product(); + var ex = assertThrows(function() { iter.next() }); + assertEquals(goog.iter.StopIteration, ex); + + iter = goog.iter.product([]); + var ex = assertThrows(function() { iter.next() }); + assertEquals(goog.iter.StopIteration, ex); +} + diff --git a/contrib/closure-library/goog/json/json.js b/contrib/closure-library/goog/json/json.js index a76c27d..2f5ee2e 100644 --- a/contrib/closure-library/goog/json/json.js +++ b/contrib/closure-library/goog/json/json.js @@ -21,7 +21,6 @@ goog.provide('goog.json'); goog.provide('goog.json.Serializer'); - /** * Tests if a string is an invalid JSON string. This only ensures that we are * not using any invalid characters @@ -105,6 +104,7 @@ goog.json.unsafeParse = function(s) { return eval('(' + s + ')'); }; + /** * Serializes an object or a value to a JSON string. * @@ -285,7 +285,7 @@ goog.json.Serializer.prototype.serializeObject_ = function(obj, sb) { sb.push('{'); var sep = ''; for (var key in obj) { - if (obj.hasOwnProperty(key)) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { var value = obj[key]; // Skip functions. // TODO(ptucker) Should we return something for function properties? diff --git a/contrib/closure-library/goog/json/json_test.html b/contrib/closure-library/goog/json/json_test.html new file mode 100644 index 0000000..aabde3b --- /dev/null +++ b/contrib/closure-library/goog/json/json_test.html @@ -0,0 +1,501 @@ + + + + + +Closure Unit Tests - goog.json + + + + + + + diff --git a/contrib/closure-library/goog/locale/countries.js b/contrib/closure-library/goog/locale/countries.js index 10a4ad4..3dd43d8 100644 --- a/contrib/closure-library/goog/locale/countries.js +++ b/contrib/closure-library/goog/locale/countries.js @@ -24,6 +24,7 @@ * */ + /** * Namespace for current country codes. */ diff --git a/contrib/closure-library/goog/locale/countrylanguagenames_test.html b/contrib/closure-library/goog/locale/countrylanguagenames_test.html index 2473766..fd4aae9 100644 --- a/contrib/closure-library/goog/locale/countrylanguagenames_test.html +++ b/contrib/closure-library/goog/locale/countrylanguagenames_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/locale/timezonelist_test.html b/contrib/closure-library/goog/locale/timezonelist_test.html index fb18e74..dedc1cd 100644 --- a/contrib/closure-library/goog/locale/timezonelist_test.html +++ b/contrib/closure-library/goog/locale/timezonelist_test.html @@ -3,7 +3,7 @@ @@ -64,7 +64,49 @@ assert(goog.math.nearlyEquals(2, input.x3)); assert(goog.math.nearlyEquals(3, input.y3)); } - + + function testSolvePositionFromXValue() { + var eps = 1e-6; + var bezier = new goog.math.Bezier(0, 0, 0.25, 0.1, 0.25, 1, 1, 1); + var pt = bezier.getPoint(0.5); + assertRoughlyEquals(0.3125, pt.x, eps); + assertRoughlyEquals(0.5375, pt.y, eps); + assertRoughlyEquals(0.321, + bezier.solvePositionFromXValue(bezier.getPoint(0.321).x), eps); + } + + function testSolveYValueFromXValue() { + var eps = 1e-6; + // The following example is taken from + // http://www.netzgesta.de/dev/cubic-bezier-timing-function.html. + // The timing values shown in that page are 1 - so the + // bezier curves in this test are constructed with 1 - ctrl points. + // E.g. ctrl points (0, 0, 0.25, 0.1, 0.25, 1, 1, 1) become + // (1, 1, 0.75, 0, 0.75, 0.9, 0, 0) here. Since chanding the order of + // the ctrl points does not affect the shape of the curve, once can also + // have (0, 0, 0.75, 0.9, 0.75, 0, 1, 1). + + // netzgesta example. + var bezier = new goog.math.Bezier(1, 1, 0.75, 0.9, 0.75, 0, 0, 0); + assertRoughlyEquals(0.024374631, bezier.solveYValueFromXValue(0.2), eps); + assertRoughlyEquals(0.317459494, bezier.solveYValueFromXValue(0.6), eps); + assertRoughlyEquals(0.905205002, bezier.solveYValueFromXValue(0.9), eps); + + // netzgesta example with ctrl points in the reverse order so that 1st and + // last ctrl points are (0, 0) and (1, 1). Note the result is exactly the + // same. + bezier = new goog.math.Bezier(0, 0, 0.75, 0, 0.75, 0.9, 1, 1); + assertRoughlyEquals(0.024374631, bezier.solveYValueFromXValue(0.2), eps); + assertRoughlyEquals(0.317459494, bezier.solveYValueFromXValue(0.6), eps); + assertRoughlyEquals(0.905205002, bezier.solveYValueFromXValue(0.9), eps); + + // Ease-out css animation timing in webkit. + bezier = new goog.math.Bezier(0, 0, 0, 0, 0.58, 1, 1, 1); + assertRoughlyEquals(0.308366667, bezier.solveYValueFromXValue(0.2), eps); + assertRoughlyEquals(0.785139061, bezier.solveYValueFromXValue(0.6), eps); + assertRoughlyEquals(0.982973389, bezier.solveYValueFromXValue(0.9), eps); + } + diff --git a/contrib/closure-library/goog/math/box.js b/contrib/closure-library/goog/math/box.js index 4ed704f..e7a65d1 100644 --- a/contrib/closure-library/goog/math/box.js +++ b/contrib/closure-library/goog/math/box.js @@ -234,3 +234,17 @@ goog.math.Box.intersects = function(a, b) { return (a.left <= b.right && b.left <= a.right && a.top <= b.bottom && b.top <= a.bottom); }; + + +/** + * Returns whether two boxes would intersect with additional padding. + * + * @param {goog.math.Box} a A Box. + * @param {goog.math.Box} b A second Box. + * @param {number} padding The additional padding. + * @return {boolean} Whether the boxes intersect. + */ +goog.math.Box.intersectsWithPadding = function(a, b, padding) { + return (a.left <= b.right + padding && b.left <= a.right + padding && + a.top <= b.bottom + padding && b.top <= a.bottom + padding); +}; diff --git a/contrib/closure-library/goog/math/box_test.html b/contrib/closure-library/goog/math/box_test.html index 69a7428..eded563 100644 --- a/contrib/closure-library/goog/math/box_test.html +++ b/contrib/closure-library/goog/math/box_test.html @@ -3,7 +3,7 @@ @@ -116,6 +116,63 @@ assertNotIntersects(new goog.math.Box(120, 140, 140, 120)); } +function testBoxesIntersectWithPadding() { + var box = new goog.math.Box(50, 100, 100, 50); + + function assertIntersects(boxB, padding) { + assertTrue(box + ' expected to intersect ' + boxB + ' with padding ' + + padding, goog.math.Box.intersectsWithPadding(box, boxB, padding)); + } + function assertNotIntersects(boxB, padding) { + assertFalse(box + ' expected to not intersect ' + boxB + ' with padding ' + + padding, goog.math.Box.intersectsWithPadding(box, boxB, padding)); + } + + assertIntersects(box, 10); + assertIntersects(new goog.math.Box(20, 80, 80, 20), 10); + assertIntersects(new goog.math.Box(50, 80, 100, 20), 10); + assertIntersects(new goog.math.Box(80, 80, 120, 20), 10); + assertIntersects(new goog.math.Box(20, 100, 80, 50), 10); + assertIntersects(new goog.math.Box(80, 100, 120, 50), 10); + assertIntersects(new goog.math.Box(20, 120, 80, 80), 10); + assertIntersects(new goog.math.Box(50, 120, 100, 80), 10); + assertIntersects(new goog.math.Box(80, 120, 120, 80), 10); + assertIntersects(new goog.math.Box(20, 120, 120, 20), 10); + assertIntersects(new goog.math.Box(70, 80, 80, 70), 10); + assertIntersects(new goog.math.Box(10, 30, 30, 10), 20); + assertIntersects(new goog.math.Box(10, 70, 30, 30), 20); + assertIntersects(new goog.math.Box(10, 100, 30, 50), 20); + assertIntersects(new goog.math.Box(10, 120, 30, 80), 20); + assertIntersects(new goog.math.Box(10, 140, 30, 120), 20); + assertIntersects(new goog.math.Box(30, 30, 70, 10), 20); + assertIntersects(new goog.math.Box(30, 140, 70, 120), 20); + assertIntersects(new goog.math.Box(50, 30, 100, 10), 20); + assertIntersects(new goog.math.Box(50, 140, 100, 120), 20); + assertIntersects(new goog.math.Box(80, 30, 120, 10), 20); + assertIntersects(new goog.math.Box(80, 140, 120, 120), 20); + assertIntersects(new goog.math.Box(120, 30, 140, 10), 20); + assertIntersects(new goog.math.Box(120, 70, 140, 30), 20); + assertIntersects(new goog.math.Box(120, 100, 140, 50), 20); + assertIntersects(new goog.math.Box(120, 120, 140, 80), 20); + assertIntersects(new goog.math.Box(120, 140, 140, 120), 20); + assertNotIntersects(new goog.math.Box(10, 30, 30, 10), 10); + assertNotIntersects(new goog.math.Box(10, 70, 30, 30), 10); + assertNotIntersects(new goog.math.Box(10, 100, 30, 50), 10); + assertNotIntersects(new goog.math.Box(10, 120, 30, 80), 10); + assertNotIntersects(new goog.math.Box(10, 140, 30, 120), 10); + assertNotIntersects(new goog.math.Box(30, 30, 70, 10), 10); + assertNotIntersects(new goog.math.Box(30, 140, 70, 120), 10); + assertNotIntersects(new goog.math.Box(50, 30, 100, 10), 10); + assertNotIntersects(new goog.math.Box(50, 140, 100, 120), 10); + assertNotIntersects(new goog.math.Box(80, 30, 120, 10), 10); + assertNotIntersects(new goog.math.Box(80, 140, 120, 120), 10); + assertNotIntersects(new goog.math.Box(120, 30, 140, 10), 10); + assertNotIntersects(new goog.math.Box(120, 70, 140, 30), 10); + assertNotIntersects(new goog.math.Box(120, 100, 140, 50), 10); + assertNotIntersects(new goog.math.Box(120, 120, 140, 80), 10); + assertNotIntersects(new goog.math.Box(120, 140, 140, 120), 10); +} + function testExpandToInclude() { var box = new goog.math.Box(10, 50, 50, 10); box.expandToInclude(new goog.math.Box(60, 70, 70, 60)); @@ -134,6 +191,18 @@ assertEquals(100, box.right); assertEquals(100, box.bottom); } + +function testBoundingBox() { + assertObjectEquals( + new goog.math.Box(1, 10, 11, 0), + goog.math.Box.boundingBox( + new goog.math.Coordinate(5, 5), + new goog.math.Coordinate(5, 11), + new goog.math.Coordinate(0, 5), + new goog.math.Coordinate(5, 1), + new goog.math.Coordinate(10, 5))); +} + diff --git a/contrib/closure-library/goog/math/coordinate.js b/contrib/closure-library/goog/math/coordinate.js index 2415deb..d902e91 100644 --- a/contrib/closure-library/goog/math/coordinate.js +++ b/contrib/closure-library/goog/math/coordinate.js @@ -20,6 +20,7 @@ goog.provide('goog.math.Coordinate'); + /** * Class for representing coordinates and positions. * @param {number=} opt_x Left, defaults to 0. diff --git a/contrib/closure-library/goog/math/coordinate3.js b/contrib/closure-library/goog/math/coordinate3.js index c7298fc..d6693e2 100644 --- a/contrib/closure-library/goog/math/coordinate3.js +++ b/contrib/closure-library/goog/math/coordinate3.js @@ -21,32 +21,33 @@ goog.provide('goog.math.Coordinate3'); + /** * Class for representing coordinates and positions in 3 dimensions. * - * @param {number=} opt_x X. - * @param {number=} opt_y Y. - * @param {number=} opt_z Z. + * @param {number=} opt_x X coordinate, defaults to 0. + * @param {number=} opt_y Y coordinate, defaults to 0. + * @param {number=} opt_z Z coordinate, defaults to 0. * @constructor */ goog.math.Coordinate3 = function(opt_x, opt_y, opt_z) { /** * X-value - * @type {number|undefined} + * @type {number} */ - this.x = goog.isDef(opt_x) ? Number(opt_x) : undefined; + this.x = goog.isDef(opt_x) ? opt_x : 0; /** * Y-value - * @type {number|undefined} + * @type {number} */ - this.y = goog.isDef(opt_y) ? Number(opt_y) : undefined; + this.y = goog.isDef(opt_y) ? opt_y : 0; /** * Z-value - * @type {number|undefined} + * @type {number} */ - this.z = goog.isDef(opt_z) ? Number(opt_z) : undefined; + this.z = goog.isDef(opt_z) ? opt_z : 0; }; diff --git a/contrib/closure-library/goog/math/coordinate3_test.html b/contrib/closure-library/goog/math/coordinate3_test.html index 65b1cfc..089307f 100644 --- a/contrib/closure-library/goog/math/coordinate3_test.html +++ b/contrib/closure-library/goog/math/coordinate3_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/math/integer.js b/contrib/closure-library/goog/math/integer.js index f0d2206..0a4898f 100644 --- a/contrib/closure-library/goog/math/integer.js +++ b/contrib/closure-library/goog/math/integer.js @@ -24,6 +24,7 @@ goog.provide('goog.math.Integer'); + /** * Constructs a two's-complement integer an array containing bits of the * integer in 32-bit (signed) pieces, given in little-endian order (i.e., diff --git a/contrib/closure-library/goog/math/integer_test.html b/contrib/closure-library/goog/math/integer_test.html index c56add0..5f4bb0f 100644 --- a/contrib/closure-library/goog/math/integer_test.html +++ b/contrib/closure-library/goog/math/integer_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/math/line.js b/contrib/closure-library/goog/math/line.js index 4351ffa..1cdd7c9 100644 --- a/contrib/closure-library/goog/math/line.js +++ b/contrib/closure-library/goog/math/line.js @@ -25,6 +25,7 @@ goog.require('goog.math'); goog.require('goog.math.Coordinate'); + /** * Object representing a line. * @param {number} x0 X coordinate of the start point. diff --git a/contrib/closure-library/goog/math/line_test.html b/contrib/closure-library/goog/math/line_test.html index 895f243..ba1abe5 100644 --- a/contrib/closure-library/goog/math/line_test.html +++ b/contrib/closure-library/goog/math/line_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/math/long.js b/contrib/closure-library/goog/math/long.js index d51f850..f03e5fa 100644 --- a/contrib/closure-library/goog/math/long.js +++ b/contrib/closure-library/goog/math/long.js @@ -22,6 +22,7 @@ goog.provide('goog.math.Long'); + /** * Constructs a 64-bit two's-complement integer, given its low and high 32-bit * values as *signed* integers. See the from* functions below for more @@ -183,12 +184,14 @@ goog.math.Long.fromString = function(str, opt_radix) { */ goog.math.Long.TWO_PWR_16_DBL_ = 1 << 16; + /** * @type {number} * @private */ goog.math.Long.TWO_PWR_24_DBL_ = 1 << 24; + /** * @type {number} * @private @@ -196,6 +199,7 @@ goog.math.Long.TWO_PWR_24_DBL_ = 1 << 24; goog.math.Long.TWO_PWR_32_DBL_ = goog.math.Long.TWO_PWR_16_DBL_ * goog.math.Long.TWO_PWR_16_DBL_; + /** * @type {number} * @private @@ -203,6 +207,7 @@ goog.math.Long.TWO_PWR_32_DBL_ = goog.math.Long.TWO_PWR_31_DBL_ = goog.math.Long.TWO_PWR_32_DBL_ / 2; + /** * @type {number} * @private @@ -210,6 +215,7 @@ goog.math.Long.TWO_PWR_31_DBL_ = goog.math.Long.TWO_PWR_48_DBL_ = goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_16_DBL_; + /** * @type {number} * @private @@ -217,6 +223,7 @@ goog.math.Long.TWO_PWR_48_DBL_ = goog.math.Long.TWO_PWR_64_DBL_ = goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_32_DBL_; + /** * @type {number} * @private @@ -228,16 +235,20 @@ goog.math.Long.TWO_PWR_63_DBL_ = /** @type {!goog.math.Long} */ goog.math.Long.ZERO = goog.math.Long.fromInt(0); + /** @type {!goog.math.Long} */ goog.math.Long.ONE = goog.math.Long.fromInt(1); + /** @type {!goog.math.Long} */ goog.math.Long.NEG_ONE = goog.math.Long.fromInt(-1); + /** @type {!goog.math.Long} */ goog.math.Long.MAX_VALUE = goog.math.Long.fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0); + /** @type {!goog.math.Long} */ goog.math.Long.MIN_VALUE = goog.math.Long.fromBits(0, 0x80000000 | 0); diff --git a/contrib/closure-library/goog/math/long_test.html b/contrib/closure-library/goog/math/long_test.html index 94d52f0..87a0e17 100644 --- a/contrib/closure-library/goog/math/long_test.html +++ b/contrib/closure-library/goog/math/long_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/math/math_test.html b/contrib/closure-library/goog/math/math_test.html index b43a4f9..3215ae8 100644 --- a/contrib/closure-library/goog/math/math_test.html +++ b/contrib/closure-library/goog/math/math_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/math/matrix.js b/contrib/closure-library/goog/math/matrix.js index 89f6d34..0b078df 100644 --- a/contrib/closure-library/goog/math/matrix.js +++ b/contrib/closure-library/goog/math/matrix.js @@ -23,6 +23,7 @@ goog.require('goog.math'); goog.require('goog.math.Size'); + /** * Class for representing and manipulating matrices. * diff --git a/contrib/closure-library/goog/math/matrix_test.html b/contrib/closure-library/goog/math/matrix_test.html index 6131c98..ed16f60 100644 --- a/contrib/closure-library/goog/math/matrix_test.html +++ b/contrib/closure-library/goog/math/matrix_test.html @@ -3,7 +3,7 @@ @@ -41,35 +41,25 @@ function testConstructorWithBadArray() { - try { - var m1 = new goog.math.Matrix([[1, 2, 3], [1, 2], [1]]); - } catch (e) { - assertNotNull('1. All arrays should be of equal length', e); - } + assertThrows('1. All arrays should be of equal length', function() { + new goog.math.Matrix([[1, 2, 3], [1, 2], [1]]); + }); - try { - var m2 = new goog.math.Matrix([[1, 2], [1, 2], [1, 2, 3, 4]]); - } catch (e) { - assertNotNull('2. All arrays should be of equal length', e); - } + assertThrows('2. All arrays should be of equal length', function() { + new goog.math.Matrix([[1, 2], [1, 2], [1, 2, 3, 4]]); + }); - try { - var m3 = new goog.math.Matrix([[1, 2], [1, 2], [1, 'a']]); - } catch (e) { - assertNotNull('3. Arrays should contain only numeric values', e); - } + assertThrows('3. Arrays should contain only numeric values', function() { + new goog.math.Matrix([[1, 2], [1, 2], [1, 'a']]); + }); - try { - var m4 = new goog.math.Matrix([[1, 2], [1, 2], [1, {a: 3}]]); - } catch (e) { - assertNotNull('4. Arrays should contain only numeric values', e); - } + assertThrows('4. Arrays should contain only numeric values', function() { + new goog.math.Matrix([[1, 2], [1, 2], [1, {a: 3}]]); + }); - try { - var m5 = new goog.math.Matrix([[1, 2], [1, 2], [1, [1, 2, 3]]]); - } catch (e) { - assertNotNull('5. Arrays should contain only numeric values', e); - } + assertThrows('5. Arrays should contain only numeric values', function() { + new goog.math.Matrix([[1, 2], [1, 2], [1, [1, 2, 3]]]); + }); } @@ -89,29 +79,21 @@ function testConstructorWithBadNumbers() { - try { - var m4 = new goog.math.Matrix(-4, 6); - } catch (e) { - assertNotNull('1. Negative argument should have errored', e); - } + assertThrows('1. Negative argument should have errored', function() { + new goog.math.Matrix(-4, 6); + }); - try { - var m5 = new goog.math.Matrix(4, -6); - } catch (e) { - assertNotNull('2. Negative argument should have errored', e); - } + assertThrows('2. Negative argument should have errored', function() { + new goog.math.Matrix(4, -6); + }); - try { - var m6 = new goog.math.Matrix(4, 0); - } catch (e) { - assertNotNull('3. Zero argument should have errored', e); - } + assertThrows('3. Zero argument should have errored', function() { + new goog.math.Matrix(4, 0); + }); - try { - var m7 = new goog.math.Matrix(0, 1); - } catch (e) { - assertNotNull('4. Zero argument should have errored', e); - } + assertThrows('4. Zero argument should have errored', function() { + new goog.math.Matrix(0, 1); + }); } @@ -304,7 +286,7 @@ assertArrayEquals('A(BC) == (AB)C', A.multiply(B.multiply(C)).toArray(), - A.multiply(B).multiply(C).toArray()); + A.multiply(B).multiply(C).toArray()); } @@ -374,7 +356,7 @@ function testDeterminant() { var m = new goog.math.Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]); - assertEquals(0, m.getDeterminant()); + assertEquals(0, m.getDeterminant()); } @@ -384,10 +366,10 @@ [ 0, -1, 2, 0, 0, 1]]); var sub1 = [[2, -1, 0], [-1, 2, -1], [0, -1, 2]]; assertArrayEquals(sub1, - m.getSubmatrixByCoordinates_(0, 0, 2, 2).toArray()); + m.getSubmatrixByCoordinates_(0, 0, 2, 2).toArray()); var sub2 = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]; - assertArrayEquals(sub2, m.getSubmatrixByCoordinates_(0, 3).toArray()); + assertArrayEquals(sub2, m.getSubmatrixByCoordinates_(0, 3).toArray()); } diff --git a/contrib/closure-library/goog/math/range.js b/contrib/closure-library/goog/math/range.js index 31cf2c9..8b8ec93 100644 --- a/contrib/closure-library/goog/math/range.js +++ b/contrib/closure-library/goog/math/range.js @@ -20,6 +20,7 @@ goog.provide('goog.math.Range'); + /** * A number range. * @param {number} a One end of the range. @@ -27,9 +28,6 @@ goog.provide('goog.math.Range'); * @constructor */ goog.math.Range = function(a, b) { - a = Number(a); - b = Number(b); - /** * The lowest value in the range. * @type {number} diff --git a/contrib/closure-library/goog/math/range_test.html b/contrib/closure-library/goog/math/range_test.html index 2101a44..2bf6254 100644 --- a/contrib/closure-library/goog/math/range_test.html +++ b/contrib/closure-library/goog/math/range_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/math/rangeset.js b/contrib/closure-library/goog/math/rangeset.js index ee06d15..ca92f86 100755 --- a/contrib/closure-library/goog/math/rangeset.js +++ b/contrib/closure-library/goog/math/rangeset.js @@ -31,6 +31,7 @@ goog.require('goog.iter.StopIteration'); goog.require('goog.math.Range'); + /** * Constructs a new RangeSet, which can store numeric ranges. * diff --git a/contrib/closure-library/goog/math/rangeset_test.html b/contrib/closure-library/goog/math/rangeset_test.html index 061055b..fe85b50 100644 --- a/contrib/closure-library/goog/math/rangeset_test.html +++ b/contrib/closure-library/goog/math/rangeset_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/math/rect.js b/contrib/closure-library/goog/math/rect.js index e277242..350f0ba 100644 --- a/contrib/closure-library/goog/math/rect.js +++ b/contrib/closure-library/goog/math/rect.js @@ -22,6 +22,8 @@ goog.provide('goog.math.Rect'); goog.require('goog.math.Box'); goog.require('goog.math.Size'); + + /** * Class for representing rectangular regions. * @param {number} x Left. @@ -304,6 +306,7 @@ goog.math.Rect.boundingRect = function(a, b) { return clone; }; + /** * Tests whether this rectangle entirely contains another rectangle or * coordinate. diff --git a/contrib/closure-library/goog/math/rect_test.html b/contrib/closure-library/goog/math/rect_test.html index c6a8f5b..92529bc 100644 --- a/contrib/closure-library/goog/math/rect_test.html +++ b/contrib/closure-library/goog/math/rect_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/math/size_test.html b/contrib/closure-library/goog/math/size_test.html index 09f9847..7ab7aba 100644 --- a/contrib/closure-library/goog/math/size_test.html +++ b/contrib/closure-library/goog/math/size_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/math/vec2.js b/contrib/closure-library/goog/math/vec2.js index 11c16c5..dfd02ec 100644 --- a/contrib/closure-library/goog/math/vec2.js +++ b/contrib/closure-library/goog/math/vec2.js @@ -33,23 +33,23 @@ goog.require('goog.math.Coordinate'); * Class for a two-dimensional vector object and assorted functions useful for * manipulating points. * - * @param {number=} opt_x The x coordinate for the vector. - * @param {number=} opt_y The y coordinate for the vector. + * @param {number} x The x coordinate for the vector. + * @param {number} y The y coordinate for the vector. * @constructor * @extends {goog.math.Coordinate} */ -goog.math.Vec2 = function(opt_x, opt_y) { +goog.math.Vec2 = function(x, y) { /** * X-value * @type {number} */ - this.x = Number(opt_x) || 0; + this.x = x; /** * Y-value * @type {number} */ - this.y = Number(opt_y) || 0; + this.y = y; }; goog.inherits(goog.math.Vec2, goog.math.Coordinate); diff --git a/contrib/closure-library/goog/math/vec2_test.html b/contrib/closure-library/goog/math/vec2_test.html index c1b01d0..0a65051 100644 --- a/contrib/closure-library/goog/math/vec2_test.html +++ b/contrib/closure-library/goog/math/vec2_test.html @@ -3,7 +3,7 @@ @@ -25,17 +25,9 @@ function testVec2() { - var a = new goog.math.Vec2(); - assertEquals(0, a.x); - assertEquals(0, a.y); - - var b = new goog.math.Vec2(4); - assertEquals(4, b.x); - assertEquals(0, b.y); - - var c = new goog.math.Vec2(3.14, 2.78); - assertEquals(3.14, c.x); - assertEquals(2.78, c.y); + var v = new goog.math.Vec2(3.14, 2.78); + assertEquals(3.14, v.x); + assertEquals(2.78, v.y); } diff --git a/contrib/closure-library/goog/math/vec3.js b/contrib/closure-library/goog/math/vec3.js index 106dc10..e24f7f7 100644 --- a/contrib/closure-library/goog/math/vec3.js +++ b/contrib/closure-library/goog/math/vec3.js @@ -26,6 +26,7 @@ goog.require('goog.math'); goog.require('goog.math.Coordinate3'); + /** * Class for a three-dimensional vector object and assorted functions useful for * manipulation. @@ -33,30 +34,30 @@ goog.require('goog.math.Coordinate3'); * Inherits from goog.math.Coordinate3 so that a Vec3 may be passed in to any * function that requires a Coordinate. * - * @param {number=} opt_x The x value for the vector. - * @param {number=} opt_y The y value for the vector. - * @param {number=} opt_z The z value for the vector. + * @param {number} x The x value for the vector. + * @param {number} y The y value for the vector. + * @param {number} z The z value for the vector. * @constructor * @extends {goog.math.Coordinate3} */ -goog.math.Vec3 = function(opt_x, opt_y, opt_z) { +goog.math.Vec3 = function(x, y, z) { /** * X-value * @type {number} */ - this.x = Number(opt_x) || 0; + this.x = x; /** * Y-value * @type {number} */ - this.y = Number(opt_y) || 0; + this.y = y; /** * Z-value * @type {number} */ - this.z = Number(opt_z) || 0; + this.z = z; }; goog.inherits(goog.math.Vec3, goog.math.Coordinate3); @@ -230,25 +231,6 @@ goog.math.Vec3.distance = goog.math.Coordinate3.distance; goog.math.Vec3.squaredDistance = goog.math.Coordinate3.squaredDistance; -/** - * Returns a new 3x1 matrix object from a given coordinate. - * - * @param {goog.math.Coordinate3} a The coordinate. - * @return {!goog.math.Matrix} A new matrix object. - */ -goog.math.Vec3.toMatrix3x1 = goog.math.Coordinate3.toMatrix3x1; - - -/** - * Returns a new 4x1 matrix object from a given coordinate. - * - * @param {goog.math.Coordinate3} a The coordinate. - * @return {!goog.math.Matrix} A new matrix object. - */ - -goog.math.Vec3.toMatrix4x1 = goog.math.Coordinate3.toMatrix4x1; - - /** * Compares vectors for equality. * @@ -323,4 +305,3 @@ goog.math.Vec3.lerp = function(a, b, x) { goog.math.lerp(a.y, b.y, x), goog.math.lerp(a.z, b.z, x)); }; - diff --git a/contrib/closure-library/goog/math/vec3_test.html b/contrib/closure-library/goog/math/vec3_test.html index d8d80f5..84c1b5f 100644 --- a/contrib/closure-library/goog/math/vec3_test.html +++ b/contrib/closure-library/goog/math/vec3_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/messaging/abstractchannel.js b/contrib/closure-library/goog/messaging/abstractchannel.js new file mode 100644 index 0000000..ea7669e --- /dev/null +++ b/contrib/closure-library/goog/messaging/abstractchannel.js @@ -0,0 +1,210 @@ +// Copyright 2010 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview An abstract superclass for message channels that handles the + * repetitive details of registering and dispatching to services. This is more + * useful for full-fledged channels than for decorators, since decorators + * generally delegate service registering anyway. + * + */ + + +goog.provide('goog.messaging.AbstractChannel'); + +goog.require('goog.Disposable'); +goog.require('goog.debug'); +goog.require('goog.debug.Logger'); +goog.require('goog.json'); +goog.require('goog.messaging.MessageChannel'); // interface + + + +/** + * Creates an abstract message channel. + * + * @constructor + * @extends {goog.Disposable} + * @implements {goog.messaging.MessageChannel} + */ +goog.messaging.AbstractChannel = function() { + goog.base(this); + + /** + * The services registered for this channel. + * @type {Object.} + * @private + */ + this.services_ = {}; +}; +goog.inherits(goog.messaging.AbstractChannel, goog.Disposable); + + +/** + * The default service to be run when no other services match. + * + * @type {?function(string, (string|!Object))} + * @private + */ +goog.messaging.AbstractChannel.prototype.defaultService_; + + +/** + * Logger for this class. + * @type {goog.debug.Logger} + * @protected + */ +goog.messaging.AbstractChannel.prototype.logger = + goog.debug.Logger.getLogger('goog.messaging.AbstractChannel'); + + +/** + * Immediately calls opt_connectCb if given, and is otherwise a no-op. If + * subclasses have configuration that needs to happen before the channel is + * connected, they should override this and {@link #isConnected}. + * @inheritDoc + */ +goog.messaging.AbstractChannel.prototype.connect = function(opt_connectCb) { + if (opt_connectCb) { + opt_connectCb(); + } +}; + + +/** + * Always returns true. If subclasses have configuration that needs to happen + * before the channel is connected, they should override this and + * {@link #connect}. + * @inheritDoc + */ +goog.messaging.AbstractChannel.prototype.isConnected = function() { + return true; +}; + + +/** @inheritDoc */ +goog.messaging.AbstractChannel.prototype.registerService = + function(serviceName, callback, opt_objectPayload) { + this.services_[serviceName] = { + callback: callback, + objectPayload: !!opt_objectPayload + }; +}; + + +/** @inheritDoc */ +goog.messaging.AbstractChannel.prototype.registerDefaultService = + function(callback) { + this.defaultService_ = callback; +}; + + +/** @inheritDoc */ +goog.messaging.AbstractChannel.prototype.send = goog.abstractMethod; + + +/** + * Delivers a message to the appropriate service. This is meant to be called by + * subclasses when they receive messages. + * + * This method takes into account both explicitly-registered and default + * services, as well as making sure that JSON payloads are decoded when + * necessary. If the subclass is capable of passing objects as payloads, those + * objects can be passed in to this method directly. Otherwise, the (potentially + * JSON-encoded) strings should be passed in. + * + * @param {string} serviceName The name of the service receiving the message. + * @param {string|!Object} payload The contents of the message. + * @protected + */ +goog.messaging.AbstractChannel.prototype.deliver = function( + serviceName, payload) { + var service = this.getService(serviceName, payload); + if (!service) { + return; + } + + var decodedPayload = + this.decodePayload(serviceName, payload, service.objectPayload); + if (goog.isDefAndNotNull(decodedPayload)) { + service.callback(decodedPayload); + } +}; + + +/** + * Find the service object for a given service name. If there's no service + * explicitly registered, but there is a default service, a service object is + * constructed for it. + * + * @param {string} serviceName The name of the service receiving the message. + * @param {string|!Object} payload The contents of the message. + * @return {?{callback: function((string|!Object)), objectPayload: boolean}} The + * service object for the given service, or null if none was found. + * @protected + */ +goog.messaging.AbstractChannel.prototype.getService = function( + serviceName, payload) { + var service = this.services_[serviceName]; + if (service) { + return service; + } else if (this.defaultService_) { + var callback = goog.partial(this.defaultService_, serviceName); + var objectPayload = goog.isObject(payload); + return {callback: callback, objectPayload: objectPayload}; + } + + this.logger.warning('Unknown service name "' + serviceName + '"'); + return null; +}; + + +/** + * Converts the message payload into the format expected by the registered + * service (either JSON or string). + * + * @param {string} serviceName The name of the service receiving the message. + * @param {string|!Object} payload The contents of the message. + * @param {boolean} objectPayload Whether the service expects an object or a + * plain string. + * @return {string|Object} The payload in the format expected by the service, or + * null if something went wrong. + * @protected + */ +goog.messaging.AbstractChannel.prototype.decodePayload = function( + serviceName, payload, objectPayload) { + if (objectPayload && goog.isString(payload)) { + try { + return goog.json.parse(payload); + } catch (err) { + this.logger.warning('Expected JSON payload for ' + serviceName + + ', was "' + payload + '"'); + return null; + } + } else if (!objectPayload && !goog.isString(payload)) { + return goog.json.serialize(payload); + } + return payload; +}; + + +/** @inheritDoc */ +goog.messaging.AbstractChannel.prototype.disposeInternal = function() { + goog.base(this, 'disposeInternal'); + goog.dispose(this.logger); + delete this.logger; + delete this.services_; + delete this.defaultService_; +}; diff --git a/contrib/closure-library/goog/messaging/abstractchannel_test.html b/contrib/closure-library/goog/messaging/abstractchannel_test.html new file mode 100644 index 0000000..2ff953d --- /dev/null +++ b/contrib/closure-library/goog/messaging/abstractchannel_test.html @@ -0,0 +1,90 @@ + + + + + + + Closure Unit Tests - goog.messaging.AbstractChannel + + + + + + + + + diff --git a/contrib/closure-library/goog/messaging/bufferedchannel.js b/contrib/closure-library/goog/messaging/bufferedchannel.js index 52349fb..f1927ec 100644 --- a/contrib/closure-library/goog/messaging/bufferedchannel.js +++ b/contrib/closure-library/goog/messaging/bufferedchannel.js @@ -19,7 +19,6 @@ */ goog.provide('goog.messaging.BufferedChannel'); -goog.provide('goog.messaging.BufferedChannel.ReservedServiceNameError'); goog.require('goog.Timer'); goog.require('goog.Uri'); @@ -27,6 +26,7 @@ goog.require('goog.debug.Error'); goog.require('goog.debug.Logger'); goog.require('goog.events'); goog.require('goog.messaging.MessageChannel'); +goog.require('goog.messaging.MultiChannel'); @@ -56,12 +56,30 @@ goog.messaging.BufferedChannel = function(messageChannel, opt_interval) { this.buffer_ = []; /** - * Delegate that we're wrapping. + * Channel dispatcher wrapping the underlying delegate channel. * - * @type {goog.messaging.MessageChannel} + * @type {!goog.messaging.MultiChannel} * @private */ - this.messageChannel_ = messageChannel; + this.multiChannel_ = new goog.messaging.MultiChannel(messageChannel); + + /** + * Virtual channel for carrying the user's messages. + * + * @type {!goog.messaging.MessageChannel} + * @private + */ + this.userChannel_ = this.multiChannel_.createVirtualChannel( + goog.messaging.BufferedChannel.USER_CHANNEL_NAME_); + + /** + * Virtual channel for carrying control messages for BufferedChannel. + * + * @type {!goog.messaging.MessageChannel} + * @private + */ + this.controlChannel_ = this.multiChannel_.createVirtualChannel( + goog.messaging.BufferedChannel.CONTROL_CHANNEL_NAME_); /** * Timer for the peer ready ping loop. @@ -72,7 +90,10 @@ goog.messaging.BufferedChannel = function(messageChannel, opt_interval) { this.timer_ = new goog.Timer( opt_interval || goog.messaging.BufferedChannel.DEFAULT_INTERVAL_MILLIS_); - this.messageChannel_.registerService( + this.timer_.start(); + goog.events.listen(this.timer_, goog.Timer.TICK, this.onTick_, false, this); + + this.controlChannel_.registerService( goog.messaging.BufferedChannel.PEER_READY_SERVICE_NAME_, goog.bind(this.setPeerReady_, this)); }; @@ -90,7 +111,10 @@ goog.messaging.BufferedChannel.DEFAULT_INTERVAL_MILLIS_ = 50; /** - * Reserved name of the service which handles peer ready pings. + * The name of the private service which handles peer ready pings. The + * service registered with this name is bound to this.setPeerReady_, an internal + * part of BufferedChannel's implementation that clients should not send to + * directly. * * @type {string} * @const @@ -100,38 +124,37 @@ goog.messaging.BufferedChannel.PEER_READY_SERVICE_NAME_ = 'setPeerReady_'; /** - * Begins the peer ready notification loop. + * The name of the virtual channel along which user messages are sent. * + * @type {string} + * @const * @private */ -goog.messaging.BufferedChannel.prototype.beginPolling_ = function() { - this.timer_.start(); - goog.events.listen( - this.timer_, goog.Timer.TICK, goog.bind(this.poll_, this)); -}; +goog.messaging.BufferedChannel.USER_CHANNEL_NAME_ = 'user'; /** - * Connects the channel, runs the (optional) passed callback, and starts the - * peer ready notification loop. When this method is called, all the - * information needed to connect the channel must be available. + * The name of the virtual channel along which internal control messages are + * sent. * - * @see goog.messaging.MessageChannel.connect + * @type {string} + * @const + * @private */ +goog.messaging.BufferedChannel.CONTROL_CHANNEL_NAME_ = 'control'; + + +/** @inheritDoc */ goog.messaging.BufferedChannel.prototype.connect = function(opt_connectCb) { - if (opt_connectCb) opt_connectCb(); - this.messageChannel_.connect(goog.bind(this.beginPolling_, this)); + if (opt_connectCb) { + opt_connectCb(); + } }; -/** - * @return {boolean} Whether or not the channel is connected. Note that this - * conveys no information about the status of the channel's peer. - * - * @see goog.messaging.MessageChannel.isConnected - */ +/** @inheritDoc */ goog.messaging.BufferedChannel.prototype.isConnected = function() { - return this.messageChannel_.isConnected(); + return true; }; @@ -155,59 +178,51 @@ goog.messaging.BufferedChannel.prototype.logger_ = goog.debug.Logger.getLogger( /** - * Whether or not the peer channel is ready to receive messages. - * - * @type {boolean} - * @private - */ -goog.messaging.BufferedChannel.prototype.peerReady_ = false; - - -/** - * Handles one tick of our peer ready notification loop. This entails sending - * a ready ping to the peer and shutting down the loop if we've received a ping + * Handles one tick of our peer ready notification loop. This entails sending a + * ready ping to the peer and shutting down the loop if we've received a ping * ourselves. * + * @param {goog.events.Event} unusedEvent Event we're handling. * @private */ -goog.messaging.BufferedChannel.prototype.poll_ = function() { +goog.messaging.BufferedChannel.prototype.onTick_ = function(unusedEvent) { // Must always send before stopping the notification loop. Otherwise, we will // commonly fail to transmit to our peer that we're ready because we received // their ready ping between two of ours. - this.messageChannel_.send('setPeerReady_', null); - if (this.isPeerReady()) this.timer_.stop(); + try { + this.controlChannel_.send( + goog.messaging.BufferedChannel.PEER_READY_SERVICE_NAME_, + /* payload */ ''); + } catch (e) { + this.timer_.stop(); // So we don't keep calling send and re-throwing. + throw e; + } + if (this.isPeerReady()) { + this.timer_.stop(); + } }; /** - * Registers a service to be called when a message is received. - * - * @param {string} serviceName The name of the service. - * @param {function((string|Object))} callback The callback to process the - * incoming messages. Passed the payload. If opt_jsonEncoded is set, the - * payload is decoded and passed as an object. - * @param {boolean} opt_jsonEncoded If true, incoming messages for this service - * are expected to contain a JSON-encoded object and will be deserialized - * automatically. It's the responsibility of implementors of this class to - * perform the deserialization. - * @throws {goog.messaging.BufferedChannel.ReservedServiceNameError} if the - * passed serviceName is reserved for BufferedChannel's use. - */ + * Whether or not the peer channel is ready to receive messages. + * + * @type {boolean} + * @private + */ +goog.messaging.BufferedChannel.prototype.peerReady_; + + +/** @inheritDoc */ goog.messaging.BufferedChannel.prototype.registerService = function( - serviceName, callback, opt_jsonEncoded) { - if (serviceName == goog.messaging.BufferedChannel.PEER_READY_SERVICE_NAME_) { - throw new goog.messaging.BufferedChannel.ReservedServiceNameError( - 'cannot register service with reserved name ' + - goog.messaging.BufferedChannel.PEER_READY_SERVICE_NAME_); - } - this.messageChannel_.registerService(serviceName, callback, opt_jsonEncoded); + serviceName, callback, opt_objectPayload) { + this.userChannel_.registerService(serviceName, callback, opt_objectPayload); }; /** @inheritDoc */ goog.messaging.BufferedChannel.prototype.registerDefaultService = function( callback) { - this.messageChannel_.registerDefaultService(callback); + this.userChannel_.registerDefaultService(callback); }; @@ -217,14 +232,14 @@ goog.messaging.BufferedChannel.prototype.registerDefaultService = function( * * @param {string} serviceName The name of the service this message should be * delivered to. - * @param {string|Object} payload The value of the message. If this is an + * @param {string|!Object} payload The value of the message. If this is an * Object, it is serialized to JSON before sending. It's the responsibility * of implementors of this class to perform the serialization. * @see goog.net.xpc.BufferedChannel.send */ goog.messaging.BufferedChannel.prototype.send = function(serviceName, payload) { if (this.isPeerReady()) { - this.messageChannel_.send(serviceName, payload); + this.userChannel_.send(serviceName, payload); } else { goog.messaging.BufferedChannel.prototype.logger_.fine( 'buffering message ' + serviceName); @@ -240,13 +255,15 @@ goog.messaging.BufferedChannel.prototype.send = function(serviceName, payload) { * @private */ goog.messaging.BufferedChannel.prototype.setPeerReady_ = function() { - if (this.peerReady_) return; + if (this.peerReady_) { + return; + } this.peerReady_ = true; for (var i = 0; i < this.buffer_.length; i++) { var message = this.buffer_[i]; goog.messaging.BufferedChannel.prototype.logger_.fine( 'sending buffered message ' + message.serviceName); - this.messageChannel_.send(message.serviceName, message.payload); + this.userChannel_.send(message.serviceName, message.payload); } this.buffer_ = null; }; @@ -254,28 +271,7 @@ goog.messaging.BufferedChannel.prototype.setPeerReady_ = function() { /** @inheritDoc */ goog.messaging.BufferedChannel.prototype.disposeInternal = function() { - goog.dispose(this.messageChannel_); + goog.dispose(this.multiChannel_); goog.dispose(this.timer_); goog.base(this, 'disposeInternal'); }; - - - -/** - * Creates the custom error thrown when clients attempt to register a service - * with the name reserved for the peer ready notification handler. - * - * @param {*=} opt_msg The message associated with this error. - * @constructor - * @extends {goog.debug.Error} - */ -goog.messaging.BufferedChannel.ReservedServiceNameError = function(opt_msg) { - goog.debug.Error.call(this, opt_msg); -}; -goog.inherits( - goog.messaging.BufferedChannel.ReservedServiceNameError, goog.debug.Error); - - -/** @inheritDoc */ -goog.messaging.BufferedChannel.ReservedServiceNameError.prototype.name = - 'ReservedServiceNameError'; diff --git a/contrib/closure-library/goog/messaging/bufferedchannel_test.html b/contrib/closure-library/goog/messaging/bufferedchannel_test.html new file mode 100644 index 0000000..0615702 --- /dev/null +++ b/contrib/closure-library/goog/messaging/bufferedchannel_test.html @@ -0,0 +1,205 @@ + + + + + + + Closure Unit Tests - goog.messaging.BufferedChannel + + + + + + + + + +
    + Debug Window + [clear] +
    +
    + + + diff --git a/contrib/closure-library/goog/messaging/deferredchannel.js b/contrib/closure-library/goog/messaging/deferredchannel.js new file mode 100644 index 0000000..98be61c --- /dev/null +++ b/contrib/closure-library/goog/messaging/deferredchannel.js @@ -0,0 +1,87 @@ +// Copyright 2010 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview A MessageChannel decorator that wraps a deferred MessageChannel + * and enqueues messages and service registrations until that channel exists. + * + */ + +goog.provide('goog.messaging.DeferredChannel'); + +goog.require('goog.async.Deferred'); +goog.require('goog.messaging.MessageChannel'); // interface + + + +/** + * Creates a new DeferredChannel, which wraps a deferred MessageChannel and + * enqueues messages to be sent once the wrapped channel is resolved. + * + * @param {!goog.async.Deferred} deferredChannel The underlying deferred + * MessageChannel. + * @constructor + * @implements {goog.messaging.MessageChannel} + */ +goog.messaging.DeferredChannel = function(deferredChannel) { + this.deferred_ = deferredChannel; +}; + + +/** + * Cancels the wrapped Deferred. + */ +goog.messaging.DeferredChannel.prototype.cancel = function() { + this.deferred_.cancel(); +}; + + +/** @inheritDoc */ +goog.messaging.DeferredChannel.prototype.connect = function(opt_connectCb) { + if (opt_connectCb) { + opt_connectCb(); + } +}; + + +/** @inheritDoc */ +goog.messaging.DeferredChannel.prototype.isConnected = function() { + return true; +}; + + +/** @inheritDoc */ +goog.messaging.DeferredChannel.prototype.registerService = function( + serviceName, callback, opt_objectPayload) { + this.deferred_.addCallback(function(resolved) { + resolved.registerService(serviceName, callback, opt_objectPayload); + }); +}; + + +/** @inheritDoc */ +goog.messaging.DeferredChannel.prototype.registerDefaultService = + function(callback) { + this.deferred_.addCallback(function(resolved) { + resolved.registerDefaultService(callback); + }); +}; + + +/** @inheritDoc */ +goog.messaging.DeferredChannel.prototype.send = function(serviceName, payload) { + this.deferred_.addCallback(function(resolved) { + resolved.send(serviceName, payload); + }); +}; diff --git a/contrib/closure-library/goog/messaging/deferredchannel_test.html b/contrib/closure-library/goog/messaging/deferredchannel_test.html new file mode 100644 index 0000000..255b889 --- /dev/null +++ b/contrib/closure-library/goog/messaging/deferredchannel_test.html @@ -0,0 +1,114 @@ + + + + + + + Closure Unit Tests - goog.messaging.DeferredChannel + + + + + + + + + diff --git a/contrib/closure-library/goog/messaging/loggerclient.js b/contrib/closure-library/goog/messaging/loggerclient.js new file mode 100644 index 0000000..e845ef1 --- /dev/null +++ b/contrib/closure-library/goog/messaging/loggerclient.js @@ -0,0 +1,131 @@ +// Copyright 2010 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview This class sends logging messages over a message channel to a + * server on the main page that prints them using standard logging mechanisms. + * + */ + +goog.provide('goog.messaging.LoggerClient'); + +goog.require('goog.Disposable'); +goog.require('goog.debug'); +goog.require('goog.debug.LogManager'); +goog.require('goog.debug.Logger'); + + + +/** + * Creates a logger client that sends messages along a message channel for the + * remote end to log. The remote end of the channel should use a + * {goog.messaging.LoggerServer} with the same service name. + * + * @param {!goog.messaging.MessageChannel} channel The channel that on which to + * send the log messages. + * @param {string} serviceName The name of the logging service to use. + * @constructor + * @extends {goog.Disposable} + */ +goog.messaging.LoggerClient = function(channel, serviceName) { + if (goog.messaging.LoggerClient.instance_) { + return goog.messaging.LoggerClient.instance_; + } + + goog.base(this); + + /** + * The channel on which to send the log messages. + * @type {!goog.messaging.MessageChannel} + * @private + */ + this.channel_ = channel; + + /** + * The name of the logging service to use. + * @type {string} + * @private + */ + this.serviceName_ = serviceName; + + /** + * The bound handler function for handling log messages. This is kept in a + * variable so that it can be deregistered when the logger client is disposed. + * @type {Function} + * @private + */ + this.publishHandler_ = goog.bind(this.sendLog_, this); + goog.debug.LogManager.getRoot().addHandler(this.publishHandler_); + + goog.messaging.LoggerClient.instance_ = this; +}; +goog.inherits(goog.messaging.LoggerClient, goog.Disposable); + + +/** + * The singleton instance, if any. + * @type {goog.messaging.LoggerClient} + * @private + */ +goog.messaging.LoggerClient.instance_ = null; + + +/** + * Sends a log message through the channel. + * @param {!goog.debug.LogRecord} logRecord The log message. + * @private + */ +goog.messaging.LoggerClient.prototype.sendLog_ = function(logRecord) { + var name = logRecord.getLoggerName(); + var level = logRecord.getLevel(); + var msg = logRecord.getMessage(); + var originalException = logRecord.getException(); + + var exception; + if (originalException) { + var normalizedException = + goog.debug.normalizeErrorObject(originalException); + exception = { + 'name': normalizedException.name, + 'message': normalizedException.message, + 'lineNumber': normalizedException.lineNumber, + 'fileName': normalizedException.fileName, + // Normalized exceptions without a stack have 'stack' set to 'Not + // available', so we check for the existance of 'stack' on the original + // exception instead. + 'stack': originalException.stack || + goog.debug.getStacktrace(goog.debug.Logger.prototype.log) + }; + + if (goog.isObject(originalException)) { + // Add messageN to the exception in case it was added using + // goog.debug.enhanceError. + for (var i = 0; 'message' + i in originalException; i++) { + exception['message' + i] = String(originalException['message' + i]); + } + } + } + this.channel_.send(this.serviceName_, { + 'name': name, 'level': level.value, 'message': msg, 'exception': exception + }); +}; + + +/** @inheritDoc */ +goog.messaging.LoggerClient.prototype.disposeInternal = function() { + goog.base(this, 'disposeInternal'); + goog.debug.LogManager.getRoot().removeHandler(this.publishHandler_); + delete this.channel_; + goog.messaging.LoggerClient.instance_ = null; +}; diff --git a/contrib/closure-library/goog/messaging/loggerclient_test.html b/contrib/closure-library/goog/messaging/loggerclient_test.html new file mode 100644 index 0000000..ab7797d --- /dev/null +++ b/contrib/closure-library/goog/messaging/loggerclient_test.html @@ -0,0 +1,102 @@ + + + + + +Closure Unit Tests - goog.messaging.LoggerClient + + + + + + + diff --git a/contrib/closure-library/goog/messaging/loggerserver.js b/contrib/closure-library/goog/messaging/loggerserver.js new file mode 100644 index 0000000..24b89ab --- /dev/null +++ b/contrib/closure-library/goog/messaging/loggerserver.js @@ -0,0 +1,94 @@ +// Copyright 2010 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview This class listens on a message channel for logger commands and + * logs them on the local page. This is useful when dealing with message + * channels to contexts that don't have access to their own logging facilities. + * + */ + +goog.provide('goog.messaging.LoggerServer'); + +goog.require('goog.Disposable'); +goog.require('goog.debug.Logger'); + + + +/** + * Creates a logger server that logs messages on behalf of the remote end of a + * message channel. The remote end of the channel should use a + * {goog.messaging.LoggerClient} with the same service name. + * + * @param {!goog.messaging.MessageChannel} channel The channel that is sending + * the log messages. + * @param {string} serviceName The name of the logging service to listen for. + * @param {string=} opt_channelName The name of this channel. Used to help + * distinguish this client's messages. + * @constructor + * @extends {goog.Disposable} + */ +goog.messaging.LoggerServer = function(channel, serviceName, opt_channelName) { + goog.base(this); + + /** + * The channel that is sending the log messages. + * @type {!goog.messaging.MessageChannel} + * @private + */ + this.channel_ = channel; + + /** + * The name of the logging service to listen for. + * @type {string} + * @private + */ + this.serviceName_ = serviceName; + + /** + * The name of the channel. + * @type {string} + * @private + */ + this.channelName_ = opt_channelName || 'remote logger'; + + this.channel_.registerService( + this.serviceName_, goog.bind(this.log_, this), true /* opt_json */); +}; +goog.inherits(goog.messaging.LoggerServer, goog.Disposable); + + +/** + * Handles logging messages from the client. + * @param {!{level: number, message: string, name: string, + * exception: Object}} args + * The logging information from the client. + * @private + */ +goog.messaging.LoggerServer.prototype.log_ = function(args) { + var level = goog.debug.Logger.Level.getPredefinedLevelByValue(args['level']); + if (level) { + var msg = '[' + this.channelName_ + '] ' + args['message']; + goog.debug.Logger.getLogger(args['name']) + .log(level, msg, args['exception']); + } +}; + + +/** @inheritDoc */ +goog.messaging.LoggerServer.prototype.disposeInternal = function() { + goog.base(this, 'disposeInternal'); + this.channel_.registerService(this.serviceName_, goog.nullFunction, true); + delete this.channel_; +}; diff --git a/contrib/closure-library/goog/messaging/loggerserver_test.html b/contrib/closure-library/goog/messaging/loggerserver_test.html new file mode 100644 index 0000000..5123f8e --- /dev/null +++ b/contrib/closure-library/goog/messaging/loggerserver_test.html @@ -0,0 +1,101 @@ + + + + + +Closure Unit Tests - goog.messaging.LoggerServer + + + + + + + diff --git a/contrib/closure-library/goog/messaging/messagechannel.js b/contrib/closure-library/goog/messaging/messagechannel.js index 0113a83..8f99471 100644 --- a/contrib/closure-library/goog/messaging/messagechannel.js +++ b/contrib/closure-library/goog/messaging/messagechannel.js @@ -15,6 +15,19 @@ /** * @fileoverview An interface for asynchronous message-passing channels. * + * This interface is useful for writing code in a message-passing style that's + * independent of the underlying communication medium. It's also useful for + * adding decorators that wrap message channels and add extra functionality on + * top. For example, {@link goog.messaging.BufferedChannel} enqueues messages + * until communication is established, while {@link goog.messaging.MultiChannel} + * splits a single underlying channel into multiple virtual ones. + * + * Decorators should be passed their underlying channel(s) in the constructor, + * and should assume that those channels are already connected. Decorators are + * responsible for disposing of the channels they wrap when the decorators + * themselves are disposed. Decorators should also follow the APIs of the + * individual methods listed below. + * */ @@ -32,6 +45,11 @@ goog.messaging.MessageChannel = function() {}; * Initiates the channel connection. When this method is called, all the * information needed to connect the channel has to be available. * + * Implementers should only require this method to be called if the channel + * needs to be configured in some way between when it's created and when it + * becomes active. Otherwise, the channel should be immediately active and this + * method should do nothing but immediately call opt_connectCb. + * * @param {Function=} opt_connectCb Called when the channel has been connected * and is ready to use. */ @@ -39,6 +57,12 @@ goog.messaging.MessageChannel.prototype.connect = function(opt_connectCb) {}; /** + * Gets whether the channel is connected. + * + * If {@link #connect} is not required for this class, this should always return + * true. Otherwise, this should return true by the time the callback passed to + * {@link #connect} has been called and always after that. + * * @return {boolean} Whether the channel is connected. */ goog.messaging.MessageChannel.prototype.isConnected = function() {}; @@ -47,24 +71,29 @@ goog.messaging.MessageChannel.prototype.isConnected = function() {}; /** * Registers a service to be called when a message is received. * + * Implementers shouldn't impose any restrictions on the service names that may + * be registered. If some services are needed as control codes, + * {@link goog.messaging.MultiMessageChannel} can be used to safely split the + * channel into "public" and "control" virtual channels. + * * @param {string} serviceName The name of the service. - * @param {function((string|Object))} callback The callback to process the - * incoming messages. Passed the payload. If opt_jsonEncoded is set, the + * @param {function((string|!Object))} callback The callback to process the + * incoming messages. Passed the payload. If opt_objectPayload is set, the * payload is decoded and passed as an object. - * @param {boolean=} opt_jsonEncoded If true, incoming messages for this service - * are expected to contain a JSON-encoded object and will be deserialized - * automatically. It's the responsibility of implementors of this class to - * perform the deserialization. + * @param {boolean=} opt_objectPayload If true, incoming messages for this + * service are expected to contain an object, and will be deserialized from + * a string automatically if necessary. It's the responsibility of + * implementors of this class to perform the deserialization. */ goog.messaging.MessageChannel.prototype.registerService = - function(serviceName, callback, opt_jsonEncoded) {}; + function(serviceName, callback, opt_objectPayload) {}; /** * Registers a service to be called when a message is received that doesn't * match any other services. * - * @param {function(string, (string|Object))} callback The callback to process + * @param {function(string, (string|!Object))} callback The callback to process * the incoming messages. Passed the service name and the payload. Since * some channels can pass objects natively, the payload may be either an * object or a string. @@ -78,9 +107,10 @@ goog.messaging.MessageChannel.prototype.registerDefaultService = * * @param {string} serviceName The name of the service this message should be * delivered to. - * @param {string|Object} payload The value of the message. If this is an - * Object, it is serialized to JSON before sending. It's the responsibility - * of implementors of this class to perform the serialization. + * @param {string|!Object} payload The value of the message. If this is an + * Object, it is serialized to a string before sending if necessary. It's + * the responsibility of implementors of this class to perform the + * serialization. */ goog.messaging.MessageChannel.prototype.send = function(serviceName, payload) {}; diff --git a/contrib/closure-library/goog/messaging/messaging_test.html b/contrib/closure-library/goog/messaging/messaging_test.html new file mode 100644 index 0000000..20af8c4 --- /dev/null +++ b/contrib/closure-library/goog/messaging/messaging_test.html @@ -0,0 +1,42 @@ + + + + + + + Closure Unit Tests - goog.messaging + + + + + + + + diff --git a/contrib/closure-library/goog/messaging/multichannel.js b/contrib/closure-library/goog/messaging/multichannel.js new file mode 100644 index 0000000..faf5710 --- /dev/null +++ b/contrib/closure-library/goog/messaging/multichannel.js @@ -0,0 +1,303 @@ +// Copyright 2010 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Definition of goog.messaging.MultiChannel, which uses a + * single underlying MessageChannel to carry several independent virtual message + * channels. + * + */ + + +goog.provide('goog.messaging.MultiChannel'); +goog.provide('goog.messaging.MultiChannel.VirtualChannel'); + +goog.require('goog.Disposable'); +goog.require('goog.debug.Logger'); +goog.require('goog.events.EventHandler'); +goog.require('goog.messaging.MessageChannel'); // interface +goog.require('goog.object'); + + + +/** + * Creates a new MultiChannel wrapping a single MessageChannel. The + * underlying channel shouldn't have any other listeners registered, but it + * should be connected. + * + * Note that the other side of the channel should also be connected to a + * MultiChannel with the same number of virtual channels. + * + * @param {goog.messaging.MessageChannel} underlyingChannel The underlying + * channel to use as transport for the virtual channels. + * @constructor + * @extends {goog.Disposable} + */ +goog.messaging.MultiChannel = function(underlyingChannel) { + goog.base(this); + + /** + * The underlying channel across which all requests are sent. + * @type {goog.messaging.MessageChannel} + * @private + */ + this.underlyingChannel_ = underlyingChannel; + + /** + * All the virtual channels that are registered for this MultiChannel. + * These are null if they've been disposed. + * @type {Object.} + * @private + */ + this.virtualChannels_ = {}; + + this.underlyingChannel_.registerDefaultService( + goog.bind(this.handleDefault_, this)); +}; +goog.inherits(goog.messaging.MultiChannel, goog.Disposable); + + +/** + * Logger object for goog.messaging.MultiChannel. + * @type {goog.debug.Logger} + * @private + */ +goog.messaging.MultiChannel.prototype.logger_ = + goog.debug.Logger.getLogger('goog.messaging.MultiChannel'); + + +/** + * Creates a new virtual channel that will communicate across the underlying + * channel. + * @param {string} name The name of the virtual channel. Must be unique for this + * MultiChannel. Cannot contain colons. + * @return {!goog.messaging.MultiChannel.VirtualChannel} The new virtual + * channel. + */ +goog.messaging.MultiChannel.prototype.createVirtualChannel = function(name) { + if (name.indexOf(':') != -1) { + throw Error( + 'Virtual channel name "' + name + '" should not contain colons'); + } + + if (name in this.virtualChannels_) { + throw Error('Virtual channel "' + name + '" was already created for ' + + 'this multichannel.'); + } + + var channel = + new goog.messaging.MultiChannel.VirtualChannel(this, name); + this.virtualChannels_[name] = channel; + return channel; +}; + + +/** + * Handles the default service for the underlying channel. This dispatches any + * unrecognized services to the appropriate virtual channel. + * + * @param {string} serviceName The name of the service being called. + * @param {string|!Object} payload The message payload. + * @private + */ +goog.messaging.MultiChannel.prototype.handleDefault_ = function( + serviceName, payload) { + var match = serviceName.match(/^([^:]*):(.*)/); + if (!match) { + this.logger_.warning('Invalid service name "' + serviceName + '": no ' + + 'virtual channel specified'); + return; + } + + var channelName = match[1]; + serviceName = match[2]; + if (!(channelName in this.virtualChannels_)) { + this.logger_.warning('Virtual channel "' + channelName + ' does not ' + + 'exist, but a message was received for it: "' + + serviceName + '"'); + return; + } + + var virtualChannel = this.virtualChannels_[channelName]; + if (!virtualChannel) { + this.logger_.warning('Virtual channel "' + channelName + ' has been ' + + 'disposed, but a message was received for it: "' + + serviceName + '"'); + return; + } + + if (!virtualChannel.defaultService_) { + this.logger_.warning('Service "' + serviceName + '" is not registered ' + + 'on virtual channel "' + channelName + '"'); + return; + } + + virtualChannel.defaultService_(serviceName, payload); +}; + + +/** + * @inheritDoc + */ +goog.messaging.MultiChannel.prototype.disposeInternal = function() { + goog.object.forEach(this.virtualChannels_, function(channel) { + goog.dispose(channel); + }); + goog.dispose(this.underlyingChannel_); + delete this.virtualChannels_; + delete this.underlyingChannel_; +}; + + + +/** + * A message channel that proxies its messages over another underlying channel. + * + * @param {goog.messaging.MultiChannel} parent The MultiChannel + * which created this channel, and which contains the underlying + * MessageChannel that's used as the transport. + * @param {string} name The name of this virtual channel. Unique among the + * virtual channels in parent. + * @constructor + * @implements {goog.messaging.MessageChannel} + * @extends {goog.Disposable} + */ +goog.messaging.MultiChannel.VirtualChannel = function(parent, name) { + goog.base(this); + + /** + * The MultiChannel containing the underlying transport channel. + * @type {goog.messaging.MultiChannel} + * @private + */ + this.parent_ = parent; + + /** + * The name of this virtual channel. + * @type {string} + * @private + */ + this.name_ = name; +}; +goog.inherits(goog.messaging.MultiChannel.VirtualChannel, + goog.Disposable); + + +/** + * The default service to run if no other services match. + * @type {?function(string, (string|!Object))} + * @private + */ +goog.messaging.MultiChannel.VirtualChannel.prototype.defaultService_; + + +/** + * Logger object for goog.messaging.MultiChannel.VirtualChannel. + * @type {goog.debug.Logger} + * @private + */ +goog.messaging.MultiChannel.VirtualChannel.prototype.logger_ = + goog.debug.Logger.getLogger( + 'goog.messaging.MultiChannel.VirtualChannel'); + + +/** + * This is a no-op, since the underlying channel is expected to already be + * initialized when it's passed in. + * + * @inheritDoc + */ +goog.messaging.MultiChannel.VirtualChannel.prototype.connect = + function(opt_connectCb) { + if (opt_connectCb) { + opt_connectCb(); + } +}; + + +/** + * This always returns true, since the underlying channel is expected to already + * be initialized when it's passed in. + * + * @inheritDoc + */ +goog.messaging.MultiChannel.VirtualChannel.prototype.isConnected = + function() { + return true; +}; + + +/** + * @inheritDoc + */ +goog.messaging.MultiChannel.VirtualChannel.prototype.registerService = + function(serviceName, callback, opt_objectPayload) { + this.parent_.underlyingChannel_.registerService( + this.name_ + ':' + serviceName, + goog.bind(this.doCallback_, this, callback), + opt_objectPayload); +}; + + +/** + * @inheritDoc + */ +goog.messaging.MultiChannel.VirtualChannel.prototype. + registerDefaultService = function(callback) { + this.defaultService_ = goog.bind(this.doCallback_, this, callback); +}; + + +/** + * @inheritDoc + */ +goog.messaging.MultiChannel.VirtualChannel.prototype.send = + function(serviceName, payload) { + if (this.isDisposed()) { + throw Error('#send called for disposed VirtualChannel.'); + } + + this.parent_.underlyingChannel_.send(this.name_ + ':' + serviceName, + payload); +}; + + +/** + * Wraps a callback with a function that will log a warning and abort if it's + * called when this channel is disposed. + * + * @param {function()} callback The callback to wrap. + * @param {...*} var_args Other arguments, passed to the callback. + * @private + */ +goog.messaging.MultiChannel.VirtualChannel.prototype.doCallback_ = + function(callback, var_args) { + if (this.isDisposed()) { + this.logger_.warning('Virtual channel "' + this.name_ + '" received ' + + ' a message after being disposed.'); + return; + } + + callback.apply({}, Array.prototype.slice.call(arguments, 1)); +}; + + +/** + * @inheritDoc + */ +goog.messaging.MultiChannel.VirtualChannel.prototype.disposeInternal = + function() { + this.parent_.virtualChannels_[this.name_] = null; + this.parent_ = null; +}; diff --git a/contrib/closure-library/goog/messaging/multichannel_test.html b/contrib/closure-library/goog/messaging/multichannel_test.html new file mode 100644 index 0000000..448c584 --- /dev/null +++ b/contrib/closure-library/goog/messaging/multichannel_test.html @@ -0,0 +1,122 @@ + + + + + + + Closure Unit Tests - goog.messaging.MultiChannel + + + + + + + + diff --git a/contrib/closure-library/goog/messaging/portcaller.js b/contrib/closure-library/goog/messaging/portcaller.js new file mode 100644 index 0000000..706f217 --- /dev/null +++ b/contrib/closure-library/goog/messaging/portcaller.js @@ -0,0 +1,150 @@ +// Copyright 2011 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview The leaf node of a {@link goog.messaging.PortNetwork}. Callers + * connect to the operator, and request connections with other contexts from it. + * + */ + +goog.provide('goog.messaging.PortCaller'); + +goog.require('goog.Disposable'); +goog.require('goog.async.Deferred'); +goog.require('goog.messaging.DeferredChannel'); +goog.require('goog.messaging.PortChannel'); +goog.require('goog.messaging.PortNetwork'); // interface +goog.require('goog.object'); + + + +/** + * The leaf node of a network. + * + * @param {!goog.messaging.MessageChannel} operatorPort The channel for + * communicating with the operator. The other side of this channel should be + * passed to {@link goog.messaging.PortOperator#addPort}. Must be either a + * {@link goog.messaging.PortChannel} or a decorator wrapping a PortChannel; + * in particular, it must be able to send and receive {@link MessagePort}s. + * @constructor + * @extends {goog.Disposable} + * @implements {goog.messaging.PortNetwork} + */ +goog.messaging.PortCaller = function(operatorPort) { + goog.base(this); + + /** + * The channel to the {@link goog.messaging.PortOperator} for this network. + * + * @type {!goog.messaging.MessageChannel} + * @private + */ + this.operatorPort_ = operatorPort; + + /** + * The collection of channels for communicating with other contexts in the + * network. Each value can contain a {@link goog.aync.Deferred} and/or a + * {@link goog.messaging.MessageChannel}. + * + * If the value contains a Deferred, then the channel is a + * {@link goog.messaging.DeferredChannel} wrapping that Deferred. The Deferred + * will be resolved with a {@link goog.messaging.PortChannel} once we receive + * the appropriate port from the operator. This is the situation when this + * caller requests a connection to another context; the DeferredChannel is + * used to queue up messages until we receive the port from the operator. + * + * If the value does not contain a Deferred, then the channel is simply a + * {@link goog.messaging.PortChannel} communicating with the given context. + * This is the situation when this context received a port for the other + * context before it was requested. + * + * If a value exists for a given key, it must contain a channel, but it + * doesn't necessarily contain a Deferred. + * + * @type {!Object.<{deferred: goog.async.Deferred, + * channel: !goog.messaging.MessageChannel}>} + * @private + */ + this.connections_ = {}; + + this.operatorPort_.registerService( + goog.messaging.PortNetwork.GRANT_CONNECTION_SERVICE, + goog.bind(this.connectionGranted_, this), + true /* opt_json */); +}; +goog.inherits(goog.messaging.PortCaller, goog.Disposable); + + +/** @inheritDoc */ +goog.messaging.PortCaller.prototype.dial = function(name) { + if (name in this.connections_) { + return this.connections_[name].channel; + } + + this.operatorPort_.send( + goog.messaging.PortNetwork.REQUEST_CONNECTION_SERVICE, name); + var deferred = new goog.async.Deferred(); + var channel = new goog.messaging.DeferredChannel(deferred); + this.connections_[name] = {deferred: deferred, channel: channel}; + return channel; +}; + + +/** + * Registers a connection to another context in the network. This is called when + * the operator sends us one end of a {@link MessageChannel}, either because + * this caller requested a connection with another context, or because that + * context requested a connection with this caller. + * + * It's possible that the remote context and this one request each other roughly + * concurrently. The operator doesn't keep track of which contexts have been + * connected, so it will create two separate {@link MessageChannel}s in this + * case. However, the first channel created will reach both contexts first, so + * we simply ignore all connections with a given context after the first. + * + * @param {{name: string, port: MessagePort}} args The name of the context + * being connected and the port connecting the context. + * @private + */ +goog.messaging.PortCaller.prototype.connectionGranted_ = function(args) { + var port = args['port']; + var entry = this.connections_[args['name']]; + if (entry && (!entry.deferred || entry.deferred.hasFired())) { + // If two PortCallers request one another at the same time, the operator may + // send out a channel for connecting them multiple times. Since both callers + // will receive the first channel's ports first, we can safely ignore and + // close any future ports. + port.close(); + } else if (!args['success']) { + throw Error(args['message']); + } else { + port.start(); + var channel = new goog.messaging.PortChannel(port); + if (entry) { + entry.deferred.callback(channel); + } else { + this.connections_[args['name']] = {channel: channel, deferred: null}; + } + } +}; + + +/** @inheritDoc */ +goog.messaging.PortCaller.prototype.disposeInternal = function() { + goog.dispose(this.operatorPort_); + goog.object.forEach(this.connections_, goog.dispose); + delete this.operatorPort_; + delete this.connections_; + goog.base(this, 'disposeInternal'); +}; diff --git a/contrib/closure-library/goog/messaging/portcaller_test.html b/contrib/closure-library/goog/messaging/portcaller_test.html new file mode 100644 index 0000000..ec22c9c --- /dev/null +++ b/contrib/closure-library/goog/messaging/portcaller_test.html @@ -0,0 +1,66 @@ + + + + + + + Closure Unit Tests - goog.messaging.PortCaller + + + + + + + + + diff --git a/contrib/closure-library/goog/messaging/portchannel.js b/contrib/closure-library/goog/messaging/portchannel.js new file mode 100644 index 0000000..923092c --- /dev/null +++ b/contrib/closure-library/goog/messaging/portchannel.js @@ -0,0 +1,395 @@ +// Copyright 2010 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview A class that wraps several types of HTML5 message-passing + * entities ({@link MessagePort}s, {@link WebWorker}s, and {@link Window}s), + * providing a unified interface. + * + * This is tested under Chrome, Safari, and Firefox. Since Firefox 3.6 has an + * incomplete implementation of web workers, it doesn't support sending ports + * over Window connections. IE has no web worker support at all, and so is + * unsupported by this class. + * + */ + +goog.provide('goog.messaging.PortChannel'); + +goog.require('goog.Timer'); +goog.require('goog.array'); +goog.require('goog.async.Deferred'); +goog.require('goog.debug'); +goog.require('goog.debug.Logger'); +goog.require('goog.dom'); +goog.require('goog.dom.DomHelper'); +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('goog.json'); +goog.require('goog.messaging.AbstractChannel'); +goog.require('goog.messaging.DeferredChannel'); +goog.require('goog.object'); +goog.require('goog.string'); + + + +/** + * A wrapper for several types of HTML5 message-passing entities + * ({@link MessagePort}s and {@link WebWorker}s). This class implements the + * {@link goog.messaging.MessageChannel} interface. + * + * This class can be used in conjunction with other communication on the port. + * It sets {@link goog.messaging.PortChannel.FLAG} to true on all messages it + * sends. + * + * @param {!MessagePort|!WebWorker} underlyingPort The message-passing + * entity to wrap. If this is a {@link MessagePort}, it should be started. + * The remote end should also be wrapped in a PortChannel. This will be + * disposed along with the PortChannel; this means terminating it if it's a + * worker or removing it from the DOM if it's an iframe. + * @constructor + * @extends {goog.messaging.AbstractChannel} + */ +goog.messaging.PortChannel = function(underlyingPort) { + goog.base(this); + + /** + * The wrapped message-passing entity. + * @type {!MessagePort|!WebWorker} + * @private + */ + this.port_ = underlyingPort; + + /** + * The key for the event listener. + * @type {?number} + * @private + */ + this.listenerKey_ = goog.events.listen( + this.port_, goog.events.EventType.MESSAGE, this.deliver_, false, this); +}; +goog.inherits(goog.messaging.PortChannel, goog.messaging.AbstractChannel); + + +/** + * Create a PortChannel that communicates with a window embedded in the current + * page (e.g. an iframe contentWindow). The code within the window should call + * {@link forGlobalWindow} to establish the connection. + * + * It's possible to use this channel in conjunction with other messages to the + * embedded window. However, only one PortChannel should be used for a given + * window at a time. + * + * @param {!Window} window The window object to communicate with. + * @param {string} peerOrigin The expected origin of the window. See + * http://dev.w3.org/html5/postmsg/#dom-window-postmessage. + * @param {goog.Timer=} opt_timer The timer that regulates how often the initial + * connection message is attempted. This will be automatically disposed once + * the connection is established, or when the connection is cancelled. + * @return {!goog.messaging.DeferredChannel} The PortChannel. Although this is + * not actually an instance of the PortChannel class, it will behave like + * one in that MessagePorts may be sent across it. The DeferredChannel may + * be cancelled before a connection is established in order to abort the + * attempt to make a connection. + */ +goog.messaging.PortChannel.forEmbeddedWindow = function( + window, peerOrigin, opt_timer) { + var timer = opt_timer || new goog.Timer(50); + var deferred = new goog.async.Deferred(goog.partial(goog.dispose, timer)); + + timer.start(); + // Every tick, attempt to set up a connection by sending in one end of an + // HTML5 MessageChannel. If the inner window posts a response along a channel, + // then we'll use that channel to create the PortChannel. + // + // As per http://dev.w3.org/html5/postmsg/#ports-and-garbage-collection, any + // ports that are not ultimately used to set up the channel will be garbage + // collected (since there are no references in this context, and the remote + // context hasn't seen them). + goog.events.listen(timer, goog.Timer.TICK, function() { + var channel = new MessageChannel(); + var gotMessage = function(e) { + channel.port1.removeEventListener( + goog.events.EventType.MESSAGE, gotMessage, true); + // If the connection has been cancelled, don't create the channel. + if (!timer.isDisposed()) { + deferred.callback(new goog.messaging.PortChannel(channel.port1)); + } + }; + channel.port1.start(); + // Don't use goog.events because we don't want any lingering references to + // the ports to prevent them from getting GCed. Only modern browsers support + // these APIs anyway, so we don't need to worry about event API + // compatibility. + channel.port1.addEventListener( + goog.events.EventType.MESSAGE, gotMessage, true); + + var msg = {}; + msg[goog.messaging.PortChannel.FLAG] = true; + window.postMessage(msg, [channel.port2], peerOrigin); + }); + + return new goog.messaging.DeferredChannel(deferred); +}; + + +/** + * Create a PortChannel that communicates with the document in which this window + * is embedded (e.g. within an iframe). The enclosing document should call + * {@link forEmbeddedWindow} to establish the connection. + * + * It's possible to use this channel in conjunction with other messages posted + * to the global window. However, only one PortChannel should be used for the + * global window at a time. + * + * @param {string} peerOrigin The expected origin of the enclosing document. See + * http://dev.w3.org/html5/postmsg/#dom-window-postmessage. + * @return {!goog.messaging.MessageChannel} The PortChannel. Although this may + * not actually be an instance of the PortChannel class, it will behave like + * one in that MessagePorts may be sent across it. + */ +goog.messaging.PortChannel.forGlobalWindow = function(peerOrigin) { + var deferred = new goog.async.Deferred(); + // Wait for the external page to post a message containing the message port + // which we'll use to set up the PortChannel. Ignore all other messages. Once + // we receive the port, notify the other end and then set up the PortChannel. + var key = goog.events.listen( + window, goog.events.EventType.MESSAGE, function(e) { + var browserEvent = e.getBrowserEvent(); + var data = browserEvent.data; + if (!goog.isObject(data) || !data[goog.messaging.PortChannel.FLAG]) { + return; + } + + if (peerOrigin != '*' && peerOrigin != browserEvent.origin) { + return; + } + + var port = browserEvent.ports[0]; + // Notify the other end of the channel that we've received our port + port.postMessage({}); + + port.start(); + deferred.callback(new goog.messaging.PortChannel(port)); + goog.events.unlistenByKey(key); + }); + return new goog.messaging.DeferredChannel(deferred); +}; + + +/** + * The flag added to messages that are sent by a PortChannel, and are meant to + * be handled by one on the other side. + * @type {string} + */ +goog.messaging.PortChannel.FLAG = '--goog.messaging.PortChannel'; + + +/** + * Whether the messages sent across the channel must be JSON-serialized. This is + * required for older versions of Webkit, which can only send string messages. + * + * Although Safari and Chrome have separate implementations of message passing, + * both of them support passing objects by Webkit 533. + * + * @type {boolean} + * @private + */ +goog.messaging.PortChannel.REQUIRES_SERIALIZATION_ = goog.userAgent.WEBKIT && + goog.string.compareVersions(goog.userAgent.VERSION, '533') < 0; + + +/** + * Logger for this class. + * @type {goog.debug.Logger} + * @protected + */ +goog.messaging.PortChannel.prototype.logger = + goog.debug.Logger.getLogger('goog.messaging.PortChannel'); + + +/** + * Sends a message over the channel. + * + * As an addition to the basic MessageChannel send API, PortChannels can send + * objects that contain MessagePorts. Note that only plain Objects and Arrays, + * not their subclasses, can contain MessagePorts. + * + * As per {@link http://www.w3.org/TR/html5/comms.html#clone-a-port}, once a + * port is copied to be sent across a channel, the original port will cease + * being able to send or receive messages. + * + * @override + * @param {string} serviceName The name of the service this message should be + * delivered to. + * @param {string|!Object|!MessagePort} payload The value of the message. May + * contain MessagePorts or be a MessagePort. + */ +goog.messaging.PortChannel.prototype.send = function(serviceName, payload) { + var ports = []; + payload = this.extractPorts_(ports, payload); + var message = {'serviceName': serviceName, 'payload': payload}; + message[goog.messaging.PortChannel.FLAG] = true; + + if (goog.messaging.PortChannel.REQUIRES_SERIALIZATION_) { + message = goog.json.serialize(message); + } + + this.port_.postMessage(message, ports); +}; + + +/** + * Delivers a message to the appropriate service handler. If this message isn't + * a GearsWorkerChannel message, it's ignored and passed on to other handlers. + * + * @param {goog.events.Event} e The event. + * @private + */ +goog.messaging.PortChannel.prototype.deliver_ = function(e) { + var browserEvent = e.getBrowserEvent(); + var data = browserEvent.data; + + if (goog.messaging.PortChannel.REQUIRES_SERIALIZATION_) { + try { + data = goog.json.parse(data); + } catch (error) { + // Ignore any non-JSON messages. + return; + } + } + + if (!goog.isObject(data) || !data[goog.messaging.PortChannel.FLAG]) { + return; + } + + if (this.validateMessage_(data)) { + var serviceName = data['serviceName']; + var payload = data['payload']; + var service = this.getService(serviceName, payload); + if (!service) { + return; + } + + payload = this.decodePayload( + serviceName, + this.injectPorts_(browserEvent.ports || [], payload), + service.objectPayload); + if (goog.isDefAndNotNull(payload)) { + service.callback(payload); + } + } +}; + + +/** + * Checks whether the message is invalid in some way. + * + * @param {Object} data The contents of the message. + * @return {boolean} True if the message is valid, false otherwise. + * @private + */ +goog.messaging.PortChannel.prototype.validateMessage_ = function(data) { + if (!('serviceName' in data)) { + this.logger.warning('Message object doesn\'t contain service name: ' + + goog.debug.deepExpose(data)); + return false; + } + + if (!('payload' in data)) { + this.logger.warning('Message object doesn\'t contain payload: ' + + goog.debug.deepExpose(data)); + return false; + } + + return true; +}; + + +/** + * Extracts all MessagePort objects from a message to be sent into an array. + * + * The message ports are replaced by placeholder objects that will be replaced + * with the ports again on the other side of the channel. + * + * @param {Array.} ports The array that will contain ports + * extracted from the message. Will be destructively modified. Should be + * empty initially. + * @param {string|!Object} message The message from which ports will be + * extracted. + * @return {string|!Object} The message with ports extracted. + * @private + */ +goog.messaging.PortChannel.prototype.extractPorts_ = function(ports, message) { + // Can't use instanceof here because MessagePort is undefined in workers + if (message && + Object.prototype.toString.call(/** @type {!Object} */ (message)) == + '[object MessagePort]') { + ports.push(message); + return {'_port': {'type': 'real', 'index': ports.length - 1}}; + } else if (goog.isArray(message)) { + return goog.array.map(message, goog.bind(this.extractPorts_, this, ports)); + // We want to compare the exact constructor here because we only want to + // recurse into object literals, not native objects like Date. + } else if (message && message.constructor == Object) { + return goog.object.map(/** @type {Object} */ (message), function(val, key) { + val = this.extractPorts_(ports, val); + return key == '_port' ? {'type': 'escaped', 'val': val} : val; + }, this); + } else { + return message; + } +}; + + +/** + * Injects MessagePorts back into a message received from across the channel. + * + * @param {Array.} ports The array of ports to be injected into the + * message. + * @param {string|!Object} message The message into which the ports will be + * injected. + * @return {string|!Object} The message with ports injected. + * @private + */ +goog.messaging.PortChannel.prototype.injectPorts_ = function(ports, message) { + if (goog.isArray(message)) { + return goog.array.map(message, goog.bind(this.injectPorts_, this, ports)); + } else if (message && message.constructor == Object) { + message = /** @type {!Object} */ (message); + if (message['_port'] && message['_port']['type'] == 'real') { + return /** @type {!MessagePort} */ (ports[message['_port']['index']]); + } + return goog.object.map(message, function(val, key) { + return this.injectPorts_(ports, key == '_port' ? val['val'] : val); + }, this); + } else { + return message; + } +}; + + +/** @inheritDoc */ +goog.messaging.PortChannel.prototype.disposeInternal = function() { + goog.events.unlistenByKey(this.listenerKey_); + // Can't use instanceof here because MessagePort is undefined in workers and + // in Firefox + if (Object.prototype.toString.call(this.port_) == '[object MessagePort]') { + this.port_.close(); + // Worker is undefined in workers as well as of Chrome 9 + } else if (Object.prototype.toString.call(this.port_) == '[object Worker]') { + this.port_.terminate(); + } + delete this.port_; + goog.base(this, 'disposeInternal'); +}; diff --git a/contrib/closure-library/goog/messaging/portchannel_test.html b/contrib/closure-library/goog/messaging/portchannel_test.html new file mode 100644 index 0000000..6c8b862 --- /dev/null +++ b/contrib/closure-library/goog/messaging/portchannel_test.html @@ -0,0 +1,376 @@ + + + + + + + Closure Unit Tests - goog.messaging.PortChannel + + + + + + +
    + + + diff --git a/contrib/closure-library/goog/messaging/portnetwork.js b/contrib/closure-library/goog/messaging/portnetwork.js new file mode 100644 index 0000000..758d699 --- /dev/null +++ b/contrib/closure-library/goog/messaging/portnetwork.js @@ -0,0 +1,78 @@ +// Copyright 2011 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview An interface for classes that connect a collection of HTML5 + * message-passing entities ({@link MessagePort}s, {@link Worker}s, and + * {@link Window}s) and allow them to seamlessly communicate with one another. + * + * Conceptually, a PortNetwork is a collection of JS contexts, such as pages (in + * or outside of iframes) or web workers. Each context has a unique name, and + * each one can communicate with any of the others in the same network. This + * communication takes place through a {@link goog.messaging.PortChannel} that + * is retrieved via {#link goog.messaging.PortNetwork#dial}. + * + * One context (usually the main page) has a + * {@link goog.messaging.PortOperator}, which is in charge of connecting each + * context to each other context. All other contexts have + * {@link goog.messaging.PortCaller}s which connect to the operator. + * + */ + +goog.provide('goog.messaging.PortNetwork'); + + + +/** + * @interface + */ +goog.messaging.PortNetwork = function() {}; + + +/** + * Returns a message channel that communicates with the named context. If no + * such port exists, an error will either be thrown immediately or after a round + * trip with the operator, depending on whether this pool is the operator or a + * caller. + * + * If context A calls dial('B') and context B calls dial('A'), the two + * ports returned will be connected to one another. + * + * @param {string} name The name of the context to get. + * @return {goog.messaging.MessageChannel} The channel communicating with the + * given context. This is either a {@link goog.messaging.PortChannel} or a + * decorator around a PortChannel, so it's safe to send {@link MessagePorts} + * across it. This will be disposed along with the PortNetwork. + */ +goog.messaging.PortNetwork.prototype.dial = function(name) {}; + + +/** + * The name of the service exported by the operator for creating a connection + * between two callers. + * + * @type {string} + * @const + */ +goog.messaging.PortNetwork.REQUEST_CONNECTION_SERVICE = 'requestConnection'; + + +/** + * The name of the service exported by the callers for adding a connection to + * another context. + * + * @type {string} + * @const + */ +goog.messaging.PortNetwork.GRANT_CONNECTION_SERVICE = 'grantConnection'; diff --git a/contrib/closure-library/goog/messaging/portnetwork_test.html b/contrib/closure-library/goog/messaging/portnetwork_test.html new file mode 100644 index 0000000..230a255 --- /dev/null +++ b/contrib/closure-library/goog/messaging/portnetwork_test.html @@ -0,0 +1,65 @@ + + + + + + + Closure Unit Tests - goog.messaging.PortNetwork + + + + + + + + + + diff --git a/contrib/closure-library/goog/messaging/portoperator.js b/contrib/closure-library/goog/messaging/portoperator.js new file mode 100644 index 0000000..a145c36 --- /dev/null +++ b/contrib/closure-library/goog/messaging/portoperator.js @@ -0,0 +1,196 @@ +// Copyright 2011 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview The central node of a {@link goog.messaging.PortNetwork}. The + * operator is responsible for providing the two-way communication channels (via + * {@link MessageChannel}s) between each pair of nodes in the network that need + * to communicate with one another. Each network should have one and only one + * operator. + * + */ + +goog.provide('goog.messaging.PortOperator'); + +goog.require('goog.Disposable'); +goog.require('goog.asserts'); +goog.require('goog.debug.Logger'); +goog.require('goog.messaging.PortChannel'); +goog.require('goog.messaging.PortNetwork'); // interface +goog.require('goog.object'); + + + +/** + * The central node of a PortNetwork. + * + * @param {string} name The name of this node. + * @constructor + * @extends {goog.Disposable} + * @implements {goog.messaging.PortNetwork} + */ +goog.messaging.PortOperator = function(name) { + goog.base(this); + + /** + * The collection of channels for communicating with other contexts in the + * network. These are the channels that are returned to the user, as opposed + * to the channels used for internal network communication. This is lazily + * populated as the user requests communication with other contexts, or other + * contexts request communication with the operator. + * + * @type {!Object.} + * @private + */ + this.connections_ = {}; + + /** + * The collection of channels for internal network communication with other + * contexts. This is not lazily populated, and always contains entries for + * each member of the network. + * + * @type {!Object.} + * @private + */ + this.switchboard_ = {}; + + /** + * The name of the operator context. + * + * @type {string} + * @private + */ + this.name_ = name; +}; +goog.inherits(goog.messaging.PortOperator, goog.Disposable); + + +/** + * The logger for PortOperator. + * @type {goog.debug.Logger} + * @private + */ +goog.messaging.PortOperator.prototype.logger_ = + goog.debug.Logger.getLogger('goog.messaging.PortOperator'); + + +/** @inheritDoc */ +goog.messaging.PortOperator.prototype.dial = function(name) { + this.connectSelfToPort_(name); + return this.connections_[name]; +}; + + +/** + * Adds a caller to the network with the given name. This port should have no + * services registered on it. It will be disposed along with the PortOperator. + * + * @param {string} name The name of the port to add. + * @param {!goog.messaging.MessageChannel} port The port to add. Must be either + * a {@link goog.messaging.PortChannel} or a decorator wrapping a + * PortChannel; in particular, it must be able to send and receive + * {@link MessagePort}s. + */ +goog.messaging.PortOperator.prototype.addPort = function(name, port) { + this.switchboard_[name] = port; + port.registerService(goog.messaging.PortNetwork.REQUEST_CONNECTION_SERVICE, + goog.bind(this.requestConnection_, this, name)); +}; + + +/** + * Connects two contexts by creating a {@link MessageChannel} and sending one + * end to one context and the other end to the other. Called when we receive a + * request from a caller to connect it to another context (including potentially + * the operator). + * + * @param {string} sourceName The name of the context requesting the connection. + * @param {string} requestedName The name of the context to which the connection + * is requested. + * @private + */ +goog.messaging.PortOperator.prototype.requestConnection_ = function( + sourceName, requestedName) { + if (requestedName == this.name_) { + this.connectSelfToPort_(sourceName); + return; + } + + var sourceChannel = this.switchboard_[sourceName]; + var requestedChannel = this.switchboard_[requestedName]; + + goog.asserts.assert(goog.isDefAndNotNull(sourceChannel)); + if (!requestedChannel) { + var err = 'Port "' + sourceName + '" requested a connection to port "' + + requestedName + '", which doesn\'t exist'; + this.logger_.warning(err); + sourceChannel.send(goog.messaging.PortNetwork.GRANT_CONNECTION_SERVICE, + {'success': false, 'message': err}); + return; + } + + var messageChannel = new MessageChannel(); + sourceChannel.send(goog.messaging.PortNetwork.GRANT_CONNECTION_SERVICE, { + 'success': true, + 'name': requestedName, + 'port': messageChannel.port1 + }); + requestedChannel.send(goog.messaging.PortNetwork.GRANT_CONNECTION_SERVICE, { + 'success': true, + 'name': sourceName, + 'port': messageChannel.port2 + }); +}; + + +/** + * Connects together the operator and a caller by creating a + * {@link MessageChannel} and sending one end to the remote context. + * + * @param {string} contextName The name of the context to which to connect the + * operator. + * @private + */ +goog.messaging.PortOperator.prototype.connectSelfToPort_ = function( + contextName) { + if (contextName in this.connections_) { + // We've already established a connection with this port. + return; + } + + var contextChannel = this.switchboard_[contextName]; + if (!contextChannel) { + throw Error('Port "' + contextName + '" doesn\'t exist'); + } + + var messageChannel = new MessageChannel(); + contextChannel.send(goog.messaging.PortNetwork.GRANT_CONNECTION_SERVICE, { + 'success': true, + 'name': this.name_, + 'port': messageChannel.port1 + }); + messageChannel.port2.start(); + this.connections_[contextName] = + new goog.messaging.PortChannel(messageChannel.port2); +}; + + +/** @inheritDoc */ +goog.messaging.PortOperator.prototype.disposeInternal = function() { + goog.object.forEach(this.switchboard_, goog.dispose); + goog.object.forEach(this.connections_, goog.dispose); + delete this.switchboard_; + delete this.connections_; + goog.base(this, 'disposeInternal'); +}; diff --git a/contrib/closure-library/goog/messaging/portoperator_test.html b/contrib/closure-library/goog/messaging/portoperator_test.html new file mode 100644 index 0000000..95ef88d --- /dev/null +++ b/contrib/closure-library/goog/messaging/portoperator_test.html @@ -0,0 +1,113 @@ + + + + + + + Closure Unit Tests - goog.messaging.PortOperator + + + + + + + + + diff --git a/contrib/closure-library/goog/messaging/testdata/portchannel_inner.html b/contrib/closure-library/goog/messaging/testdata/portchannel_inner.html new file mode 100644 index 0000000..015757a --- /dev/null +++ b/contrib/closure-library/goog/messaging/testdata/portchannel_inner.html @@ -0,0 +1,29 @@ + + + + + +PortChannel test inner document + + + + + + + + diff --git a/contrib/closure-library/goog/messaging/testdata/portchannel_worker.js b/contrib/closure-library/goog/messaging/testdata/portchannel_worker.js new file mode 100644 index 0000000..fc67043 --- /dev/null +++ b/contrib/closure-library/goog/messaging/testdata/portchannel_worker.js @@ -0,0 +1,38 @@ +// Copyright 2010 The Closure Library Authors. All Rights Reserved. + +// Use of this source code is governed by the Apache License, Version 2.0. +// See the COPYING file for details. + +/** + * @fileoverview A web worker for integration testing the PortChannel class. + * + * @nocompile + */ + +self.CLOSURE_BASE_PATH = '../../'; +importScripts('../../bootstrap/webworkers.js'); +importScripts('../../base.js'); +importScripts('../../../../third_party/closure/goog/deps.js'); + +// The provide is necessary to stop the jscompiler from thinking this is an +// entry point and adding it into the manifest incorrectly. +goog.provide('goog.messaging.testdata.portchannel_worker'); +goog.require('goog.messaging.PortChannel'); + +function registerPing(channel) { + channel.registerService('ping', function(msg) { + channel.send('pong', msg); + }, true); +} + +function startListening() { + var channel = new goog.messaging.PortChannel(self); + registerPing(channel); + + channel.registerService('addPort', function(port) { + port.start(); + registerPing(new goog.messaging.PortChannel(port)); + }, true); +} + +startListening(); diff --git a/contrib/closure-library/goog/messaging/testdata/portchannel_wrong_origin_inner.html b/contrib/closure-library/goog/messaging/testdata/portchannel_wrong_origin_inner.html new file mode 100644 index 0000000..62d07e2 --- /dev/null +++ b/contrib/closure-library/goog/messaging/testdata/portchannel_wrong_origin_inner.html @@ -0,0 +1,30 @@ + + + + + +PortChannel test inner document + + + + + + + + diff --git a/contrib/closure-library/goog/messaging/testdata/portnetwork_inner.html b/contrib/closure-library/goog/messaging/testdata/portnetwork_inner.html new file mode 100644 index 0000000..d7f356f --- /dev/null +++ b/contrib/closure-library/goog/messaging/testdata/portnetwork_inner.html @@ -0,0 +1,35 @@ + + + + + + + Closure Unit Tests - goog.messaging.PortNetwork iframe page + + + + + + + + + + diff --git a/contrib/closure-library/goog/messaging/testdata/portnetwork_worker1.js b/contrib/closure-library/goog/messaging/testdata/portnetwork_worker1.js new file mode 100644 index 0000000..5c8a08e --- /dev/null +++ b/contrib/closure-library/goog/messaging/testdata/portnetwork_worker1.js @@ -0,0 +1,33 @@ +// Copyright 2011 The Closure Library Authors. All Rights Reserved. + +// Use of this source code is governed by the Apache License, Version 2.0. +// See the COPYING file for details. + +/** + * @fileoverview A web worker for integration testing the PortPool class. + * + * @nocompile + */ + +self.CLOSURE_BASE_PATH = '../../'; +importScripts('../../bootstrap/webworkers.js'); +importScripts('../../base.js'); +importScripts('../../../../third_party/closure/goog/deps.js'); + +// The provide is necessary to stop the jscompiler from thinking this is an +// entry point and adding it into the manifest incorrectly. +goog.provide('goog.messaging.testdata.portnetwork_worker1'); +goog.require('goog.messaging.PortCaller'); +goog.require('goog.messaging.PortChannel'); + +function startListening() { + var caller = new goog.messaging.PortCaller( + new goog.messaging.PortChannel(self)); + + caller.dial('frame').registerService('sendToMain', function(msg) { + msg.push('worker1'); + caller.dial('main').send('result', msg); + }, true); +} + +startListening(); diff --git a/contrib/closure-library/goog/messaging/testdata/portnetwork_worker2.js b/contrib/closure-library/goog/messaging/testdata/portnetwork_worker2.js new file mode 100644 index 0000000..a88f0d2 --- /dev/null +++ b/contrib/closure-library/goog/messaging/testdata/portnetwork_worker2.js @@ -0,0 +1,33 @@ +// Copyright 2011 The Closure Library Authors. All Rights Reserved. + +// Use of this source code is governed by the Apache License, Version 2.0. +// See the COPYING file for details. + +/** + * @fileoverview A web worker for integration testing the PortPool class. + * + * @nocompile + */ + +self.CLOSURE_BASE_PATH = '../../'; +importScripts('../../bootstrap/webworkers.js'); +importScripts('../../base.js'); +importScripts('../../../../third_party/closure/goog/deps.js'); + +// The provide is necessary to stop the jscompiler from thinking this is an +// entry point and adding it into the manifest incorrectly. +goog.provide('goog.messaging.testdata.portnetwork_worker2'); +goog.require('goog.messaging.PortCaller'); +goog.require('goog.messaging.PortChannel'); + +function startListening() { + var caller = new goog.messaging.PortCaller( + new goog.messaging.PortChannel(self)); + + caller.dial('main').registerService('sendToFrame', function(msg) { + msg.push('worker2'); + caller.dial('frame').send('sendToWorker1', msg); + }, true); +} + +startListening(); diff --git a/contrib/closure-library/goog/module/abstractmoduleloader.js b/contrib/closure-library/goog/module/abstractmoduleloader.js index a8ddd6b..f685f60 100644 --- a/contrib/closure-library/goog/module/abstractmoduleloader.js +++ b/contrib/closure-library/goog/module/abstractmoduleloader.js @@ -19,12 +19,15 @@ goog.provide('goog.module.AbstractModuleLoader'); + + /** * An interface that loads JavaScript modules. * @interface */ goog.module.AbstractModuleLoader = function() {}; + /** * Loads a list of JavaScript modules. * diff --git a/contrib/closure-library/goog/module/basemodule.js b/contrib/closure-library/goog/module/basemodule.js index 2b19840..93f5822 100644 --- a/contrib/closure-library/goog/module/basemodule.js +++ b/contrib/closure-library/goog/module/basemodule.js @@ -23,6 +23,8 @@ goog.provide('goog.module.BaseModule'); goog.require('goog.Disposable'); + + /** * A basic module object that represents a module of Javascript code that can * be dynamically loaded. diff --git a/contrib/closure-library/goog/module/basemoduleloader.js b/contrib/closure-library/goog/module/basemoduleloader.js index df8ebcb..bc28589 100644 --- a/contrib/closure-library/goog/module/basemoduleloader.js +++ b/contrib/closure-library/goog/module/basemoduleloader.js @@ -24,6 +24,7 @@ goog.require('goog.debug.Logger'); goog.require('goog.module.AbstractModuleLoader'); + /** * A class that loads Javascript modules. * @constructor diff --git a/contrib/closure-library/goog/module/loader.js b/contrib/closure-library/goog/module/loader.js index 75fd6ec..6b903f4 100644 --- a/contrib/closure-library/goog/module/loader.js +++ b/contrib/closure-library/goog/module/loader.js @@ -28,6 +28,8 @@ goog.require('goog.array'); goog.require('goog.dom'); goog.require('goog.object'); + + /** * The dynamic loading functionality is defined as a class. The class * will be used as singleton. There is, however, a two step diff --git a/contrib/closure-library/goog/module/module.js b/contrib/closure-library/goog/module/module.js index 699a932..f31cfa3 100644 --- a/contrib/closure-library/goog/module/module.js +++ b/contrib/closure-library/goog/module/module.js @@ -26,6 +26,7 @@ goog.provide('goog.module'); goog.require('goog.array'); goog.require('goog.module.Loader'); + /** * Wrapper of goog.module.Loader.require() for use in modules. * See method goog.module.Loader.require() for diff --git a/contrib/closure-library/goog/module/moduleinfo.js b/contrib/closure-library/goog/module/moduleinfo.js index 79e1fa3..59f6e6b 100644 --- a/contrib/closure-library/goog/module/moduleinfo.js +++ b/contrib/closure-library/goog/module/moduleinfo.js @@ -28,6 +28,7 @@ goog.require('goog.module.ModuleLoadCallback'); // goog.require('goog.module.ModuleManager.FailureType'); + /** * A ModuleInfo object is used by the ModuleManager to hold information about a * module of js code that may or may not yet be loaded into the environment. diff --git a/contrib/closure-library/goog/module/moduleinfo_test.html b/contrib/closure-library/goog/module/moduleinfo_test.html index a78c5a3..f614de4 100644 --- a/contrib/closure-library/goog/module/moduleinfo_test.html +++ b/contrib/closure-library/goog/module/moduleinfo_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/module/modulemanager.js b/contrib/closure-library/goog/module/modulemanager.js index d9489dc..056be0d 100644 --- a/contrib/closure-library/goog/module/modulemanager.js +++ b/contrib/closure-library/goog/module/modulemanager.js @@ -31,6 +31,7 @@ goog.require('goog.module.ModuleInfo'); goog.require('goog.module.ModuleLoadCallback'); + /** * The ModuleManager keeps track of all modules in the environment. * Since modules may not have their code loaded, we must keep track of them. @@ -102,6 +103,7 @@ goog.module.ModuleManager = function() { goog.inherits(goog.module.ModuleManager, goog.Disposable); goog.addSingletonGetter(goog.module.ModuleManager); + /** * The type of callbacks that can be registered with the module manager,. * @enum {string} @@ -253,7 +255,7 @@ goog.module.ModuleManager.prototype.setAllModuleInfo = function(infoMap) { */ goog.module.ModuleManager.prototype.setAllModuleInfoString = function( opt_info) { - if (!opt_info) { + if (!goog.isString(opt_info)) { // The call to this method is generated in two steps, the argument is added // after some of the compilation passes. This means that the initial code // doesn't have any arguments and causes compiler errors. We make it @@ -436,7 +438,7 @@ goog.module.ModuleManager.prototype. d.callback(this.moduleContext_); } else { moduleInfo.registerCallback(d.callback, d); - moduleInfo.registerErrback(d.errback, d); + moduleInfo.registerErrback(function(err) { d.errback(Error(err)); }); if (!this.isModuleLoading(id)) { this.loadModuleOrEnqueue_(id); } @@ -465,6 +467,18 @@ goog.module.ModuleManager.prototype.loadModuleOrEnqueue_ = function(id) { }; +/** + * Gets the amount of delay to wait before sending a request for more modules. + * If a certain module request fails, we backoff a little bit and try again. + * @return {number} Delay, in ms. + * @private + */ +goog.module.ModuleManager.prototype.getBackOff_ = function() { + // 5 seconds after one error, 20 seconds after 2. + return Math.pow(this.consecutiveFailures_, 2) * 5000; +}; + + /** * Loads a module and any of its not-yet-loaded prerequisites. If batch mode is * enabled, the prerequisites will be loaded together with the requested module. @@ -510,11 +524,20 @@ goog.module.ModuleManager.prototype.loadModule_ = function( // Dispatch an active/idle change if needed. this.dispatchActiveIdleChangeIfNeeded_(); - this.loader_.loadModules( - goog.array.clone(ids), this.moduleInfoMap_, null, - goog.bind(this.handleLoadError_, this), - goog.bind(this.handleLoadTimeout_, this), - !!opt_forceReload); + function load() { + this.loader_.loadModules( + goog.array.clone(ids), this.moduleInfoMap_, null, + goog.bind(this.handleLoadError_, this), + goog.bind(this.handleLoadTimeout_, this), + !!opt_forceReload); + } + + var delay = this.getBackOff_(); + if (delay) { + window.setTimeout(goog.bind(load, this), delay); + } else { + load.call(this); + } }; @@ -568,6 +591,12 @@ goog.module.ModuleManager.prototype.maybeFinishBaseLoad_ = function() { * @param {string} id A module id. */ goog.module.ModuleManager.prototype.setLoaded = function(id) { + if (this.isDisposed()) { + this.logger_.warning( + 'Module loaded after module manager was disposed: ' + id); + return; + } + this.logger_.info('Module loaded: ' + id); this.moduleInfoMap_[id].onLoad(goog.bind(this.getModuleContext, this)); @@ -642,7 +671,7 @@ goog.module.ModuleManager.prototype.execOnLoad = function( callbackWrapper = moduleInfo.registerCallback(fn, opt_handler); if (opt_userInitiated) { this.logger_.info('User initiated module already loading: ' + moduleId); - this.userInitiatedLoadingModuleIds_.push(moduleId); + this.addUserIntiatedLoadingModule_(moduleId); this.dispatchActiveIdleChangeIfNeeded_(); } } else { @@ -651,7 +680,7 @@ goog.module.ModuleManager.prototype.execOnLoad = function( if (!opt_noLoad) { if (opt_userInitiated) { this.logger_.info('User initiated module load: ' + moduleId); - this.userInitiatedLoadingModuleIds_.push(moduleId); + this.addUserIntiatedLoadingModule_(moduleId); } this.logger_.info('Initiating module load: ' + moduleId); this.loadModuleOrEnqueue_(moduleId); @@ -681,20 +710,20 @@ goog.module.ModuleManager.prototype.load = function( } else if (this.isModuleLoading(moduleId)) { this.logger_.info(moduleId + ' module already loading'); moduleInfo.registerCallback(d.callback, d); - moduleInfo.registerErrback(d.errback, d); + moduleInfo.registerErrback(function(err) { d.errback(Error(err)); }); if (opt_userInitiated) { this.logger_.info('User initiated module already loading: ' + moduleId); - this.userInitiatedLoadingModuleIds_.push(moduleId); + this.addUserIntiatedLoadingModule_(moduleId); this.dispatchActiveIdleChangeIfNeeded_(); } } else { this.logger_.info('Registering callback for module: ' + moduleId); moduleInfo.registerCallback(d.callback, d); - moduleInfo.registerErrback(d.errback, d); + moduleInfo.registerErrback(function(err) { d.errback(Error(err)); }); if (opt_userInitiated) { this.logger_.info('User initiated module load: ' + moduleId); - this.userInitiatedLoadingModuleIds_.push(moduleId); + this.addUserIntiatedLoadingModule_(moduleId); } else { this.logger_.info('Initiating module load: ' + moduleId); } @@ -705,6 +734,21 @@ goog.module.ModuleManager.prototype.load = function( }; +/** + * Ensures that the module with the given id is listed as a user-initiated + * module that is being loaded. This method guarantees that a module will never + * get listed more than once. + * @param {string} id Identifier of the module. + * @private + */ +goog.module.ModuleManager.prototype.addUserIntiatedLoadingModule_ = function( + id) { + if (!goog.array.contains(this.userInitiatedLoadingModuleIds_, id)) { + this.userInitiatedLoadingModuleIds_.push(id); + } +}; + + /** * Method called just before a module code is loaded. * @param {string} id Identifier of the module. diff --git a/contrib/closure-library/goog/module/modulemanager_test.html b/contrib/closure-library/goog/module/modulemanager_test.html index 39596db..3fd0238 100644 --- a/contrib/closure-library/goog/module/modulemanager_test.html +++ b/contrib/closure-library/goog/module/modulemanager_test.html @@ -3,7 +3,7 @@ @@ -23,7 +23,7 @@ var baseCount = 0; function checkForCookies() { - if (!goog.net.cookies.isEnabled()) { + if (!cookies.isEnabled()) { var message = 'Cookies must be enabled to run this test.'; if (location.protocol == 'file:') { message += '\nNote that cookies for local files are disabled in some ' + @@ -172,25 +172,65 @@ assertEquals(value2, cookies.get('testb')); } +function testSetCookiePath() { + assertEquals('foo=bar;path=/xyz', + mockSetCookie('foo', 'bar', -1, '/xyz')); +} + +function testSetCookieDomain() { + assertEquals('foo=bar;domain=google.com', + mockSetCookie('foo', 'bar', -1, null, 'google.com')); +} + +function testSetCookieSecure() { + assertEquals('foo=bar;secure', + mockSetCookie('foo', 'bar', -1, null, null, true)); +} + +function testSetCookieMaxAgeZero() { + var result = mockSetCookie('foo', 'bar', 0); + var pattern = new RegExp( + 'foo=bar;expires=' + new Date(1970, 1, 1).toUTCString()); + if (!result.match(pattern)) { + fail('expected match against ' + pattern + ' got ' + result); + } +} + +// TODO(chrisn): Testing max age > 0 requires a mock clock. + +function mockSetCookie(var_args) { + var setCookie = cookies.setCookie_; + try { + var result; + cookies.setCookie_ = function(arg) { + result = arg; + }; + cookies.set.apply(cookies, arguments); + return result; + } finally { + cookies.setCookie_ = setCookie; + } +} + function assertValidName(name) { - assertTrue(name + ' should be valid', goog.net.cookies.isValidName(name)); + assertTrue(name + ' should be valid', cookies.isValidName(name)); } function assertInvalidName(name) { - assertFalse(name + ' should be invalid', goog.net.cookies.isValidName(name)); + assertFalse(name + ' should be invalid', cookies.isValidName(name)); assertThrows(function() { - goog.net.cookies.set(name, 'value'); + cookies.set(name, 'value'); }); } function assertValidValue(val) { - assertTrue(val + ' should be valid', goog.net.cookies.isValidValue(val)); + assertTrue(val + ' should be valid', cookies.isValidValue(val)); } function assertInvalidValue(val) { - assertFalse(val + ' should be invalid', goog.net.cookies.isValidValue(val)); + assertFalse(val + ' should be invalid', cookies.isValidValue(val)); assertThrows(function() { - goog.net.cookies.set('name', val); + cookies.set('name', val); }); } @@ -210,10 +250,6 @@ assertInvalidValue('foo\nbar'); } -// TODO(user): Test path, domain and maxAge. -// However the document.cookie string is magical which makes this -// very hard to test - diff --git a/contrib/closure-library/goog/net/crossdomainrpc.js b/contrib/closure-library/goog/net/crossdomainrpc.js index 4b8a092..7952011 100644 --- a/contrib/closure-library/goog/net/crossdomainrpc.js +++ b/contrib/closure-library/goog/net/crossdomainrpc.js @@ -74,9 +74,11 @@ goog.require('goog.events.EventTarget'); goog.require('goog.events.EventType'); goog.require('goog.json'); goog.require('goog.net.EventType'); +goog.require('goog.net.HttpStatus'); goog.require('goog.userAgent'); + /** * Creates a new instance of cross domain RPC * @extends {goog.events.EventTarget} @@ -424,13 +426,12 @@ goog.net.CrossDomainRpc.prototype.sendRequest = requestFrameDoc.forms[0].submit(); requestFrameDoc = null; - this.loadListenerKey_ = goog.events.listen(requestFrame, - goog.events.EventType.LOAD, function() { + this.loadListenerKey_ = goog.events.listen( + requestFrame, goog.events.EventType.LOAD, function() { goog.net.CrossDomainRpc.logger_.log(goog.debug.Logger.Level.FINE, 'response ready'); this.responseReady_ = true; - }, false, this - ); + }, false, this); this.receiveResponse_(); }; @@ -538,8 +539,9 @@ goog.net.CrossDomainRpc.prototype.detectResponse_ = 'xd response timed out'); window.clearInterval(responseDetectorHandle); - this.status = 500; + this.status = goog.net.HttpStatus.INTERNAL_SERVER_ERROR; this.responseText = 'response timed out'; + this.dispatchEvent(goog.net.EventType.READY); this.dispatchEvent(goog.net.EventType.ERROR); this.dispatchEvent(goog.net.EventType.COMPLETE); @@ -605,8 +607,8 @@ goog.net.CrossDomainRpc.prototype.getResponseJson = function() { goog.net.CrossDomainRpc.prototype.isSuccess = function() { // Definition similar to goog.net.XhrIo.prototype.isSuccess. switch (this.status) { - case 200: // Http Success - case 304: // Http Cache + case goog.net.HttpStatus.OK: + case goog.net.HttpStatus.NOT_MODIFIED: return true; default: diff --git a/contrib/closure-library/goog/net/crossdomainrpc_test.html b/contrib/closure-library/goog/net/crossdomainrpc_test.html index 2e26a7f..fbb077f 100644 --- a/contrib/closure-library/goog/net/crossdomainrpc_test.html +++ b/contrib/closure-library/goog/net/crossdomainrpc_test.html @@ -3,7 +3,7 @@ + + +Closure Unit Tests - goog.net.FileDownloader + + + + + + + + diff --git a/contrib/closure-library/goog/net/httpstatus.js b/contrib/closure-library/goog/net/httpstatus.js new file mode 100755 index 0000000..c0eb626 --- /dev/null +++ b/contrib/closure-library/goog/net/httpstatus.js @@ -0,0 +1,84 @@ +// Copyright 2011 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Constants for HTTP status codes. + */ + +goog.provide('goog.net.HttpStatus'); + + +/** + * HTTP Status Codes defined in RFC 2616. + * @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html + * @enum {number} + */ +goog.net.HttpStatus = { + // Informational 1xx + CONTINUE: 100, + SWITCHING_PROTOCOLS: 101, + + // Successful 2xx + OK: 200, + CREATED: 201, + ACCEPTED: 202, + NON_AUTHORITATIVE_INFORMATION: 203, + NO_CONTENT: 204, + RESET_CONTENT: 205, + PARTIAL_CONTENT: 206, + + // Redirection 3xx + MULTIPLE_CHOICES: 300, + MOVED_PERMANENTLY: 301, + FOUND: 302, + SEE_OTHER: 303, + NOT_MODIFIED: 304, + USE_PROXY: 305, + TEMPORARY_REDIRECT: 307, + + // Client Error 4xx + BAD_REQUEST: 400, + UNAUTHORIZED: 401, + PAYMENT_REQUIRED: 402, + FORBIDDEN: 403, + NOT_FOUND: 404, + METHOD_NOT_ALLOWED: 405, + NOT_ACCEPTABLE: 406, + PROXY_AUTHENTICATION_REQUIRED: 407, + REQUEST_TIMEOUT: 408, + CONFLICT: 409, + GONE: 410, + LENGTH_REQUIRED: 411, + PRECONDITION_FAILED: 412, + REQUEST_ENTITY_TOO_LARGE: 413, + REQUEST_URI_TOO_LONG: 414, + UNSUPPORTED_MEDIA_TYPE: 415, + REQUEST_RANGE_NOT_SATISFIABLE: 416, + EXPECTATION_FAILED: 417, + + // Server Error 5xx + INTERNAL_SERVER_ERROR: 500, + NOT_IMPLEMENTED: 501, + BAD_GATEWAY: 502, + SERVICE_UNAVAILABLE: 503, + GATEWAY_TIMEOUT: 504, + HTTP_VERSION_NOT_SUPPORTED: 505, + + /* + * IE returns this code for 204 due to its use of URLMon, which returns this + * code for 'Operation Aborted'. The status text is 'Unknown', the response + * headers are ''. Known to occur on IE 6 on XP through IE9 on Win7. + */ + QUIRK_IE_NO_CONTENT: 1223 +}; diff --git a/contrib/closure-library/goog/net/iframe_xhr_test.html b/contrib/closure-library/goog/net/iframe_xhr_test.html index e862ee6..69dddfc 100644 --- a/contrib/closure-library/goog/net/iframe_xhr_test.html +++ b/contrib/closure-library/goog/net/iframe_xhr_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/net/iframe_xhr_test_response.html b/contrib/closure-library/goog/net/iframe_xhr_test_response.html index f7823d0..3dafbef 100644 --- a/contrib/closure-library/goog/net/iframe_xhr_test_response.html +++ b/contrib/closure-library/goog/net/iframe_xhr_test_response.html @@ -2,7 +2,7 @@ diff --git a/contrib/closure-library/goog/net/iframeio.js b/contrib/closure-library/goog/net/iframeio.js index 6417cf1..2d2757d 100644 --- a/contrib/closure-library/goog/net/iframeio.js +++ b/contrib/closure-library/goog/net/iframeio.js @@ -147,6 +147,7 @@ goog.require('goog.json'); goog.require('goog.net.ErrorCode'); goog.require('goog.net.EventType'); goog.require('goog.net.xhrMonitor'); +goog.require('goog.reflect'); goog.require('goog.string'); goog.require('goog.structs'); goog.require('goog.userAgent'); @@ -863,6 +864,11 @@ goog.net.IframeIo.prototype.sendFormInternal_ = function() { var doc = goog.dom.getFrameContentDocument(this.iframe_); var html = ''; + if (document.baseURI) { + // On Safari 4 and 5 the new iframe doesn't inherit the current baseURI. + html = '' + html; + } if (goog.userAgent.OPERA) { // Opera adds a history entry when document.write is used. // Change the innerHTML of the page instead. @@ -881,14 +887,18 @@ goog.net.IframeIo.prototype.sendFormInternal_ = function() { // The childnodes represent the initial child nodes for the text area // appending a text node essentially resets the initial value ready for // it to be clones - while maintaining HTML escaping. - if (goog.dom.getTextContent(textareas[i]) != textareas[i].value) { - goog.dom.setTextContent(textareas[i], textareas[i].value); + var value = textareas[i].value; + if (goog.dom.getRawTextContent(textareas[i]) != value) { + goog.dom.setTextContent(textareas[i], value); + textareas[i].value = value; } } // Append a cloned form to the iframe var clone = doc.importNode(this.form_, true); clone.target = innerFrameName; + // Work around crbug.com/66987 + clone.action = this.form_.action; doc.body.appendChild(clone); // Fix select boxes, importNode won't override the default value @@ -1284,32 +1294,23 @@ goog.net.IframeIo.prototype.getRequestIframe_ = function() { goog.net.IframeIo.prototype.testForFirefoxSilentError_ = function() { if (this.active_) { var doc = this.getContentDocument_(); - if (doc) { - /** @preserveTry */ - try { - // This is a hack to test of the document has loaded with a page that - // we can't access, such as a network error, that won't report onload - // or onerror events. - // Exporting is really the only foolproof way to do this with - // the compiler. - doc['closure_export_'] = doc['documentUri']; - - // TODO: Is there a situation when this won't error? - - } catch (e) { - goog.events.unlisten(this.getRequestIframe_(), - goog.events.EventType.LOAD, this.onIframeLoaded_, false, this); - - if (navigator.onLine) { - this.logger_.warning('Silent Firefox error detected'); - this.handleError_(goog.net.ErrorCode.FF_SILENT_ERROR); - } else { - this.logger_.warning('Firefox is offline so report offline error ' + - 'instead of silent error'); - this.handleError_(goog.net.ErrorCode.OFFLINE); - } - return; + + // This is a hack to test of the document has loaded with a page that + // we can't access, such as a network error, that won't report onload + // or onerror events. + if (doc && !goog.reflect.canAccessProperty(doc, 'documentUri')) { + goog.events.unlisten(this.getRequestIframe_(), + goog.events.EventType.LOAD, this.onIframeLoaded_, false, this); + + if (navigator.onLine) { + this.logger_.warning('Silent Firefox error detected'); + this.handleError_(goog.net.ErrorCode.FF_SILENT_ERROR); + } else { + this.logger_.warning('Firefox is offline so report offline error ' + + 'instead of silent error'); + this.handleError_(goog.net.ErrorCode.OFFLINE); } + return; } this.firefoxSilentErrorTimeout_ = goog.Timer.callOnce(this.testForFirefoxSilentError_, 250, this); @@ -1317,6 +1318,7 @@ goog.net.IframeIo.prototype.testForFirefoxSilentError_ = function() { }; + /** * Class for representing incremental data events. * @param {Object} data The data associated with the event. diff --git a/contrib/closure-library/goog/net/iframeio_different_base_test.data b/contrib/closure-library/goog/net/iframeio_different_base_test.data new file mode 100644 index 0000000..fed4357 --- /dev/null +++ b/contrib/closure-library/goog/net/iframeio_different_base_test.data @@ -0,0 +1,2 @@ +This is just a file that iframeio_different_base_test.html requests to test +iframeIo. diff --git a/contrib/closure-library/goog/net/iframeio_different_base_test.html b/contrib/closure-library/goog/net/iframeio_different_base_test.html new file mode 100644 index 0000000..476cbe8 --- /dev/null +++ b/contrib/closure-library/goog/net/iframeio_different_base_test.html @@ -0,0 +1,44 @@ + + + +Closure Unit Tests - goog.net.IframeIo (with different base URL) + + + + + + + diff --git a/contrib/closure-library/goog/net/iframeio_test.html b/contrib/closure-library/goog/net/iframeio_test.html index b41984e..ba8d9b4 100644 --- a/contrib/closure-library/goog/net/iframeio_test.html +++ b/contrib/closure-library/goog/net/iframeio_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/net/iframeloadmonitor.js b/contrib/closure-library/goog/net/iframeloadmonitor.js index cbec22f..6179117 100644 --- a/contrib/closure-library/goog/net/iframeloadmonitor.js +++ b/contrib/closure-library/goog/net/iframeloadmonitor.js @@ -25,6 +25,7 @@ goog.require('goog.events.EventType'); goog.require('goog.userAgent'); + /** * The correct way to determine whether an iframe has completed loading * is different in IE and Firefox. This class abstracts above these diff --git a/contrib/closure-library/goog/net/iframeloadmonitor_test.html b/contrib/closure-library/goog/net/iframeloadmonitor_test.html index f5beeed..501d477 100644 --- a/contrib/closure-library/goog/net/iframeloadmonitor_test.html +++ b/contrib/closure-library/goog/net/iframeloadmonitor_test.html @@ -3,7 +3,7 @@ Iframe Load Test Frame 1 diff --git a/contrib/closure-library/goog/net/iframeloadmonitor_test_frame2.html b/contrib/closure-library/goog/net/iframeloadmonitor_test_frame2.html index be6c4d5..7d436e2 100644 --- a/contrib/closure-library/goog/net/iframeloadmonitor_test_frame2.html +++ b/contrib/closure-library/goog/net/iframeloadmonitor_test_frame2.html @@ -2,7 +2,7 @@ Iframe Load Test Frame 2 diff --git a/contrib/closure-library/goog/net/iframeloadmonitor_test_frame3.html b/contrib/closure-library/goog/net/iframeloadmonitor_test_frame3.html index 5bf235a..910b639 100644 --- a/contrib/closure-library/goog/net/iframeloadmonitor_test_frame3.html +++ b/contrib/closure-library/goog/net/iframeloadmonitor_test_frame3.html @@ -2,7 +2,7 @@ Iframe Load Test Frame 3 diff --git a/contrib/closure-library/goog/net/imageloader.js b/contrib/closure-library/goog/net/imageloader.js index b3b3fe3..643f863 100644 --- a/contrib/closure-library/goog/net/imageloader.js +++ b/contrib/closure-library/goog/net/imageloader.js @@ -28,6 +28,8 @@ goog.require('goog.net.EventType'); goog.require('goog.object'); goog.require('goog.userAgent'); + + /** * Image loader utility class. Raises a {@link goog.events.EventType.LOAD} * event for each image loaded, with an {@link Image} object as the target of @@ -197,9 +199,15 @@ goog.net.ImageLoader.prototype.onNetworkEvent_ = function(evt) { } } - // Redispatch the event on behalf of the image. + // Redispatch the event on behalf of the image. Note that the external + // listener may dispose this instance. this.dispatchEvent({type: evt.type, target: image}); + if (this.isDisposed()) { + // If instance was disposed by listener, exit this function. + return; + } + // Remove the image from the map. goog.object.remove(this.images_, image.id); diff --git a/contrib/closure-library/goog/net/imageloader_test.html b/contrib/closure-library/goog/net/imageloader_test.html index 0801627..9d8b3d8 100644 --- a/contrib/closure-library/goog/net/imageloader_test.html +++ b/contrib/closure-library/goog/net/imageloader_test.html @@ -3,14 +3,14 @@ - Closure Unit Tests - goog.net.ImageLoader + Closure Unit Tests - goog.net.ImageLoader @@ -278,6 +280,49 @@ timeoutHandler(); } +function testPayloadParameters() { + var checkCleanup = newCleanupGuard(); + + var jsonp = new goog.net.Jsonp(fakeUrl); + var result = jsonp.send({ + 'foo': 3, + 'bar': 'baz' + }); + + var script = goog.dom.getElement(result.id_); + assertEquals('Payload parameters should have been added to url.', + fakeUrl + '?foo=3&bar=baz', + script.src); + + checkCleanup(); + timeoutHandler(); +} + +function testOptionalPayload() { + var checkCleanup = newCleanupGuard(); + + var errorCallback = goog.testing.recordFunction(); + + var stubs = new goog.testing.PropertyReplacer(); + stubs.set(goog.global, 'setTimeout', function(errorHandler) { + errorHandler(); + }); + + var jsonp = new goog.net.Jsonp(fakeUrl); + var result = jsonp.send(null, null, errorCallback); + + var script = goog.dom.getElement(result.id_); + assertEquals('Parameters should not have been added to url.', + fakeUrl, script.src); + + var errorCallbackArguments = errorCallback.getLastCall().getArguments(); + assertEquals(1, errorCallbackArguments.length); + assertNull(errorCallbackArguments[0]); + + checkCleanup(); + stubs.reset(); +} + diff --git a/contrib/closure-library/goog/net/mockiframeio.js b/contrib/closure-library/goog/net/mockiframeio.js index ef4c6e4..13423fd 100644 --- a/contrib/closure-library/goog/net/mockiframeio.js +++ b/contrib/closure-library/goog/net/mockiframeio.js @@ -23,6 +23,7 @@ goog.require('goog.net.IframeIo'); goog.require('goog.net.IframeIo.IncrementalDataEvent'); + /** * Mock implenetation of goog.net.IframeIo. This doesn't provide a mock * implementation for all cases, but it's not too hard to add them as needed. @@ -53,6 +54,14 @@ goog.inherits(goog.net.MockIFrameIo, goog.events.EventTarget); goog.net.MockIFrameIo.prototype.active_ = false; +/** + * Last content. + * @type {string} + * @private + */ +goog.net.MockIFrameIo.prototype.lastContent_ = ''; + + /** * Last error code. * @type {goog.net.ErrorCode} @@ -68,6 +77,23 @@ goog.net.MockIFrameIo.prototype.lastErrorCode_ = goog.net.ErrorCode.NO_ERROR; */ goog.net.MockIFrameIo.prototype.lastError_ = ''; + +/** + * Last custom error. + * @type {Object} + * @private + */ +goog.net.MockIFrameIo.prototype.lastCustomError_ = null; + + +/** + * Last URI. + * @type {goog.Uri} + * @private + */ +goog.net.MockIFrameIo.prototype.lastUri_ = null; + + /** * Simulates the iframe send. * @@ -109,6 +135,7 @@ goog.net.MockIFrameIo.prototype.sendFromForm = function(form, opt_uri, this.active_ = true; }; + /** * Simulates aborting the current Iframe request. * @param {goog.net.ErrorCode=} opt_failureCode Optional error code to use - @@ -126,6 +153,7 @@ goog.net.MockIFrameIo.prototype.abort = function(opt_failureCode) { } }; + /** * Simulates receive of incremental data. * @param {Object} data Data. @@ -155,6 +183,7 @@ goog.net.MockIFrameIo.prototype.simulateDone = function(errorCode) { this.dispatchEvent(goog.net.EventType.COMPLETE); }; + /** * Simulates the IFrame is ready for the next request. */ diff --git a/contrib/closure-library/goog/net/mockxhrlite_test.html b/contrib/closure-library/goog/net/mockxhrlite_test.html index 6b8d19e..c52743a 100644 --- a/contrib/closure-library/goog/net/mockxhrlite_test.html +++ b/contrib/closure-library/goog/net/mockxhrlite_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/net/multiiframeloadmonitor.js b/contrib/closure-library/goog/net/multiiframeloadmonitor.js index 091bb30..721f5cc 100644 --- a/contrib/closure-library/goog/net/multiiframeloadmonitor.js +++ b/contrib/closure-library/goog/net/multiiframeloadmonitor.js @@ -21,6 +21,7 @@ goog.provide('goog.net.MultiIframeLoadMonitor'); goog.require('goog.net.IframeLoadMonitor'); + /** * Provides a wrapper around IframeLoadMonitor, to allow the caller to wait for * multiple iframes to load. diff --git a/contrib/closure-library/goog/net/multiiframeloadmonitor_test.html b/contrib/closure-library/goog/net/multiiframeloadmonitor_test.html index 23654f0..7b7696d 100644 --- a/contrib/closure-library/goog/net/multiiframeloadmonitor_test.html +++ b/contrib/closure-library/goog/net/multiiframeloadmonitor_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/net/tmpnetwork.js b/contrib/closure-library/goog/net/tmpnetwork.js index bcbb594..6f9c03c 100644 --- a/contrib/closure-library/goog/net/tmpnetwork.js +++ b/contrib/closure-library/goog/net/tmpnetwork.js @@ -17,6 +17,7 @@ * for browserchannel which will be moved at a later date. */ + /** * Namespace for BrowserChannel */ @@ -26,29 +27,14 @@ goog.require('goog.Uri'); goog.require('goog.net.ChannelDebug'); -/** - * HTTP status code for OK. - * @type {number} - * @private - */ -goog.net.HTTP_STATUS_OK_ = 200; - - -/** - * HTTP status code returned for cached item. - * @type {number} - * @private - */ -goog.net.HTTP_STATUS_CACHED_ = 304; - /** * Default timeout to allow for google.com pings. * @type {number} */ -goog.net.GOOGLECOM_TIMEOUT = 10000; +goog.net.tmpnetwork.GOOGLECOM_TIMEOUT = 10000; -goog.net.testGoogleCom = function(callback, opt_imageUri) { +goog.net.tmpnetwork.testGoogleCom = function(callback, opt_imageUri) { // We need to add a 'rand' to make sure the response is not fulfilled // by browser cache. var uri = opt_imageUri; @@ -56,7 +42,8 @@ goog.net.testGoogleCom = function(callback, opt_imageUri) { uri = new goog.Uri('//www.google.com/images/cleardot.gif'); uri.makeUnique(); } - goog.net.testLoadImage(uri.toString(), goog.net.GOOGLECOM_TIMEOUT, callback); + goog.net.tmpnetwork.testLoadImage(uri.toString(), + goog.net.tmpnetwork.GOOGLECOM_TIMEOUT, callback); }; @@ -69,8 +56,8 @@ goog.net.testGoogleCom = function(callback, opt_imageUri) { * @param {number=} opt_pauseBetweenRetriesMS Optional number of milliseconds * between retries - defaults to 0. */ -goog.net.testLoadImageWithRetries = function(url, timeout, callback, retries, - opt_pauseBetweenRetriesMS) { +goog.net.tmpnetwork.testLoadImageWithRetries = function(url, timeout, callback, + retries, opt_pauseBetweenRetriesMS) { var channelDebug = new goog.net.ChannelDebug(); channelDebug.debug('TestLoadImageWithRetries: ' + opt_pauseBetweenRetriesMS); if (retries == 0) { @@ -81,15 +68,15 @@ goog.net.testLoadImageWithRetries = function(url, timeout, callback, retries, var pauseBetweenRetries = opt_pauseBetweenRetriesMS || 0; retries--; - goog.net.testLoadImage(url, timeout, function(succeeded) { + goog.net.tmpnetwork.testLoadImage(url, timeout, function(succeeded) { if (succeeded) { callback(true); } else { // try again goog.global.setTimeout(function() { - goog.net.testLoadImageWithRetries(url, timeout, callback, retries, - pauseBetweenRetries); - }, pauseBetweenRetries); + goog.net.tmpnetwork.testLoadImageWithRetries(url, timeout, callback, + retries, pauseBetweenRetries); + }, pauseBetweenRetries); } }); }; @@ -101,14 +88,14 @@ goog.net.testLoadImageWithRetries = function(url, timeout, callback, retries, * @param {number} timeout Milliseconds before giving up. * @param {Function} callback Function to call with results. */ -goog.net.testLoadImage = function(url, timeout, callback) { +goog.net.tmpnetwork.testLoadImage = function(url, timeout, callback) { var channelDebug = new goog.net.ChannelDebug(); channelDebug.debug('TestLoadImage: loading ' + url); var img = new Image(); img.onload = function() { try { channelDebug.debug('TestLoadImage: loaded'); - goog.net.clearImageCallbacks_(img); + goog.net.tmpnetwork.clearImageCallbacks_(img); callback(true); } catch (e) { channelDebug.dumpException(e); @@ -117,7 +104,7 @@ goog.net.testLoadImage = function(url, timeout, callback) { img.onerror = function() { try { channelDebug.debug('TestLoadImage: error'); - goog.net.clearImageCallbacks_(img); + goog.net.tmpnetwork.clearImageCallbacks_(img); callback(false); } catch (e) { channelDebug.dumpException(e); @@ -126,7 +113,7 @@ goog.net.testLoadImage = function(url, timeout, callback) { img.onabort = function() { try { channelDebug.debug('TestLoadImage: abort'); - goog.net.clearImageCallbacks_(img); + goog.net.tmpnetwork.clearImageCallbacks_(img); callback(false); } catch (e) { channelDebug.dumpException(e); @@ -135,7 +122,7 @@ goog.net.testLoadImage = function(url, timeout, callback) { img.ontimeout = function() { try { channelDebug.debug('TestLoadImage: timeout'); - goog.net.clearImageCallbacks_(img); + goog.net.tmpnetwork.clearImageCallbacks_(img); callback(false); } catch (e) { channelDebug.dumpException(e); @@ -156,7 +143,7 @@ goog.net.testLoadImage = function(url, timeout, callback) { * @param {Image} img The image to clear handlers from. * @private */ -goog.net.clearImageCallbacks_ = function(img) { +goog.net.tmpnetwork.clearImageCallbacks_ = function(img) { // NOTE(user): Nullified individually to avoid compiler warnings // (BUG 658126) img.onload = null; diff --git a/contrib/closure-library/goog/net/websocket.js b/contrib/closure-library/goog/net/websocket.js new file mode 100644 index 0000000..958e1d6 --- /dev/null +++ b/contrib/closure-library/goog/net/websocket.js @@ -0,0 +1,506 @@ +// Copyright 2011 The Closure Library Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @fileoverview Definition of the WebSocket class. A WebSocket provides a + * bi-directional, full-duplex communications channel, over a single TCP socket. + * + * See http://dev.w3.org/html5/websockets/ + * for the full HTML5 WebSocket API. + * + * Typical usage will look like this: + * + * var ws = new goog.net.WebSocket(); + * + * var handler = new goog.events.EventHandler(); + * handler.listen(ws, goog.net.WebSocket.EventType.OPENED, onOpen); + * handler.listen(ws, goog.net.WebSocket.EventType.MESSAGE, onMessage); + * + * try { + * ws.open('ws://127.0.0.1:4200'); + * } catch (e) { + * ... + * } + * + */ + +goog.provide('goog.net.WebSocket'); +goog.provide('goog.net.WebSocket.ErrorEvent'); +goog.provide('goog.net.WebSocket.EventType'); +goog.provide('goog.net.WebSocket.MessageEvent'); + +goog.require('goog.Timer'); +goog.require('goog.asserts'); +goog.require('goog.debug.Logger'); +goog.require('goog.debug.entryPointRegistry'); +goog.require('goog.events'); +goog.require('goog.events.Event'); +goog.require('goog.events.EventTarget'); + + + +/** + * Class encapsulating the logic for using a WebSocket. + * + * @param {boolean=} opt_autoReconnect True if the web socket should + * automatically reconnect or not. This is true by default. + * @param {function(number):number=} opt_getNextReconnect A function for + * obtaining the time until the next reconnect attempt. Given the reconnect + * attempt count (which is a positive integer), the function should return a + * positive integer representing the milliseconds to the next reconnect + * attempt. The default function used is an exponential back-off. Note that + * this function is never called if auto reconnect is disabled. + * @constructor + * @extends {goog.events.EventTarget} + */ +goog.net.WebSocket = function(opt_autoReconnect, opt_getNextReconnect) { + goog.base(this); + + /** + * True if the web socket should automatically reconnect or not. + * @type {boolean} + * @private + */ + this.autoReconnect_ = goog.isDef(opt_autoReconnect) ? + opt_autoReconnect : true; + + /** + * A function for obtaining the time until the next reconnect attempt. + * Given the reconnect attempt count (which is a positive integer), the + * function should return a positive integer representing the milliseconds to + * the next reconnect attempt. + * @type {function(number):number} + * @private + */ + this.getNextReconnect_ = opt_getNextReconnect || + goog.net.WebSocket.EXPONENTIAL_BACKOFF_; + + /** + * The time, in milliseconds, that must elapse before the next attempt to + * reconnect. + * @type {number} + * @private + */ + this.nextReconnect_ = this.getNextReconnect_(this.reconnectAttempt_); +}; +goog.inherits(goog.net.WebSocket, goog.events.EventTarget); + + +/** + * The actual web socket that will be used to send/receive messages. + * @type {WebSocket} + * @private + */ +goog.net.WebSocket.prototype.webSocket_ = null; + + +/** + * The URL to which the web socket will connect. + * @type {?string} + * @private + */ +goog.net.WebSocket.prototype.url_ = null; + + +/** + * The subprotocol name used when establishing the web socket connection. + * @type {string|undefined} + * @private + */ +goog.net.WebSocket.prototype.protocol_ = undefined; + + +/** + * True if a call to the close callback is expected or not. + * @type {boolean} + * @private + */ +goog.net.WebSocket.prototype.closeExpected_ = false; + + +/** + * Keeps track of the number of reconnect attempts made since the last + * successful connection. + * @type {number} + * @private + */ +goog.net.WebSocket.prototype.reconnectAttempt_ = 0; + + +/** + * The logger for this class. + * @type {goog.debug.Logger} + * @private + */ +goog.net.WebSocket.prototype.logger_ = goog.debug.Logger.getLogger( + 'goog.net.WebSocket'); + + +/** + * The events fired by the web socket. + * @enum {string} The event types for the web socket. + */ +goog.net.WebSocket.EventType = { + + /** + * Fired when an attempt to open the WebSocket fails or there is a connection + * failure after a successful connection has been established. + */ + CLOSED: goog.events.getUniqueId('closed'), + + /** + * Fired when the WebSocket encounters an error. + */ + ERROR: goog.events.getUniqueId('error'), + + /** + * Fired when a new message arrives from the WebSocket. + */ + MESSAGE: goog.events.getUniqueId('message'), + + /** + * Fired when the WebSocket connection has been established. + */ + OPENED: goog.events.getUniqueId('opened') +}; + + +/** + * The various states of the web socket. + * @enum {number} The states of the web socket. + * @private + */ +goog.net.WebSocket.ReadyState_ = { + // This is the initial state during construction. + CONNECTING: 0, + // This is when the socket is actually open and ready for data. + OPEN: 1, + // This is when the socket is in the middle of a close handshake. + // Note that this is a valid state even if the OPEN state was never achieved. + CLOSING: 2, + // This is when the socket is actually closed. + CLOSED: 3 +}; + + +/** + * The maximum amount of time between reconnect attempts for the exponential + * back-off in milliseconds. + * @type {number} + * @private + */ +goog.net.WebSocket.EXPONENTIAL_BACKOFF_CEILING_ = 60 * 1000; + + +/** + * Computes the next reconnect time given the number of reconnect attempts since + * the last successful connection. + * + * @param {number} attempt The number of reconnect attempts since the last + * connection. + * @return {number} The time, in milliseconds, until the next reconnect attempt. + * @const + * @private + */ +goog.net.WebSocket.EXPONENTIAL_BACKOFF_ = function(attempt) { + var time = Math.pow(2, attempt) * 1000; + return Math.min(time, goog.net.WebSocket.EXPONENTIAL_BACKOFF_CEILING_); +}; + + +/** + * Installs exception protection for all entry points introduced by + * goog.net.WebSocket instances which are not protected by + * {@link goog.debug.ErrorHandler#protectWindowSetTimeout}, + * {@link goog.debug.ErrorHandler#protectWindowSetInterval}, or + * {@link goog.events.protectBrowserEventEntryPoint}. + * + * @param {!goog.debug.ErrorHandler} errorHandler Error handler with which to + * protect the entry points. + */ +goog.net.WebSocket.protectEntryPoints = function(errorHandler) { + goog.net.WebSocket.prototype.onOpen_ = errorHandler.protectEntryPoint( + goog.net.WebSocket.prototype.onOpen_); + goog.net.WebSocket.prototype.onClose_ = errorHandler.protectEntryPoint( + goog.net.WebSocket.prototype.onClose_); + goog.net.WebSocket.prototype.onMessage_ = errorHandler.protectEntryPoint( + goog.net.WebSocket.prototype.onMessage_); + goog.net.WebSocket.prototype.onError_ = errorHandler.protectEntryPoint( + goog.net.WebSocket.prototype.onError_); +}; + + +/** + * Creates and opens the actual WebSocket. Only call this after attaching the + * appropriate listeners to this object. If listeners aren't registered, then + * the {@code goog.net.WebSocket.EventType.OPENED} event might be missed. + * + * @param {string} url The URL to which to connect. + * @param {string=} opt_protocol The subprotocol to use. The connection will + * only be established if the server reports that it has selected this + * subprotocol. The subprotocol name must all be a non-empty ASCII string + * with no control characters and no spaces in them (i.e. only characters + * in the range U+0021 to U+007E). + */ +goog.net.WebSocket.prototype.open = function(url, opt_protocol) { + // Sanity check. This works only in modern browsers. + goog.asserts.assert(goog.global['WebSocket'], + 'This browser does not support WebSocket'); + + // Don't do anything if the web socket is already open. + goog.asserts.assert(!this.isOpen(), 'The WebSocket is already open'); + + // Clear any pending attempts to reconnect. + this.clearReconnectTimer_(); + + // Construct the web socket. + this.url_ = url; + this.protocol_ = opt_protocol; + + // This check has to be made otherwise you get protocol mismatch exceptions + // for passing undefined, null, '', or []. + if (this.protocol_) { + this.logger_.info('Opening the WebSocket on ' + this.url_ + + ' with protocol ' + this.protocol_); + this.webSocket_ = new WebSocket(this.url_, this.protocol_); + } else { + this.logger_.info('Opening the WebSocket on ' + this.url_); + this.webSocket_ = new WebSocket(this.url_); + } + + // Register the event handlers. Note that it is not possible for these + // callbacks to be missed because it is registered after the web socket is + // instantiated. Because of the synchronous nature of JavaScript, this code + // will execute before the browser creates the resource and makes any calls + // to these callbacks. + this.webSocket_.onopen = goog.bind(this.onOpen_, this); + this.webSocket_.onclose = goog.bind(this.onClose_, this); + this.webSocket_.onmessage = goog.bind(this.onMessage_, this); + this.webSocket_.onerror = goog.bind(this.onError_, this); +}; + + +/** + * Closes the web socket connection. + */ +goog.net.WebSocket.prototype.close = function() { + + // Clear any pending attempts to reconnect. + this.clearReconnectTimer_(); + + // Attempt to close only if the web socket was created. + if (this.webSocket_) { + this.logger_.info('Closing the WebSocket.'); + + // Close is expected here since it was a direct call. Close is considered + // unexpected when opening the connection fails or there is some other form + // of connection loss after being connected. + this.closeExpected_ = true; + this.webSocket_.close(); + this.webSocket_ = null; + } +}; + + +/** + * Sends the message over the web socket. + * + * @param {string} message The message to send. + */ +goog.net.WebSocket.prototype.send = function(message) { + // Make sure the socket is ready to go before sending a message. + goog.asserts.assert(this.isOpen(), 'Cannot send without an open socket'); + + // Send the message and let onError_ be called if it fails thereafter. + this.webSocket_.send(message); +}; + + +/** + * Checks to see if the web socket is open or not. + * + * @return {boolean} True if the web socket is open, false otherwise. + */ +goog.net.WebSocket.prototype.isOpen = function() { + return !!this.webSocket_ && + this.webSocket_.readyState == goog.net.WebSocket.ReadyState_.OPEN; +}; + + +/** + * Called when the web socket has connected. + * + * @private + */ +goog.net.WebSocket.prototype.onOpen_ = function() { + this.logger_.info('WebSocket opened on ' + this.url_); + this.dispatchEvent(goog.net.WebSocket.EventType.OPENED); + + // Set the next reconnect interval. + this.reconnectAttempt_ = 0; + this.nextReconnect_ = this.getNextReconnect_(this.reconnectAttempt_); +}; + + +/** + * Called when the web socket has closed. + * + * @param {!Event} event The close event. + * @private + */ +goog.net.WebSocket.prototype.onClose_ = function(event) { + this.logger_.info('The WebSocket on ' + this.url_ + ' closed.'); + + // Firing this event allows handlers to query the URL. + this.dispatchEvent(goog.net.WebSocket.EventType.CLOSED); + + // Always clear out the web socket on a close event. + this.webSocket_ = null; + + // See if this is an expected call to onClose_. + if (this.closeExpected_) { + this.logger_.info('The WebSocket closed normally.'); + // Only clear out the URL if this is a normal close. + this.url_ = null; + this.protocol_ = undefined; + } else { + // Unexpected, so try to reconnect. + this.logger_.severe('The WebSocket disconnected unexpectedly: ' + + event.data); + + // Only try to reconnect if it is enabled. + if (this.autoReconnect_) { + // Log the reconnect attempt. + var seconds = Math.floor(this.nextReconnect_ / 1000); + this.logger_.info('Seconds until next reconnect attempt: ' + seconds); + + // Actually schedule the timer. + this.reconnectTimer_ = goog.Timer.callOnce( + goog.bind(this.open, this, this.url_, this.protocol_), + this.nextReconnect_, this); + + // Set the next reconnect interval. + this.reconnectAttempt_++; + this.nextReconnect_ = this.getNextReconnect_(this.reconnectAttempt_); + } + } + this.closeExpected_ = false; +}; + + +/** + * Called when a new message arrives from the server. + * + * @param {MessageEvent} event The web socket message event. + * @private + */ +goog.net.WebSocket.prototype.onMessage_ = function(event) { + var message = /** @type {string} */ (event.data); + this.dispatchEvent(new goog.net.WebSocket.MessageEvent(message)); +}; + + +/** + * Called when there is any error in communication. + * + * @param {Event} event The error event containing the error data. + * @private + */ +goog.net.WebSocket.prototype.onError_ = function(event) { + var data = /** @type {string} */ event.data; + this.logger_.severe('An error occurred: ' + data); + this.dispatchEvent(new goog.net.WebSocket.ErrorEvent(data)); +}; + + +/** + * Clears the reconnect timer. + * + * @private + */ +goog.net.WebSocket.prototype.clearReconnectTimer_ = function() { + if (goog.isDefAndNotNull(this.reconnectTimer_)) { + goog.Timer.clear(this.reconnectTimer_); + } + this.reconnectTimer_ = null; +}; + + +/** + * @inheritDoc + */ +goog.net.WebSocket.prototype.disposeInternal = function() { + goog.base(this, 'disposeInternal'); + this.close(); +}; + + + +/** + * Object representing a new incoming message event. + * + * @param {string} message The raw message coming from the web socket. + * @extends {goog.events.Event} + * @constructor + */ +goog.net.WebSocket.MessageEvent = function(message) { + goog.base(this, goog.net.WebSocket.EventType.MESSAGE); + + /** + * The new message from the web socket. + * @type {string} + */ + this.message = message; +}; +goog.inherits(goog.net.WebSocket.MessageEvent, goog.events.Event); + + + +/** + * Object representing an error event. This is fired whenever an error occurs + * on the web socket. + * + * @param {string} data The error data. + * @extends {goog.events.Event} + * @constructor + */ +goog.net.WebSocket.ErrorEvent = function(data) { + goog.base(this, goog.net.WebSocket.EventType.ERROR); + + /** + * The error data coming from the web socket. + * @type {string} + */ + this.data = data; +}; +goog.inherits(goog.net.WebSocket.ErrorEvent, goog.events.Event); + + +// Register the WebSocket as an entry point, so that it can be monitored for +// exception handling, etc. +goog.debug.entryPointRegistry.register( + /** + * @param {function(!Function): !Function} transformer The transforming + * function. + */ + function(transformer) { + goog.net.WebSocket.prototype.onOpen_ = + transformer(goog.net.WebSocket.prototype.onOpen_); + goog.net.WebSocket.prototype.onClose_ = + transformer(goog.net.WebSocket.prototype.onClose_); + goog.net.WebSocket.prototype.onMessage_ = + transformer(goog.net.WebSocket.prototype.onMessage_); + goog.net.WebSocket.prototype.onError_ = + transformer(goog.net.WebSocket.prototype.onError_); + }); diff --git a/contrib/closure-library/goog/net/websocket_test.html b/contrib/closure-library/goog/net/websocket_test.html new file mode 100644 index 0000000..4901830 --- /dev/null +++ b/contrib/closure-library/goog/net/websocket_test.html @@ -0,0 +1,367 @@ + + + + + + +Closure Unit Tests - goog.net.WebSocket + + + + + + + + + diff --git a/contrib/closure-library/goog/net/wrapperxmlhttpfactory.js b/contrib/closure-library/goog/net/wrapperxmlhttpfactory.js index e566ad0..570a5d3 100644 --- a/contrib/closure-library/goog/net/wrapperxmlhttpfactory.js +++ b/contrib/closure-library/goog/net/wrapperxmlhttpfactory.js @@ -15,6 +15,7 @@ /** * @fileoverview Implementation of XmlHttpFactory which allows construction from * simple factory methods. + * @author dbk@google.com (David Barrett-Kahn) */ goog.provide('goog.net.WrapperXmlHttpFactory'); diff --git a/contrib/closure-library/goog/net/xhrio.js b/contrib/closure-library/goog/net/xhrio.js index a30acbb..fcbd1a0 100644 --- a/contrib/closure-library/goog/net/xhrio.js +++ b/contrib/closure-library/goog/net/xhrio.js @@ -39,6 +39,7 @@ goog.provide('goog.net.XhrIo'); +goog.provide('goog.net.XhrIo.ResponseType'); goog.require('goog.Timer'); goog.require('goog.debug.Logger'); @@ -48,13 +49,16 @@ goog.require('goog.events.EventTarget'); goog.require('goog.json'); goog.require('goog.net.ErrorCode'); goog.require('goog.net.EventType'); +goog.require('goog.net.HttpStatus'); goog.require('goog.net.XmlHttp'); goog.require('goog.net.xhrMonitor'); +goog.require('goog.object'); goog.require('goog.structs'); goog.require('goog.structs.Map'); goog.require('goog.uri.utils'); + /** * Basic class for handling XMLHttpRequests. * @param {goog.net.XmlHttpFactory=} opt_xmlHttpFactory Factory to use when @@ -81,6 +85,22 @@ goog.net.XhrIo = function(opt_xmlHttpFactory) { }; goog.inherits(goog.net.XhrIo, goog.events.EventTarget); + +/** + * Response types that may be requested for XMLHttpRequests. + * @enum {string} + * @see http://dev.w3.org/2006/webapi/XMLHttpRequest-2/#the-responsetype-attribute + */ +goog.net.XhrIo.ResponseType = { + DEFAULT: '', + TEXT: 'text', + DOCUMENT: 'document', + // Not supported as of Chrome 10.0.612.1 dev + BLOB: 'blob', + ARRAY_BUFFER: 'arraybuffer' +}; + + /** * A reference to the XhrIo logger * @type {goog.debug.Logger} @@ -98,10 +118,10 @@ goog.net.XhrIo.CONTENT_TYPE_HEADER = 'Content-Type'; /** - * The URI scheme for the local filesystem - * @type {string} + * The pattern matching the 'http' and 'https' URI schemes + * @type {!RegExp} */ -goog.net.XhrIo.FILE_SCHEME = 'file'; +goog.net.XhrIo.HTTP_SCHEME_PATTERN = /^https?:?$/i; /** @@ -322,6 +342,29 @@ goog.net.XhrIo.prototype.timeoutInterval_ = 0; goog.net.XhrIo.prototype.timeoutId_ = null; +/** + * The requested type for the response. The empty string means use the default + * XHR behavior. + * @type {goog.net.XhrIo.ResponseType} + * @private + */ +goog.net.XhrIo.prototype.responseType_ = goog.net.XhrIo.ResponseType.DEFAULT; + + +/** + * Whether a "credentialed" request is to be sent (one that is aware of cookies + * and authentication) . This is applicable only for cross-domain requests and + * more recent browsers that support this part of the HTTP Access Control + * standard. + * + * @see http://dev.w3.org/2006/webapi/XMLHttpRequest-2/#withcredentials + * + * @type {boolean} + * @private + */ +goog.net.XhrIo.prototype.withCredentials_ = false; + + /** * Returns the number of milliseconds after which an incomplete request will be * aborted, or 0 if no timeout is set. @@ -343,6 +386,51 @@ goog.net.XhrIo.prototype.setTimeoutInterval = function(ms) { }; +/** + * Sets the desired type for the response. At time of writing, this is only + * supported in very recent versions of WebKit (10.0.612.1 dev and later). + * + * If this is used, the response may only be accessed via {@link #getResponse}. + * + * @param {goog.net.XhrIo.ResponseType} type The desired type for the response. + */ +goog.net.XhrIo.prototype.setResponseType = function(type) { + this.responseType_ = type; +}; + + +/** + * Gets the desired type for the response. + * @return {goog.net.XhrIo.ResponseType} The desired type for the response. + */ +goog.net.XhrIo.prototype.getResponseType = function() { + return this.responseType_; +}; + + +/** + * Sets whether a "credentialed" request that is aware of cookie and + * authentication information should be made. This option is only supported by + * browsers that support HTTP Access Control. As of this writing, this option + * is not supported in IE. + * + * @param {boolean} withCredentials Whether this should be a "credentialed" + * request. + */ +goog.net.XhrIo.prototype.setWithCredentials = function(withCredentials) { + this.withCredentials_ = withCredentials; +}; + + +/** + * Gets whether a "credentialed" request is to be sent. + * @return {boolean} The desired type for the response. + */ +goog.net.XhrIo.prototype.getWithCredentials = function() { + return this.withCredentials_; +}; + + /** * Instance send that actually uses XMLHttpRequest to make a server call. * @param {string|goog.Uri} url Uri to make request to. @@ -358,7 +446,7 @@ goog.net.XhrIo.prototype.send = function(url, opt_method, opt_content, throw Error('[goog.net.XhrIo] Object is active with another request'); } - var method = opt_method || 'GET'; + var method = opt_method ? opt_method.toUpperCase() : 'GET'; this.lastUri_ = url; this.lastError_ = ''; @@ -422,6 +510,14 @@ goog.net.XhrIo.prototype.send = function(url, opt_method, opt_content, this.xhr_.setRequestHeader(key, value); }, this); + if (this.responseType_) { + this.xhr_.responseType = this.responseType_; + } + + if (goog.object.containsKey(this.xhr_, 'withCredentials')) { + this.xhr_.withCredentials = this.withCredentials_; + } + /** * Try to send the request, or other wise report an error (404 not found). * @preserveTry @@ -464,11 +560,9 @@ goog.net.XhrIo.prototype.createXhr = function() { /** * Override of dispatchEvent. We need to keep track if an XMLHttpRequest is - * being sent from the context of another requests' repsonse. If it is then, we + * being sent from the context of another requests' response. If it is then, we * make the XHR send async. - * @param {goog.events.Event|string} e Event to dispatch. - * @return {boolean} Whether the dispatch completed without a handler calling - * preventDefault. + * @override */ goog.net.XhrIo.prototype.dispatchEvent = function(e) { if (this.xhr_) { @@ -749,11 +843,12 @@ goog.net.XhrIo.prototype.isComplete = function() { goog.net.XhrIo.prototype.isSuccess = function() { switch (this.getStatus()) { case 0: // Used for local XHR requests - return this.isLastUriEffectiveSchemeFile_(); + return !this.isLastUriEffectiveSchemeHttp_(); - case 200: // Http Success - case 204: // Http Success - no content - case 304: // Http Cache + case goog.net.HttpStatus.OK: + case goog.net.HttpStatus.NO_CONTENT: + case goog.net.HttpStatus.NOT_MODIFIED: + case goog.net.HttpStatus.QUIRK_IE_NO_CONTENT: return true; default: @@ -764,22 +859,21 @@ goog.net.XhrIo.prototype.isSuccess = function() { /** * @return {boolean} whether the effective scheme of the last URI that was - * fetched was 'file'. + * fetched was 'http' or 'https'. * @private */ -goog.net.XhrIo.prototype.isLastUriEffectiveSchemeFile_ = function() { +goog.net.XhrIo.prototype.isLastUriEffectiveSchemeHttp_ = function() { var lastUriScheme = goog.isString(this.lastUri_) ? goog.uri.utils.getScheme(this.lastUri_) : (/** @type {!goog.Uri} */ this.lastUri_).getScheme(); // if it's an absolute URI, we're done. if (lastUriScheme) { - return lastUriScheme.toLowerCase() == goog.net.XhrIo.FILE_SCHEME; + return goog.net.XhrIo.HTTP_SCHEME_PATTERN.test(lastUriScheme); } // if it's a relative URI, it inherits the scheme of the page. if (self.location) { - return self.location.protocol.replace(/:$/, '').toLowerCase() == - goog.net.XhrIo.FILE_SCHEME; + return goog.net.XhrIo.HTTP_SCHEME_PATTERN.test(self.location.protocol); } else { // This case can occur from a web worker in Firefox 3.5 . All other browsers // with web workers support self.location from the worker. @@ -913,6 +1007,24 @@ goog.net.XhrIo.prototype.getResponseJson = function(opt_xssiPrefix) { }; +/** + * Get the response as the type specificed by {@link #setResponseType}. At time + * of writing, this is only supported in very recent versions of WebKit + * (10.0.612.1 dev and later). + * + * @return {*} The response. + */ +goog.net.XhrIo.prototype.getResponse = function() { + /** @preserveTry */ + try { + return this.xhr_ && this.xhr_.response; + } catch (e) { + this.logger_.fine('Can not get response: ' + e.message); + return null; + } +}; + + /** * Get the value of the response-header with the given name from the Xhr object * Will only return correct result when called from the context of a callback diff --git a/contrib/closure-library/goog/net/xhrio_test.html b/contrib/closure-library/goog/net/xhrio_test.html index 5a6acb6..12da10e 100644 --- a/contrib/closure-library/goog/net/xhrio_test.html +++ b/contrib/closure-library/goog/net/xhrio_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/net/xmlhttp.js b/contrib/closure-library/goog/net/xmlhttp.js index 81e468e..d9d7e5b 100644 --- a/contrib/closure-library/goog/net/xmlhttp.js +++ b/contrib/closure-library/goog/net/xmlhttp.js @@ -25,7 +25,6 @@ goog.require('goog.net.WrapperXmlHttpFactory'); goog.require('goog.net.XmlHttpFactory'); - /** * Static class for creating XMLHttpRequest objects. * @return {!(XMLHttpRequest|GearsHttpRequest)} A new XMLHttpRequest object. @@ -129,6 +128,7 @@ goog.net.XmlHttp.setGlobalFactory = function(factory) { }; + /** * Default factory to use when creating xhr objects. You probably shouldn't be * instantiating this directly, but rather using it via goog.net.XmlHttp. diff --git a/contrib/closure-library/goog/net/xmlhttpfactory.js b/contrib/closure-library/goog/net/xmlhttpfactory.js index b06ecfc..ef2c719 100644 --- a/contrib/closure-library/goog/net/xmlhttpfactory.js +++ b/contrib/closure-library/goog/net/xmlhttpfactory.js @@ -15,6 +15,7 @@ /** * @fileoverview Interface for a factory for creating XMLHttpRequest objects * and metadata about them. + * @author dbk@google.com (David Barrett-Kahn) */ goog.provide('goog.net.XmlHttpFactory'); diff --git a/contrib/closure-library/goog/net/xpc/crosspagechannel.js b/contrib/closure-library/goog/net/xpc/crosspagechannel.js index 0a21765..35f7600 100644 --- a/contrib/closure-library/goog/net/xpc/crosspagechannel.js +++ b/contrib/closure-library/goog/net/xpc/crosspagechannel.js @@ -27,7 +27,7 @@ goog.require('goog.Uri'); goog.require('goog.dom'); goog.require('goog.events'); goog.require('goog.json'); -goog.require('goog.messaging.MessageChannel'); // interface +goog.require('goog.messaging.AbstractChannel'); goog.require('goog.net.xpc'); goog.require('goog.net.xpc.FrameElementMethodTransport'); goog.require('goog.net.xpc.IframePollingTransport'); @@ -47,11 +47,16 @@ goog.require('goog.userAgent'); * @param {goog.dom.DomHelper=} opt_domHelper The optional dom helper to * use for looking up elements in the dom. * @constructor - * @implements {goog.messaging.MessageChannel} - * @extends {goog.Disposable} + * @extends {goog.messaging.AbstractChannel} */ goog.net.xpc.CrossPageChannel = function(cfg, opt_domHelper) { - goog.Disposable.call(this); + goog.base(this); + + for (var i = 0, uriField; uriField = goog.net.xpc.UriCfgFields[i]; i++) { + if (uriField in cfg && !/^https?:\/\//.test(cfg[uriField])) { + throw Error('URI ' + cfg[uriField] + ' is invalid for field ' + uriField); + } + } /** * The configuration for this channel. @@ -68,13 +73,6 @@ goog.net.xpc.CrossPageChannel = function(cfg, opt_domHelper) { this.name = this.cfg_[goog.net.xpc.CfgFields.CHANNEL_NAME] || goog.net.xpc.getRandomString(10); - /** - * Object holding the service callbacks. - * @type {Object} - * @private - */ - this.services_ = {}; - /** * The dom helper to use for accessing the dom. * @type {goog.dom.DomHelper} @@ -82,6 +80,18 @@ goog.net.xpc.CrossPageChannel = function(cfg, opt_domHelper) { */ this.domHelper_ = opt_domHelper || goog.dom.getDomHelper(); + // If LOCAL_POLL_URI or PEER_POLL_URI is not available, try using + // robots.txt from that host. + cfg[goog.net.xpc.CfgFields.LOCAL_POLL_URI] = + cfg[goog.net.xpc.CfgFields.LOCAL_POLL_URI] || + goog.uri.utils.getHost(this.domHelper_.getWindow().location.href) + + '/robots.txt'; + // PEER_URI is sometimes undefined in tests. + cfg[goog.net.xpc.CfgFields.PEER_POLL_URI] = + cfg[goog.net.xpc.CfgFields.PEER_POLL_URI] || + goog.uri.utils.getHost(cfg[goog.net.xpc.CfgFields.PEER_URI] || '') + + '/robots.txt'; + goog.net.xpc.channels_[this.name] = this; goog.events.listen(window, 'unload', @@ -89,8 +99,26 @@ goog.net.xpc.CrossPageChannel = function(cfg, opt_domHelper) { goog.net.xpc.logger.info('CrossPageChannel created: ' + this.name); }; -goog.inherits(goog.net.xpc.CrossPageChannel, goog.Disposable); +goog.inherits(goog.net.xpc.CrossPageChannel, goog.messaging.AbstractChannel); + + +/** + * Regexp for escaping service names. + * @type {RegExp} + * @private + */ +goog.net.xpc.CrossPageChannel.TRANSPORT_SERVICE_ESCAPE_RE_ = + new RegExp('^%*' + goog.net.xpc.TRANSPORT_SERVICE_ + '$'); + + +/** + * Regexp for unescaping service names. + * @type {RegExp} + * @private + */ +goog.net.xpc.CrossPageChannel.TRANSPORT_SERVICE_UNESCAPE_RE_ = + new RegExp('^%+' + goog.net.xpc.TRANSPORT_SERVICE_ + '$'); /** * The transport. @@ -110,6 +138,7 @@ goog.net.xpc.CrossPageChannel.prototype.state_ = /** + * @override * @return {boolean} Whether the channel is connected. */ goog.net.xpc.CrossPageChannel.prototype.isConnected = function() { @@ -162,10 +191,9 @@ goog.net.xpc.CrossPageChannel.prototype.determineTransportType_ = function() { } else if (goog.userAgent.IE && this.cfg_[goog.net.xpc.CfgFields.PEER_RELAY_URI]) { transportType = goog.net.xpc.TransportTypes.IFRAME_RELAY; - } else if (goog.userAgent.IE) { + } else if (goog.userAgent.IE && goog.net.xpc.NixTransport.isNixSupported()) { transportType = goog.net.xpc.TransportTypes.NIX; - } else if (this.cfg_[goog.net.xpc.CfgFields.LOCAL_POLL_URI] && - this.cfg_[goog.net.xpc.CfgFields.PEER_POLL_URI]) { + } else { transportType = goog.net.xpc.TransportTypes.IFRAME_POLLING; } return transportType; @@ -359,6 +387,7 @@ goog.net.xpc.CrossPageChannel.prototype.connectDeferred_ = false; * Initiates connecting the channel. When this method is called, all the * information needed to connect the channel has to be available. * + * @override * @param {Function=} opt_connectCb The function to be called when the * channel has been connected and is ready to be used. */ @@ -439,47 +468,7 @@ goog.net.xpc.CrossPageChannel.prototype.notifyTransportError_ = function() { }; -/** - * Registers a service. - * - * @param {string} serviceName The name of the service. - * @param {Function} callback The callback responsible to process incoming - * messages. - * @param {boolean=} opt_jsonEncoded If true, incoming messages for this - * service are expected to contain a JSON-encoded object and will be - * deserialized automatically. - */ -goog.net.xpc.CrossPageChannel.prototype.registerService = function( - serviceName, callback, opt_jsonEncoded) { - this.services_[serviceName] = { - name: serviceName, - callback: callback, - jsonEncoded: !!opt_jsonEncoded - }; -}; - - -/** - * Registers a service to handle any messages that aren't handled by any other - * services. - * - * @param {function(string, (string|Object))} callback The callback responsible - * for processing incoming messages that aren't processed by other services. - */ -goog.net.xpc.CrossPageChannel.prototype.registerDefaultService = function( - callback) { - this.defaultService_ = callback; -}; - - -/** - * Sends a msg over the channel. - * - * @param {string} serviceName The name of the service this message - * should be delivered to. - * @param {string|Object} payload The payload. If this is an object, it is - * serialized to JSON before sending. - */ +/** @inheritDoc */ goog.net.xpc.CrossPageChannel.prototype.send = function(serviceName, payload) { if (!this.isConnected()) { goog.net.xpc.logger.severe('Can\'t send. Channel not connected.'); @@ -497,7 +486,11 @@ goog.net.xpc.CrossPageChannel.prototype.send = function(serviceName, payload) { if (goog.isObject(payload)) { payload = goog.json.serialize(payload); } - this.transport_.send(serviceName, payload); + + // Partially URL-encode the service name because some characters (: and |) are + // used as delimiters for some transports, and we want to allow those + // characters in service names. + this.transport_.send(this.escapeServiceName_(serviceName), payload); }; @@ -506,10 +499,20 @@ goog.net.xpc.CrossPageChannel.prototype.send = function(serviceName, payload) { * * @param {string} serviceName The name of the port. * @param {string} payload The payload. + * @param {string=} opt_origin An optional origin for the message, where the + * underlying transport makes that available. If this is specified, and + * the PEER_HOSTNAME parameter was provided, they must match or the message + * will be rejected. * @private */ -goog.net.xpc.CrossPageChannel.prototype.deliver_ = function(serviceName, - payload) { +goog.net.xpc.CrossPageChannel.prototype.deliver_ = function( + serviceName, payload, opt_origin) { + // Check whether the origin of the message is as expected. + if (!this.isMessageOriginAcceptable_(opt_origin)) { + goog.net.xpc.logger.warning('Message received from unapproved origin "' + + opt_origin + '" - rejected.'); + return; + } if (this.isDisposed()) { goog.net.xpc.logger.warning('CrossPageChannel::deliver_(): Disposed.'); @@ -519,25 +522,7 @@ goog.net.xpc.CrossPageChannel.prototype.deliver_ = function(serviceName, } else { // only deliver messages if connected if (this.isConnected()) { - var service = this.services_[serviceName]; - if (service) { - if (service.jsonEncoded) { - /** @preserveTry */ - try { - payload = goog.json.parse(payload); - } catch (e) { - goog.net.xpc.logger.info('Error parsing JSON-encoded payload.'); - return; - } - } - service.callback(payload); - } else if (this.defaultService_) { - this.defaultService_.callback(payload); - } else { - goog.net.xpc.logger.info('CrossPageChannel::deliver_(): ' + - 'No such service: "' + serviceName + '" ' + - '(payload: ' + payload + ')'); - } + this.deliver(this.unescapeServiceName_(serviceName), payload); } else { goog.net.xpc.logger.info('CrossPageChannel::deliver_(): Not connected.'); } @@ -545,6 +530,44 @@ goog.net.xpc.CrossPageChannel.prototype.deliver_ = function(serviceName, }; +/** + * Escape the user-provided service name for sending across the channel. This + * URL-encodes certain special characters so they don't conflict with delimiters + * used by some of the transports, and adds a special prefix if the name + * conflicts with the reserved transport service name. + * + * This is the opposite of {@link #unescapeServiceName_}. + * + * @param {string} name The name of the service to escape. + * @return {string} The escaped service name. + * @private + */ +goog.net.xpc.CrossPageChannel.prototype.escapeServiceName_ = function(name) { + if (goog.net.xpc.CrossPageChannel.TRANSPORT_SERVICE_ESCAPE_RE_.test(name)) { + name = '%' + name; + } + return name.replace(/[%:|]/g, encodeURIComponent); +}; + + +/** + * Unescape the escaped service name that was sent across the channel. This is + * the opposite of {@link #escapeServiceName_}. + * + * @param {string} name The name of the service to unescape. + * @return {string} The unescaped service name. + * @private + */ +goog.net.xpc.CrossPageChannel.prototype.unescapeServiceName_ = function(name) { + name = name.replace(/%[0-9a-f]{2}/gi, decodeURIComponent); + if (goog.net.xpc.CrossPageChannel.TRANSPORT_SERVICE_UNESCAPE_RE_.test(name)) { + return name.substring(1); + } else { + return name; + } +}; + + /** * The role of the peer. * @enum {number} @@ -566,17 +589,34 @@ goog.net.xpc.CrossPageChannel.prototype.getRole = function() { }; +/** + * Returns whether an incoming message with the given origin is acceptable. + * If an incoming request comes with a specified (non-empty) origin, and the + * PEER_HOSTNAME config parameter has also been provided, the two must match, + * or the message is unacceptable. + * @param {string=} opt_origin The origin associated with the incoming message. + * @return {boolean} Whether the message is acceptable. + * @private + */ +goog.net.xpc.CrossPageChannel.prototype.isMessageOriginAcceptable_ = function( + opt_origin) { + var peerHostname = this.cfg_[goog.net.xpc.CfgFields.PEER_HOSTNAME]; + return goog.string.isEmptySafe(opt_origin) || + goog.string.isEmptySafe(peerHostname) || + opt_origin == this.cfg_[goog.net.xpc.CfgFields.PEER_HOSTNAME]; +}; + + /** * Disposes of the channel. */ goog.net.xpc.CrossPageChannel.prototype.disposeInternal = function() { - goog.net.xpc.CrossPageChannel.superClass_.disposeInternal.call(this); + goog.base(this, 'disposeInternal'); this.close(); this.peerWindowObject_ = null; this.iframeElement_ = null; - delete this.services_; delete goog.net.xpc.channels_[this.name]; }; diff --git a/contrib/closure-library/goog/net/xpc/crosspagechannel_test.html b/contrib/closure-library/goog/net/xpc/crosspagechannel_test.html index 1b821db..ff9ffc2 100644 --- a/contrib/closure-library/goog/net/xpc/crosspagechannel_test.html +++ b/contrib/closure-library/goog/net/xpc/crosspagechannel_test.html @@ -5,7 +5,7 @@ @@ -18,6 +18,7 @@ goog.require('goog.debug.Logger'); goog.require('goog.dom'); goog.require('goog.net.xpc.CrossPageChannel'); + goog.require('goog.object'); goog.require('goog.testing.AsyncTestCase'); goog.require('goog.testing.PropertyReplacer'); goog.require('goog.testing.jsunit'); @@ -114,6 +115,64 @@ driver.connect(); } +function testEscapeServiceName() { + var escape = goog.net.xpc.CrossPageChannel.prototype.escapeServiceName_; + assertEquals('Shouldn\'t escape alphanumeric name', + 'fooBar123', escape('fooBar123')); + assertEquals('Shouldn\'t escape most non-alphanumeric characters', + '`~!@#$^&*()_-=+ []{}\'";,<.>/?\\', + escape('`~!@#$^&*()_-=+ []{}\'";,<.>/?\\')); + assertEquals('Should escape %, |, and :', + 'foo%3ABar%7C123%25', escape('foo:Bar|123%')); + assertEquals('Should escape tp', '%25tp', escape('tp')); + assertEquals('Should escape %tp', '%25%25tp', escape('%tp')); + assertEquals('Should not escape stp', 'stp', escape('stp')); + assertEquals('Should not escape s%tp', 's%25tp', escape('s%tp')); +} + +function testSameDomainCheck_noMessageOrigin() { + var channel = new goog.net.xpc.CrossPageChannel(goog.object.create( + goog.net.xpc.CfgFields.PEER_HOSTNAME, 'http://foo.com')); + assertTrue(channel.isMessageOriginAcceptable_(undefined)); +} + +function testSameDomainCheck_noPeerHostname() { + var channel = new goog.net.xpc.CrossPageChannel({}); + assertTrue(channel.isMessageOriginAcceptable_('http://foo.com')); +} + +function testSameDomainCheck_unconfigured() { + var channel = new goog.net.xpc.CrossPageChannel({}); + assertTrue(channel.isMessageOriginAcceptable_(undefined)); +} + +function testSameDomainCheck_originsMatch() { + var channel = new goog.net.xpc.CrossPageChannel(goog.object.create( + goog.net.xpc.CfgFields.PEER_HOSTNAME, 'http://foo.com')); + assertTrue(channel.isMessageOriginAcceptable_('http://foo.com')); +} + +function testSameDomainCheck_originsMismatch() { + var channel = new goog.net.xpc.CrossPageChannel(goog.object.create( + goog.net.xpc.CfgFields.PEER_HOSTNAME, 'http://foo.com')); + assertFalse(channel.isMessageOriginAcceptable_('http://nasty.com')); +} + +function testUnescapeServiceName() { + var unescape = goog.net.xpc.CrossPageChannel.prototype.unescapeServiceName_; + assertEquals('Shouldn\'t modify alphanumeric name', + 'fooBar123', unescape('fooBar123')); + assertEquals('Shouldn\'t modify most non-alphanumeric characters', + '`~!@#$^&*()_-=+ []{}\'";,<.>/?\\', + unescape('`~!@#$^&*()_-=+ []{}\'";,<.>/?\\')); + assertEquals('Should unescape URL-escapes', + 'foo:Bar|123%', unescape('foo%3ABar%7C123%25')); + assertEquals('Should unescape tp', 'tp', unescape('%25tp')); + assertEquals('Should unescape %tp', '%tp', unescape('%25%25tp')); + assertEquals('Should not escape stp', 'stp', unescape('stp')); + assertEquals('Should not escape s%tp', 's%tp', unescape('s%25tp')); +} + /** * Driver for the tests for CrossPageChannel. @@ -122,6 +181,8 @@ * @extends {goog.Disposable} */ Driver = function() { + goog.Disposable.call(this); + /** * The peer iframe. * @type {!Element} @@ -157,7 +218,7 @@ * Disposes of the channel. */ Driver.prototype.disposeInternal = function() { - goog.net.xpc.CrossPageChannel.superClass_.disposeInternal.call(this); + goog.base(this, 'disposeInternal'); if (this.channel_) { this.channel_.dispose(); @@ -192,6 +253,13 @@ cfg[goog.net.xpc.CfgFields.CHANNEL_NAME] = 'test_channel' + uniqueId++; cfg[goog.net.xpc.CfgFields.LOCAL_POLL_URI] = 'does-not-exist.html'; cfg[goog.net.xpc.CfgFields.PEER_POLL_URI] = 'does-not-exist.html'; + function resolveUri(fieldName) { + cfg[fieldName] = + goog.Uri.resolve(window.location.href, cfg[fieldName]).toString(); + } + resolveUri(goog.net.xpc.CfgFields.PEER_URI); + resolveUri(goog.net.xpc.CfgFields.LOCAL_POLL_URI); + resolveUri(goog.net.xpc.CfgFields.PEER_POLL_URI); this.channel_ = new goog.net.xpc.CrossPageChannel(cfg, opt_domHelper); this.channel_.registerService('msg', goog.bind(this.msgHandler_, this)); diff --git a/contrib/closure-library/goog/net/xpc/frameelementmethodtransport.js b/contrib/closure-library/goog/net/xpc/frameelementmethodtransport.js index 2620e54..d2b5870 100644 --- a/contrib/closure-library/goog/net/xpc/frameelementmethodtransport.js +++ b/contrib/closure-library/goog/net/xpc/frameelementmethodtransport.js @@ -27,6 +27,7 @@ goog.require('goog.net.xpc'); goog.require('goog.net.xpc.Transport'); + /** * Frame-element method transport. * diff --git a/contrib/closure-library/goog/net/xpc/iframepollingtransport.js b/contrib/closure-library/goog/net/xpc/iframepollingtransport.js index 4afe2f6..604548b 100644 --- a/contrib/closure-library/goog/net/xpc/iframepollingtransport.js +++ b/contrib/closure-library/goog/net/xpc/iframepollingtransport.js @@ -28,6 +28,7 @@ goog.require('goog.net.xpc.Transport'); goog.require('goog.userAgent'); + /** * Iframe polling transport. Uses hidden iframes to transfer data * in the fragment identifier of the URL. The peer polls the iframe's location @@ -592,7 +593,7 @@ goog.net.xpc.IframePollingTransport.prototype.send = * Disposes of the transport. */ goog.net.xpc.IframePollingTransport.prototype.disposeInternal = function() { - goog.net.xpc.IframePollingTransport.superClass_.disposeInternal.call(this); + goog.base(this, 'disposeInternal'); var receivers = goog.net.xpc.IframePollingTransport.receivers_; goog.array.remove(receivers, this.msgReceiver_); @@ -775,7 +776,6 @@ goog.net.xpc.IframePollingTransport.Sender.prototype.send = function(payload) { - /** * goog.net.xpc.IframePollingTransport.Receiver * diff --git a/contrib/closure-library/goog/net/xpc/iframerelaytransport.js b/contrib/closure-library/goog/net/xpc/iframerelaytransport.js index 6d57baf..6204b92 100644 --- a/contrib/closure-library/goog/net/xpc/iframerelaytransport.js +++ b/contrib/closure-library/goog/net/xpc/iframerelaytransport.js @@ -26,6 +26,7 @@ goog.require('goog.net.xpc.Transport'); goog.require('goog.userAgent'); + /** * Iframe relay transport. Creates hidden iframes containing a document * from the peer's origin. Data is transferred in the fragment identifier. @@ -92,6 +93,7 @@ if (goog.userAgent.WEBKIT) { /** * Time after which a relay-iframe is destroyed. + * @type {number} * @private */ goog.net.xpc.IframeRelayTransport.IFRAME_MAX_AGE_ = 3000; @@ -153,6 +155,31 @@ if (goog.userAgent.WEBKIT) { } +/** + * Maximum sendable size of a payload via a single iframe in IE. + * @type {number} + * @private + */ +goog.net.xpc.IframeRelayTransport.IE_PAYLOAD_MAX_SIZE_ = 1800; + + +/** + * @typedef {{fragments: !Array., received: number, expected: number}} + */ +goog.net.xpc.IframeRelayTransport.FragmentInfo; + + +/** + * Used to track incoming payload fragments. The implementation can process + * incoming fragments from several channels at a time, even if data is + * out-of-order or interleaved. + * + * @type {!Object.} + * @private + */ +goog.net.xpc.IframeRelayTransport.fragmentMap_ = {}; + + /** * The transport type. * @type {number} @@ -184,8 +211,47 @@ goog.net.xpc.IframeRelayTransport.prototype.connect = function() { goog.net.xpc.IframeRelayTransport.receiveMessage_ = function(channelName, frame) { var pos = frame.indexOf(':'); - var service = frame.substring(0, pos); - var payload = frame.substring(pos + 1); + var header = frame.substr(0, pos); + var payload = frame.substr(pos + 1); + + if (!goog.userAgent.IE || (pos = header.indexOf('|')) == -1) { + // First, the easy case. + var service = header; + } else { + // There was a fragment id in the header, so this is a message + // fragment, not a whole message. + var service = header.substr(0, pos); + var fragmentIdStr = header.substr(pos + 1); + + // Separate the message id string and the fragment number. Note that + // there may be a single leading + in the argument to parseInt, but + // this is harmless. + pos = fragmentIdStr.indexOf('+'); + var messageIdStr = fragmentIdStr.substr(0, pos); + var fragmentNum = parseInt(fragmentIdStr.substr(pos + 1), 10); + var fragmentInfo = + goog.net.xpc.IframeRelayTransport.fragmentMap_[messageIdStr]; + if (!fragmentInfo) { + fragmentInfo = + goog.net.xpc.IframeRelayTransport.fragmentMap_[messageIdStr] = + {fragments: [], received: 0, expected: 0}; + } + + if (goog.string.contains(fragmentIdStr, '++')) { + fragmentInfo.expected = fragmentNum + 1; + } + fragmentInfo.fragments[fragmentNum] = payload; + fragmentInfo.received++; + + if (fragmentInfo.received != fragmentInfo.expected) { + return; + } + + // We've received all outstanding fragments; combine what we've received + // into payload and fall out to the call to deliver_. + payload = fragmentInfo.fragments.join(''); + delete goog.net.xpc.IframeRelayTransport.fragmentMap_[messageIdStr]; + } goog.net.xpc.channels_[channelName].deliver_(service, decodeURIComponent(payload)); @@ -217,6 +283,42 @@ goog.net.xpc.IframeRelayTransport.prototype.transportServiceHandler = * @param {string} payload The message content. */ goog.net.xpc.IframeRelayTransport.prototype.send = function(service, payload) { + // If we're on IE and the post-encoding payload is large, split it + // into multiple payloads and send each one separately. Otherwise, + // just send the whole thing. + var encodedPayload = encodeURIComponent(payload); + var encodedLen = encodedPayload.length; + var maxSize = goog.net.xpc.IframeRelayTransport.IE_PAYLOAD_MAX_SIZE_; + + if (goog.userAgent.IE && encodedLen > maxSize) { + // A probabilistically-unique string used to link together all fragments + // in this message. + var messageIdStr = goog.string.getRandomString(); + + for (var startIndex = 0, fragmentNum = 0; startIndex < encodedLen; + fragmentNum++) { + var payloadFragment = encodedPayload.substr(startIndex, maxSize); + startIndex += maxSize; + var fragmentIdStr = + messageIdStr + (startIndex >= encodedLen ? '++' : '+') + fragmentNum; + this.send_(service, payloadFragment, fragmentIdStr); + } + } else { + this.send_(service, encodedPayload); + } +}; + + +/** + * Sends an encoded message or message fragment. + * @param {string} service Name of service this the message has to be delivered. + * @param {string} encodedPayload The message content, URI encoded. + * @param {string=} opt_fragmentIdStr If sending a fragment, a string that + * identifies the fragment. + * @private + */ +goog.net.xpc.IframeRelayTransport.prototype.send_ = + function(service, encodedPayload, opt_fragmentIdStr) { // IE requires that we create the onload attribute inline, otherwise the // handler is not triggered if (goog.userAgent.IE) { @@ -224,7 +326,7 @@ goog.net.xpc.IframeRelayTransport.prototype.send = function(service, payload) { div.innerHTML = ''; var ifr = div.childNodes[0]; div = null; - ifr.xpcOnload = goog.net.xpc.IframeRelayTransport.iframeLoadHandler_; + ifr['xpcOnload'] = goog.net.xpc.IframeRelayTransport.iframeLoadHandler_; } else { var ifr = this.getWindow().document.createElement('iframe'); @@ -246,15 +348,16 @@ goog.net.xpc.IframeRelayTransport.prototype.send = function(service, payload) { style.width = ifr.style.height = '0px'; style.position = 'absolute'; - // TODO(user) Split payload in multiple parts (frames) in case we are - // in IE and the constructed URL exceeds IE's 4K-limit. - var url = this.peerRelayUri_; url += '#' + this.channel_.name; if (this.peerIframeId_) { url += ',' + this.peerIframeId_; } - url += '|' + service + ':' + encodeURIComponent(payload); + url += '|' + service; + if (opt_fragmentIdStr) { + url += '|' + opt_fragmentIdStr; + } + url += ':' + encodedPayload; ifr.src = url; @@ -280,7 +383,7 @@ goog.net.xpc.IframeRelayTransport.iframeLoadHandler_ = function() { * Disposes of the transport. */ goog.net.xpc.IframeRelayTransport.prototype.disposeInternal = function() { - goog.net.xpc.IframeRelayTransport.superClass_.disposeInternal.call(this); + goog.base(this, 'disposeInternal'); if (goog.userAgent.WEBKIT) { goog.net.xpc.IframeRelayTransport.cleanup_(0); } diff --git a/contrib/closure-library/goog/net/xpc/nativemessagingtransport.js b/contrib/closure-library/goog/net/xpc/nativemessagingtransport.js index 8a7e664..6525a0d 100644 --- a/contrib/closure-library/goog/net/xpc/nativemessagingtransport.js +++ b/contrib/closure-library/goog/net/xpc/nativemessagingtransport.js @@ -26,6 +26,7 @@ goog.require('goog.net.xpc'); goog.require('goog.net.xpc.Transport'); + /** * The native messaging transport * @@ -62,6 +63,7 @@ goog.net.xpc.NativeMessagingTransport = function(channel, peerHostname, }; goog.inherits(goog.net.xpc.NativeMessagingTransport, goog.net.xpc.Transport); + /** * Flag indicating if this instance of the transport has been initialized. * @type {boolean} @@ -69,12 +71,14 @@ goog.inherits(goog.net.xpc.NativeMessagingTransport, goog.net.xpc.Transport); */ goog.net.xpc.NativeMessagingTransport.prototype.initialized_ = false; + /** * The transport type. * @type {number} */ goog.net.xpc.NativeMessagingTransport.prototype.transportType = - goog.net.xpc.TransportTypes.NATIVE_MESSAGING; + goog.net.xpc.TransportTypes.NATIVE_MESSAGING; + /** * Tracks the number of NativeMessagingTransport channels that have been @@ -86,6 +90,7 @@ goog.net.xpc.NativeMessagingTransport.prototype.transportType = */ goog.net.xpc.NativeMessagingTransport.activeCount_ = {}; + /** * Initializes this transport. Registers a listener for 'message'-events * on the document. @@ -111,6 +116,7 @@ goog.net.xpc.NativeMessagingTransport.initialize_ = function(listenWindow) { goog.net.xpc.NativeMessagingTransport.activeCount_[uid] = value + 1; }; + /** * Processes an incoming message-event. * @param {goog.events.BrowserEvent} msgEvt The message event. @@ -144,7 +150,7 @@ goog.net.xpc.NativeMessagingTransport.messageReceived_ = function(msgEvt) { // - channel has become stale (e.g. caching iframes and back clicks) var channel = goog.net.xpc.channels_[channelName]; if (channel) { - channel.deliver_(service, payload); + channel.deliver_(service, payload, msgEvt.getBrowserEvent().origin); return true; } @@ -256,7 +262,7 @@ goog.net.xpc.NativeMessagingTransport.prototype.send = function(service, * Disposes of the transport. */ goog.net.xpc.NativeMessagingTransport.prototype.disposeInternal = function() { - goog.net.xpc.NativeMessagingTransport.superClass_.disposeInternal.call(this); + goog.base(this, 'disposeInternal'); if (this.initialized_) { var listenWindow = this.getWindow(); var uid = goog.getUid(listenWindow); diff --git a/contrib/closure-library/goog/net/xpc/nativemessagingtransport_test.html b/contrib/closure-library/goog/net/xpc/nativemessagingtransport_test.html index f6f3e1a..50b346c 100644 --- a/contrib/closure-library/goog/net/xpc/nativemessagingtransport_test.html +++ b/contrib/closure-library/goog/net/xpc/nativemessagingtransport_test.html @@ -4,7 +4,7 @@ diff --git a/contrib/closure-library/goog/net/xpc/nixtransport.js b/contrib/closure-library/goog/net/xpc/nixtransport.js index ebb2cd7..5c80231 100644 --- a/contrib/closure-library/goog/net/xpc/nixtransport.js +++ b/contrib/closure-library/goog/net/xpc/nixtransport.js @@ -35,7 +35,7 @@ goog.provide('goog.net.xpc.NixTransport'); goog.require('goog.net.xpc'); goog.require('goog.net.xpc.Transport'); - +goog.require('goog.reflect'); /** @@ -92,6 +92,7 @@ goog.inherits(goog.net.xpc.NixTransport, goog.net.xpc.Transport); // reason, so we need to make these names quite unique, as they will go into // the global namespace. + /** * Global name of the Wrapper VBScript class. * Note that this class will be stored in the *global* @@ -110,6 +111,7 @@ goog.net.xpc.NixTransport.NIX_WRAPPER = 'GCXPC____NIXVBS_wrapper'; */ goog.net.xpc.NixTransport.NIX_GET_WRAPPER = 'GCXPC____NIXVBS_get_wrapper'; + /** * The name of the handle message method used by the wrapper class * when calling the transport. @@ -117,6 +119,7 @@ goog.net.xpc.NixTransport.NIX_GET_WRAPPER = 'GCXPC____NIXVBS_get_wrapper'; */ goog.net.xpc.NixTransport.NIX_HANDLE_MESSAGE = 'GCXPC____NIXJS_handle_message'; + /** * The name of the create channel method used by the wrapper class * when calling the transport. @@ -124,6 +127,7 @@ goog.net.xpc.NixTransport.NIX_HANDLE_MESSAGE = 'GCXPC____NIXJS_handle_message'; */ goog.net.xpc.NixTransport.NIX_CREATE_CHANNEL = 'GCXPC____NIXJS_create_channel'; + /** * A "unique" identifier that is stored in the wrapper * class so that the wrapper can be distinguished from @@ -132,6 +136,27 @@ goog.net.xpc.NixTransport.NIX_CREATE_CHANNEL = 'GCXPC____NIXJS_create_channel'; */ goog.net.xpc.NixTransport.NIX_ID_FIELD = 'GCXPC____NIXVBS_container'; + +/** + * Determines if the installed version of IE supports accessing window.opener + * after it has been set to a non-Window/null value. NIX relies on this being + * possible. + * @return {boolean} Whether window.opener behavior is compatible with NIX. + */ +goog.net.xpc.NixTransport.isNixSupported = function() { + var isSupported = false; + try { + var oldOpener = window.opener; + // The compiler complains (as it should!) if we set window.opener to + // something other than a window or null. + window.opener = /** @type {Window} */ ({}); + isSupported = goog.reflect.canAccessProperty(window, 'opener'); + window.opener = oldOpener; + } catch(e) { } + return isSupported; +}; + + /** * Conducts the global setup work for the NIX transport method. * This function creates and then injects into the page the @@ -232,6 +257,7 @@ goog.net.xpc.NixTransport.conductGlobalSetup_ = function(listenWindow) { } }; + /** * The transport type. * @type {number} @@ -250,6 +276,7 @@ goog.net.xpc.NixTransport.prototype.transportType = */ goog.net.xpc.NixTransport.prototype.localSetupCompleted_ = false; + /** * The NIX channel used to talk to the other page. This * object is in fact a reference to a VBScript class @@ -312,6 +339,7 @@ goog.net.xpc.NixTransport.prototype.attemptOuterSetup_ = function() { } }; + /** * Attempts to setup the channel from the perspective * of the inner (read: iframe) page. This method @@ -369,6 +397,7 @@ goog.net.xpc.NixTransport.prototype.attemptInnerSetup_ = function() { } }; + /** * Internal method called by the inner page, via the * NIX wrapper, to complete the setup of the channel. @@ -399,6 +428,7 @@ goog.net.xpc.NixTransport.prototype.createChannel_ = function(channel) { this.channel_.notifyConnected_(); }; + /** * Internal method called by the other page, via the NIX wrapper, * to deliver a message. @@ -439,6 +469,6 @@ goog.net.xpc.NixTransport.prototype.send = function(service, payload) { * Disposes of the transport. */ goog.net.xpc.NixTransport.prototype.disposeInternal = function() { - goog.net.xpc.NixTransport.superClass_.disposeInternal.call(this); + goog.base(this, 'disposeInternal'); this.nixChannel_ = null; }; diff --git a/contrib/closure-library/goog/net/xpc/testdata/inner_peer.html b/contrib/closure-library/goog/net/xpc/testdata/inner_peer.html index 4906dfe..3d9530b 100644 --- a/contrib/closure-library/goog/net/xpc/testdata/inner_peer.html +++ b/contrib/closure-library/goog/net/xpc/testdata/inner_peer.html @@ -10,7 +10,7 @@ diff --git a/contrib/closure-library/goog/net/xpc/transport.js b/contrib/closure-library/goog/net/xpc/transport.js index f0504d5..95b987f 100644 --- a/contrib/closure-library/goog/net/xpc/transport.js +++ b/contrib/closure-library/goog/net/xpc/transport.js @@ -11,6 +11,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + /** * @fileoverview Contains the base class for transports. * @@ -23,6 +24,7 @@ goog.require('goog.Disposable'); goog.require('goog.net.xpc'); + /** * The base class for transports. * @param {goog.dom.DomHelper=} opt_domHelper The dom helper to use for @@ -31,6 +33,8 @@ goog.require('goog.net.xpc'); * @extends {goog.Disposable}; */ goog.net.xpc.Transport = function(opt_domHelper) { + goog.Disposable.call(this); + /** * The dom helper to use for finding the window objects to reference. * @type {goog.dom.DomHelper} @@ -59,7 +63,7 @@ goog.net.xpc.Transport.prototype.getType = function() { /** * Returns the window associated with this transport instance. - * @return {Window} The window to use + * @return {Window} The window to use. */ goog.net.xpc.Transport.prototype.getWindow = function() { return this.domHelper_.getWindow(); diff --git a/contrib/closure-library/goog/net/xpc/xpc.js b/contrib/closure-library/goog/net/xpc/xpc.js index 1fd6fda..c74a349 100644 --- a/contrib/closure-library/goog/net/xpc/xpc.js +++ b/contrib/closure-library/goog/net/xpc/xpc.js @@ -35,10 +35,16 @@ TODO(user) - resolve fastback issues in Safari (IframeRelayTransport) */ + /** * Namespace for CrossPageChannel */ goog.provide('goog.net.xpc'); +goog.provide('goog.net.xpc.CfgFields'); +goog.provide('goog.net.xpc.ChannelStates'); +goog.provide('goog.net.xpc.TransportNames'); +goog.provide('goog.net.xpc.TransportTypes'); +goog.provide('goog.net.xpc.UriCfgFields'); goog.require('goog.debug.Logger'); @@ -74,6 +80,7 @@ goog.net.xpc.TransportNames = { // TODO(user): Add auth token support to other methods. + /** * Field names used on configuration object. * @type {Object} @@ -145,6 +152,19 @@ goog.net.xpc.CfgFields = { }; +/** + * Config properties that need to be URL sanitized. + * @type {Array}. + */ +goog.net.xpc.UriCfgFields = [ + goog.net.xpc.CfgFields.PEER_URI, + goog.net.xpc.CfgFields.LOCAL_RELAY_URI, + goog.net.xpc.CfgFields.PEER_RELAY_URI, + goog.net.xpc.CfgFields.LOCAL_POLL_URI, + goog.net.xpc.CfgFields.PEER_POLL_URI +]; + + /** * @enum {number} */ @@ -210,6 +230,7 @@ goog.net.xpc.getRandomString = function(length, opt_characters) { goog.net.xpc.randomStringCharacters_ = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + /** * The logger. * @type {goog.debug.Logger} diff --git a/contrib/closure-library/goog/object/object.js b/contrib/closure-library/goog/object/object.js index 7893bb3..fcd0990 100644 --- a/contrib/closure-library/goog/object/object.js +++ b/contrib/closure-library/goog/object/object.js @@ -219,6 +219,34 @@ goog.object.getKeys = function(obj) { }; +/** + * Get a value from an object multiple levels deep. This is useful for + * pulling values from deeply nested objects, such as JSON responses. + * Example usage: getValueByKeys(jsonObj, 'foo', 'entries', 3) + * + * @param {!Object} obj An object to get the value from. Can be array-like. + * @param {...(string|number|!Array.)} var_args A number of keys + * (as strings, or nubmers, for array-like objects). Can also be + * specified as a single array of keys. + * @return {*} The resulting value. If, at any point, the value for a key + * is undefined, returns undefined. + */ +goog.object.getValueByKeys = function(obj, var_args) { + var isArrayLike = goog.isArrayLike(var_args); + var keys = isArrayLike ? var_args : arguments; + + // Start with the 2nd parameter for the variable parameters syntax. + for (var i = isArrayLike ? 0 : 1; i < keys.length; i++) { + obj = obj[keys[i]]; + if (!goog.isDef(obj)) { + break; + } + } + + return obj; +}; + + /** * Whether the object/map/hash contains the given key. * @@ -306,10 +334,8 @@ goog.object.isEmpty = function(obj) { * @param {Object} obj The object to clear. */ goog.object.clear = function(obj) { - // Some versions of IE has problems if we delete keys from the beginning - var keys = goog.object.getKeys(obj); - for (var i = keys.length - 1; i >= 0; i--) { - goog.object.remove(obj, keys[i]); + for (var i in obj) { + delete obj[i]; } }; @@ -407,6 +433,37 @@ goog.object.clone = function(obj) { }; +/** + * Clones a value. The input may be an Object, Array, or basic type. Objects and + * arrays will be cloned recursively. + * + * WARNINGS: + * goog.object.unsafeClone does not detect reference loops. Objects + * that refer to themselves will cause infinite recursion. + * + * goog.object.unsafeClone is unaware of unique identifiers, and + * copies UIDs created by getUid into cloned results. + * + * @param {*} obj The value to clone. + * @return {*} A clone of the input value. + */ +goog.object.unsafeClone = function(obj) { + var type = goog.typeOf(obj); + if (type == 'object' || type == 'array') { + if (obj.clone) { + return obj.clone(); + } + var clone = type == 'array' ? [] : {}; + for (var key in obj) { + clone[key] = goog.object.unsafeClone(obj[key]); + } + return clone; + } + + return obj; +}; + + /** * Returns a new object in which all the keys and values are interchanged * (keys become values and values become keys). If multiple keys map to the diff --git a/contrib/closure-library/goog/object/object_test.html b/contrib/closure-library/goog/object/object_test.html index 14bb690..e3cca30 100644 --- a/contrib/closure-library/goog/object/object_test.html +++ b/contrib/closure-library/goog/object/object_test.html @@ -3,7 +3,7 @@ @@ -11,6 +11,7 @@ Closure Unit Tests - goog.object @@ -130,6 +131,59 @@ goog.object.containsKey(m2, 'c')); } +function testUnsafeClonePrimitive() { + assertEquals('cloning a primitive should return an equal primitive', + 5, goog.object.unsafeClone(5)); +} + +function testUnsafeCloneObjectThatHasACloneMethod() { + var original = { + name: 'original', + clone: goog.functions.constant({name: 'clone'}) + }; + + var clone = goog.object.unsafeClone(original); + assertEquals('original', original.name); + assertEquals('clone', clone.name); +} + +function testUnsafeCloneFlatObject() { + var original = {a: 1, b: 2, c: 3}; + var clone = goog.object.unsafeClone(original); + assertNotEquals(original, clone); + assertObjectEquals(original, clone); +} + +function testUnsafeCloneDeepObject() { + var original = { + a: 1, + b: {c: 2, d: 3}, + e: {f: {g: 4, h: 5}} + }; + var clone = goog.object.unsafeClone(original); + + assertNotEquals(original, clone); + assertNotEquals(original.b, clone.b); + assertNotEquals(original.e, clone.e); + + assertEquals(1, clone.a); + assertEquals(2, clone.b.c); + assertEquals(3, clone.b.d); + assertEquals(4, clone.e.f.g); + assertEquals(5, clone.e.f.h); +} + +function testUnsafeCloneFunctions() { + var original = { + f: goog.functions.constant('hi') + }; + var clone = goog.object.unsafeClone(original); + + assertNotEquals(original, clone); + assertEquals('hi', clone.f()); + assertEquals(original.f, clone.f); +} + function testForEach() { var m = getObject(); var s = ''; @@ -333,6 +387,44 @@ {}, goog.object.createSet([])); } +function createTestDeepObject() { + var obj = {}; + obj.a = {}; + obj.a.b = {}; + obj.a.b.c = {}; + obj.a.b.c.fooArr = [5, 6, 7, 8]; + obj.a.b.c.knownNull = null; + return obj; +} + +function testGetValueByKeys() { + var obj = createTestDeepObject(); + assertEquals(obj, goog.object.getValueByKeys(obj)); + assertEquals(obj.a, goog.object.getValueByKeys(obj, 'a')); + assertEquals(obj.a.b, goog.object.getValueByKeys(obj, 'a', 'b')); + assertEquals(obj.a.b.c, goog.object.getValueByKeys(obj, 'a', 'b', 'c')); + assertEquals(obj.a.b.c.d, + goog.object.getValueByKeys(obj, 'a', 'b', 'c', 'd')); + assertEquals(8, goog.object.getValueByKeys(obj, 'a', 'b', 'c', 'fooArr', 3)); + assertNull(goog.object.getValueByKeys(obj, 'a', 'b', 'c', 'knownNull')); + assertUndefined(goog.object.getValueByKeys(obj, 'e', 'f', 'g')); +} + +function testGetValueByKeysArraySyntax() { + var obj = createTestDeepObject(); + assertEquals(obj, goog.object.getValueByKeys(obj, [])); + assertEquals(obj.a, goog.object.getValueByKeys(obj, ['a'])); + + assertEquals(obj.a.b, goog.object.getValueByKeys(obj, ['a', 'b'])); + assertEquals(obj.a.b.c, goog.object.getValueByKeys(obj, ['a', 'b', 'c'])); + assertEquals(obj.a.b.c.d, + goog.object.getValueByKeys(obj, ['a', 'b', 'c', 'd'])); + assertEquals(8, + goog.object.getValueByKeys(obj, ['a', 'b', 'c', 'fooArr', 3])); + assertNull(goog.object.getValueByKeys(obj, ['a', 'b', 'c', 'knownNull'])); + assertUndefined(goog.object.getValueByKeys(obj, 'e', 'f', 'g')); +} + diff --git a/contrib/closure-library/goog/positioning/anchoredposition.js b/contrib/closure-library/goog/positioning/anchoredposition.js index cd597e9..96dfa20 100644 --- a/contrib/closure-library/goog/positioning/anchoredposition.js +++ b/contrib/closure-library/goog/positioning/anchoredposition.js @@ -24,6 +24,7 @@ goog.require('goog.positioning'); goog.require('goog.positioning.AbstractPosition'); + /** * Encapsulates a popup position where the popup is anchored at a corner of * an element. diff --git a/contrib/closure-library/goog/positioning/anchoredviewportposition.js b/contrib/closure-library/goog/positioning/anchoredviewportposition.js index 345fc99..07b1d70 100644 --- a/contrib/closure-library/goog/positioning/anchoredviewportposition.js +++ b/contrib/closure-library/goog/positioning/anchoredviewportposition.js @@ -19,6 +19,7 @@ goog.provide('goog.positioning.AnchoredViewportPosition'); +goog.require('goog.functions'); goog.require('goog.math.Box'); goog.require('goog.positioning'); goog.require('goog.positioning.AnchoredPosition'); @@ -27,10 +28,11 @@ goog.require('goog.positioning.Overflow'); goog.require('goog.positioning.OverflowStatus'); + /** * Encapsulates a popup position where the popup is anchored at a corner of * an element. The corners are swapped if dictated by the viewport. For instance - * if a popup is anchored with it's top left corner to the bottom left corner of + * if a popup is anchored with its top left corner to the bottom left corner of * the anchor the popup is either displayed below the anchor (as specified) or * above it if there's not enough room to display it below. * @@ -64,6 +66,18 @@ goog.inherits(goog.positioning.AnchoredViewportPosition, goog.positioning.AnchoredPosition); +/** + * @return {number} A bitmask for the "last resort" overflow. Only takes affect + * when {@code opt_adjusted} in the constructor is enabled. + * @protected + */ +goog.positioning.AnchoredViewportPosition.prototype.getLastResortOverflow = + function() { + return goog.positioning.Overflow.ADJUST_X | + goog.positioning.Overflow.ADJUST_Y; +}; + + /** * Repositions the movable element. * @@ -73,6 +87,7 @@ goog.inherits(goog.positioning.AnchoredViewportPosition, * @param {goog.math.Box=} opt_margin A margin specified in pixels. * @param {goog.math.Size=} opt_preferredSize The preferred size of the * movableElement. + * @override */ goog.positioning.AnchoredViewportPosition.prototype.reposition = function( movableElement, movableCorner, opt_margin, opt_preferredSize) { @@ -84,20 +99,8 @@ goog.positioning.AnchoredViewportPosition.prototype.reposition = function( // If the desired position is outside the viewport try mirroring the corners // horizontally or vertically. if (status & goog.positioning.OverflowStatus.FAILED) { - var cornerFallback = this.corner; - var movableCornerFallback = movableCorner; - - if (status & goog.positioning.OverflowStatus.FAILED_HORIZONTAL) { - cornerFallback = goog.positioning.flipCornerHorizontal(cornerFallback); - movableCornerFallback = goog.positioning.flipCornerHorizontal( - movableCornerFallback); - } - - if (status & goog.positioning.OverflowStatus.FAILED_VERTICAL) { - cornerFallback = goog.positioning.flipCornerVertical(cornerFallback); - movableCornerFallback = goog.positioning.flipCornerVertical( - movableCornerFallback); - } + var cornerFallback = this.correctCorner_(status, this.corner); + var movableCornerFallback = this.correctCorner_(status, movableCorner); status = goog.positioning.positionAtAnchor(this.element, cornerFallback, movableElement, movableCornerFallback, null, opt_margin, @@ -105,21 +108,46 @@ goog.positioning.AnchoredViewportPosition.prototype.reposition = function( opt_preferredSize); if (status & goog.positioning.OverflowStatus.FAILED) { - // If that also fails adjust the position until it fits. + // If that also fails, pick the best corner from the two tries, + // and adjust the position until it fits. + cornerFallback = this.correctCorner_(status, cornerFallback); + movableCornerFallback = this.correctCorner_( + status, movableCornerFallback); + if (this.adjust_) { - goog.positioning.positionAtAnchor(this.element, this.corner, - movableElement, movableCorner, null, opt_margin, - goog.positioning.Overflow.ADJUST_X | - goog.positioning.Overflow.ADJUST_Y, opt_preferredSize); + goog.positioning.positionAtAnchor(this.element, cornerFallback, + movableElement, movableCornerFallback, null, opt_margin, + this.getLastResortOverflow(), opt_preferredSize); // Or display it anyway at the preferred position, if the adjust option // was not enabled. } else { - goog.positioning.positionAtAnchor(this.element, this.corner, - movableElement, movableCorner, null, opt_margin, + goog.positioning.positionAtAnchor(this.element, cornerFallback, + movableElement, movableCornerFallback, null, opt_margin, goog.positioning.Overflow.IGNORE, opt_preferredSize); } } } }; + +/** + * Flip the given corner if X or Y positioning failed. + * @param {number} status The status of the last positionAtAnchor call. + * @param {goog.positioning.Corner} corner The corner to correct. + * @return {goog.positioning.Corner} The new corner. + * @private + */ +goog.positioning.AnchoredViewportPosition.prototype.correctCorner_ = function( + status, corner) { + if (status & goog.positioning.OverflowStatus.FAILED_HORIZONTAL) { + corner = goog.positioning.flipCornerHorizontal(corner); + } + + if (status & goog.positioning.OverflowStatus.FAILED_VERTICAL) { + corner = goog.positioning.flipCornerVertical(corner); + } + + return corner; +}; + diff --git a/contrib/closure-library/goog/positioning/anchoredviewportposition_test.html b/contrib/closure-library/goog/positioning/anchoredviewportposition_test.html index 71112bf..37e5f18 100644 --- a/contrib/closure-library/goog/positioning/anchoredviewportposition_test.html +++ b/contrib/closure-library/goog/positioning/anchoredviewportposition_test.html @@ -6,7 +6,7 @@ diff --git a/contrib/closure-library/goog/positioning/anchoredviewportposition_test_iframe.html b/contrib/closure-library/goog/positioning/anchoredviewportposition_test_iframe.html index afe130c..a9b7e5e 100644 --- a/contrib/closure-library/goog/positioning/anchoredviewportposition_test_iframe.html +++ b/contrib/closure-library/goog/positioning/anchoredviewportposition_test_iframe.html @@ -6,7 +6,7 @@ diff --git a/contrib/closure-library/goog/positioning/menuanchoredposition.js b/contrib/closure-library/goog/positioning/menuanchoredposition.js index aa2f841..91182fa 100644 --- a/contrib/closure-library/goog/positioning/menuanchoredposition.js +++ b/contrib/closure-library/goog/positioning/menuanchoredposition.js @@ -28,6 +28,7 @@ goog.require('goog.positioning.Corner'); goog.require('goog.positioning.Overflow'); + /** * Encapsulates a popup position where the popup is anchored at a corner of * an element. The positioning behavior changes based on the values of @@ -54,7 +55,7 @@ goog.positioning.MenuAnchoredPosition = function(anchorElement, opt_adjust, opt_resize) { goog.positioning.AnchoredViewportPosition.call(this, anchorElement, corner, - opt_adjust); + opt_adjust || opt_resize); /** * Whether the positioning should be adjusted until the element fits inside * the viewport even if that means that the anchored corners are ignored. @@ -67,30 +68,12 @@ goog.inherits(goog.positioning.MenuAnchoredPosition, goog.positioning.AnchoredViewportPosition); -/** - * Repositions the movable element. - * - * @param {Element} movableElement Element to position. - * @param {goog.positioning.Corner} movableCorner Corner of the movable element - * that should be positioned adjacent to the anchored element. - * @param {goog.math.Box=} opt_margin A margin specifin pixels. - * @param {goog.math.Size=} opt_preferredSize Preferred size of the - * moveableElement. - */ -goog.positioning.MenuAnchoredPosition.prototype.reposition = - function(movableElement, movableCorner, opt_margin, opt_preferredSize) { - - if (this.resize_) { - goog.positioning.positionAtAnchor(this.element, this.corner, - movableElement, movableCorner, null, opt_margin, - goog.positioning.Overflow.ADJUST_X | - goog.positioning.Overflow.RESIZE_HEIGHT, opt_preferredSize); - } else { - goog.positioning.MenuAnchoredPosition.superClass_.reposition.call( - this, - movableElement, - movableCorner, - opt_margin, - opt_preferredSize); - } +/** @inheritDoc */ +goog.positioning.MenuAnchoredPosition.prototype.getLastResortOverflow = + function() { + var overflowX = goog.positioning.Overflow.ADJUST_X_EXCEPT_OFFSCREEN; + var overflowY = this.resize_ ? + goog.positioning.Overflow.RESIZE_HEIGHT : + goog.positioning.Overflow.ADJUST_Y_EXCEPT_OFFSCREEN; + return overflowX | overflowY; }; diff --git a/contrib/closure-library/goog/positioning/menuanchoredposition_test.html b/contrib/closure-library/goog/positioning/menuanchoredposition_test.html new file mode 100644 index 0000000..3f78d5a --- /dev/null +++ b/contrib/closure-library/goog/positioning/menuanchoredposition_test.html @@ -0,0 +1,119 @@ + + + + + +Closure Unit Tests - goog.positioning.MenuAnchoredPosition + + + + + + +
    + +
    + + +
    + + + + + + diff --git a/contrib/closure-library/goog/positioning/positioning.js b/contrib/closure-library/goog/positioning/positioning.js index 838a066..0e21961 100644 --- a/contrib/closure-library/goog/positioning/positioning.js +++ b/contrib/closure-library/goog/positioning/positioning.js @@ -31,7 +31,6 @@ goog.require('goog.math.Size'); goog.require('goog.style'); - /** * Enum for representing an element corner for positioning the popup. * @@ -72,13 +71,38 @@ goog.positioning.CornerBit = { * @enum {number} */ goog.positioning.Overflow = { + /** Ignore overflow */ IGNORE: 0, + + /** Try to fit horizontally in the viewport at all costs. */ ADJUST_X: 1, + + /** If the element can't fit horizontally, report positioning failure. */ FAIL_X: 2, + + /** Try to fit vertically in the viewport at all costs. */ ADJUST_Y: 4, + + /** If the element can't fit vertically, report positioning failure. */ FAIL_Y: 8, + + /** Resize the element's width to fit in the viewport. */ RESIZE_WIDTH: 16, - RESIZE_HEIGHT: 32 + + /** Resize the element's height to fit in the viewport. */ + RESIZE_HEIGHT: 32, + + /** + * If the anchor goes off-screen in the x-direction, position the movable + * element off-screen. Otherwise, try to fit horizontally in the viewport. + */ + ADJUST_X_EXCEPT_OFFSCREEN: 64 | 1, + + /** + * If the anchor goes off-screen in the y-direction, position the movable + * element off-screen. Otherwise, try to fit vertically in the viewport. + */ + ADJUST_Y_EXCEPT_OFFSCREEN: 128 | 4 }; @@ -305,7 +329,7 @@ goog.positioning.positionAtCoordinate = function(absolutePos, movableElementCorner); var elementSize = goog.style.getSize(movableElement); var size = opt_preferredSize ? opt_preferredSize.clone() : - elementSize; + elementSize.clone(); if (opt_margin || corner != goog.positioning.Corner.TOP_LEFT) { if (corner & goog.positioning.CornerBit.RIGHT) { @@ -322,10 +346,9 @@ goog.positioning.positionAtCoordinate = function(absolutePos, // Adjust position to fit inside viewport. if (opt_overflow) { - status = opt_viewport ? goog.positioning.adjustForViewport(absolutePos, - size, - opt_viewport, - opt_overflow) : + status = opt_viewport ? + goog.positioning.adjustForViewport( + absolutePos, size, opt_viewport, opt_overflow) : goog.positioning.OverflowStatus.FAILED_OUTSIDE_VIEWPORT; if (status & goog.positioning.OverflowStatus.FAILED) { return status; @@ -359,6 +382,19 @@ goog.positioning.positionAtCoordinate = function(absolutePos, goog.positioning.adjustForViewport = function(pos, size, viewport, overflow) { var status = goog.positioning.OverflowStatus.NONE; + var ADJUST_X_EXCEPT_OFFSCREEN = + goog.positioning.Overflow.ADJUST_X_EXCEPT_OFFSCREEN; + var ADJUST_Y_EXCEPT_OFFSCREEN = + goog.positioning.Overflow.ADJUST_Y_EXCEPT_OFFSCREEN; + if ((overflow & ADJUST_X_EXCEPT_OFFSCREEN) == ADJUST_X_EXCEPT_OFFSCREEN && + (pos.x < viewport.left || pos.x >= viewport.right)) { + overflow &= ~goog.positioning.Overflow.ADJUST_X; + } + if ((overflow & ADJUST_Y_EXCEPT_OFFSCREEN) == ADJUST_Y_EXCEPT_OFFSCREEN && + (pos.y < viewport.top || pos.y >= viewport.bottom)) { + overflow &= ~goog.positioning.Overflow.ADJUST_Y; + } + // Left edge outside viewport, try to move it. if (pos.x < viewport.left && overflow & goog.positioning.Overflow.ADJUST_X) { pos.x = viewport.left; diff --git a/contrib/closure-library/goog/positioning/positioning_test.html b/contrib/closure-library/goog/positioning/positioning_test.html index 3083d8f..4e4b891 100644 --- a/contrib/closure-library/goog/positioning/positioning_test.html +++ b/contrib/closure-library/goog/positioning/positioning_test.html @@ -1,13 +1,11 @@ - @@ -19,8 +17,10 @@ goog.require('goog.math.Rect'); goog.require('goog.style'); goog.require('goog.positioning'); +goog.require('goog.testing.ExpectedFailures'); goog.require('goog.testing.jsunit'); goog.require('goog.userAgent'); +goog.require('goog.userAgent.product'); + + + + + + + + + + + + +
    Column HeadSecond Head
    First rowSecond column
    + + + + diff --git a/contrib/closure-library/goog/ui/editor/abstractdialog.js b/contrib/closure-library/goog/ui/editor/abstractdialog.js index a2693e3..4b73802 100644 --- a/contrib/closure-library/goog/ui/editor/abstractdialog.js +++ b/contrib/closure-library/goog/ui/editor/abstractdialog.js @@ -34,6 +34,8 @@ goog.require('goog.ui.Dialog.EventType'); // *** Public interface ***************************************************** // + + /** * Creates an object that represents a dialog box. * @param {goog.dom.DomHelper} domHelper DomHelper to be used to create the @@ -63,6 +65,7 @@ goog.ui.editor.AbstractDialog.prototype.show = function() { this.dialogInternal_.setVisible(true); }; + /** * Hides the dialog, causing AFTER_HIDE to fire. */ @@ -74,6 +77,7 @@ goog.ui.editor.AbstractDialog.prototype.hide = function() { } }; + /** * @return {boolean} Whether the dialog is open. */ @@ -102,6 +106,7 @@ goog.ui.editor.AbstractDialog.prototype.processOkAndClose = function() { // *** Dialog events ******************************************************** // + /** * Event type constants for events the dialog fires. * @enum {string} @@ -119,6 +124,8 @@ goog.ui.editor.AbstractDialog.EventType = { // *** Inner helper class *************************************************** // + + /** * A builder class for the dialog control. All methods except build return this. * @param {goog.ui.editor.AbstractDialog} editorDialog Editor dialog object @@ -135,6 +142,7 @@ goog.ui.editor.AbstractDialog.Builder = function(editorDialog) { this.addClassName(goog.getCssName('tr-dialog')); }; + /** * Sets the title of the dialog. * @param {string} title Title HTML (escaped). @@ -145,6 +153,7 @@ goog.ui.editor.AbstractDialog.Builder.prototype.setTitle = function(title) { return this; }; + /** * Adds an OK button to the dialog. Clicking this button will cause {@link * handleOk} to run, subsequently dispatching an OK event. @@ -163,6 +172,7 @@ goog.ui.editor.AbstractDialog.Builder.prototype.addOkButton = return this; }; + /** * Adds a Cancel button to the dialog. Clicking this button will cause {@link * handleCancel} to run, subsequently dispatching a CANCEL event. @@ -181,6 +191,7 @@ goog.ui.editor.AbstractDialog.Builder.prototype.addCancelButton = return this; }; + /** * Adds a custom button to the dialog. * @param {string} label The caption for the button. @@ -202,6 +213,7 @@ goog.ui.editor.AbstractDialog.Builder.prototype.addButton = return this; }; + /** * Puts a CSS class on the dialog's main element. * @param {string} className The class to add. @@ -213,6 +225,7 @@ goog.ui.editor.AbstractDialog.Builder.prototype.addClassName = return this; }; + /** * Sets the content element of the dialog. * @param {Element} contentElem An element for the main body. @@ -224,6 +237,7 @@ goog.ui.editor.AbstractDialog.Builder.prototype.setContent = return this; }; + /** * Builds the wrapped dialog control. May only be called once, after which * no more methods may be called on this builder. @@ -256,6 +270,7 @@ goog.ui.editor.AbstractDialog.Builder.prototype.build = function() { return dialog; }; + /** * Editor dialog that will wrap the wrapped dialog this builder will create. * @type {goog.ui.editor.AbstractDialog} @@ -263,6 +278,7 @@ goog.ui.editor.AbstractDialog.Builder.prototype.build = function() { */ goog.ui.editor.AbstractDialog.Builder.prototype.editorDialog_; + /** * wrapped dialog control being built by this builder. * @type {goog.ui.Dialog} @@ -270,6 +286,7 @@ goog.ui.editor.AbstractDialog.Builder.prototype.editorDialog_; */ goog.ui.editor.AbstractDialog.Builder.prototype.wrappedDialog_; + /** * Set of buttons to be added to the wrapped dialog control. * @type {goog.ui.Dialog.ButtonSet} @@ -277,6 +294,7 @@ goog.ui.editor.AbstractDialog.Builder.prototype.wrappedDialog_; */ goog.ui.editor.AbstractDialog.Builder.prototype.buttonSet_; + /** * Map from keys that will be returned in the wrapped dialog SELECT events to * handler functions to be called to handle those events. @@ -288,6 +306,7 @@ goog.ui.editor.AbstractDialog.Builder.prototype.buttonHandlers_; // *** Protected interface ************************************************** // + /** * The DOM helper for the parent document. * @type {goog.dom.DomHelper} @@ -305,6 +324,7 @@ goog.ui.editor.AbstractDialog.prototype.dom; goog.ui.editor.AbstractDialog.prototype.createDialogControl = goog.abstractMethod; + /** * Returns the HTML Button element for the OK button in this dialog. * @return {Element} The button element if found, else null. @@ -314,6 +334,7 @@ goog.ui.editor.AbstractDialog.prototype.getOkButtonElement = function() { return this.getButtonElement(goog.ui.Dialog.DefaultButtonKeys.OK); }; + /** * Returns the HTML Button element for the Cancel button in this dialog. * @return {Element} The button element if found, else null. @@ -323,6 +344,7 @@ goog.ui.editor.AbstractDialog.prototype.getCancelButtonElement = function() { return this.getButtonElement(goog.ui.Dialog.DefaultButtonKeys.CANCEL); }; + /** * Returns the HTML Button element for the button added to this dialog with * the given button id. @@ -348,6 +370,7 @@ goog.ui.editor.AbstractDialog.prototype.getButtonElement = function(buttonId) { */ goog.ui.editor.AbstractDialog.prototype.createOkEvent = goog.abstractMethod; + /** * Handles the event dispatched by the wrapped dialog control when the user * clicks the OK button. Attempts to create the OK event object and dispatches @@ -368,6 +391,7 @@ goog.ui.editor.AbstractDialog.prototype.handleOk = function(e) { } }; + /** * Handles the event dispatched by the wrapped dialog control when the user * clicks the Cancel button. Simply dispatches a CANCEL event. @@ -400,6 +424,7 @@ goog.ui.editor.AbstractDialog.prototype.disposeInternal = function() { // *** Private implementation *********************************************** // + /** * The wrapped dialog widget. * @type {goog.ui.Dialog} diff --git a/contrib/closure-library/goog/ui/editor/abstractdialog_test.html b/contrib/closure-library/goog/ui/editor/abstractdialog_test.html index 8849d8a..97aa447 100644 --- a/contrib/closure-library/goog/ui/editor/abstractdialog_test.html +++ b/contrib/closure-library/goog/ui/editor/abstractdialog_test.html @@ -9,7 +9,7 @@ @@ -27,11 +27,17 @@ goog.require('goog.ui.editor.AbstractDialog'); goog.require('goog.ui.editor.AbstractDialog.Builder'); goog.require('goog.ui.editor.AbstractDialog.EventType'); + goog.require('goog.userAgent'); @@ -32,6 +35,17 @@ var submits; var originalCreateDom = goog.ui.FormPost.prototype.createDom; + function isChrome7or8() { + // Temporarily disabled in Chrome 7 & 8. See b/3176768 + if (goog.userAgent.product.CHROME && + goog.userAgent.product.isVersion('7.0') && + !goog.userAgent.product.isVersion('8.0')) { + return false; + } + + return true; + } + function setUp() { formPost = new goog.ui.FormPost(); submits = 0; @@ -56,6 +70,10 @@ } function testPostWithDefaults() { + // Temporarily disabled in Chrome 7. See See b/3176768 + if (isChrome7or8) { + return; + } formPost = new goog.ui.FormPost(); formPost.post(parameters); expectUrlAndParameters_('', '', parameters); diff --git a/contrib/closure-library/goog/ui/gauge.js b/contrib/closure-library/goog/ui/gauge.js index dc845bd..4404c9e 100644 --- a/contrib/closure-library/goog/ui/gauge.js +++ b/contrib/closure-library/goog/ui/gauge.js @@ -34,6 +34,7 @@ goog.require('goog.ui.Component'); goog.require('goog.ui.GaugeTheme'); + /** * Information on how to decorate a range in the gauge. * This is an internal-only class. @@ -66,6 +67,7 @@ goog.ui.GaugeColoredRange = function(fromValue, toValue, backgroundColor) { }; + /** * A UI component that displays a gauge. * A gauge displayes a current value within a round axis that represents a diff --git a/contrib/closure-library/goog/ui/gaugetheme.js b/contrib/closure-library/goog/ui/gaugetheme.js index 2bd80ed..cc04f43 100644 --- a/contrib/closure-library/goog/ui/gaugetheme.js +++ b/contrib/closure-library/goog/ui/gaugetheme.js @@ -26,6 +26,7 @@ goog.require('goog.graphics.SolidFill'); goog.require('goog.graphics.Stroke'); + /** * A class for the default color theme for a Gauge. * Users can extend this class to provide a custom color theme, and apply the diff --git a/contrib/closure-library/goog/ui/hovercard_test.html b/contrib/closure-library/goog/ui/hovercard_test.html index 424c3be..27edee5 100644 --- a/contrib/closure-library/goog/ui/hovercard_test.html +++ b/contrib/closure-library/goog/ui/hovercard_test.html @@ -2,7 +2,7 @@ diff --git a/contrib/closure-library/goog/ui/hsvapalette_test.html b/contrib/closure-library/goog/ui/hsvapalette_test.html index aede542..8a7eb9f 100644 --- a/contrib/closure-library/goog/ui/hsvapalette_test.html +++ b/contrib/closure-library/goog/ui/hsvapalette_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/ui/iframemask.js b/contrib/closure-library/goog/ui/iframemask.js index 8697eac..2e70222 100644 --- a/contrib/closure-library/goog/ui/iframemask.js +++ b/contrib/closure-library/goog/ui/iframemask.js @@ -31,6 +31,7 @@ goog.require('goog.events.EventTarget'); goog.require('goog.style'); + /** * Controller for an iframe mask. The mask is only valid in the current * document, or else the document of the given DOM helper. @@ -44,6 +45,7 @@ goog.require('goog.style'); * @extends {goog.Disposable} */ goog.ui.IframeMask = function(opt_domHelper, opt_iframePool) { + goog.Disposable.call(this); /** * The DOM helper for this document. @@ -121,6 +123,7 @@ goog.ui.IframeMask.prototype.disposeInternal = function() { goog.ui.IframeMask.superClass_.disposeInternal.call(this); }; + /** * CSS for a hidden iframe. * @type {string} diff --git a/contrib/closure-library/goog/ui/iframemask_test.html b/contrib/closure-library/goog/ui/iframemask_test.html index 8331b65..eeea52b 100644 --- a/contrib/closure-library/goog/ui/iframemask_test.html +++ b/contrib/closure-library/goog/ui/iframemask_test.html @@ -3,7 +3,7 @@ @@ -232,12 +232,8 @@ callCount++; }); - try { - fire(KeyCodes.X); - fail('Expected exception'); - } catch (e) { - assertContains(e.message, 'x'); - } + var e = assertThrows(goog.partial(fire, KeyCodes.X)); + assertEquals('x', e.message); assertEquals(1, callCount); } diff --git a/contrib/closure-library/goog/ui/labelinput.js b/contrib/closure-library/goog/ui/labelinput.js index 5def30e..eba08b8 100644 --- a/contrib/closure-library/goog/ui/labelinput.js +++ b/contrib/closure-library/goog/ui/labelinput.js @@ -31,7 +31,6 @@ goog.provide('goog.ui.LabelInput'); - goog.require('goog.Timer'); goog.require('goog.dom'); goog.require('goog.dom.classes'); @@ -41,6 +40,7 @@ goog.require('goog.events.EventType'); goog.require('goog.ui.Component'); + /** * This creates the label input object. * @param {string=} opt_label The text to show as the label. @@ -81,7 +81,7 @@ goog.ui.LabelInput.prototype.eventHandler_; * @type {boolean} * @private */ -goog.ui.LabelInput.prototype.hasFocus_; +goog.ui.LabelInput.prototype.hasFocus_ = false; /** @@ -132,6 +132,7 @@ goog.ui.LabelInput.prototype.exitDocument = function() { this.getElement().labelInput_ = null; }; + /** * Attaches the events we need to listen to. * @private @@ -142,9 +143,11 @@ goog.ui.LabelInput.prototype.attachEvents_ = function() { eh.listen(this.getElement(), goog.events.EventType.BLUR, this.handleBlur_); if (goog.userAgent.GECKO) { - eh.listen(this.getElement(), [goog.events.EventType.KEYPRESS, - goog.events.EventType.KEYDOWN, goog.events.EventType.KEYUP], - this.handleEscapeKeys_); + eh.listen(this.getElement(), [ + goog.events.EventType.KEYPRESS, + goog.events.EventType.KEYDOWN, + goog.events.EventType.KEYUP + ], this.handleEscapeKeys_); } // IE sets defaultValue upon load so we need to test that as well. @@ -229,6 +232,12 @@ goog.ui.LabelInput.prototype.handleFocus_ = function(e) { * @private */ goog.ui.LabelInput.prototype.handleBlur_ = function(e) { + // We listen to the click event when we enter focusAndSelect mode so we can + // fake an artificial focus when the user clicks on the input box. However, + // if the user clicks on something else (and we lose focus), there is no + // need for an artificial focus event. + this.eventHandler_.unlisten( + this.getElement(), goog.events.EventType.CLICK, this.handleFocus_); this.ffKeyRestoreValue_ = null; this.hasFocus_ = false; this.check_(); @@ -266,7 +275,6 @@ goog.ui.LabelInput.prototype.handleEscapeKeys_ = function(e) { }; - /** * Handler for the submit event of the form element. * @param {goog.events.Event} e The event object passed in to the event handler. @@ -364,6 +372,27 @@ goog.ui.LabelInput.prototype.getValue = function() { }; +/** + * Sets the label text. + * @param {string} label The text to show as the label. + */ +goog.ui.LabelInput.prototype.setLabel = function(label) { + if (this.getElement() && !this.hasChanged()) { + this.getElement().value = ''; + } + this.label_ = label; + this.restoreLabel_(); +}; + + +/** + * @return {string} The text to show as the label. + */ +goog.ui.LabelInput.prototype.getLabel = function() { + return this.label_; +}; + + /** * Checks the state of the input element * @private @@ -399,6 +428,16 @@ goog.ui.LabelInput.prototype.focusAndSelect = function() { this.getElement().value = this.label_; } this.getElement().select(); + + // Since the object now has focus, we won't get a focus event when they + // click in the input element. The expected behavior when you click on + // the default text is that it goes away and allows you to type...so we + // have to fire an artificial focus event when we're in focusAndSelect mode. + if (this.eventHandler_) { + this.eventHandler_.listenOnce( + this.getElement(), goog.events.EventType.CLICK, this.handleFocus_); + } + // set to false in timer to let IE trigger the focus event goog.Timer.callOnce(this.focusAndSelect_, 10, this); }; diff --git a/contrib/closure-library/goog/ui/labelinput_test.html b/contrib/closure-library/goog/ui/labelinput_test.html new file mode 100644 index 0000000..67f2d21 --- /dev/null +++ b/contrib/closure-library/goog/ui/labelinput_test.html @@ -0,0 +1,58 @@ + + + + + +Closure Unit Tests - goog.ui.LabelInput + + + + + + + diff --git a/contrib/closure-library/goog/ui/media/flashobject.js b/contrib/closure-library/goog/ui/media/flashobject.js index f3c7437..f5b4190 100644 --- a/contrib/closure-library/goog/ui/media/flashobject.js +++ b/contrib/closure-library/goog/ui/media/flashobject.js @@ -56,6 +56,7 @@ goog.require('goog.userAgent'); goog.require('goog.userAgent.flash'); + /** * A very simple flash wrapper, that allows you to create flash object * programmatically, instead of embedding your own HTML. It extends @@ -138,6 +139,7 @@ goog.ui.media.FlashObject.Wmodes = { WINDOW: 'window' }; + /** * The different levels of allowScriptAccess. * @@ -164,6 +166,7 @@ goog.ui.media.FlashObject.ScriptAccessLevel = { NEVER: 'never' }; + /** * The component CSS namespace. * diff --git a/contrib/closure-library/goog/ui/media/flashobject_test.html b/contrib/closure-library/goog/ui/media/flashobject_test.html index 7e3de4e..a0ef187 100644 --- a/contrib/closure-library/goog/ui/media/flashobject_test.html +++ b/contrib/closure-library/goog/ui/media/flashobject_test.html @@ -3,7 +3,7 @@ + + + +Closure Unit Tests - goog.ui.media.GoogleVideo + + + + + + + diff --git a/contrib/closure-library/goog/ui/media/media.js b/contrib/closure-library/goog/ui/media/media.js index 662a8b5..be18607 100644 --- a/contrib/closure-library/goog/ui/media/media.js +++ b/contrib/closure-library/goog/ui/media/media.js @@ -100,6 +100,7 @@ goog.require('goog.ui.Control'); goog.require('goog.ui.ControlRenderer'); + /** * Provides the control mechanism of media types. * @@ -123,6 +124,10 @@ goog.ui.media.Media = function(dataModel, opt_renderer, opt_domHelper) { // e.preventDefault(), because it was not allowing the event to reach the // flash player. figure out a better way to not e.preventDefault(). this.setAllowTextSelection(true); + + // Media items don't use RTL styles, so avoid accessing computed styles to + // figure out if the control is RTL. + this.setRightToLeft(false); }; goog.inherits(goog.ui.media.Media, goog.ui.Control); @@ -155,6 +160,7 @@ goog.ui.media.Media.prototype.getDataModel = function() { }; + /** * Base class of all media renderers. Provides the common renderer functionality * of medias. diff --git a/contrib/closure-library/goog/ui/media/media_test.html b/contrib/closure-library/goog/ui/media/media_test.html index 2b46f6d..f048a99 100644 --- a/contrib/closure-library/goog/ui/media/media_test.html +++ b/contrib/closure-library/goog/ui/media/media_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/ui/menubuttonrenderer.js b/contrib/closure-library/goog/ui/menubuttonrenderer.js index f7f57a2..09ed871 100644 --- a/contrib/closure-library/goog/ui/menubuttonrenderer.js +++ b/contrib/closure-library/goog/ui/menubuttonrenderer.js @@ -28,6 +28,7 @@ goog.require('goog.ui.MenuRenderer'); goog.require('goog.userAgent'); + /** * Renderer for {@link goog.ui.MenuButton}s. This implementation overrides * {@link goog.ui.CustomButtonRenderer#createButton} to create a separate diff --git a/contrib/closure-library/goog/ui/menubuttonrenderer_test.html b/contrib/closure-library/goog/ui/menubuttonrenderer_test.html index 4fa641c..97293b0 100644 --- a/contrib/closure-library/goog/ui/menubuttonrenderer_test.html +++ b/contrib/closure-library/goog/ui/menubuttonrenderer_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/ui/popup.js b/contrib/closure-library/goog/ui/popup.js index f9f5e62..5f4b861 100644 --- a/contrib/closure-library/goog/ui/popup.js +++ b/contrib/closure-library/goog/ui/popup.js @@ -263,7 +263,6 @@ goog.ui.Popup.positionPopup = function(anchorElement, anchorElementCorner, }; - /** * Positions the specified corner of the movable element at the * specified coordinate. @@ -309,6 +308,7 @@ goog.ui.Popup.positionAtCoordinate = function(absolutePos, movableElement, goog.ui.Popup.AnchoredPosition = goog.positioning.AnchoredPosition; + /** * Encapsulates a popup position where the popup is anchored at a corner of * an element. The corners are swapped if dictated by the viewport. For instance @@ -336,6 +336,7 @@ goog.ui.Popup.AnchoredViewPortPosition = goog.positioning.AnchoredViewportPosition; + /** * Encapsulates a popup position where the popup absolutely positioned by * setting the left/top style elements directly to the specified values. @@ -354,6 +355,7 @@ goog.ui.Popup.AnchoredViewPortPosition = goog.ui.Popup.AbsolutePosition = goog.positioning.AbsolutePosition; + /** * Encapsulates a popup position where the popup is positioned according to * coordinates relative to the element's view port (page). This calculates the @@ -371,6 +373,7 @@ goog.ui.Popup.AbsolutePosition = goog.positioning.AbsolutePosition; goog.ui.Popup.ViewPortPosition = goog.positioning.ViewportPosition; + /** * Encapsulates a popup position where the popup is positioned relative to the * window (client) coordinates. This calculates the correct position to @@ -390,6 +393,7 @@ goog.ui.Popup.ViewPortPosition = goog.positioning.ViewportPosition; goog.ui.Popup.ClientPosition = goog.positioning.ClientPosition; + /** * Encapsulates a popup position where the popup is positioned relative to the * window (client) coordinates, and made to stay within the viewport. diff --git a/contrib/closure-library/goog/ui/popup_test.html b/contrib/closure-library/goog/ui/popup_test.html index 8c97c6c..83c2d83 100644 --- a/contrib/closure-library/goog/ui/popup_test.html +++ b/contrib/closure-library/goog/ui/popup_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/ui/popupbase.js b/contrib/closure-library/goog/ui/popupbase.js index 1d60103..30055d8 100644 --- a/contrib/closure-library/goog/ui/popupbase.js +++ b/contrib/closure-library/goog/ui/popupbase.js @@ -31,6 +31,7 @@ goog.require('goog.style'); goog.require('goog.userAgent'); + /** * The PopupBase class provides functionality for showing and hiding a generic * container element. It also provides the option for hiding the popup element @@ -42,6 +43,8 @@ goog.require('goog.userAgent'); * @param {goog.ui.PopupBase.Type=} opt_type Type of popup. */ goog.ui.PopupBase = function(opt_element, opt_type) { + goog.events.EventTarget.call(this); + /** * An event handler to manage the events easily * @type {goog.events.EventHandler} @@ -56,6 +59,7 @@ goog.ui.PopupBase = function(opt_element, opt_type) { }; goog.inherits(goog.ui.PopupBase, goog.events.EventTarget); + /** * Constants for type of Popup * @enum {string} @@ -65,6 +69,7 @@ goog.ui.PopupBase.Type = { MOVE_OFFSCREEN: 'move_offscreen' }; + /** * The popup dom element that this Popup wraps. * @type {Element} @@ -72,6 +77,7 @@ goog.ui.PopupBase.Type = { */ goog.ui.PopupBase.prototype.element_ = null; + /** * Whether the Popup dismisses itself it the user clicks outside of it or the * popup loses focus @@ -80,6 +86,7 @@ goog.ui.PopupBase.prototype.element_ = null; */ goog.ui.PopupBase.prototype.autoHide_ = true; + /** * Clicks outside the popup but inside this element will cause the popup to * hide if autoHide_ is true. If this is null, then the entire document is used. @@ -90,6 +97,7 @@ goog.ui.PopupBase.prototype.autoHide_ = true; */ goog.ui.PopupBase.prototype.autoHideRegion_ = null; + /** * Whether the popup is currently being shown. * @type {boolean} @@ -97,6 +105,7 @@ goog.ui.PopupBase.prototype.autoHideRegion_ = null; */ goog.ui.PopupBase.prototype.isVisible_ = false; + /** * Whether the popup should hide itself asynchrously. This was added because * there are cases where hiding the element in mouse down handler in IE can @@ -107,6 +116,7 @@ goog.ui.PopupBase.prototype.isVisible_ = false; */ goog.ui.PopupBase.prototype.shouldHideAsync_ = false; + /** * The time when the popup was last shown. * @type {number} @@ -114,6 +124,7 @@ goog.ui.PopupBase.prototype.shouldHideAsync_ = false; */ goog.ui.PopupBase.prototype.lastShowTime_ = -1; + /** * The time when the popup was last hidden. * @type {number} @@ -121,6 +132,7 @@ goog.ui.PopupBase.prototype.lastShowTime_ = -1; */ goog.ui.PopupBase.prototype.lastHideTime_ = -1; + /** * Whether to hide when the escape key is pressed. * @type {boolean} @@ -128,6 +140,7 @@ goog.ui.PopupBase.prototype.lastHideTime_ = -1; */ goog.ui.PopupBase.prototype.hideOnEscape_ = false; + /** * Whether to enable cross-iframe dismissal. * @type {boolean} @@ -135,6 +148,7 @@ goog.ui.PopupBase.prototype.hideOnEscape_ = false; */ goog.ui.PopupBase.prototype.enableCrossIframeDismissal_ = true; + /** * The type of popup * @type {goog.ui.PopupBase.Type} @@ -142,6 +156,7 @@ goog.ui.PopupBase.prototype.enableCrossIframeDismissal_ = true; */ goog.ui.PopupBase.prototype.type_ = goog.ui.PopupBase.Type.TOGGLE_DISPLAY; + /** * Constants for event type fired by Popup * @@ -172,6 +187,7 @@ goog.ui.PopupBase.EventType = { */ goog.ui.PopupBase.DEBOUNCE_DELAY_MS = 150; + /** * @return {goog.ui.PopupBase.Type} The type of popup this is. */ @@ -340,6 +356,7 @@ goog.ui.PopupBase.prototype.ensureNotVisible_ = function() { } }; + /** * Returns whether the popup is currently visible. * @@ -448,7 +465,15 @@ goog.ui.PopupBase.prototype.show_ = function() { // in an iframe and the deactivate fires within that iframe. // The active element in the top-level document will remain the iframe // itself. - var activeElement = doc.activeElement; + var activeElement; + /** @preserveTry */ + try { + activeElement = doc.activeElement; + } catch (e) { + // There is an IE browser bug which can cause just the reading of + // document.activeElement to throw an Unspecified Error. This + // may have to do with loading a popup within a hidden iframe. + } while (activeElement && activeElement.nodeName == 'IFRAME') { /** @preserveTry */ try { @@ -481,7 +506,7 @@ goog.ui.PopupBase.prototype.show_ = function() { // Make the popup visible. if (this.type_ == goog.ui.PopupBase.Type.TOGGLE_DISPLAY) { - this.showPopupElement(); + this.showPopupElement(); } else if (this.type_ == goog.ui.PopupBase.Type.MOVE_OFFSCREEN) { this.reposition(); } @@ -623,7 +648,7 @@ goog.ui.PopupBase.prototype.onHide_ = function(opt_target) { * @private */ goog.ui.PopupBase.prototype.onDocumentMouseDown_ = function(e) { - var target = e.target; + var target = /** @type {Node} */ (e.target); if (!goog.dom.contains(this.element_, target) && (!this.autoHideRegion_ || goog.dom.contains( this.autoHideRegion_, target)) && diff --git a/contrib/closure-library/goog/ui/popupbase_test.html b/contrib/closure-library/goog/ui/popupbase_test.html index 4fe8e21..6dabe0d 100644 --- a/contrib/closure-library/goog/ui/popupbase_test.html +++ b/contrib/closure-library/goog/ui/popupbase_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/ui/popupdatepicker.js b/contrib/closure-library/goog/ui/popupdatepicker.js index fde02f5..4605fd0 100644 --- a/contrib/closure-library/goog/ui/popupdatepicker.js +++ b/contrib/closure-library/goog/ui/popupdatepicker.js @@ -32,6 +32,7 @@ goog.require('goog.ui.Popup'); goog.require('goog.ui.PopupBase.EventType'); + /** * Popup date picker widget. * diff --git a/contrib/closure-library/goog/ui/popupmenu.js b/contrib/closure-library/goog/ui/popupmenu.js index f8fcf2f..00a5423 100644 --- a/contrib/closure-library/goog/ui/popupmenu.js +++ b/contrib/closure-library/goog/ui/popupmenu.js @@ -446,6 +446,10 @@ goog.ui.PopupMenu.prototype.showAtElement = function(element, targetCorner, * Hides the menu. */ goog.ui.PopupMenu.prototype.hide = function() { + if (!this.isVisible()) { + return; + } + // setVisible dispatches a goog.ui.Component.EventType.HIDE event, which may // be canceled to prevent the menu from being hidden. this.setVisible(false); diff --git a/contrib/closure-library/goog/ui/popupmenu_test.html b/contrib/closure-library/goog/ui/popupmenu_test.html index ccf994d..aa17afc 100644 --- a/contrib/closure-library/goog/ui/popupmenu_test.html +++ b/contrib/closure-library/goog/ui/popupmenu_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/ui/progressbar.js b/contrib/closure-library/goog/ui/progressbar.js index cc0bd02..55bd0a1 100644 --- a/contrib/closure-library/goog/ui/progressbar.js +++ b/contrib/closure-library/goog/ui/progressbar.js @@ -33,6 +33,7 @@ goog.require('goog.ui.RangeModel'); goog.require('goog.userAgent'); + /** * This creates a progress bar object. * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper. @@ -78,6 +79,7 @@ goog.ui.ProgressBar.ORIENTATION_TO_CSS_NAME_[ goog.ui.ProgressBar.Orientation.HORIZONTAL] = goog.getCssName('progress-bar-horizontal'); + /** * Creates the DOM nodes needed for the progress bar */ @@ -370,7 +372,6 @@ goog.ui.ProgressBar.prototype.disposeInternal = function() { }; - /** * @return {?number} The step value used to determine how to round the value. */ diff --git a/contrib/closure-library/goog/ui/prompt.js b/contrib/closure-library/goog/ui/prompt.js index f0c47eb..de7c0c0 100644 --- a/contrib/closure-library/goog/ui/prompt.js +++ b/contrib/closure-library/goog/ui/prompt.js @@ -31,6 +31,8 @@ goog.require('goog.ui.Dialog.DefaultButtonKeys'); goog.require('goog.ui.Dialog.EventType'); goog.require('goog.userAgent'); + + /** * Creates an object that represents a prompt (used in place of javascript's * prompt). The html structure of the prompt is the same as the layout for @@ -197,12 +199,12 @@ goog.ui.Prompt.prototype.createDom = function() { // add input box to the content var attrs = { - 'className': goog.getCssName(cls, 'userInput'), - 'value': this.defaultValue_}; + 'className': goog.getCssName(cls, 'userInput'), + 'value': this.defaultValue_}; if (this.rows_ == 1) { // If rows == 1 then use an input element. this.userInputEl_ = /** @type {HTMLInputElement} */ - (this.getDomHelper().createDom('input', attrs)); + (this.getDomHelper().createDom('input', attrs)); this.userInputEl_.type = 'text'; if (this.cols_) { this.userInputEl_.size = this.cols_; @@ -235,16 +237,24 @@ goog.ui.Prompt.prototype.createDom = function() { */ goog.ui.Prompt.prototype.setVisible = function(visible) { goog.ui.Dialog.prototype.setVisible.call(this, visible); - if (visible) { this.isClosing_ = false; this.userInputEl_.value = this.defaultValue_; - if (goog.userAgent.OPERA) { - // select() doesn't focus elements in Opera. - this.userInputEl_.focus(); - } - this.userInputEl_.select(); + this.focus(); + } +}; + + +/** + * Overrides setFocus to put focus on the input element. + * @override + */ +goog.ui.Prompt.prototype.focus = function() { + if (goog.userAgent.OPERA) { + // select() doesn't focus elements in Opera. + this.userInputEl_.focus(); } + this.userInputEl_.select(); }; diff --git a/contrib/closure-library/goog/ui/prompt_test.html b/contrib/closure-library/goog/ui/prompt_test.html new file mode 100644 index 0000000..25599e2 --- /dev/null +++ b/contrib/closure-library/goog/ui/prompt_test.html @@ -0,0 +1,65 @@ + + + + + +Closure Unit Tests - goog.ui.Prompt + + + + + + + + + + + + diff --git a/contrib/closure-library/goog/ui/rangemodel.js b/contrib/closure-library/goog/ui/rangemodel.js index 6739882..a20a1d1 100644 --- a/contrib/closure-library/goog/ui/rangemodel.js +++ b/contrib/closure-library/goog/ui/rangemodel.js @@ -31,6 +31,7 @@ goog.require('goog.events.EventTarget'); goog.require('goog.ui.Component.EventType'); + /** * Creates a range model * @extends {goog.events.EventTarget} diff --git a/contrib/closure-library/goog/ui/rangemodel_test.html b/contrib/closure-library/goog/ui/rangemodel_test.html index 62c582d..c2a560c 100644 --- a/contrib/closure-library/goog/ui/rangemodel_test.html +++ b/contrib/closure-library/goog/ui/rangemodel_test.html @@ -3,7 +3,7 @@ diff --git a/contrib/closure-library/goog/ui/ratings.js b/contrib/closure-library/goog/ui/ratings.js index 7626f81..0af2378 100644 --- a/contrib/closure-library/goog/ui/ratings.js +++ b/contrib/closure-library/goog/ui/ratings.js @@ -38,6 +38,7 @@ goog.require('goog.events.EventType'); goog.require('goog.ui.Component'); + /** * A UI Control used for rating things, i.e. videos on Google Video. * @param {Array.=} opt_ratings Ratings. Default: [1,2,3,4,5]. @@ -72,6 +73,7 @@ goog.inherits(goog.ui.Ratings, goog.ui.Component); */ goog.ui.Ratings.CSS_CLASS = goog.getCssName('goog-ratings'); + /** * The last index to be highlighted * @type {number} @@ -95,6 +97,7 @@ goog.ui.Ratings.prototype.selectedIndex_ = -1; */ goog.ui.Ratings.prototype.attachedFormField_ = null; + /** * Enums for Ratings event type. * @enum {string} @@ -106,6 +109,7 @@ goog.ui.Ratings.EventType = { UNHIGHLIGHT: 'unhighlight' }; + /** * Decorate a HTML structure already in the document. Expects the structure: *
    @@ -148,7 +152,7 @@ goog.ui.Ratings.prototype.decorateInternal = function(el) {
     goog.ui.Ratings.prototype.enterDocument = function() {
       var el = this.getElement();
       el.tabIndex = 0;
    -  goog.dom.classes.add(el, goog.getCssName('goog-ratings'));
    +  goog.dom.classes.add(el, this.getCssClass());
       goog.dom.a11y.setRole(el, 'slider');
       goog.dom.a11y.setState(el, 'valuemin', 0);
       var max = this.ratings_.length - 1;
    diff --git a/contrib/closure-library/goog/ui/registry.js b/contrib/closure-library/goog/ui/registry.js
    index a971948..cabfc9d 100644
    --- a/contrib/closure-library/goog/ui/registry.js
    +++ b/contrib/closure-library/goog/ui/registry.js
    @@ -21,7 +21,6 @@ goog.provide('goog.ui.registry');
     goog.require('goog.dom.classes');
     
     
    -
     /**
      * Given a {@link goog.ui.Component} constructor, returns an instance of its
      * default renderer.  If the default renderer is a singleton, returns the
    @@ -36,7 +35,7 @@ goog.ui.registry.getDefaultRenderer = function(componentCtor) {
       // Locate the default renderer based on the constructor's unique ID.  If no
       // renderer is registered for this class, walk up the superClass_ chain.
       var key;
    -  var /** @constructor */ rendererCtor;
    +  /** @type {Function|undefined} */ var rendererCtor;
       while (componentCtor) {
         key = goog.getUid(componentCtor);
         if ((rendererCtor = goog.ui.registry.defaultRenderers_[key])) {
    diff --git a/contrib/closure-library/goog/ui/registry_test.html b/contrib/closure-library/goog/ui/registry_test.html
    index 4791a5e..1828268 100644
    --- a/contrib/closure-library/goog/ui/registry_test.html
    +++ b/contrib/closure-library/goog/ui/registry_test.html
    @@ -3,7 +3,7 @@
     
     
    diff --git a/contrib/closure-library/goog/ui/richtextspellchecker.js b/contrib/closure-library/goog/ui/richtextspellchecker.js
    index 8de714e..bd2096b 100644
    --- a/contrib/closure-library/goog/ui/richtextspellchecker.js
    +++ b/contrib/closure-library/goog/ui/richtextspellchecker.js
    @@ -29,6 +29,8 @@ goog.require('goog.string.StringBuffer');
     goog.require('goog.ui.AbstractSpellChecker');
     goog.require('goog.ui.AbstractSpellChecker.AsyncResult');
     
    +
    +
     /**
      * Rich text spell checker implementation.
      *
    @@ -66,6 +68,7 @@ goog.inherits(goog.ui.RichTextSpellChecker, goog.ui.AbstractSpellChecker);
      */
     goog.ui.RichTextSpellChecker.prototype.rootNode_;
     
    +
     /**
      * Current node where spell checker has interrupted to go to the next stack
      * frame.
    @@ -74,6 +77,7 @@ goog.ui.RichTextSpellChecker.prototype.rootNode_;
      */
     goog.ui.RichTextSpellChecker.prototype.currentNode_;
     
    +
     /**
      * Counter of inserted elements. Used in processing loop to attempt to preserve
      * existing nodes if they contain no misspellings.
    @@ -82,6 +86,7 @@ goog.ui.RichTextSpellChecker.prototype.currentNode_;
      */
     goog.ui.RichTextSpellChecker.prototype.elementsInserted_ = 0;
     
    +
     /**
      * Number of words to scan to precharge the dictionary.
      * @type {number}
    @@ -89,6 +94,7 @@ goog.ui.RichTextSpellChecker.prototype.elementsInserted_ = 0;
      */
     goog.ui.RichTextSpellChecker.prototype.dictionaryPreScanSize_ = 1000;
     
    +
     /**
      * Class name for word spans.
      * @type {string}
    @@ -96,6 +102,7 @@ goog.ui.RichTextSpellChecker.prototype.dictionaryPreScanSize_ = 1000;
     goog.ui.RichTextSpellChecker.prototype.wordClassName =
         goog.getCssName('goog-spellcheck-word');
     
    +
     /**
      * DomHelper to be used for interacting with the editable document/element.
      *
    @@ -104,6 +111,7 @@ goog.ui.RichTextSpellChecker.prototype.wordClassName =
      */
     goog.ui.RichTextSpellChecker.prototype.editorDom_;
     
    +
     /**
      * Tag name porition of the marker for the text that does not need to be checked
      * for spelling.
    @@ -112,6 +120,7 @@ goog.ui.RichTextSpellChecker.prototype.editorDom_;
      */
     goog.ui.RichTextSpellChecker.prototype.excludeTag;
     
    +
     /**
      * CSS Style text for invalid words. As it's set inside the rich edit iframe
      * classes defined in the parent document are not availble, thus the style is
    @@ -121,6 +130,7 @@ goog.ui.RichTextSpellChecker.prototype.excludeTag;
     goog.ui.RichTextSpellChecker.prototype.invalidWordCssText =
         'background: yellow;';
     
    +
     /**
      * Creates the initial DOM representation for the component.
      *
    diff --git a/contrib/closure-library/goog/ui/richtextspellchecker_test.html b/contrib/closure-library/goog/ui/richtextspellchecker_test.html
    index 9b516b5..c99e6f5 100644
    --- a/contrib/closure-library/goog/ui/richtextspellchecker_test.html
    +++ b/contrib/closure-library/goog/ui/richtextspellchecker_test.html
    @@ -3,7 +3,7 @@
     
     
    diff --git a/contrib/closure-library/goog/ui/roundedcorners.js b/contrib/closure-library/goog/ui/roundedcorners.js
    index 50da533..2abaa8a 100644
    --- a/contrib/closure-library/goog/ui/roundedcorners.js
    +++ b/contrib/closure-library/goog/ui/roundedcorners.js
    @@ -32,6 +32,8 @@ goog.require('goog.string');
     goog.require('goog.style');
     goog.require('goog.userAgent');
     
    +
    +
     /**
      * Class for constructing the HTML for a rounded corner border based on the
      * RoundedCornerServlet server class.
    @@ -58,6 +60,7 @@ goog.ui.RoundedCorners = function(servletUri) {
       this.cornersToShow_ = goog.ui.RoundedCorners.Corners.ALL;
     };
     
    +
     /**
      * A convenience method to round the corners of a given element.
      * To achieve the rounding, the rounded corners div replaces the element in its
    @@ -113,6 +116,7 @@ goog.ui.RoundedCorners.roundElement = function(
       goog.dom.appendChild(roundedContainer, element);
     };
     
    +
     /**
      * Foreground color of the rounded corners
      * @type {string}
    @@ -120,6 +124,7 @@ goog.ui.RoundedCorners.roundElement = function(
      */
     goog.ui.RoundedCorners.prototype.color_ = '#ff0000';
     
    +
     /**
      * Background color of the rounded corners
      * @type {string}
    @@ -127,6 +132,7 @@ goog.ui.RoundedCorners.prototype.color_ = '#ff0000';
      */
     goog.ui.RoundedCorners.prototype.bgColor_ = '';
     
    +
     /**
      * Inner color of the rounded corners
      * @type {string}
    @@ -134,6 +140,7 @@ goog.ui.RoundedCorners.prototype.bgColor_ = '';
      */
     goog.ui.RoundedCorners.prototype.inColor_ = '';
     
    +
     /**
      * HTML content that goes inside the template
      * @type {string}
    @@ -141,6 +148,7 @@ goog.ui.RoundedCorners.prototype.inColor_ = '';
      */
     goog.ui.RoundedCorners.prototype.content_ = '';
     
    +
     /**
      * Padding style for the internal content
      * @type {string}
    @@ -148,6 +156,7 @@ goog.ui.RoundedCorners.prototype.content_ = '';
      */
     goog.ui.RoundedCorners.prototype.padding_ = '';
     
    +
     /**
      * An explicit height for the HTML. If null, no height is specified
      * @type {?string}
    @@ -155,6 +164,7 @@ goog.ui.RoundedCorners.prototype.padding_ = '';
      */
     goog.ui.RoundedCorners.prototype.height_ = null;
     
    +
     /**
      * The format of the image. Either PNG or GIF
      * @type {string}
    @@ -162,6 +172,7 @@ goog.ui.RoundedCorners.prototype.height_ = null;
      */
     goog.ui.RoundedCorners.prototype.imageFormat_ = 'png';
     
    +
     /**
      * The width of the border line. If 0, width == corner radius
      * @type {number}
    @@ -169,6 +180,7 @@ goog.ui.RoundedCorners.prototype.imageFormat_ = 'png';
      */
     goog.ui.RoundedCorners.prototype.lineWidth_ = 0;
     
    +
     /**
      * Enum for specifying which corners to include.
      * @enum {number}
    @@ -220,6 +232,7 @@ goog.ui.RoundedCorners.Corners = {
       ALL: 15 // TOP |  BOTTOM
     };
     
    +
     /**
      * Returns the foreground color
      * @return {string} The color in hex format.
    @@ -623,6 +636,7 @@ goog.ui.RoundedCorners.prototype.colorStyleFor_ = function(side) {
           'background-color:' + this.color_;
     };
     
    +
     /**
      * Returns the background image style string that uses AlphaImageLoader for IE6
      * and background-images for other browsers
    diff --git a/contrib/closure-library/goog/ui/roundedpanel.js b/contrib/closure-library/goog/ui/roundedpanel.js
    index ab5ab2c..f43e167 100644
    --- a/contrib/closure-library/goog/ui/roundedpanel.js
    +++ b/contrib/closure-library/goog/ui/roundedpanel.js
    @@ -111,6 +111,7 @@ goog.ui.RoundedPanel.Classes_ = {
     };
     
     
    +
     /**
      * Base class for the hierarchy of RoundedPanel classes. Do not
      * instantiate directly. Instead, call goog.ui.RoundedPanel.create().
    @@ -243,6 +244,7 @@ goog.ui.BaseRoundedPanel.prototype.getContentElement = function() {
     };
     
     
    +
     /**
      * RoundedPanel class specifically for browsers that support CSS attributes
      * for elements with rounded borders (ex. Safari 3.0+, Firefox 3.0+). Do not
    @@ -367,6 +369,7 @@ goog.ui.CssRoundedPanel.prototype.getStyle_ = function(corner) {
     };
     
     
    +
     /**
      * RoundedPanel class that uses goog.graphics to create the rounded corners.
      * Do not instantiate directly. Instead, call goog.ui.RoundedPanel.create().
    diff --git a/contrib/closure-library/goog/ui/roundedpanel_test.html b/contrib/closure-library/goog/ui/roundedpanel_test.html
    index 7466e6e..243a37f 100644
    --- a/contrib/closure-library/goog/ui/roundedpanel_test.html
    +++ b/contrib/closure-library/goog/ui/roundedpanel_test.html
    @@ -3,7 +3,7 @@
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    diff --git a/contrib/closure-library/goog/ui/tabpane.js b/contrib/closure-library/goog/ui/tabpane.js
    index 9da8380..eb65119 100644
    --- a/contrib/closure-library/goog/ui/tabpane.js
    +++ b/contrib/closure-library/goog/ui/tabpane.js
    @@ -33,6 +33,7 @@ goog.require('goog.events.KeyCodes');
     goog.require('goog.style');
     
     
    +
     /**
      * TabPane widget. All children already inside the tab pane container element
      * will be be converted to tabs. Each tab is represented by a goog.ui.TabPane.
    @@ -145,6 +146,7 @@ goog.ui.TabPane.TabLocation = {
       RIGHT: 3
     };
     
    +
     /**
      * Creates HTML nodes for tab pane.
      *
    @@ -200,6 +202,7 @@ goog.ui.TabPane.prototype.create_ = function() {
       this.createPages_(nodes);
     };
     
    +
     /**
      * Creates the HTML node for the clearing div, and associated style in
      * the .
    @@ -214,6 +217,7 @@ goog.ui.TabPane.prototype.createClear_ = function() {
       return this.dom_.createDom('div', goog.getCssName('goog-tabpane-clear'));
     };
     
    +
     /** @inheritDoc */
     goog.ui.TabPane.prototype.disposeInternal = function() {
       goog.ui.TabPane.superClass_.disposeInternal.call(this);
    @@ -609,6 +613,7 @@ goog.ui.TabPane.TabPage.prototype.setEnabled = function(enabled) {
           goog.getCssName('goog-tabpane-tab-disabled');
     };
     
    +
     /**
      * Returns if the page is enabled.
      * @return {boolean} Whether the page is enabled or not.
    @@ -617,6 +622,7 @@ goog.ui.TabPane.TabPage.prototype.isEnabled = function() {
       return this.enabled_;
     };
     
    +
     /**
      * Sets visible state for page content and updates style of tab.
      *
    @@ -632,6 +638,7 @@ goog.ui.TabPane.TabPage.prototype.setVisible_ = function(visible) {
       }
     };
     
    +
     /**
      * Sets parent tab pane for tab page.
      *
    diff --git a/contrib/closure-library/goog/ui/tabpane_test.html b/contrib/closure-library/goog/ui/tabpane_test.html
    index 75c0bec..d4e6b20 100644
    --- a/contrib/closure-library/goog/ui/tabpane_test.html
    +++ b/contrib/closure-library/goog/ui/tabpane_test.html
    @@ -3,7 +3,7 @@
     
     
    diff --git a/contrib/closure-library/goog/ui/tabrenderer_test.html b/contrib/closure-library/goog/ui/tabrenderer_test.html
    index 3d533d4..811c158 100644
    --- a/contrib/closure-library/goog/ui/tabrenderer_test.html
    +++ b/contrib/closure-library/goog/ui/tabrenderer_test.html
    @@ -3,7 +3,7 @@
     
     
     
    diff --git a/contrib/closure-library/goog/ui/togglebutton.js b/contrib/closure-library/goog/ui/togglebutton.js
    index 6b08cbf..845c365 100644
    --- a/contrib/closure-library/goog/ui/togglebutton.js
    +++ b/contrib/closure-library/goog/ui/togglebutton.js
    @@ -27,6 +27,7 @@ goog.require('goog.ui.CustomButtonRenderer');
     goog.require('goog.ui.registry');
     
     
    +
     /**
      * A toggle button, with checkbox-like semantics.  Rendered using
      * {@link goog.ui.CustomButtonRenderer} by default, though any
    diff --git a/contrib/closure-library/goog/ui/toolbar.js b/contrib/closure-library/goog/ui/toolbar.js
    index 8a04267..fb789f6 100644
    --- a/contrib/closure-library/goog/ui/toolbar.js
    +++ b/contrib/closure-library/goog/ui/toolbar.js
    @@ -25,6 +25,7 @@ goog.require('goog.ui.Container');
     goog.require('goog.ui.ToolbarRenderer');
     
     
    +
     /**
      * A toolbar class, implemented as a {@link goog.ui.Container} that defaults to
      * having a horizontal orientation and {@link goog.ui.ToolbarRenderer} as its
    diff --git a/contrib/closure-library/goog/ui/toolbarbuttonrenderer.js b/contrib/closure-library/goog/ui/toolbarbuttonrenderer.js
    index e18450a..058b29d 100644
    --- a/contrib/closure-library/goog/ui/toolbarbuttonrenderer.js
    +++ b/contrib/closure-library/goog/ui/toolbarbuttonrenderer.js
    @@ -22,6 +22,7 @@ goog.provide('goog.ui.ToolbarButtonRenderer');
     goog.require('goog.ui.CustomButtonRenderer');
     
     
    +
     /**
      * Toolbar-specific renderer for {@link goog.ui.Button}s, based on {@link
      * goog.ui.CustomButtonRenderer}.
    diff --git a/contrib/closure-library/goog/ui/toolbarcolormenubutton.js b/contrib/closure-library/goog/ui/toolbarcolormenubutton.js
    index ad58d9d..51c2a20 100644
    --- a/contrib/closure-library/goog/ui/toolbarcolormenubutton.js
    +++ b/contrib/closure-library/goog/ui/toolbarcolormenubutton.js
    @@ -25,6 +25,7 @@ goog.require('goog.ui.ToolbarColorMenuButtonRenderer');
     goog.require('goog.ui.registry');
     
     
    +
     /**
      * A color menu button control for a toolbar.
      *
    diff --git a/contrib/closure-library/goog/ui/toolbarcolormenubuttonrenderer.js b/contrib/closure-library/goog/ui/toolbarcolormenubuttonrenderer.js
    index a2c2a42..c7c042e 100644
    --- a/contrib/closure-library/goog/ui/toolbarcolormenubuttonrenderer.js
    +++ b/contrib/closure-library/goog/ui/toolbarcolormenubuttonrenderer.js
    @@ -25,6 +25,8 @@ goog.require('goog.ui.ControlContent');
     goog.require('goog.ui.MenuButtonRenderer');
     goog.require('goog.ui.ToolbarMenuButtonRenderer');
     
    +
    +
     /**
      * Toolbar-style renderer for {@link goog.ui.ColorMenuButton}s.
      * @constructor
    @@ -37,6 +39,7 @@ goog.inherits(goog.ui.ToolbarColorMenuButtonRenderer,
                   goog.ui.ToolbarMenuButtonRenderer);
     goog.addSingletonGetter(goog.ui.ToolbarColorMenuButtonRenderer);
     
    +
     /**
      * Overrides the superclass implementation by wrapping the caption text or DOM
      * structure in a color indicator element.  Creates the following DOM structure:
    diff --git a/contrib/closure-library/goog/ui/toolbarcolormenubuttonrenderer_test.html b/contrib/closure-library/goog/ui/toolbarcolormenubuttonrenderer_test.html
    index f9a0503..395a866 100644
    --- a/contrib/closure-library/goog/ui/toolbarcolormenubuttonrenderer_test.html
    +++ b/contrib/closure-library/goog/ui/toolbarcolormenubuttonrenderer_test.html
    @@ -3,7 +3,7 @@
     
     
     
    diff --git a/contrib/closure-library/goog/ui/tree/basenode.js b/contrib/closure-library/goog/ui/tree/basenode.js
    index b35ec5d..42ccc89 100644
    --- a/contrib/closure-library/goog/ui/tree/basenode.js
    +++ b/contrib/closure-library/goog/ui/tree/basenode.js
    @@ -464,11 +464,12 @@ goog.ui.tree.BaseNode.prototype.setDepth_ = function(depth) {
      *    otherwise.
      */
     goog.ui.tree.BaseNode.prototype.contains = function(node) {
    -  while (node) {
    -    if (node == this) {
    +  var current = node;
    +  while (current) {
    +    if (current == this) {
           return true;
         }
    -    node = node.getParent();
    +    current = current.getParent();
       }
       return false;
     };
    @@ -676,6 +677,7 @@ goog.ui.tree.BaseNode.prototype.toggle = function() {
       this.setExpanded(!this.getExpanded());
     };
     
    +
     /**
      * Expands the node.
      */
    @@ -692,7 +694,6 @@ goog.ui.tree.BaseNode.prototype.collapse = function() {
     };
     
     
    -
     /**
      * Collapses the children of the node.
      */
    diff --git a/contrib/closure-library/goog/ui/tree/basenode_test.html b/contrib/closure-library/goog/ui/tree/basenode_test.html
    index 50e7ec3..aae7351 100644
    --- a/contrib/closure-library/goog/ui/tree/basenode_test.html
    +++ b/contrib/closure-library/goog/ui/tree/basenode_test.html
    @@ -3,7 +3,7 @@
     
     
     
     
     
     
     
     
    diff --git a/contrib/closure-library/goog/useragent/flash_test.html b/contrib/closure-library/goog/useragent/flash_test.html
    index c1465cc..f4659d9 100644
    --- a/contrib/closure-library/goog/useragent/flash_test.html
    +++ b/contrib/closure-library/goog/useragent/flash_test.html
    @@ -3,7 +3,7 @@
     
     
    diff --git a/contrib/closure-library/goog/useragent/jscript.js b/contrib/closure-library/goog/useragent/jscript.js
    index a3b3a18..1fa9676 100644
    --- a/contrib/closure-library/goog/useragent/jscript.js
    +++ b/contrib/closure-library/goog/useragent/jscript.js
    @@ -64,6 +64,7 @@ if (!goog.userAgent.jscript.ASSUME_NO_JSCRIPT) {
       goog.userAgent.jscript.init_();
     }
     
    +
     /**
      * Whether we detect that the user agent is using Microsoft JScript.
      * @type {boolean}
    diff --git a/contrib/closure-library/goog/useragent/jscript_test.html b/contrib/closure-library/goog/useragent/jscript_test.html
    index 89a5604..2deed71 100644
    --- a/contrib/closure-library/goog/useragent/jscript_test.html
    +++ b/contrib/closure-library/goog/useragent/jscript_test.html
    @@ -3,7 +3,7 @@
     
     
    diff --git a/contrib/closure-library/goog/useragent/platform.js b/contrib/closure-library/goog/useragent/platform.js
    index b764d7d..69c2cdb 100644
    --- a/contrib/closure-library/goog/useragent/platform.js
    +++ b/contrib/closure-library/goog/useragent/platform.js
    @@ -20,6 +20,7 @@ goog.provide('goog.userAgent.platform');
     
     goog.require('goog.userAgent');
     
    +
     /**
      * Detects the version of Windows or Mac OS that is running.
      *
    diff --git a/contrib/closure-library/goog/useragent/platform_test.html b/contrib/closure-library/goog/useragent/platform_test.html
    index 2d79351..e9ad9f2 100644
    --- a/contrib/closure-library/goog/useragent/platform_test.html
    +++ b/contrib/closure-library/goog/useragent/platform_test.html
    @@ -3,7 +3,7 @@
     
     
     
     
    diff --git a/contrib/closure-library/goog/vec/float32array.js b/contrib/closure-library/goog/vec/float32array.js
    new file mode 100644
    index 0000000..d7ae25c
    --- /dev/null
    +++ b/contrib/closure-library/goog/vec/float32array.js
    @@ -0,0 +1,109 @@
    +// Copyright 2011 The Closure Library Authors. All Rights Reserved.
    +//
    +// Licensed under the Apache License, Version 2.0 (the "License");
    +// you may not use this file except in compliance with the License.
    +// You may obtain a copy of the License at
    +//
    +//      http://www.apache.org/licenses/LICENSE-2.0
    +//
    +// Unless required by applicable law or agreed to in writing, software
    +// distributed under the License is distributed on an "AS-IS" BASIS,
    +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +// See the License for the specific language governing permissions and
    +// limitations under the License.
    +
    +
    +/**
    + * @fileoverview Supplies a Float32Array implementation that implements
    + *     most of the Float32Array spec and that can be used when a built-in
    + *     implementation is not available.
    + *
    + *     Note that if no existing Float32Array implementation is found then
    + *     this class and all its public properties are exported as Float32Array.
    + *
    + *     Adding support for the other TypedArray classes here does not make sense
    + *     since this vector math library only needs Float32Array.
    + *
    + */
    +goog.provide('goog.vec.Float32Array');
    +
    +
    +
    +/**
    + * Constructs a new Float32Array. The new array is initialized to all zeros.
    + *
    + * @param {goog.vec.Float32Array|Array|ArrayBuffer|TypedArray|number} p0
    + *     The length of the array, or an array to initialize the contents of the
    + *     new Float32Array.
    + * @constructor
    + */
    +goog.vec.Float32Array = function(p0) {
    +  this.length = p0.length || p0;
    +  for (var i = 0; i < this.length; i++) {
    +    this[i] = p0[i] || 0;
    +  }
    +};
    +
    +
    +/**
    + * The number of bytes in an element (as defined by the Typed Array
    + * specification).
    + *
    + * @type {number}
    + */
    +goog.vec.Float32Array.BYTES_PER_ELEMENT = 4;
    +
    +
    +/**
    + * The number of bytes in an element (as defined by the Typed Array
    + * specification).
    + *
    + * @type {number}
    + */
    +goog.vec.Float32Array.prototype.BYTES_PER_ELEMENT = 4;
    +
    +
    +/**
    + * Sets elements of the array.
    + * @param {Array.|Float32Array} values The array of values.
    + * @param {number=} opt_offset The offset in this array to start.
    + */
    +goog.vec.Float32Array.prototype.set = function(values, opt_offset) {
    +  opt_offset = opt_offset || 0;
    +  for (var i = 0; i < values.length && opt_offset + i < this.length; i++) {
    +    this[opt_offset + i] = values[i];
    +  }
    +};
    +
    +
    +/**
    + * Creates a string representation of this array.
    + * @return {string} The string version of this array.
    + */
    +goog.vec.Float32Array.prototype.toString = Array.prototype.join;
    +
    +
    +/**
    + * Note that we cannot implement the subarray() or (deprecated) slice()
    + * methods properly since doing so would require being able to overload
    + * the [] operator which is not possible in javascript.  So we leave
    + * them unimplemented.  Any attempt to call these methods will just result
    + * in a javascript error since we leave them undefined.
    + */
    +
    +
    +/**
    + * If no existing Float32Array implementation is found then we export
    + * goog.vec.Float32Array as Float32Array.
    + */
    +if (typeof Float32Array == 'undefined') {
    +  goog.exportProperty(goog.vec.Float32Array, 'BYTES_PER_ELEMENT',
    +                      goog.vec.Float32Array.BYTES_PER_ELEMENT);
    +  goog.exportProperty(goog.vec.Float32Array.prototype, 'BYTES_PER_ELEMENT',
    +                      goog.vec.Float32Array.prototype.BYTES_PER_ELEMENT);
    +  goog.exportProperty(goog.vec.Float32Array.prototype, 'set',
    +                      goog.vec.Float32Array.prototype.set);
    +  goog.exportProperty(goog.vec.Float32Array.prototype, 'toString',
    +                      goog.vec.Float32Array.prototype.toString);
    +  goog.exportSymbol('Float32Array', goog.vec.Float32Array);
    +}
    diff --git a/contrib/closure-library/goog/vec/float32array_test.html b/contrib/closure-library/goog/vec/float32array_test.html
    new file mode 100644
    index 0000000..227797d
    --- /dev/null
    +++ b/contrib/closure-library/goog/vec/float32array_test.html
    @@ -0,0 +1,69 @@
    +
    +
    +
    +
    +
    +Closure Unit Tests - goog.vec.Float32Array
    +
    +
    +
    +
    +
    +
    diff --git a/contrib/closure-library/goog/vec/mat3.js b/contrib/closure-library/goog/vec/mat3.js
    new file mode 100644
    index 0000000..3c00187
    --- /dev/null
    +++ b/contrib/closure-library/goog/vec/mat3.js
    @@ -0,0 +1,703 @@
    +// Copyright 2011 The Closure Library Authors. All Rights Reserved.
    +//
    +// Licensed under the Apache License, Version 2.0 (the "License");
    +// you may not use this file except in compliance with the License.
    +// You may obtain a copy of the License at
    +//
    +//      http://www.apache.org/licenses/LICENSE-2.0
    +//
    +// Unless required by applicable law or agreed to in writing, software
    +// distributed under the License is distributed on an "AS-IS" BASIS,
    +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +// See the License for the specific language governing permissions and
    +// limitations under the License.
    +
    +/**
    + * @fileoverview Implements 3x3 matrices and their related functions which are
    + * compatible with WebGL. The API is structured to avoid unnecessary memory
    + * allocations.  The last parameter will typically be the output vector and
    + * an object can be both an input and output parameter to all methods except
    + * where noted. Matrix operations follow the mathematical form when multiplying
    + * vectors as follows: resultVec = matrix * vec.
    + *
    + */
    +goog.provide('goog.vec.Mat3');
    +
    +goog.require('goog.vec');
    +goog.require('goog.vec.Vec3');
    +
    +
    +/**
    + * @typedef {goog.vec.ArrayType}
    + */
    +goog.vec.Mat3.Type;
    +
    +
    +/**
    + * Creates the array representation of a 3x3 matrix. The use of the array
    + * directly instead of a class reduces overhead.
    + * The returned matrix is cleared to all zeros.
    + *
    + * @return {goog.vec.Mat3.Type} The new, nine element array.
    + */
    +goog.vec.Mat3.create = function() {
    +  return new Float32Array(9);
    +};
    +
    +
    +/**
    + * Creates the array representation of a 3x3 matrix. The use of the array
    + * directly eliminates any overhead associated with the class representation
    + * defined above. The returned matrix is initialized with the identity.
    + *
    + * @return {goog.vec.Mat3.Type} The new, nine element array.
    + */
    +goog.vec.Mat3.createIdentity = function() {
    +  var mat = goog.vec.Mat3.create();
    +  mat[0] = mat[4] = mat[8] = 1;
    +  return mat;
    +};
    +
    +
    +/**
    + * Creates a 3x3 matrix initialized from the given array.
    + *
    + * @param {goog.vec.Mat3.Type} matrix The array containing the
    + *     matrix values in column major order.
    + * @return {goog.vec.Mat3.Type} The new, nine element array.
    + */
    +goog.vec.Mat3.createFromArray = function(matrix) {
    +  var newMatrix = goog.vec.Mat3.create();
    +  goog.vec.Mat3.setFromArray(newMatrix, matrix);
    +  return newMatrix;
    +};
    +
    +
    +/**
    + * Creates a 3x3 matrix initialized from the given values.
    + *
    + * @param {number} v00 The values at (0, 0).
    + * @param {number} v10 The values at (1, 0).
    + * @param {number} v20 The values at (2, 0).
    + * @param {number} v01 The values at (0, 1).
    + * @param {number} v11 The values at (1, 1).
    + * @param {number} v21 The values at (2, 1).
    + * @param {number} v02 The values at (0, 2).
    + * @param {number} v12 The values at (1, 2).
    + * @param {number} v22 The values at (2, 2).
    + * @return {goog.vec.Mat3.Type} The new, nine element array.
    + */
    +goog.vec.Mat3.createFromValues = function(
    +    v00, v10, v20, v01, v11, v21, v02, v12, v22) {
    +  var newMatrix = goog.vec.Mat3.create();
    +  goog.vec.Mat3.setFromValues(
    +      newMatrix, v00, v10, v20, v01, v11, v21, v02, v12, v22);
    +  return newMatrix;
    +};
    +
    +
    +/**
    + * Creates a clone of a 3x3 matrix.
    + *
    + * @param {goog.vec.Mat3.Type} matrix The source 3x3 matrix.
    + * @return {goog.vec.Mat3.Type} The new 3x3 element matrix.
    + */
    +goog.vec.Mat3.clone =
    +    goog.vec.Mat3.createFromArray;
    +
    +
    +/**
    + * Retrieves the element at the requested row and column.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix containing the value to retrieve.
    + * @param {number} row The row index.
    + * @param {number} column The column index.
    + * @return {number} The element value at the requested row, column indices.
    + */
    +goog.vec.Mat3.getElement = function(mat, row, column) {
    +  return mat[row + column * 3];
    +};
    +
    +
    +/**
    + * Sets the element at the requested row and column.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix containing the value to retrieve.
    + * @param {number} row The row index.
    + * @param {number} column The column index.
    + * @param {number} value The value to set at the requested row, column.
    + */
    +goog.vec.Mat3.setElement = function(mat, row, column, value) {
    +  mat[row + column * 3] = value;
    +};
    +
    +
    +/**
    + * Initializes the matrix from the set of values. Note the values supplied are
    + * in column major order.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix to receive the
    + *     values.
    + * @param {number} v00 The values at (0, 0).
    + * @param {number} v10 The values at (1, 0).
    + * @param {number} v20 The values at (2, 0).
    + * @param {number} v01 The values at (0, 1).
    + * @param {number} v11 The values at (1, 1).
    + * @param {number} v21 The values at (2, 1).
    + * @param {number} v02 The values at (0, 2).
    + * @param {number} v12 The values at (1, 2).
    + * @param {number} v22 The values at (2, 2).
    + */
    +goog.vec.Mat3.setFromValues = function(
    +    mat, v00, v10, v20, v01, v11, v21, v02, v12, v22) {
    +  mat[0] = v00;
    +  mat[1] = v10;
    +  mat[2] = v20;
    +  mat[3] = v01;
    +  mat[4] = v11;
    +  mat[5] = v21;
    +  mat[6] = v02;
    +  mat[7] = v12;
    +  mat[8] = v22;
    +};
    +
    +
    +/**
    + * Sets the matrix from the array of values stored in column major order.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix to receive the values.
    + * @param {goog.vec.Mat3.Type} values The column major ordered
    + *     array of values to store in the matrix.
    + */
    +goog.vec.Mat3.setFromArray = function(mat, values) {
    +  mat[0] = values[0];
    +  mat[1] = values[1];
    +  mat[2] = values[2];
    +  mat[3] = values[3];
    +  mat[4] = values[4];
    +  mat[5] = values[5];
    +  mat[6] = values[6];
    +  mat[7] = values[7];
    +  mat[8] = values[8];
    +};
    +
    +
    +/**
    + * Sets the matrix from the array of values stored in row major order.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix to receive the values.
    + * @param {goog.vec.Mat3.Type} values The row major ordered array
    + *     of values to store in the matrix.
    + */
    +goog.vec.Mat3.setFromRowMajorArray = function(mat, values) {
    +  mat[0] = values[0];
    +  mat[1] = values[3];
    +  mat[2] = values[6];
    +  mat[3] = values[1];
    +  mat[4] = values[4];
    +  mat[5] = values[7];
    +  mat[6] = values[2];
    +  mat[7] = values[5];
    +  mat[8] = values[8];
    +};
    +
    +
    +/**
    + * Sets the diagonal values of the matrix from the given values.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix to receive the values.
    + * @param {number} v00 The values for (0, 0).
    + * @param {number} v11 The values for (1, 1).
    + * @param {number} v22 The values for (2, 2).
    + */
    +goog.vec.Mat3.setDiagonalValues = function(mat, v00, v11, v22) {
    +  mat[0] = v00;
    +  mat[4] = v11;
    +  mat[8] = v22;
    +};
    +
    +
    +/**
    + * Sets the diagonal values of the matrix from the given vector.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix to receive the values.
    + * @param {goog.vec.Vec3.Type} vec The vector containing the values.
    + */
    +goog.vec.Mat3.setDiagonal = function(mat, vec) {
    +  mat[0] = vec[0];
    +  mat[4] = vec[1];
    +  mat[8] = vec[2];
    +};
    +
    +
    +/**
    + * Sets the specified column with the supplied values.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix to recieve the values.
    + * @param {number} column The column index to set the values on.
    + * @param {number} v0 The value for row 0.
    + * @param {number} v1 The value for row 1.
    + * @param {number} v2 The value for row 2.
    + */
    +goog.vec.Mat3.setColumnValues = function(mat, column, v0, v1, v2) {
    +  var i = column * 3;
    +  mat[i] = v0;
    +  mat[i + 1] = v1;
    +  mat[i + 2] = v2;
    +};
    +
    +
    +/**
    + * Sets the specified column with the value from the supplied array.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix to receive the values.
    + * @param {number} column The column index to set the values on.
    + * @param {goog.vec.Vec3.Type} vec The vector elements for the column.
    + */
    +goog.vec.Mat3.setColumn = function(mat, column, vec) {
    +  var i = column * 3;
    +  mat[i] = vec[0];
    +  mat[i + 1] = vec[1];
    +  mat[i + 2] = vec[2];
    +};
    +
    +
    +/**
    + * Retrieves the specified column from the matrix into the given vector
    + * array.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix supplying the values.
    + * @param {number} column The column to get the values from.
    + * @param {goog.vec.Vec3.Type} vec The vector elements to receive the column.
    + */
    +goog.vec.Mat3.getColumn = function(mat, column, vec) {
    +  var i = column * 3;
    +  vec[0] = mat[i];
    +  vec[1] = mat[i + 1];
    +  vec[2] = mat[i + 2];
    +};
    +
    +
    +/**
    + * Sets the columns of the matrix from the set of vector elements.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix to receive the values.
    + * @param {goog.vec.Vec3.Type} vec0 The values for column 0.
    + * @param {goog.vec.Vec3.Type} vec1 The values for column 1.
    + * @param {goog.vec.Vec3.Type} vec2 The values for column 2.
    + */
    +goog.vec.Mat3.setColumns = function(mat, vec0, vec1, vec2) {
    +  goog.vec.Mat3.setColumn(mat, 0, vec0);
    +  goog.vec.Mat3.setColumn(mat, 1, vec1);
    +  goog.vec.Mat3.setColumn(mat, 2, vec2);
    +};
    +
    +
    +/**
    + * Retrieves the column values from the given matrix into the given vector
    + * elements.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix supplying the columns.
    + * @param {goog.vec.Vec3.Type} vec0 The vector to receive column 0.
    + * @param {goog.vec.Vec3.Type} vec1 The vector to receive column 1.
    + * @param {goog.vec.Vec3.Type} vec2 The vector to receive column 2.
    + */
    +goog.vec.Mat3.getColumns = function(mat, vec0, vec1, vec2) {
    +  goog.vec.Mat3.getColumn(mat, 0, vec0);
    +  goog.vec.Mat3.getColumn(mat, 1, vec1);
    +  goog.vec.Mat3.getColumn(mat, 2, vec2);
    +};
    +
    +
    +/**
    + * Sets the row values from the supplied values.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix to receive the values.
    + * @param {number} row The index of the row to receive the values.
    + * @param {number} v0 The value for column 0.
    + * @param {number} v1 The value for column 1.
    + * @param {number} v2 The value for column 2.
    + */
    +goog.vec.Mat3.setRowValues = function(mat, row, v0, v1, v2) {
    +  mat[row] = v0;
    +  mat[row + 3] = v1;
    +  mat[row + 6] = v2;
    +};
    +
    +
    +/**
    + * Sets the row values from the supplied vector.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix to receive the row values.
    + * @param {number} row The index of the row.
    + * @param {goog.vec.Vec3.Type} vec The vector containing the values.
    + */
    +goog.vec.Mat3.setRow = function(mat, row, vec) {
    +  mat[row] = vec[0];
    +  mat[row + 3] = vec[1];
    +  mat[row + 6] = vec[2];
    +};
    +
    +
    +/**
    + * Retrieves the row values into the given vector.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix supplying the values.
    + * @param {number} row The index of the row supplying the values.
    + * @param {goog.vec.Vec3.Type} vec The vector to receive the row.
    + */
    +goog.vec.Mat3.getRow = function(mat, row, vec) {
    +  vec[0] = mat[row];
    +  vec[1] = mat[row + 3];
    +  vec[2] = mat[row + 6];
    +};
    +
    +
    +/**
    + * Sets the rows of the matrix from the supplied vectors.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix to receive the values.
    + * @param {goog.vec.Vec3.Type} vec0 The values for row 0.
    + * @param {goog.vec.Vec3.Type} vec1 The values for row 1.
    + * @param {goog.vec.Vec3.Type} vec2 The values for row 2.
    + */
    +goog.vec.Mat3.setRows = function(mat, vec0, vec1, vec2) {
    +  goog.vec.Mat3.setRow(mat, 0, vec0);
    +  goog.vec.Mat3.setRow(mat, 1, vec1);
    +  goog.vec.Mat3.setRow(mat, 2, vec2);
    +};
    +
    +
    +/**
    + * Retrieves the rows of the matrix into the supplied vectors.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix to supplying the values.
    + * @param {goog.vec.Vec3.Type} vec0 The vector to receive row 0.
    + * @param {goog.vec.Vec3.Type} vec1 The vector to receive row 1.
    + * @param {goog.vec.Vec3.Type} vec2 The vector to receive row 2.
    + */
    +goog.vec.Mat3.getRows = function(mat, vec0, vec1, vec2) {
    +  goog.vec.Mat3.getRow(mat, 0, vec0);
    +  goog.vec.Mat3.getRow(mat, 1, vec1);
    +  goog.vec.Mat3.getRow(mat, 2, vec2);
    +};
    +
    +
    +/**
    + * Makes the given 3x3 matrix the zero matrix.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix.
    + * @return {goog.vec.Mat3.Type} return mat so operations can be chained.
    + */
    +goog.vec.Mat3.makeZero = function(mat) {
    +  mat[0] = 0;
    +  mat[1] = 0;
    +  mat[2] = 0;
    +  mat[3] = 0;
    +  mat[4] = 0;
    +  mat[5] = 0;
    +  mat[6] = 0;
    +  mat[7] = 0;
    +  mat[8] = 0;
    +  return mat;
    +};
    +
    +
    +/**
    + * Makes the given 3x3 matrix the identity matrix.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix.
    + * @return {goog.vec.Mat3.Type} return mat so operations can be chained.
    + */
    +goog.vec.Mat3.makeIdentity = function(mat) {
    +  mat[0] = 1;
    +  mat[1] = 0;
    +  mat[2] = 0;
    +  mat[3] = 0;
    +  mat[4] = 1;
    +  mat[5] = 0;
    +  mat[6] = 0;
    +  mat[7] = 0;
    +  mat[8] = 1;
    +  return mat;
    +};
    +
    +
    +/**
    + * Performs a per-component addition of the matrices mat0 and mat1, storing
    + * the result into resultMat.
    + *
    + * @param {goog.vec.Mat3.Type} mat0 The first addend.
    + * @param {goog.vec.Mat3.Type} mat1 The second addend.
    + * @param {goog.vec.Mat3.Type} resultMat The matrix to
    + *     receive the results (may be either mat0 or mat1).
    + * @return {goog.vec.Mat3.Type} return resultMat so that operations can be
    + *     chained together.
    + */
    +goog.vec.Mat3.addMat = function(mat0, mat1, resultMat) {
    +  resultMat[0] = mat0[0] + mat1[0];
    +  resultMat[1] = mat0[1] + mat1[1];
    +  resultMat[2] = mat0[2] + mat1[2];
    +  resultMat[3] = mat0[3] + mat1[3];
    +  resultMat[4] = mat0[4] + mat1[4];
    +  resultMat[5] = mat0[5] + mat1[5];
    +  resultMat[6] = mat0[6] + mat1[6];
    +  resultMat[7] = mat0[7] + mat1[7];
    +  resultMat[8] = mat0[8] + mat1[8];
    +  return resultMat;
    +};
    +
    +
    +/**
    + * Performs a per-component subtraction of the matrices mat0 and mat1,
    + * storing the result into resultMat.
    + *
    + * @param {goog.vec.Mat3.Type} mat0 The minuend.
    + * @param {goog.vec.Mat3.Type} mat1 The subtrahend.
    + * @param {goog.vec.Mat3.Type} resultMat The matrix to receive
    + *     the results (may be either mat0 or mat1).
    + * @return {goog.vec.Mat3.Type} return resultMat so that operations can be
    + *     chained together.
    + */
    +goog.vec.Mat3.subMat = function(mat0, mat1, resultMat) {
    +  resultMat[0] = mat0[0] - mat1[0];
    +  resultMat[1] = mat0[1] - mat1[1];
    +  resultMat[2] = mat0[2] - mat1[2];
    +  resultMat[3] = mat0[3] - mat1[3];
    +  resultMat[4] = mat0[4] - mat1[4];
    +  resultMat[5] = mat0[5] - mat1[5];
    +  resultMat[6] = mat0[6] - mat1[6];
    +  resultMat[7] = mat0[7] - mat1[7];
    +  resultMat[8] = mat0[8] - mat1[8];
    +  return resultMat;
    +};
    +
    +
    +/**
    + * Multiplies matrix mat0 with the given scalar, storing the result
    + * into resultMat.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix.
    + * @param {number} scalar The scalar value to multiple to each element of mat.
    + * @param {goog.vec.Mat3.Type} resultMat The matrix to receive
    + *     the results (may be mat).
    + * @return {goog.vec.Mat3.Type} return resultMat so that operations can be
    + *     chained together.
    + */
    +goog.vec.Mat3.multScalar = function(mat, scalar, resultMat) {
    +  resultMat[0] = mat[0] * scalar;
    +  resultMat[1] = mat[1] * scalar;
    +  resultMat[2] = mat[2] * scalar;
    +  resultMat[3] = mat[3] * scalar;
    +  resultMat[4] = mat[4] * scalar;
    +  resultMat[5] = mat[5] * scalar;
    +  resultMat[6] = mat[6] * scalar;
    +  resultMat[7] = mat[7] * scalar;
    +  resultMat[8] = mat[8] * scalar;
    +  return resultMat;
    +};
    +
    +
    +/**
    + * Multiplies the two matrices mat0 and mat1 using matrix multiplication,
    + * storing the result into resultMat.
    + *
    + * @param {goog.vec.Mat3.Type} mat0 The first (left hand) matrix.
    + * @param {goog.vec.Mat3.Type} mat1 The second (right hand) matrix.
    + * @param {goog.vec.Mat3.Type} resultMat The matrix to receive
    + *     the results (may be either mat0 or mat1).
    + * @return {goog.vec.Mat3.Type} return resultMat so that operations can be
    + *     chained together.
    + */
    +goog.vec.Mat3.multMat = function(mat0, mat1, resultMat) {
    +  var a00 = mat0[0], a10 = mat0[1], a20 = mat0[2];
    +  var a01 = mat0[3], a11 = mat0[4], a21 = mat0[5];
    +  var a02 = mat0[6], a12 = mat0[7], a22 = mat0[8];
    +
    +  var b00 = mat1[0], b10 = mat1[1], b20 = mat1[2];
    +  var b01 = mat1[3], b11 = mat1[4], b21 = mat1[5];
    +  var b02 = mat1[6], b12 = mat1[7], b22 = mat1[8];
    +
    +  resultMat[0] = a00 * b00 + a01 * b10 + a02 * b20;
    +  resultMat[1] = a10 * b00 + a11 * b10 + a12 * b20;
    +  resultMat[2] = a20 * b00 + a21 * b10 + a22 * b20;
    +  resultMat[3] = a00 * b01 + a01 * b11 + a02 * b21;
    +  resultMat[4] = a10 * b01 + a11 * b11 + a12 * b21;
    +  resultMat[5] = a20 * b01 + a21 * b11 + a22 * b21;
    +  resultMat[6] = a00 * b02 + a01 * b12 + a02 * b22;
    +  resultMat[7] = a10 * b02 + a11 * b12 + a12 * b22;
    +  resultMat[8] = a20 * b02 + a21 * b12 + a22 * b22;
    +  return resultMat;
    +};
    +
    +
    +/**
    + * Transposes the given matrix mat storing the result into resultMat.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix to transpose.
    + * @param {goog.vec.Mat3.Type} resultMat The matrix to receive
    + *     the results (may be mat).
    + * @return {goog.vec.Mat3.Type} return resultMat so that operations can be
    + *     chained together.
    + */
    +goog.vec.Mat3.transpose = function(mat, resultMat) {
    +  if (resultMat == mat) {
    +    var a10 = mat[1], a20 = mat[2], a21 = mat[5];
    +    resultMat[1] = mat[3];
    +    resultMat[2] = mat[6];
    +    resultMat[3] = a10;
    +    resultMat[5] = mat[7];
    +    resultMat[6] = a20;
    +    resultMat[7] = a21;
    +  } else {
    +    resultMat[0] = mat[0];
    +    resultMat[1] = mat[3];
    +    resultMat[2] = mat[6];
    +    resultMat[3] = mat[1];
    +    resultMat[4] = mat[4];
    +    resultMat[5] = mat[7];
    +    resultMat[6] = mat[2];
    +    resultMat[7] = mat[5];
    +    resultMat[8] = mat[8];
    +  }
    +  return resultMat;
    +};
    +
    +
    +/**
    + * Computes the inverse of mat0 storing the result into resultMat. If the
    + * inverse is defined, this function returns true, false otherwise.
    + *
    + * @param {goog.vec.Mat3.Type} mat0 The matrix to invert.
    + * @param {goog.vec.Mat3.Type} resultMat The matrix to receive
    + *     the result (may be mat0).
    + * @return {boolean} True if the inverse is defined. If false is returned,
    + *     resultMat is not modified.
    + */
    +goog.vec.Mat3.invert = function(mat0, resultMat) {
    +  var a00 = mat0[0], a10 = mat0[1], a20 = mat0[2];
    +  var a01 = mat0[3], a11 = mat0[4], a21 = mat0[5];
    +  var a02 = mat0[6], a12 = mat0[7], a22 = mat0[8];
    +
    +  var t00 = a11 * a22 - a12 * a21;
    +  var t10 = a12 * a20 - a10 * a22;
    +  var t20 = a10 * a21 - a11 * a20;
    +  var det = a00 * t00 + a01 * t10 + a02 * t20;
    +  if (det == 0) {
    +    return false;
    +  }
    +
    +  var idet = 1 / det;
    +  resultMat[0] = t00 * idet;
    +  resultMat[3] = (a02 * a21 - a01 * a22) * idet;
    +  resultMat[6] = (a01 * a12 - a02 * a11) * idet;
    +
    +  resultMat[1] = t10 * idet;
    +  resultMat[4] = (a00 * a22 - a02 * a20) * idet;
    +  resultMat[7] = (a02 * a10 - a00 * a12) * idet;
    +
    +  resultMat[2] = t20 * idet;
    +  resultMat[5] = (a01 * a20 - a00 * a21) * idet;
    +  resultMat[8] = (a00 * a11 - a01 * a10) * idet;
    +  return true;
    +};
    +
    +
    +/**
    + * Returns true if the components of mat0 are equal to the components of mat1.
    + *
    + * @param {goog.vec.Mat3.Type} mat0 The first matrix.
    + * @param {goog.vec.Mat3.Type} mat1 The second matrix.
    + * @return {boolean} True if the the two matrices are equivalent.
    + */
    +goog.vec.Mat3.equals = function(mat0, mat1) {
    +  return mat0.length == mat1.length &&
    +      mat0[0] == mat1[0] && mat0[1] == mat1[1] && mat0[2] == mat1[2] &&
    +      mat0[3] == mat1[3] && mat0[4] == mat1[4] && mat0[5] == mat1[5] &&
    +      mat0[6] == mat1[6] && mat0[7] == mat1[7] && mat0[8] == mat1[8];
    +};
    +
    +
    +/**
    + * Transforms the given vector with the given matrix storing the resulting,
    + * transformed matrix into resultVec.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix supplying the transformation.
    + * @param {goog.vec.Vec3.Type} vec The vector to transform.
    + * @param {goog.vec.Vec3.Type} resultVec The vector to
    + *     receive the results (may be vec).
    + * @return {goog.vec.Vec3.Type} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Mat3.multVec3 = function(mat, vec, resultVec) {
    +  var x = vec[0], y = vec[1], z = vec[2];
    +  resultVec[0] = x * mat[0] + y * mat[3] + z * mat[6];
    +  resultVec[1] = x * mat[1] + y * mat[4] + z * mat[7];
    +  resultVec[2] = x * mat[2] + y * mat[5] + z * mat[8];
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Makes the given 3x3 matrix a translation matrix with x and y
    + * translation values.
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix.
    + * @param {number} x The translation along the x axis.
    + * @param {number} y The translation along the y axis.
    + * @return {goog.vec.Mat3.Type} return mat so that operations can be chained.
    + */
    +goog.vec.Mat3.makeTranslate = function(mat, x, y) {
    +  goog.vec.Mat3.makeIdentity(mat);
    +  goog.vec.Mat3.setColumnValues(mat, 2, x, y, 1);
    +  return mat;
    +};
    +
    +
    +/**
    + * Makes the given 3x3 matrix a scale matrix with x, y, and z scale factors.
    + *
    + * @param {goog.vec.Mat3.Type} mat The 3x3 (9-element) matrix
    + *     array to receive the new scale matrix.
    + * @param {number} x The scale along the x axis.
    + * @param {number} y The scale along the y axis.
    + * @param {number} z The scale along the z axis.
    + * @return {goog.vec.Mat3.Type} return mat so that operations can be chained.
    + */
    +goog.vec.Mat3.makeScale = function(mat, x, y, z) {
    +  goog.vec.Mat3.makeIdentity(mat);
    +  goog.vec.Mat3.setDiagonalValues(mat, x, y, z);
    +  return mat;
    +};
    +
    +
    +/**
    + * Makes the given 3x3 matrix a rotation matrix with the given rotation
    + * angle about the axis defined by the vector (ax, ay, az).
    + *
    + * @param {goog.vec.Mat3.Type} mat The matrix.
    + * @param {number} angle The rotation angle in radians.
    + * @param {number} ax The x component of the rotation axis.
    + * @param {number} ay The y component of the rotation axis.
    + * @param {number} az The z component of the rotation axis.
    + * @return {goog.vec.Mat3.Type} return mat so that operations can be chained.
    + */
    +goog.vec.Mat3.makeRotate = function(mat, angle, ax, ay, az) {
    +  var c = Math.cos(angle);
    +  var d = 1 - c;
    +  var s = Math.sin(angle);
    +
    +  goog.vec.Mat3.setFromValues(mat,
    +      ax * ax * d + c,
    +      ax * ay * d + az * s,
    +      ax * az * d - ay * s,
    +
    +      ax * ay * d - az * s,
    +      ay * ay * d + c,
    +      ay * az * d + ax * s,
    +
    +      ax * az * d + ay * s,
    +      ay * az * d - ax * s,
    +      az * az * d + c);
    +  return mat;
    +};
    diff --git a/contrib/closure-library/goog/vec/mat3_test.html b/contrib/closure-library/goog/vec/mat3_test.html
    new file mode 100644
    index 0000000..e6f2d34
    --- /dev/null
    +++ b/contrib/closure-library/goog/vec/mat3_test.html
    @@ -0,0 +1,300 @@
    +
    +
    +
    +
    +
    +Closure Unit Tests - goog.vec.Vec3
    +
    +
    +
    +
    +
    +
    diff --git a/contrib/closure-library/goog/vec/mat4.js b/contrib/closure-library/goog/vec/mat4.js
    new file mode 100644
    index 0000000..f08c09a
    --- /dev/null
    +++ b/contrib/closure-library/goog/vec/mat4.js
    @@ -0,0 +1,1368 @@
    +// Copyright 2011 The Closure Library Authors. All Rights Reserved.
    +//
    +// Licensed under the Apache License, Version 2.0 (the "License");
    +// you may not use this file except in compliance with the License.
    +// You may obtain a copy of the License at
    +//
    +//      http://www.apache.org/licenses/LICENSE-2.0
    +//
    +// Unless required by applicable law or agreed to in writing, software
    +// distributed under the License is distributed on an "AS-IS" BASIS,
    +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +// See the License for the specific language governing permissions and
    +// limitations under the License.
    +
    +/**
    + * @fileoverview Implements 4x4 matrices and their related functions which are
    + * compatible with WebGL. The API is structured to avoid unnecessary memory
    + * allocations.  The last parameter will typically be the output vector and
    + * an object can be both an input and output parameter to all methods except
    + * where noted. Matrix operations follow the mathematical form when multiplying
    + * vectors as follows: resultVec = matrix * vec.
    + *
    + */
    +goog.provide('goog.vec.Mat4');
    +
    +goog.require('goog.vec');
    +goog.require('goog.vec.Vec3');
    +goog.require('goog.vec.Vec4');
    +
    +
    +/**
    + * @typedef {goog.vec.ArrayType}
    + */
    +goog.vec.Mat4.Type;
    +
    +
    +/**
    + * Creates the array representation of a 4x4 matrix. The use of the array
    + * directly instead of a class reduces overhead.
    + * The returned matrix is cleared to all zeros.
    + *
    + * @return {goog.vec.Mat4.Type} The new, sixteen element array.
    + */
    +goog.vec.Mat4.create = function() {
    +  return new Float32Array(16);
    +};
    +
    +
    +/**
    + * Creates the array representation of a 4x4 matrix. The use of the array
    + * directly eliminates any overhead associated with the class representation
    + * defined above. The returned matrix is initialized with the identity
    + *
    + * @return {goog.vec.Mat4.Type} The new, sixteen element array.
    + */
    +goog.vec.Mat4.createIdentity = function() {
    +  var mat = goog.vec.Mat4.create();
    +  mat[0] = mat[5] = mat[10] = mat[15] = 1;
    +  return mat;
    +};
    +
    +
    +/**
    + * Creates a 4x4 matrix initialized from the given array.
    + *
    + * @param {goog.vec.Mat4.Type} matrix The array containing the
    + *     matrix values in column major order.
    + * @return {goog.vec.Mat4.Type} The new, 16 element array.
    + */
    +goog.vec.Mat4.createFromArray = function(matrix) {
    +  var newMatrix = goog.vec.Mat4.create();
    +  goog.vec.Mat4.setFromArray(newMatrix, matrix);
    +  return newMatrix;
    +};
    +
    +
    +/**
    + * Creates a 4x4 matrix initialized from the given values.
    + *
    + * @param {number} v00 The values at (0, 0).
    + * @param {number} v10 The values at (1, 0).
    + * @param {number} v20 The values at (2, 0).
    + * @param {number} v30 The values at (3, 0).
    + * @param {number} v01 The values at (0, 1).
    + * @param {number} v11 The values at (1, 1).
    + * @param {number} v21 The values at (2, 1).
    + * @param {number} v31 The values at (3, 1).
    + * @param {number} v02 The values at (0, 2).
    + * @param {number} v12 The values at (1, 2).
    + * @param {number} v22 The values at (2, 2).
    + * @param {number} v32 The values at (3, 2).
    + * @param {number} v03 The values at (0, 3).
    + * @param {number} v13 The values at (1, 3).
    + * @param {number} v23 The values at (2, 3).
    + * @param {number} v33 The values at (3, 3).
    + * @return {goog.vec.Mat4.Type} The new, 16 element array.
    + */
    +goog.vec.Mat4.createFromValues = function(
    +    v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32,
    +    v03, v13, v23, v33) {
    +  var newMatrix = goog.vec.Mat4.create();
    +  goog.vec.Mat4.setFromValues(
    +      newMatrix, v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32,
    +      v03, v13, v23, v33);
    +  return newMatrix;
    +};
    +
    +
    +/**
    + * Creates a clone of a 4x4 matrix.
    + *
    + * @param {goog.vec.Mat4.Type} matrix The source 4x4 matrix.
    + * @return {goog.vec.Mat4.Type} The new, 16 element matrix.
    + */
    +goog.vec.Mat4.clone = goog.vec.Mat4.createFromArray;
    +
    +
    +/**
    + * Retrieves the element at the requested row and column.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix containing the
    + *     value to retrieve.
    + * @param {number} row The row index.
    + * @param {number} column The column index.
    + * @return {number} The element value at the requested row, column indices.
    + */
    +goog.vec.Mat4.getElement = function(mat, row, column) {
    +  return mat[row + column * 4];
    +};
    +
    +
    +/**
    + * Sets the element at the requested row and column.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix to set the value on.
    + * @param {number} row The row index.
    + * @param {number} column The column index.
    + * @param {number} value The value to set at the requested row, column.
    + */
    +goog.vec.Mat4.setElement = function(mat, row, column, value) {
    +  mat[row + column * 4] = value;
    +};
    +
    +
    +/**
    + * Initializes the matrix from the set of values. Note the values supplied are
    + * in column major order.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix to receive the
    + *     values.
    + * @param {number} v00 The values at (0, 0).
    + * @param {number} v10 The values at (1, 0).
    + * @param {number} v20 The values at (2, 0).
    + * @param {number} v30 The values at (3, 0).
    + * @param {number} v01 The values at (0, 1).
    + * @param {number} v11 The values at (1, 1).
    + * @param {number} v21 The values at (2, 1).
    + * @param {number} v31 The values at (3, 1).
    + * @param {number} v02 The values at (0, 2).
    + * @param {number} v12 The values at (1, 2).
    + * @param {number} v22 The values at (2, 2).
    + * @param {number} v32 The values at (3, 2).
    + * @param {number} v03 The values at (0, 3).
    + * @param {number} v13 The values at (1, 3).
    + * @param {number} v23 The values at (2, 3).
    + * @param {number} v33 The values at (3, 3).
    + */
    +goog.vec.Mat4.setFromValues = function(
    +    mat, v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32,
    +    v03, v13, v23, v33) {
    +  mat[0] = v00;
    +  mat[1] = v10;
    +  mat[2] = v20;
    +  mat[3] = v30;
    +  mat[4] = v01;
    +  mat[5] = v11;
    +  mat[6] = v21;
    +  mat[7] = v31;
    +  mat[8] = v02;
    +  mat[9] = v12;
    +  mat[10] = v22;
    +  mat[11] = v32;
    +  mat[12] = v03;
    +  mat[13] = v13;
    +  mat[14] = v23;
    +  mat[15] = v33;
    +};
    +
    +
    +/**
    + * Sets the matrix from the array of values stored in column major order.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix to receive the values.
    + * @param {goog.vec.ArrayType} values The column major ordered
    + *     array of values to store in the matrix.
    + */
    +goog.vec.Mat4.setFromArray = function(mat, values) {
    +  mat[0] = values[0];
    +  mat[1] = values[1];
    +  mat[2] = values[2];
    +  mat[3] = values[3];
    +  mat[4] = values[4];
    +  mat[5] = values[5];
    +  mat[6] = values[6];
    +  mat[7] = values[7];
    +  mat[8] = values[8];
    +  mat[9] = values[9];
    +  mat[10] = values[10];
    +  mat[11] = values[11];
    +  mat[12] = values[12];
    +  mat[13] = values[13];
    +  mat[14] = values[14];
    +  mat[15] = values[15];
    +};
    +
    +
    +/**
    + * Sets the matrix from the array of values stored in row major order.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix to receive the values.
    + * @param {goog.vec.ArrayType} values The row major ordered array of
    + *     values to store in the matrix.
    + */
    +goog.vec.Mat4.setFromRowMajorArray = function(mat, values) {
    +  mat[0] = values[0];
    +  mat[1] = values[4];
    +  mat[2] = values[8];
    +  mat[3] = values[12];
    +
    +  mat[4] = values[1];
    +  mat[5] = values[5];
    +  mat[6] = values[9];
    +  mat[7] = values[13];
    +
    +  mat[8] = values[2];
    +  mat[9] = values[6];
    +  mat[10] = values[10];
    +  mat[11] = values[14];
    +
    +  mat[12] = values[3];
    +  mat[13] = values[7];
    +  mat[14] = values[11];
    +  mat[15] = values[15];
    +};
    +
    +
    +/**
    + * Sets the diagonal values of the matrix from the given values.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix to receive the
    + *     values.
    + * @param {number} v00 The values for (0, 0).
    + * @param {number} v11 The values for (1, 1).
    + * @param {number} v22 The values for (2, 2).
    + * @param {number} v33 The values for (3, 3).
    + */
    +goog.vec.Mat4.setDiagonalValues = function(mat, v00, v11, v22, v33) {
    +  mat[0] = v00;
    +  mat[5] = v11;
    +  mat[10] = v22;
    +  mat[15] = v33;
    +};
    +
    +
    +/**
    + * Sets the diagonal values of the matrix from the given vector.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix to receive the
    + *     values.
    + * @param {goog.vec.Vec4.Type} vec The vector containing the
    + *     values.
    + */
    +goog.vec.Mat4.setDiagonal = function(mat, vec) {
    +  mat[0] = vec[0];
    +  mat[5] = vec[1];
    +  mat[10] = vec[2];
    +  mat[15] = vec[3];
    +};
    +
    +
    +/**
    + * Sets the specified column with the supplied values.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix to recieve the
    + *     values.
    + * @param {number} column The column index to set the values on.
    + * @param {number} v0 The value for row 0.
    + * @param {number} v1 The value for row 1.
    + * @param {number} v2 The value for row 2.
    + * @param {number} v3 The value for row 3.
    + */
    +goog.vec.Mat4.setColumnValues = function(mat, column, v0, v1, v2, v3) {
    +  var i = column * 4;
    +  mat[i] = v0;
    +  mat[i + 1] = v1;
    +  mat[i + 2] = v2;
    +  mat[i + 3] = v3;
    +};
    +
    +
    +/**
    + * Sets the specified column with the value from the supplied vector.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix to receive the
    + *     values.
    + * @param {number} column The column index to set the values on.
    + * @param {goog.vec.Vec4.Type} vec The vector of elements for the
    + *     column.
    + */
    +goog.vec.Mat4.setColumn = function(mat, column, vec) {
    +  var i = column * 4;
    +  mat[i] = vec[0];
    +  mat[i + 1] = vec[1];
    +  mat[i + 2] = vec[2];
    +  mat[i + 3] = vec[3];
    +};
    +
    +
    +/**
    + * Retrieves the specified column from the matrix into the given vector.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix supplying the values.
    + * @param {number} column The column to get the values from.
    + * @param {goog.vec.Vec4.Type} vec The vector of elements to
    + *     receive the column.
    + */
    +goog.vec.Mat4.getColumn = function(mat, column, vec) {
    +  var i = column * 4;
    +  vec[0] = mat[i];
    +  vec[1] = mat[i + 1];
    +  vec[2] = mat[i + 2];
    +  vec[3] = mat[i + 3];
    +};
    +
    +
    +/**
    + * Sets the columns of the matrix from the given vectors.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix to receive the values.
    + * @param {goog.vec.Vec4.Type} vec0 The values for column 0.
    + * @param {goog.vec.Vec4.Type} vec1 The values for column 1.
    + * @param {goog.vec.Vec4.Type} vec2 The values for column 2.
    + * @param {goog.vec.Vec4.Type} vec3 The values for column 3.
    + */
    +goog.vec.Mat4.setColumns = function(mat, vec0, vec1, vec2, vec3) {
    +  goog.vec.Mat4.setColumn(mat, 0, vec0);
    +  goog.vec.Mat4.setColumn(mat, 1, vec1);
    +  goog.vec.Mat4.setColumn(mat, 2, vec2);
    +  goog.vec.Mat4.setColumn(mat, 3, vec3);
    +};
    +
    +
    +/**
    + * Retrieves the column values from the given matrix into the given vectors.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix supplying the columns.
    + * @param {goog.vec.Vec4.Type} vec0 The vector to receive column 0.
    + * @param {goog.vec.Vec4.Type} vec1 The vector to receive column 1.
    + * @param {goog.vec.Vec4.Type} vec2 The vector to receive column 2.
    + * @param {goog.vec.Vec4.Type} vec3 The vector to receive column 3.
    + */
    +goog.vec.Mat4.getColumns = function(mat, vec0, vec1, vec2, vec3) {
    +  goog.vec.Mat4.getColumn(mat, 0, vec0);
    +  goog.vec.Mat4.getColumn(mat, 1, vec1);
    +  goog.vec.Mat4.getColumn(mat, 2, vec2);
    +  goog.vec.Mat4.getColumn(mat, 3, vec3);
    +};
    +
    +
    +/**
    + * Sets the row values from the supplied values.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix to receive the values.
    + * @param {number} row The index of the row to receive the values.
    + * @param {number} v0 The value for column 0.
    + * @param {number} v1 The value for column 1.
    + * @param {number} v2 The value for column 2.
    + * @param {number} v3 The value for column 3.
    + */
    +goog.vec.Mat4.setRowValues = function(mat, row, v0, v1, v2, v3) {
    +  mat[row] = v0;
    +  mat[row + 4] = v1;
    +  mat[row + 8] = v2;
    +  mat[row + 12] = v3;
    +};
    +
    +
    +/**
    + * Sets the row values from the supplied vector.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix to receive the row values.
    + * @param {number} row The index of the row.
    + * @param {goog.vec.Vec4.Type} vec The vector containing the values.
    + */
    +goog.vec.Mat4.setRow = function(mat, row, vec) {
    +  mat[row] = vec[0];
    +  mat[row + 4] = vec[1];
    +  mat[row + 8] = vec[2];
    +  mat[row + 12] = vec[3];
    +};
    +
    +
    +/**
    + * Retrieves the row values into the given vector.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix supplying the values.
    + * @param {number} row The index of the row supplying the values.
    + * @param {goog.vec.Vec4.Type} vec The vector to receive the row.
    + */
    +goog.vec.Mat4.getRow = function(mat, row, vec) {
    +  vec[0] = mat[row];
    +  vec[1] = mat[row + 4];
    +  vec[2] = mat[row + 8];
    +  vec[3] = mat[row + 12];
    +};
    +
    +
    +/**
    + * Sets the rows of the matrix from the supplied vectors.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix to receive the values.
    + * @param {goog.vec.Vec4.Type} vec0 The values for row 0.
    + * @param {goog.vec.Vec4.Type} vec1 The values for row 1.
    + * @param {goog.vec.Vec4.Type} vec2 The values for row 2.
    + * @param {goog.vec.Vec4.Type} vec3 The values for row 3.
    + */
    +goog.vec.Mat4.setRows = function(mat, vec0, vec1, vec2, vec3) {
    +  goog.vec.Mat4.setRow(mat, 0, vec0);
    +  goog.vec.Mat4.setRow(mat, 1, vec1);
    +  goog.vec.Mat4.setRow(mat, 2, vec2);
    +  goog.vec.Mat4.setRow(mat, 3, vec3);
    +};
    +
    +
    +/**
    + * Retrieves the rows of the matrix into the supplied vectors.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix to supply the values.
    + * @param {goog.vec.Vec4.Type} vec0 The vector to receive row 0.
    + * @param {goog.vec.Vec4.Type} vec1 The vector to receive row 1.
    + * @param {goog.vec.Vec4.Type} vec2 The vector to receive row 2.
    + * @param {goog.vec.Vec4.Type} vec3 The vector to receive row 3.
    + */
    +goog.vec.Mat4.getRows = function(mat, vec0, vec1, vec2, vec3) {
    +  goog.vec.Mat4.getRow(mat, 0, vec0);
    +  goog.vec.Mat4.getRow(mat, 1, vec1);
    +  goog.vec.Mat4.getRow(mat, 2, vec2);
    +  goog.vec.Mat4.getRow(mat, 3, vec3);
    +};
    +
    +
    +/**
    + * Makes the given 4x4 matrix the zero matrix.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix.
    + * @return {goog.vec.Mat4.Type} return mat so operations can be chained.
    + */
    +goog.vec.Mat4.makeZero = function(mat) {
    +  mat[0] = 0;
    +  mat[1] = 0;
    +  mat[2] = 0;
    +  mat[3] = 0;
    +  mat[4] = 0;
    +  mat[5] = 0;
    +  mat[6] = 0;
    +  mat[7] = 0;
    +  mat[8] = 0;
    +  mat[9] = 0;
    +  mat[10] = 0;
    +  mat[11] = 0;
    +  mat[12] = 0;
    +  mat[13] = 0;
    +  mat[14] = 0;
    +  mat[15] = 0;
    +  return mat;
    +};
    +
    +
    +/**
    + * Makes the given 4x4 matrix the identity matrix.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix.
    + * @return {goog.vec.Mat4.Type} return mat so operations can be chained.
    + */
    +goog.vec.Mat4.makeIdentity = function(mat) {
    +  mat[0] = 1;
    +  mat[1] = 0;
    +  mat[2] = 0;
    +  mat[3] = 0;
    +  mat[4] = 0;
    +  mat[5] = 1;
    +  mat[6] = 0;
    +  mat[7] = 0;
    +  mat[8] = 0;
    +  mat[9] = 0;
    +  mat[10] = 1;
    +  mat[11] = 0;
    +  mat[12] = 0;
    +  mat[13] = 0;
    +  mat[14] = 0;
    +  mat[15] = 1;
    +  return mat;
    +};
    +
    +
    +/**
    + * Performs a per-component addition of the matrix mat0 and mat1, storing
    + * the result into resultMat.
    + *
    + * @param {goog.vec.Mat4.Type} mat0 The first addend.
    + * @param {goog.vec.Mat4.Type} mat1 The second addend.
    + * @param {goog.vec.Mat4.Type} resultMat The matrix to
    + *     receive the results (may be either mat0 or mat1).
    + * @return {goog.vec.Mat4.Type} return resultMat so that operations can be
    + *     chained together.
    + */
    +goog.vec.Mat4.addMat = function(mat0, mat1, resultMat) {
    +  resultMat[0] = mat0[0] + mat1[0];
    +  resultMat[1] = mat0[1] + mat1[1];
    +  resultMat[2] = mat0[2] + mat1[2];
    +  resultMat[3] = mat0[3] + mat1[3];
    +  resultMat[4] = mat0[4] + mat1[4];
    +  resultMat[5] = mat0[5] + mat1[5];
    +  resultMat[6] = mat0[6] + mat1[6];
    +  resultMat[7] = mat0[7] + mat1[7];
    +  resultMat[8] = mat0[8] + mat1[8];
    +  resultMat[9] = mat0[9] + mat1[9];
    +  resultMat[10] = mat0[10] + mat1[10];
    +  resultMat[11] = mat0[11] + mat1[11];
    +  resultMat[12] = mat0[12] + mat1[12];
    +  resultMat[13] = mat0[13] + mat1[13];
    +  resultMat[14] = mat0[14] + mat1[14];
    +  resultMat[15] = mat0[15] + mat1[15];
    +  return resultMat;
    +};
    +
    +
    +/**
    + * Performs a per-component subtraction of the matrix mat0 and mat1,
    + * storing the result into resultMat.
    + *
    + * @param {goog.vec.Mat4.Type} mat0 The minuend.
    + * @param {goog.vec.Mat4.Type} mat1 The subtrahend.
    + * @param {goog.vec.Mat4.Type} resultMat The matrix to receive
    + *     the results (may be either mat0 or mat1).
    + * @return {goog.vec.Mat4.Type} return resultMat so that operations can be
    + *     chained together.
    + */
    +goog.vec.Mat4.subMat = function(mat0, mat1, resultMat) {
    +  resultMat[0] = mat0[0] - mat1[0];
    +  resultMat[1] = mat0[1] - mat1[1];
    +  resultMat[2] = mat0[2] - mat1[2];
    +  resultMat[3] = mat0[3] - mat1[3];
    +  resultMat[4] = mat0[4] - mat1[4];
    +  resultMat[5] = mat0[5] - mat1[5];
    +  resultMat[6] = mat0[6] - mat1[6];
    +  resultMat[7] = mat0[7] - mat1[7];
    +  resultMat[8] = mat0[8] - mat1[8];
    +  resultMat[9] = mat0[9] - mat1[9];
    +  resultMat[10] = mat0[10] - mat1[10];
    +  resultMat[11] = mat0[11] - mat1[11];
    +  resultMat[12] = mat0[12] - mat1[12];
    +  resultMat[13] = mat0[13] - mat1[13];
    +  resultMat[14] = mat0[14] - mat1[14];
    +  resultMat[15] = mat0[15] - mat1[15];
    +  return resultMat;
    +};
    +
    +
    +/**
    + * Multiplies matrix mat with the given scalar, storing the result
    + * into resultMat.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix.
    + * @param {number} scalar The scalar value to multiply to each element of mat.
    + * @param {goog.vec.Mat4.Type} resultMat The matrix to receive
    + *     the results (may be mat).
    + * @return {goog.vec.Mat4.Type} return resultMat so that operations can be
    + *     chained together.
    + */
    +goog.vec.Mat4.multScalar = function(mat, scalar, resultMat) {
    +  resultMat[0] = mat[0] * scalar;
    +  resultMat[1] = mat[1] * scalar;
    +  resultMat[2] = mat[2] * scalar;
    +  resultMat[3] = mat[3] * scalar;
    +  resultMat[4] = mat[4] * scalar;
    +  resultMat[5] = mat[5] * scalar;
    +  resultMat[6] = mat[6] * scalar;
    +  resultMat[7] = mat[7] * scalar;
    +  resultMat[8] = mat[8] * scalar;
    +  resultMat[9] = mat[9] * scalar;
    +  resultMat[10] = mat[10] * scalar;
    +  resultMat[11] = mat[11] * scalar;
    +  resultMat[12] = mat[12] * scalar;
    +  resultMat[13] = mat[13] * scalar;
    +  resultMat[14] = mat[14] * scalar;
    +  resultMat[15] = mat[15] * scalar;
    +  return resultMat;
    +};
    +
    +
    +/**
    + * Multiplies the two matrices mat0 and mat1 using matrix multiplication,
    + * storing the result into resultMat.
    + *
    + * @param {goog.vec.Mat4.Type} mat0 The first (left hand) matrix.
    + * @param {goog.vec.Mat4.Type} mat1 The second (right hand)
    + *     matrix.
    + * @param {goog.vec.Mat4.Type} resultMat The matrix to receive
    + *     the results (may be either mat0 or mat1).
    + * @return {goog.vec.Mat4.Type} return resultMat so that operations can be
    + *     chained together.
    + */
    +goog.vec.Mat4.multMat = function(mat0, mat1, resultMat) {
    +  var a00 = mat0[0], a10 = mat0[1], a20 = mat0[2], a30 = mat0[3];
    +  var a01 = mat0[4], a11 = mat0[5], a21 = mat0[6], a31 = mat0[7];
    +  var a02 = mat0[8], a12 = mat0[9], a22 = mat0[10], a32 = mat0[11];
    +  var a03 = mat0[12], a13 = mat0[13], a23 = mat0[14], a33 = mat0[15];
    +
    +  var b00 = mat1[0], b10 = mat1[1], b20 = mat1[2], b30 = mat1[3];
    +  var b01 = mat1[4], b11 = mat1[5], b21 = mat1[6], b31 = mat1[7];
    +  var b02 = mat1[8], b12 = mat1[9], b22 = mat1[10], b32 = mat1[11];
    +  var b03 = mat1[12], b13 = mat1[13], b23 = mat1[14], b33 = mat1[15];
    +
    +  resultMat[0] = a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30;
    +  resultMat[1] = a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30;
    +  resultMat[2] = a20 * b00 + a21 * b10 + a22 * b20 + a23 * b30;
    +  resultMat[3] = a30 * b00 + a31 * b10 + a32 * b20 + a33 * b30;
    +
    +  resultMat[4] = a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31;
    +  resultMat[5] = a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31;
    +  resultMat[6] = a20 * b01 + a21 * b11 + a22 * b21 + a23 * b31;
    +  resultMat[7] = a30 * b01 + a31 * b11 + a32 * b21 + a33 * b31;
    +
    +  resultMat[8] = a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32;
    +  resultMat[9] = a10 * b02 + a11 * b12 + a12 * b22 + a13 * b32;
    +  resultMat[10] = a20 * b02 + a21 * b12 + a22 * b22 + a23 * b32;
    +  resultMat[11] = a30 * b02 + a31 * b12 + a32 * b22 + a33 * b32;
    +
    +  resultMat[12] = a00 * b03 + a01 * b13 + a02 * b23 + a03 * b33;
    +  resultMat[13] = a10 * b03 + a11 * b13 + a12 * b23 + a13 * b33;
    +  resultMat[14] = a20 * b03 + a21 * b13 + a22 * b23 + a23 * b33;
    +  resultMat[15] = a30 * b03 + a31 * b13 + a32 * b23 + a33 * b33;
    +  return resultMat;
    +};
    +
    +
    +/**
    + * Transposes the given matrix mat storing the result into resultMat.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix to transpose.
    + * @param {goog.vec.Mat4.Type} resultMat The matrix to receive
    + *     the results (may be mat).
    + * @return {goog.vec.Mat4.Type} return resultMat so that operations can be
    + *     chained together.
    + */
    +goog.vec.Mat4.transpose = function(mat, resultMat) {
    +  if (resultMat == mat) {
    +    var a10 = mat[1], a20 = mat[2], a30 = mat[3];
    +    var a21 = mat[6], a31 = mat[7];
    +    var a32 = mat[11];
    +    resultMat[1] = mat[4];
    +    resultMat[2] = mat[8];
    +    resultMat[3] = mat[12];
    +    resultMat[4] = a10;
    +    resultMat[6] = mat[9];
    +    resultMat[7] = mat[13];
    +    resultMat[8] = a20;
    +    resultMat[9] = a21;
    +    resultMat[11] = mat[14];
    +    resultMat[12] = a30;
    +    resultMat[13] = a31;
    +    resultMat[14] = a32;
    +  } else {
    +    resultMat[0] = mat[0];
    +    resultMat[1] = mat[4];
    +    resultMat[2] = mat[8];
    +    resultMat[3] = mat[12];
    +
    +    resultMat[4] = mat[1];
    +    resultMat[5] = mat[5];
    +    resultMat[6] = mat[9];
    +    resultMat[7] = mat[13];
    +
    +    resultMat[8] = mat[2];
    +    resultMat[9] = mat[6];
    +    resultMat[10] = mat[10];
    +    resultMat[11] = mat[14];
    +
    +    resultMat[12] = mat[3];
    +    resultMat[13] = mat[7];
    +    resultMat[14] = mat[11];
    +    resultMat[15] = mat[15];
    +  }
    +  return resultMat;
    +};
    +
    +
    +/**
    + * Computes the determinant of the matrix.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix to compute the
    + *     matrix for.
    + * @return {number} The determinant of the matrix.
    + */
    +goog.vec.Mat4.determinant = function(mat) {
    +  var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3];
    +  var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7];
    +  var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11];
    +  var m03 = mat[12], m13 = mat[13], m23 = mat[14], m33 = mat[15];
    +
    +  var a0 = m00 * m11 - m10 * m01;
    +  var a1 = m00 * m21 - m20 * m01;
    +  var a2 = m00 * m31 - m30 * m01;
    +  var a3 = m10 * m21 - m20 * m11;
    +  var a4 = m10 * m31 - m30 * m11;
    +  var a5 = m20 * m31 - m30 * m21;
    +  var b0 = m02 * m13 - m12 * m03;
    +  var b1 = m02 * m23 - m22 * m03;
    +  var b2 = m02 * m33 - m32 * m03;
    +  var b3 = m12 * m23 - m22 * m13;
    +  var b4 = m12 * m33 - m32 * m13;
    +  var b5 = m22 * m33 - m32 * m23;
    +
    +  return a0 * b5 - a1 * b4 + a2 * b3 + a3 * b2 - a4 * b1 + a5 * b0;
    +};
    +
    +
    +/**
    + * Computes the inverse of mat storing the result into resultMat. If the
    + * inverse is defined, this function returns true, false otherwise.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix to invert.
    + * @param {goog.vec.Mat4.Type} resultMat The matrix to receive
    + *     the result (may be mat).
    + * @return {boolean} True if the inverse is defined. If false is returned,
    + *     resultMat is not modified.
    + */
    +goog.vec.Mat4.invert = function(mat, resultMat) {
    +  var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3];
    +  var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7];
    +  var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11];
    +  var m03 = mat[12], m13 = mat[13], m23 = mat[14], m33 = mat[15];
    +
    +  var a0 = m00 * m11 - m10 * m01;
    +  var a1 = m00 * m21 - m20 * m01;
    +  var a2 = m00 * m31 - m30 * m01;
    +  var a3 = m10 * m21 - m20 * m11;
    +  var a4 = m10 * m31 - m30 * m11;
    +  var a5 = m20 * m31 - m30 * m21;
    +  var b0 = m02 * m13 - m12 * m03;
    +  var b1 = m02 * m23 - m22 * m03;
    +  var b2 = m02 * m33 - m32 * m03;
    +  var b3 = m12 * m23 - m22 * m13;
    +  var b4 = m12 * m33 - m32 * m13;
    +  var b5 = m22 * m33 - m32 * m23;
    +
    +  var det = a0 * b5 - a1 * b4 + a2 * b3 + a3 * b2 - a4 * b1 + a5 * b0;
    +  if (det == 0) {
    +    return false;
    +  }
    +
    +  var idet = 1.0 / det;
    +  resultMat[0] = (m11 * b5 - m21 * b4 + m31 * b3) * idet;
    +  resultMat[1] = (-m10 * b5 + m20 * b4 - m30 * b3) * idet;
    +  resultMat[2] = (m13 * a5 - m23 * a4 + m33 * a3) * idet;
    +  resultMat[3] = (-m12 * a5 + m22 * a4 - m32 * a3) * idet;
    +  resultMat[4] = (-m01 * b5 + m21 * b2 - m31 * b1) * idet;
    +  resultMat[5] = (m00 * b5 - m20 * b2 + m30 * b1) * idet;
    +  resultMat[6] = (-m03 * a5 + m23 * a2 - m33 * a1) * idet;
    +  resultMat[7] = (m02 * a5 - m22 * a2 + m32 * a1) * idet;
    +  resultMat[8] = (m01 * b4 - m11 * b2 + m31 * b0) * idet;
    +  resultMat[9] = (-m00 * b4 + m10 * b2 - m30 * b0) * idet;
    +  resultMat[10] = (m03 * a4 - m13 * a2 + m33 * a0) * idet;
    +  resultMat[11] = (-m02 * a4 + m12 * a2 - m32 * a0) * idet;
    +  resultMat[12] = (-m01 * b3 + m11 * b1 - m21 * b0) * idet;
    +  resultMat[13] = (m00 * b3 - m10 * b1 + m20 * b0) * idet;
    +  resultMat[14] = (-m03 * a3 + m13 * a1 - m23 * a0) * idet;
    +  resultMat[15] = (m02 * a3 - m12 * a1 + m22 * a0) * idet;
    +  return true;
    +};
    +
    +
    +/**
    + * Returns true if the components of mat0 are equal to the components of mat1.
    + *
    + * @param {goog.vec.Mat4.Type} mat0 The first matrix.
    + * @param {goog.vec.Mat4.Type} mat1 The second matrix.
    + * @return {boolean} True if the the two matrices are equivalent.
    + */
    +goog.vec.Mat4.equals = function(mat0, mat1) {
    +  return mat0.length == mat1.length &&
    +      mat0[0] == mat1[0] &&
    +      mat0[1] == mat1[1] &&
    +      mat0[2] == mat1[2] &&
    +      mat0[3] == mat1[3] &&
    +      mat0[4] == mat1[4] &&
    +      mat0[5] == mat1[5] &&
    +      mat0[6] == mat1[6] &&
    +      mat0[7] == mat1[7] &&
    +      mat0[8] == mat1[8] &&
    +      mat0[9] == mat1[9] &&
    +      mat0[10] == mat1[10] &&
    +      mat0[11] == mat1[11] &&
    +      mat0[12] == mat1[12] &&
    +      mat0[13] == mat1[13] &&
    +      mat0[14] == mat1[14] &&
    +      mat0[15] == mat1[15];
    +};
    +
    +
    +/**
    + * Transforms the given vector with the given matrix storing the resulting,
    + * transformed vector into resultVec. The input vector is multiplied against the
    + * upper 3x4 matrix omitting the projective component.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix supplying the transformation.
    + * @param {goog.vec.Vec3.Type} vec The 3 element vector to transform.
    + * @param {goog.vec.Vec3.Type} resultVec The 3 element vector to
    + *     receive the results (may be vec).
    + * @return {goog.vec.Vec3.Type} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Mat4.multVec3 = function(mat, vec, resultVec) {
    +  var x = vec[0], y = vec[1], z = vec[2];
    +  resultVec[0] = x * mat[0] + y * mat[4] + z * mat[8] + mat[12];
    +  resultVec[1] = x * mat[1] + y * mat[5] + z * mat[9] + mat[13];
    +  resultVec[2] = x * mat[2] + y * mat[6] + z * mat[10] + mat[14];
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Transforms the given vector with the given matrix storing the resulting,
    + * transformed vector into resultVec. The input vector is multiplied against the
    + * upper 3x3 matrix omitting the projective component and translation
    + * components.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix supplying the transformation.
    + * @param {goog.vec.Vec3.Type} vec The 3 element vector to transform.
    + * @param {goog.vec.Vec3.Type} resultVec The 3 element vector to
    + *     receive the results (may be vec).
    + * @return {goog.vec.Vec3.Type} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Mat4.multVec3NoTranslate = function(mat, vec, resultVec) {
    +  var x = vec[0], y = vec[1], z = vec[2];
    +  resultVec[0] = x * mat[0] + y * mat[4] + z * mat[8];
    +  resultVec[1] = x * mat[1] + y * mat[5] + z * mat[9];
    +  resultVec[2] = x * mat[2] + y * mat[6] + z * mat[10];
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Transforms the given vector with the given matrix storing the resulting,
    + * transformed vector into resultVec. The input vector is multiplied against the
    + * full 4x4 matrix with the homogeneous divide applied to reduce the 4 element
    + * vector to a 3 element vector.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix supplying the transformation.
    + * @param {goog.vec.Vec3.Type} vec The 3 element vector to
    + *     transform.
    + * @param {goog.vec.Vec3.Type} resultVec The 3 element vector
    + *     to receive the results (may be vec).
    + * @return {goog.vec.Vec3.Type} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Mat4.multVec3Projective = function(mat, vec, resultVec) {
    +  var x = vec[0], y = vec[1], z = vec[2];
    +  var invw = 1 / (x * mat[3] + y * mat[7] + z * mat[11] + mat[15]);
    +  resultVec[0] = (x * mat[0] + y * mat[4] + z * mat[8] + mat[12]) * invw;
    +  resultVec[1] = (x * mat[1] + y * mat[5] + z * mat[9] + mat[13]) * invw;
    +  resultVec[2] = (x * mat[2] + y * mat[6] + z * mat[10] + mat[14]) * invw;
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Transforms the given vector with the given matrix storing the resulting,
    + * transformed vector into resultVec.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix supplying the transformation.
    + * @param {goog.vec.Vec4.Type} vec The vector to transform.
    + * @param {goog.vec.Vec4.Type} resultVec The vector to
    + *     receive the results (may be vec).
    + * @return {goog.vec.Vec4.Type} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Mat4.multVec4 = function(mat, vec, resultVec) {
    +  var x = vec[0], y = vec[1], z = vec[2], w = vec[3];
    +  resultVec[0] = x * mat[0] + y * mat[4] + z * mat[8] + w * mat[12];
    +  resultVec[1] = x * mat[1] + y * mat[5] + z * mat[9] + w * mat[13];
    +  resultVec[2] = x * mat[2] + y * mat[6] + z * mat[10] + w * mat[14];
    +  resultVec[3] = x * mat[3] + y * mat[7] + z * mat[11] + w * mat[15];
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Makes the given 4x4 matrix a translation matrix with x, y and z
    + * translation factors.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix.
    + * @param {number} x The translation along the x axis.
    + * @param {number} y The translation along the y axis.
    + * @param {number} z The translation along the z axis.
    + * @return {goog.vec.Mat4.Type} return mat so that operations can be chained.
    + */
    +goog.vec.Mat4.makeTranslate = function(mat, x, y, z) {
    +  goog.vec.Mat4.makeIdentity(mat);
    +  goog.vec.Mat4.setColumnValues(mat, 3, x, y, z, 1);
    +  return mat;
    +};
    +
    +
    +/**
    + * Makes the given 4x4 matrix as a scale matrix with x, y and z scale factors.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix.
    + * @param {number} x The scale along the x axis.
    + * @param {number} y The scale along the y axis.
    + * @param {number} z The scale along the z axis.
    + * @return {goog.vec.Mat4.Type} return mat so that operations can be chained.
    + */
    +goog.vec.Mat4.makeScale = function(mat, x, y, z) {
    +  goog.vec.Mat4.makeIdentity(mat);
    +  goog.vec.Mat4.setDiagonalValues(mat, x, y, z, 1);
    +  return mat;
    +};
    +
    +
    +/**
    + * Makes the given 4x4 matrix a rotation matrix with the given rotation
    + * angle about the axis defined by the vector (ax, ay, az).
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix.
    + * @param {number} angle The rotation angle in radians.
    + * @param {number} ax The x component of the rotation axis.
    + * @param {number} ay The y component of the rotation axis.
    + * @param {number} az The z component of the rotation axis.
    + * @return {goog.vec.Mat4.Type} return mat so that operations can be chained.
    + */
    +goog.vec.Mat4.makeRotate = function(mat, angle, ax, ay, az) {
    +  var c = Math.cos(angle);
    +  var d = 1 - c;
    +  var s = Math.sin(angle);
    +
    +  goog.vec.Mat4.setFromValues(mat,
    +      ax * ax * d + c,
    +      ax * ay * d + az * s,
    +      ax * az * d - ay * s,
    +      0,
    +
    +      ax * ay * d - az * s,
    +      ay * ay * d + c,
    +      ay * az * d + ax * s,
    +      0,
    +
    +      ax * az * d + ay * s,
    +      ay * az * d - ax * s,
    +      az * az * d + c,
    +      0,
    +
    +      0, 0, 0, 1);
    +  return mat;
    +};
    +
    +
    +/**
    + * Makes the given 4x4 matrix a perspective projection matrix.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix.
    + * @param {number} left The coordinate of the left clipping plane.
    + * @param {number} right The coordinate of the right clipping plane.
    + * @param {number} bottom The coordinate of the bottom clipping plane.
    + * @param {number} top The coordinate of the top clipping plane.
    + * @param {number} near The distance to the near clipping plane.
    + * @param {number} far The distance to the far clipping plane.
    + * @return {goog.vec.Mat4.Type} return mat so that operations can be chained.
    + */
    +goog.vec.Mat4.makeFrustum = function(mat, left, right, bottom, top, near, far) {
    +  var x = (2 * near) / (right - left);
    +  var y = (2 * near) / (top - bottom);
    +  var a = (right + left) / (right - left);
    +  var b = (top + bottom) / (top - bottom);
    +  var c = -(far + near) / (far - near);
    +  var d = -(2 * far * near) / (far - near);
    +
    +  goog.vec.Mat4.setFromValues(mat,
    +      x, 0, 0, 0,
    +      0, y, 0, 0,
    +      a, b, c, -1,
    +      0, 0, d, 0
    +  );
    +  return mat;
    +};
    +
    +
    +/**
    + * Makse the given 4x4 matrix  perspective projection matrix given a
    + * field of view and aspect ratio.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix.
    + * @param {number} fovy The field of view along the y (vertical) axis in
    + *     radians.
    + * @param {number} aspect The x (width) to y (height) aspect ratio.
    + * @param {number} near The distance to the near clipping plane.
    + * @param {number} far The distance to the far clipping plane.
    + * @return {goog.vec.Mat4.Type} return mat so that operations can be chained.
    + */
    +goog.vec.Mat4.makePerspective = function(mat, fovy, aspect, near, far) {
    +  var angle = fovy / 2;
    +  var dz = far - near;
    +  var sinAngle = Math.sin(angle);
    +  if (dz == 0 || sinAngle == 0 || aspect == 0) return mat;
    +
    +  var cot = Math.cos(angle) / sinAngle;
    +  goog.vec.Mat4.setFromValues(mat,
    +      cot / aspect, 0, 0, 0,
    +      0, cot, 0, 0,
    +      0, 0, -(far + near) / dz, -1,
    +      0, 0, -(2 * near * far) / dz, 0
    +  );
    +  return mat;
    +};
    +
    +
    +/**
    + * Makes the given 4x4 matrix an orthographic projection matrix.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix.
    + * @param {number} left The coordinate of the left clipping plane.
    + * @param {number} right The coordinate of the right clipping plane.
    + * @param {number} bottom The coordinate of the bottom clipping plane.
    + * @param {number} top The coordinate of the top clipping plane.
    + * @param {number} near The distance to the near clipping plane.
    + * @param {number} far The distance to the far clipping plane.
    + * @return {goog.vec.Mat4.Type} return mat so that operations can be chained.
    + */
    +goog.vec.Mat4.makeOrtho = function(mat, left, right, bottom, top, near, far) {
    +  var x = 2 / (right - left);
    +  var y = 2 / (top - bottom);
    +  var z = -2 / (far - near);
    +  var a = -(right + left) / (right - left);
    +  var b = -(top + bottom) / (top - bottom);
    +  var c = -(far + near) / (far - near);
    +
    +  goog.vec.Mat4.setFromValues(mat,
    +      x, 0, 0, 0,
    +      0, y, 0, 0,
    +      0, 0, z, 0,
    +      a, b, c, 1
    +  );
    +  return mat;
    +};
    +
    +
    +/**
    + * Makes the given 4x4 matrix a modelview matrix of a camera so that
    + * the camera is 'looking at' the given center point.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix.
    + * @param {goog.vec.Vec3.Type} eyePt The position of the eye point
    + *     (camera origin).
    + * @param {goog.vec.Vec3.Type} centerPt The point to aim the camera at.
    + * @param {goog.vec.Vec3.Type} worldUpVec The vector that identifies
    + *     the up direction for the camera.
    + * @return {goog.vec.Mat4.Type} return mat so that operations can be chained.
    + */
    +goog.vec.Mat4.makeLookAt = function(mat, eyePt, centerPt, worldUpVec) {
    +  // Compute the direction vector from the eye point to the center point and
    +  // normalize.
    +  var fwdVec = goog.vec.Mat4.tmpVec4_[0];
    +  goog.vec.Vec3.subtract(centerPt, eyePt, fwdVec);
    +  goog.vec.Vec3.normalize(fwdVec, fwdVec);
    +  fwdVec[3] = 0;
    +
    +  // Compute the side vector from the forward vector and the input up vector.
    +  var sideVec = goog.vec.Mat4.tmpVec4_[1];
    +  goog.vec.Vec3.cross(fwdVec, worldUpVec, sideVec);
    +  goog.vec.Vec3.normalize(sideVec, sideVec);
    +  sideVec[3] = 0;
    +
    +  // Now the up vector to form the orthonormal basis.
    +  var upVec = goog.vec.Mat4.tmpVec4_[2];
    +  goog.vec.Vec3.cross(sideVec, fwdVec, upVec);
    +  goog.vec.Vec3.normalize(upVec, upVec);
    +  upVec[3] = 0;
    +
    +  // Update the view matrix with the new orthonormal basis and position the
    +  // camera at the given eye point.
    +  goog.vec.Vec3.negate(fwdVec, fwdVec);
    +  goog.vec.Mat4.setRow(mat, 0, sideVec);
    +  goog.vec.Mat4.setRow(mat, 1, upVec);
    +  goog.vec.Mat4.setRow(mat, 2, fwdVec);
    +  goog.vec.Mat4.setRowValues(mat, 3, 0, 0, 0, 1);
    +  goog.vec.Mat4.translate(
    +      mat, -eyePt[0], -eyePt[1], -eyePt[2]);
    +
    +  return mat;
    +};
    +
    +
    +/**
    + * Decomposes a matrix into the lookAt vectors eyePt, fwdVec and worldUpVec.
    + * The matrix represents the modelview matrix of a camera. It is the inverse
    + * of lookAt except for the output of the fwdVec instead of centerPt.
    + * The centerPt itself cannot be recovered from a modelview matrix.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix.
    + * @param {goog.vec.Vec3.Type} eyePt The position of the eye point
    + *     (camera origin).
    + * @param {goog.vec.Vec3.Type} fwdVec The vector describing where
    + *     the camera points to.
    + * @param {goog.vec.Vec3.Type} worldUpVec The vector that
    + *     identifies the up direction for the camera.
    + * @return {boolean} True if the method succeeds, false otherwise.
    + *     The method can only fail if the inverse of viewMatrix is not defined.
    + */
    +goog.vec.Mat4.toLookAt = function(mat, eyePt, fwdVec, worldUpVec) {
    +  // Get eye of the camera.
    +  var matInverse = goog.vec.Mat4.tmpMat4_[0];
    +  if (!goog.vec.Mat4.invert(mat, matInverse)) {
    +    // The input matrix does not have a valid inverse.
    +    return false;
    +  }
    +
    +  if (eyePt) {
    +    eyePt[0] = matInverse[12];
    +    eyePt[1] = matInverse[13];
    +    eyePt[2] = matInverse[14];
    +  }
    +
    +  // Get forward vector from the definition of lookAt.
    +  if (fwdVec || worldUpVec) {
    +    if (!fwdVec) {
    +      fwdVec = goog.vec.Mat4.tmpVec3_[0];
    +    }
    +    fwdVec[0] = -mat[2];
    +    fwdVec[1] = -mat[6];
    +    fwdVec[2] = -mat[10];
    +    // Normalize forward vector.
    +    goog.vec.Vec3.normalize(fwdVec, fwdVec);
    +  }
    +
    +  if (worldUpVec) {
    +    // Get side vector from the definition of gluLookAt.
    +    var side = goog.vec.Mat4.tmpVec3_[1];
    +    side[0] = mat[0];
    +    side[1] = mat[4];
    +    side[2] = mat[8];
    +    // Compute up vector as a up = side x forward.
    +    goog.vec.Vec3.cross(side, fwdVec, worldUpVec);
    +    // Normalize up vector.
    +    goog.vec.Vec3.normalize(worldUpVec, worldUpVec);
    +  }
    +  return true;
    +};
    +
    +
    +/**
    + * Makes the given 4x4 matrix a rotation matrix given Euler angles using
    + * the ZXZ convention.
    + * Given the euler angles [theta1, theta2, theta3], the rotation is defined as
    + * rotation = rotation_z(theta1) * rotation_x(theta2) * rotation_z(theta3),
    + * where rotation_x(theta) means rotation around the X axis of theta radians.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix.
    + * @param {number} theta1 The angle of rotation around the Z axis in radians.
    + * @param {number} theta2 The angle of rotation around the X axis in radians.
    + * @param {number} theta3 The angle of rotation around the Z axis in radians.
    + * @return {goog.vec.Mat4.Type} return mat so that operations can be chained.
    + */
    +goog.vec.Mat4.makeEulerZXZ = function(mat, theta1, theta2, theta3) {
    +  var c1 = Math.cos(theta1);
    +  var s1 = Math.sin(theta1);
    +
    +  var c2 = Math.cos(theta2);
    +  var s2 = Math.sin(theta2);
    +
    +  var c3 = Math.cos(theta3);
    +  var s3 = Math.sin(theta3);
    +
    +  mat[0] = c1 * c3 - c2 * s1 * s3;
    +  mat[1] = c2 * c1 * s3 + c3 * s1;
    +  mat[2] = s3 * s2;
    +  mat[3] = 0;
    +
    +  mat[4] = -c1 * s3 - c3 * c2 * s1;
    +  mat[5] = c1 * c2 * c3 - s1 * s3;
    +  mat[6] = c3 * s2;
    +  mat[7] = 0;
    +
    +  mat[8] = s2 * s1;
    +  mat[9] = -c1 * s2;
    +  mat[10] = c2;
    +  mat[11] = 0;
    +
    +  mat[12] = 0;
    +  mat[13] = 0;
    +  mat[14] = 0;
    +  mat[15] = 1;
    +
    +  return mat;
    +};
    +
    +
    +/**
    + * Decomposes a rotation matrix into Euler angles using the ZXZ convention.
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix.
    + * @param {goog.vec.ArrayType} euler The ZXZ Euler angles in
    + *     radians. euler = [roll, tilt, pan].
    + */
    +goog.vec.Mat4.toEulerZXZ = function(mat, euler) {
    +  var s2 = Math.sqrt(mat[2] * mat[2] + mat[6] * mat[6]);
    +
    +  // There is an ambiguity in the sign of s2. We assume the tilt value
    +  // is between [-pi/2, 0], so s2 is always negative.
    +  if (s2 > goog.vec.EPSILON) {
    +    euler[2] = Math.atan2(-mat[2], -mat[6]);
    +    euler[1] = Math.atan2(-s2, mat[10]);
    +    euler[0] = Math.atan2(-mat[8], mat[9]);
    +  } else {
    +    // There is also an arbitrary choice for roll = 0 or pan = 0 in this case.
    +    // We assume roll = 0 as some applications do not allow the camera to roll.
    +    euler[0] = 0;
    +    euler[1] = Math.atan2(-s2, mat[10]);
    +    euler[2] = Math.atan2(mat[1], mat[0]);
    +  }
    +};
    +
    +
    +/**
    + * Translates the given matrix by x,y,z.  Equvialent to:
    + * goog.vec.Mat4.multMat(
    + *     mat,
    + *     goog.vec.Mat4.makeTranslate(goog.vec.Mat4.create(), x, y, z),
    + *     mat);
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix.
    + * @param {number} x The translation along the x axis.
    + * @param {number} y The translation along the y axis.
    + * @param {number} z The translation along the z axis.
    + * @return {goog.vec.Mat4.Type} return mat so that operations can be chained.
    + */
    +goog.vec.Mat4.translate = function(mat, x, y, z) {
    +  goog.vec.Mat4.setColumnValues(
    +      mat, 3,
    +      mat[0] * x + mat[4] * y + mat[8] * z + mat[12],
    +      mat[1] * x + mat[5] * y + mat[9] * z + mat[13],
    +      mat[2] * x + mat[6] * y + mat[10] * z + mat[14],
    +      mat[3] * x + mat[7] * y + mat[11] * z + mat[15]);
    +  return mat;
    +};
    +
    +
    +/**
    + * Scales the given matrix by x,y,z.  Equivalent to:
    + * goog.vec.Mat4.multMat(
    + *     mat,
    + *     goog.vec.Mat4.makeScale(goog.vec.Mat4.create(), x, y, z),
    + *     mat);
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix.
    + * @param {number} x The x scale factor.
    + * @param {number} y The y scale factor.
    + * @param {number} z The z scale factor.
    + * @return {goog.vec.Mat4.Type} return mat so that operations can be chained.
    + */
    +goog.vec.Mat4.scale = function(mat, x, y, z) {
    +  goog.vec.Mat4.setFromValues(
    +      mat,
    +      mat[0] * x, mat[1] * x, mat[2] * x, mat[3] * x,
    +      mat[4] * y, mat[5] * y, mat[6] * y, mat[7] * y,
    +      mat[8] * z, mat[9] * z, mat[10] * z, mat[11] * z,
    +      mat[12], mat[13], mat[14], mat[15]);
    +  return mat;
    +};
    +
    +
    +/**
    + * Rotation the given matrix by angle about the x,y,z axis.  Equivalent to:
    + * goog.vec.Mat4.multMat(
    + *     mat,
    + *     goog.vec.Mat4.makeRotate(goog.vec.Mat4.create(), angle, x, y, z),
    + *     mat);
    + *
    + * @param {goog.vec.Mat4.Type} mat The matrix.
    + * @param {number} angle The angle in radians.
    + * @param {number} x The x component of the rotation axis.
    + * @param {number} y The y component of the rotation axis.
    + * @param {number} z The z component of the rotation axis.
    + * @return {goog.vec.Mat4.Type} return mat so that operations can be chained.
    + */
    +goog.vec.Mat4.rotate = function(mat, angle, x, y, z) {
    +  var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3];
    +  var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7];
    +  var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11];
    +  var m03 = mat[12], m13 = mat[13], m23 = mat[14], m33 = mat[15];
    +
    +  var cosAngle = Math.cos(angle);
    +  var sinAngle = Math.sin(angle);
    +  var diffCosAngle = 1 - cosAngle;
    +  var r00 = x * x * diffCosAngle + cosAngle;
    +  var r10 = x * y * diffCosAngle + z * sinAngle;
    +  var r20 = x * z * diffCosAngle - y * sinAngle;
    +
    +  var r01 = x * y * diffCosAngle - z * sinAngle;
    +  var r11 = y * y * diffCosAngle + cosAngle;
    +  var r21 = y * z * diffCosAngle + x * sinAngle;
    +
    +  var r02 = x * z * diffCosAngle + y * sinAngle;
    +  var r12 = y * z * diffCosAngle - x * sinAngle;
    +  var r22 = z * z * diffCosAngle + cosAngle;
    +
    +  goog.vec.Mat4.setFromValues(
    +      mat,
    +      m00 * r00 + m01 * r10 + m02 * r20,
    +      m10 * r00 + m11 * r10 + m12 * r20,
    +      m20 * r00 + m21 * r10 + m22 * r20,
    +      m30 * r00 + m31 * r10 + m32 * r20,
    +
    +      m00 * r01 + m01 * r11 + m02 * r21,
    +      m10 * r01 + m11 * r11 + m12 * r21,
    +      m20 * r01 + m21 * r11 + m22 * r21,
    +      m30 * r01 + m31 * r11 + m32 * r21,
    +
    +      m00 * r02 + m01 * r12 + m02 * r22,
    +      m10 * r02 + m11 * r12 + m12 * r22,
    +      m20 * r02 + m21 * r12 + m22 * r22,
    +      m30 * r02 + m31 * r12 + m32 * r22,
    +
    +      m03, m13, m23, m33);
    +
    +  return mat;
    +};
    +
    +
    +/**
    + * @type {Array.}
    + * @private
    + */
    +goog.vec.Mat4.tmpVec3_ = [
    +  goog.vec.Vec3.create(),
    +  goog.vec.Vec3.create()
    +];
    +
    +
    +/**
    + * @type {Array.}
    + * @private
    + */
    +goog.vec.Mat4.tmpVec4_ = [
    +  goog.vec.Vec4.create(),
    +  goog.vec.Vec4.create(),
    +  goog.vec.Vec4.create()
    +];
    +
    +
    +/**
    + * @type {Array.}
    + * @private
    + */
    +goog.vec.Mat4.tmpMat4_ = [
    +  goog.vec.Mat4.create()
    +];
    diff --git a/contrib/closure-library/goog/vec/mat4_test.html b/contrib/closure-library/goog/vec/mat4_test.html
    new file mode 100644
    index 0000000..8076014
    --- /dev/null
    +++ b/contrib/closure-library/goog/vec/mat4_test.html
    @@ -0,0 +1,609 @@
    +
    +
    +
    +
    +
    +Closure Unit Tests - goog.vec.Mat4
    +
    +
    +
    +
    +
    +
    diff --git a/contrib/closure-library/goog/vec/matrix3.js b/contrib/closure-library/goog/vec/matrix3.js
    new file mode 100644
    index 0000000..fc47af4
    --- /dev/null
    +++ b/contrib/closure-library/goog/vec/matrix3.js
    @@ -0,0 +1,722 @@
    +// Copyright 2011 The Closure Library Authors. All Rights Reserved.
    +//
    +// Licensed under the Apache License, Version 2.0 (the "License");
    +// you may not use this file except in compliance with the License.
    +// You may obtain a copy of the License at
    +//
    +//      http://www.apache.org/licenses/LICENSE-2.0
    +//
    +// Unless required by applicable law or agreed to in writing, software
    +// distributed under the License is distributed on an "AS-IS" BASIS,
    +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +// See the License for the specific language governing permissions and
    +// limitations under the License.
    +
    +/**
    + * @fileoverview WARNING: DEPRECATED.  Use Mat3 instead.
    + * Implements 3x3 matrices and their related functions which are
    + * compatible with WebGL. The API is structured to avoid unnecessary memory
    + * allocations.  The last parameter will typically be the output vector and
    + * an object can be both an input and output parameter to all methods except
    + * where noted. Matrix operations follow the mathematical form when multiplying
    + * vectors as follows: resultVec = matrix * vec.
    + *
    + */
    +goog.provide('goog.vec.Matrix3');
    +
    +goog.require('goog.vec');
    +
    +
    +/**
    + * @typedef {goog.vec.ArrayType}
    + */
    +goog.vec.Matrix3.Type;
    +
    +
    +/**
    + * Creates the array representation of a 3x3 matrix. The use of the array
    + * directly eliminates any overhead associated with the class representation
    + * defined above. The returned matrix is cleared to all zeros.
    + *
    + * @return {goog.vec.Matrix3.Type} The new, nine element array.
    + */
    +goog.vec.Matrix3.create = function() {
    +  return new Float32Array(9);
    +};
    +
    +
    +/**
    + * Creates the array representation of a 3x3 matrix. The use of the array
    + * directly eliminates any overhead associated with the class representation
    + * defined above. The returned matrix is initialized with the identity.
    + *
    + * @return {goog.vec.Matrix3.Type} The new, nine element array.
    + */
    +goog.vec.Matrix3.createIdentity = function() {
    +  var mat = goog.vec.Matrix3.create();
    +  mat[0] = mat[4] = mat[8] = 1;
    +  return mat;
    +};
    +
    +
    +/**
    + * Creates a 3x3 matrix initialized from the given array.
    + *
    + * @param {goog.vec.ArrayType} matrix The array containing the
    + *     matrix values in column major order.
    + * @return {goog.vec.Matrix3.Type} The new, nine element array.
    + */
    +goog.vec.Matrix3.createFromArray = function(matrix) {
    +  var newMatrix = goog.vec.Matrix3.create();
    +  goog.vec.Matrix3.setFromArray(newMatrix, matrix);
    +  return newMatrix;
    +};
    +
    +
    +/**
    + * Creates a 3x3 matrix initialized from the given values.
    + *
    + * @param {number} v00 The values at (0, 0).
    + * @param {number} v10 The values at (1, 0).
    + * @param {number} v20 The values at (2, 0).
    + * @param {number} v01 The values at (0, 1).
    + * @param {number} v11 The values at (1, 1).
    + * @param {number} v21 The values at (2, 1).
    + * @param {number} v02 The values at (0, 2).
    + * @param {number} v12 The values at (1, 2).
    + * @param {number} v22 The values at (2, 2).
    + * @return {goog.vec.Matrix3.Type} The new, nine element array.
    + */
    +goog.vec.Matrix3.createFromValues = function(
    +    v00, v10, v20, v01, v11, v21, v02, v12, v22) {
    +  var newMatrix = goog.vec.Matrix3.create();
    +  goog.vec.Matrix3.setFromValues(
    +      newMatrix, v00, v10, v20, v01, v11, v21, v02, v12, v22);
    +  return newMatrix;
    +};
    +
    +
    +/**
    + * Creates a clone of a 3x3 matrix.
    + *
    + * @param {goog.vec.Matrix3.Type} matrix The source 3x3 matrix.
    + * @return {goog.vec.Matrix3.Type} The new 3x3 element matrix.
    + */
    +goog.vec.Matrix3.clone =
    +    goog.vec.Matrix3.createFromArray;
    +
    +
    +/**
    + * Retrieves the element at the requested row and column.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix containing the
    + *     value to retrieve.
    + * @param {number} row The row index.
    + * @param {number} column The column index.
    + * @return {number} The element value at the requested row, column indices.
    + */
    +goog.vec.Matrix3.getElement = function(mat, row, column) {
    +  return mat[row + column * 3];
    +};
    +
    +
    +/**
    + * Sets the element at the requested row and column.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix containing the
    + *     value to retrieve.
    + * @param {number} row The row index.
    + * @param {number} column The column index.
    + * @param {number} value The value to set at the requested row, column.
    + */
    +goog.vec.Matrix3.setElement = function(mat, row, column, value) {
    +  mat[row + column * 3] = value;
    +};
    +
    +
    +/**
    + * Initializes the matrix from the set of values. Note the values supplied are
    + * in column major order.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to receive the
    + *     values.
    + * @param {number} v00 The values at (0, 0).
    + * @param {number} v10 The values at (1, 0).
    + * @param {number} v20 The values at (2, 0).
    + * @param {number} v01 The values at (0, 1).
    + * @param {number} v11 The values at (1, 1).
    + * @param {number} v21 The values at (2, 1).
    + * @param {number} v02 The values at (0, 2).
    + * @param {number} v12 The values at (1, 2).
    + * @param {number} v22 The values at (2, 2).
    + */
    +goog.vec.Matrix3.setFromValues = function(
    +    mat, v00, v10, v20, v01, v11, v21, v02, v12, v22) {
    +  mat[0] = v00;
    +  mat[1] = v10;
    +  mat[2] = v20;
    +  mat[3] = v01;
    +  mat[4] = v11;
    +  mat[5] = v21;
    +  mat[6] = v02;
    +  mat[7] = v12;
    +  mat[8] = v22;
    +};
    +
    +
    +/**
    + * Sets the matrix from the array of values stored in column major order.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to receive the
    + *     values.
    + * @param {goog.vec.ArrayType} values The column major ordered
    + *     array of values to store in the matrix.
    + */
    +goog.vec.Matrix3.setFromArray = function(mat, values) {
    +  mat[0] = values[0];
    +  mat[1] = values[1];
    +  mat[2] = values[2];
    +  mat[3] = values[3];
    +  mat[4] = values[4];
    +  mat[5] = values[5];
    +  mat[6] = values[6];
    +  mat[7] = values[7];
    +  mat[8] = values[8];
    +};
    +
    +
    +/**
    + * Sets the matrix from the array of values stored in row major order.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to receive the
    + *     values.
    + * @param {goog.vec.ArrayType} values The row major ordered array
    + *     of values to store in the matrix.
    + */
    +goog.vec.Matrix3.setFromRowMajorArray = function(mat, values) {
    +  mat[0] = values[0];
    +  mat[1] = values[3];
    +  mat[2] = values[6];
    +  mat[3] = values[1];
    +  mat[4] = values[4];
    +  mat[5] = values[7];
    +  mat[6] = values[2];
    +  mat[7] = values[5];
    +  mat[8] = values[8];
    +};
    +
    +
    +/**
    + * Sets the diagonal values of the matrix from the given values.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to receive the
    + *     values.
    + * @param {number} v00 The values for (0, 0).
    + * @param {number} v11 The values for (1, 1).
    + * @param {number} v22 The values for (2, 2).
    + */
    +goog.vec.Matrix3.setDiagonalValues = function(mat, v00, v11, v22) {
    +  mat[0] = v00;
    +  mat[4] = v11;
    +  mat[8] = v22;
    +};
    +
    +
    +/**
    + * Sets the diagonal values of the matrix from the given vector.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to receive the
    + *     values.
    + * @param {goog.vec.ArrayType} vec The vector containing the
    + *     values.
    + */
    +goog.vec.Matrix3.setDiagonal = function(mat, vec) {
    +  mat[0] = vec[0];
    +  mat[4] = vec[1];
    +  mat[8] = vec[2];
    +};
    +
    +
    +/**
    + * Sets the specified column with the supplied values.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to recieve the
    + *     values.
    + * @param {number} column The column index to set the values on.
    + * @param {number} v0 The value for row 0.
    + * @param {number} v1 The value for row 1.
    + * @param {number} v2 The value for row 2.
    + */
    +goog.vec.Matrix3.setColumnValues = function(
    +    mat, column, v0, v1, v2) {
    +  var i = column * 3;
    +  mat[i] = v0;
    +  mat[i + 1] = v1;
    +  mat[i + 2] = v2;
    +};
    +
    +
    +/**
    + * Sets the specified column with the value from the supplied array.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to receive the
    + *     values.
    + * @param {number} column The column index to set the values on.
    + * @param {goog.vec.ArrayType} vec The vector elements for the
    + *     column.
    + */
    +goog.vec.Matrix3.setColumn = function(mat, column, vec) {
    +  var i = column * 3;
    +  mat[i] = vec[0];
    +  mat[i + 1] = vec[1];
    +  mat[i + 2] = vec[2];
    +};
    +
    +
    +/**
    + * Retrieves the specified column from the matrix into the given vector
    + * array.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix supplying the
    + *     values.
    + * @param {number} column The column to get the values from.
    + * @param {goog.vec.ArrayType} vec The vector elements to receive
    + *     the column.
    + */
    +goog.vec.Matrix3.getColumn = function(mat, column, vec) {
    +  var i = column * 3;
    +  vec[0] = mat[i];
    +  vec[1] = mat[i + 1];
    +  vec[2] = mat[i + 2];
    +};
    +
    +
    +/**
    + * Sets the columns of the matrix from the set of vector elements.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to receive the
    + *     values.
    + * @param {goog.vec.ArrayType} vec0 The values for column 0.
    + * @param {goog.vec.ArrayType} vec1 The values for column 1.
    + * @param {goog.vec.ArrayType} vec2 The values for column 2.
    + */
    +goog.vec.Matrix3.setColumns = function(
    +    mat, vec0, vec1, vec2) {
    +  goog.vec.Matrix3.setColumn(mat, 0, vec0);
    +  goog.vec.Matrix3.setColumn(mat, 1, vec1);
    +  goog.vec.Matrix3.setColumn(mat, 2, vec2);
    +};
    +
    +
    +/**
    + * Retrieves the column values from the given matrix into the given vector
    + * elements.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix containing the
    + *     columns to retrieve.
    + * @param {goog.vec.ArrayType} vec0 The vector elements to receive
    + *     column 0.
    + * @param {goog.vec.ArrayType} vec1 The vector elements to receive
    + *     column 1.
    + * @param {goog.vec.ArrayType} vec2 The vector elements to receive
    + *     column 2.
    + */
    +goog.vec.Matrix3.getColumns = function(
    +    mat, vec0, vec1, vec2) {
    +  goog.vec.Matrix3.getColumn(mat, 0, vec0);
    +  goog.vec.Matrix3.getColumn(mat, 1, vec1);
    +  goog.vec.Matrix3.getColumn(mat, 2, vec2);
    +};
    +
    +
    +/**
    + * Sets the row values from the supplied values.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to receive the
    + *     values.
    + * @param {number} row The index of the row to receive the values.
    + * @param {number} v0 The value for column 0.
    + * @param {number} v1 The value for column 1.
    + * @param {number} v2 The value for column 2.
    + */
    +goog.vec.Matrix3.setRowValues = function(mat, row, v0, v1, v2) {
    +  mat[row] = v0;
    +  mat[row + 3] = v1;
    +  mat[row + 6] = v2;
    +};
    +
    +
    +/**
    + * Sets the row values from the supplied vector.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to receive the
    + *     row values.
    + * @param {number} row The index of the row.
    + * @param {goog.vec.ArrayType} vec The vector containing the values.
    + */
    +goog.vec.Matrix3.setRow = function(mat, row, vec) {
    +  mat[row] = vec[0];
    +  mat[row + 3] = vec[1];
    +  mat[row + 6] = vec[2];
    +};
    +
    +
    +/**
    + * Retrieves the row values into the given vector.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix supplying the
    + *     values.
    + * @param {number} row The index of the row supplying the values.
    + * @param {goog.vec.ArrayType} vec The vector to receive the row.
    + */
    +goog.vec.Matrix3.getRow = function(mat, row, vec) {
    +  vec[0] = mat[row];
    +  vec[1] = mat[row + 3];
    +  vec[2] = mat[row + 6];
    +};
    +
    +
    +/**
    + * Sets the rows of the matrix from the supplied vectors.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to receive the
    + *     values.
    + * @param {goog.vec.ArrayType} vec0 The values for row 0.
    + * @param {goog.vec.ArrayType} vec1 The values for row 1.
    + * @param {goog.vec.ArrayType} vec2 The values for row 2.
    + */
    +goog.vec.Matrix3.setRows = function(
    +    mat, vec0, vec1, vec2) {
    +  goog.vec.Matrix3.setRow(mat, 0, vec0);
    +  goog.vec.Matrix3.setRow(mat, 1, vec1);
    +  goog.vec.Matrix3.setRow(mat, 2, vec2);
    +};
    +
    +
    +/**
    + * Retrieves the rows of the matrix into the supplied vectors.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to supplying
    + *     the values.
    + * @param {goog.vec.ArrayType} vec0 The vector to receive row 0.
    + * @param {goog.vec.ArrayType} vec1 The vector to receive row 1.
    + * @param {goog.vec.ArrayType} vec2 The vector to receive row 2.
    + */
    +goog.vec.Matrix3.getRows = function(
    +    mat, vec0, vec1, vec2) {
    +  goog.vec.Matrix3.getRow(mat, 0, vec0);
    +  goog.vec.Matrix3.getRow(mat, 1, vec1);
    +  goog.vec.Matrix3.getRow(mat, 2, vec2);
    +};
    +
    +
    +/**
    + * Clears the given matrix to zero.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to clear.
    + */
    +goog.vec.Matrix3.setZero = function(mat) {
    +  mat[0] = 0;
    +  mat[1] = 0;
    +  mat[2] = 0;
    +  mat[3] = 0;
    +  mat[4] = 0;
    +  mat[5] = 0;
    +  mat[6] = 0;
    +  mat[7] = 0;
    +  mat[8] = 0;
    +};
    +
    +
    +/**
    + * Sets the given matrix to the identity matrix.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to set.
    + */
    +goog.vec.Matrix3.setIdentity = function(mat) {
    +  mat[0] = 1;
    +  mat[1] = 0;
    +  mat[2] = 0;
    +  mat[3] = 0;
    +  mat[4] = 1;
    +  mat[5] = 0;
    +  mat[6] = 0;
    +  mat[7] = 0;
    +  mat[8] = 1;
    +};
    +
    +
    +/**
    + * Performs a per-component addition of the matrices mat0 and mat1, storing
    + * the result into resultMat.
    + *
    + * @param {goog.vec.ArrayType} mat0 The first addend.
    + * @param {goog.vec.ArrayType} mat1 The second addend.
    + * @param {goog.vec.ArrayType} resultMat The matrix to
    + *     receive the results (may be either mat0 or mat1).
    + * @return {goog.vec.ArrayType} return resultMat so that operations can be
    + *     chained together.
    + */
    +goog.vec.Matrix3.add = function(mat0, mat1, resultMat) {
    +  resultMat[0] = mat0[0] + mat1[0];
    +  resultMat[1] = mat0[1] + mat1[1];
    +  resultMat[2] = mat0[2] + mat1[2];
    +  resultMat[3] = mat0[3] + mat1[3];
    +  resultMat[4] = mat0[4] + mat1[4];
    +  resultMat[5] = mat0[5] + mat1[5];
    +  resultMat[6] = mat0[6] + mat1[6];
    +  resultMat[7] = mat0[7] + mat1[7];
    +  resultMat[8] = mat0[8] + mat1[8];
    +  return resultMat;
    +};
    +
    +
    +/**
    + * Performs a per-component subtraction of the matrices mat0 and mat1,
    + * storing the result into resultMat.
    + *
    + * @param {goog.vec.ArrayType} mat0 The minuend.
    + * @param {goog.vec.ArrayType} mat1 The subtrahend.
    + * @param {goog.vec.ArrayType} resultMat The matrix to receive
    + *     the results (may be either mat0 or mat1).
    + * @return {goog.vec.ArrayType} return resultMat so that operations can be
    + *     chained together.
    + */
    +goog.vec.Matrix3.subtract = function(mat0, mat1, resultMat) {
    +  resultMat[0] = mat0[0] - mat1[0];
    +  resultMat[1] = mat0[1] - mat1[1];
    +  resultMat[2] = mat0[2] - mat1[2];
    +  resultMat[3] = mat0[3] - mat1[3];
    +  resultMat[4] = mat0[4] - mat1[4];
    +  resultMat[5] = mat0[5] - mat1[5];
    +  resultMat[6] = mat0[6] - mat1[6];
    +  resultMat[7] = mat0[7] - mat1[7];
    +  resultMat[8] = mat0[8] - mat1[8];
    +  return resultMat;
    +};
    +
    +
    +/**
    + * Performs a component-wise multiplication of mat0 with the given scalar
    + * storing the result into resultMat.
    + *
    + * @param {goog.vec.ArrayType} mat0 The matrix to scale.
    + * @param {number} scalar The scalar value to multiple to each element of mat0.
    + * @param {goog.vec.ArrayType} resultMat The matrix to receive
    + *     the results (may be mat0).
    + * @return {goog.vec.ArrayType} return resultMat so that operations can be
    + *     chained together.
    + */
    +goog.vec.Matrix3.scale = function(mat0, scalar, resultMat) {
    +  resultMat[0] = mat0[0] * scalar;
    +  resultMat[1] = mat0[1] * scalar;
    +  resultMat[2] = mat0[2] * scalar;
    +  resultMat[3] = mat0[3] * scalar;
    +  resultMat[4] = mat0[4] * scalar;
    +  resultMat[5] = mat0[5] * scalar;
    +  resultMat[6] = mat0[6] * scalar;
    +  resultMat[7] = mat0[7] * scalar;
    +  resultMat[8] = mat0[8] * scalar;
    +  return resultMat;
    +};
    +
    +
    +/**
    + * Multiplies the two matrices mat0 and mat1 using matrix multiplication,
    + * storing the result into resultMat.
    + *
    + * @param {goog.vec.ArrayType} mat0 The first (left hand) matrix.
    + * @param {goog.vec.ArrayType} mat1 The second (right hand)
    + *     matrix.
    + * @param {goog.vec.ArrayType} resultMat The matrix to receive
    + *     the results (may be either mat0 or mat1).
    + * @return {goog.vec.ArrayType} return resultMat so that operations can be
    + *     chained together.
    + */
    +goog.vec.Matrix3.multMat = function(mat0, mat1, resultMat) {
    +  var a00 = mat0[0], a10 = mat0[1], a20 = mat0[2];
    +  var a01 = mat0[3], a11 = mat0[4], a21 = mat0[5];
    +  var a02 = mat0[6], a12 = mat0[7], a22 = mat0[8];
    +
    +  var b00 = mat1[0], b10 = mat1[1], b20 = mat1[2];
    +  var b01 = mat1[3], b11 = mat1[4], b21 = mat1[5];
    +  var b02 = mat1[6], b12 = mat1[7], b22 = mat1[8];
    +
    +  resultMat[0] = a00 * b00 + a01 * b10 + a02 * b20;
    +  resultMat[1] = a10 * b00 + a11 * b10 + a12 * b20;
    +  resultMat[2] = a20 * b00 + a21 * b10 + a22 * b20;
    +  resultMat[3] = a00 * b01 + a01 * b11 + a02 * b21;
    +  resultMat[4] = a10 * b01 + a11 * b11 + a12 * b21;
    +  resultMat[5] = a20 * b01 + a21 * b11 + a22 * b21;
    +  resultMat[6] = a00 * b02 + a01 * b12 + a02 * b22;
    +  resultMat[7] = a10 * b02 + a11 * b12 + a12 * b22;
    +  resultMat[8] = a20 * b02 + a21 * b12 + a22 * b22;
    +  return resultMat;
    +};
    +
    +
    +/**
    + * Transposes the given matrix mat storing the result into resultMat.
    + * @param {goog.vec.ArrayType} mat The matrix to transpose.
    + * @param {goog.vec.ArrayType} resultMat The matrix to receive
    + *     the results (may be mat).
    + * @return {goog.vec.ArrayType} return resultMat so that operations can be
    + *     chained together.
    + */
    +goog.vec.Matrix3.transpose = function(mat, resultMat) {
    +  if (resultMat == mat) {
    +    var a10 = mat[1], a20 = mat[2], a21 = mat[5];
    +    resultMat[1] = mat[3];
    +    resultMat[2] = mat[6];
    +    resultMat[3] = a10;
    +    resultMat[5] = mat[7];
    +    resultMat[6] = a20;
    +    resultMat[7] = a21;
    +  } else {
    +    resultMat[0] = mat[0];
    +    resultMat[1] = mat[3];
    +    resultMat[2] = mat[6];
    +    resultMat[3] = mat[1];
    +    resultMat[4] = mat[4];
    +    resultMat[5] = mat[7];
    +    resultMat[6] = mat[2];
    +    resultMat[7] = mat[5];
    +    resultMat[8] = mat[8];
    +  }
    +  return resultMat;
    +};
    +
    +
    +/**
    + * Computes the inverse of mat0 storing the result into resultMat. If the
    + * inverse is defined, this function returns true, false otherwise.
    + * @param {goog.vec.ArrayType} mat0 The matrix to invert.
    + * @param {goog.vec.ArrayType} resultMat The matrix to receive
    + *     the result (may be mat0).
    + * @return {boolean} True if the inverse is defined. If false is returned,
    + *     resultMat is not modified.
    + */
    +goog.vec.Matrix3.invert = function(mat0, resultMat) {
    +  var a00 = mat0[0], a10 = mat0[1], a20 = mat0[2];
    +  var a01 = mat0[3], a11 = mat0[4], a21 = mat0[5];
    +  var a02 = mat0[6], a12 = mat0[7], a22 = mat0[8];
    +
    +  var t00 = a11 * a22 - a12 * a21;
    +  var t10 = a12 * a20 - a10 * a22;
    +  var t20 = a10 * a21 - a11 * a20;
    +  var det = a00 * t00 + a01 * t10 + a02 * t20;
    +  if (det == 0) {
    +    return false;
    +  }
    +
    +  var idet = 1 / det;
    +  resultMat[0] = t00 * idet;
    +  resultMat[3] = (a02 * a21 - a01 * a22) * idet;
    +  resultMat[6] = (a01 * a12 - a02 * a11) * idet;
    +
    +  resultMat[1] = t10 * idet;
    +  resultMat[4] = (a00 * a22 - a02 * a20) * idet;
    +  resultMat[7] = (a02 * a10 - a00 * a12) * idet;
    +
    +  resultMat[2] = t20 * idet;
    +  resultMat[5] = (a01 * a20 - a00 * a21) * idet;
    +  resultMat[8] = (a00 * a11 - a01 * a10) * idet;
    +  return true;
    +};
    +
    +
    +/**
    + * Returns true if the components of mat0 are equal to the components of mat1.
    + *
    + * @param {goog.vec.ArrayType} mat0 The first matrix.
    + * @param {goog.vec.ArrayType} mat1 The second matrix.
    + * @return {boolean} True if the the two matrices are equivalent.
    + */
    +goog.vec.Matrix3.equals = function(mat0, mat1) {
    +  return mat0.length == mat1.length &&
    +      mat0[0] == mat1[0] && mat0[1] == mat1[1] && mat0[2] == mat1[2] &&
    +      mat0[3] == mat1[3] && mat0[4] == mat1[4] && mat0[5] == mat1[5] &&
    +      mat0[6] == mat1[6] && mat0[7] == mat1[7] && mat0[8] == mat1[8];
    +};
    +
    +
    +/**
    + * Transforms the given vector with the given matrix storing the resulting,
    + * transformed matrix into resultVec.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix supplying the
    + *     transformation.
    + * @param {goog.vec.ArrayType} vec The vector to transform.
    + * @param {goog.vec.ArrayType} resultVec The vector to
    + *     receive the results (may be vec).
    + * @return {goog.vec.ArrayType} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Matrix3.multVec3 = function(mat, vec, resultVec) {
    +  var x = vec[0], y = vec[1], z = vec[2];
    +  resultVec[0] = x * mat[0] + y * mat[3] + z * mat[6];
    +  resultVec[1] = x * mat[1] + y * mat[4] + z * mat[7];
    +  resultVec[2] = x * mat[2] + y * mat[5] + z * mat[8];
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Initializes the given 3x3 matrix as a translation matrix with x and y
    + * translation values.
    + *
    + * @param {goog.vec.ArrayType} mat The 3x3 (9-element) matrix
    + *     array to receive the new translation matrix.
    + * @param {number} x The translation along the x axis.
    + * @param {number} y The translation along the y axis.
    + */
    +goog.vec.Matrix3.makeTranslate = function(mat, x, y) {
    +  goog.vec.Matrix3.setIdentity(mat);
    +  goog.vec.Matrix3.setColumnValues(mat, 2, x, y, 1);
    +};
    +
    +
    +/**
    + * Initializes the given 3x3 matrix as a scale matrix with x, y and z scale
    + * factors.
    + * @param {goog.vec.ArrayType} mat The 3x3 (9-element) matrix
    + *     array to receive the new scale matrix.
    + * @param {number} x The scale along the x axis.
    + * @param {number} y The scale along the y axis.
    + * @param {number} z The scale along the z axis.
    + */
    +goog.vec.Matrix3.makeScale = function(mat, x, y, z) {
    +  goog.vec.Matrix3.setIdentity(mat);
    +  goog.vec.Matrix3.setDiagonalValues(mat, x, y, z);
    +};
    +
    +
    +/**
    + * Initializes the given 3x3 matrix as a rotation matrix with the given rotation
    + * angle about the axis defined by the vector (ax, ay, az).
    + * @param {goog.vec.ArrayType} mat The 3x3 (9-element) matrix
    + *     array to receive the new scale matrix.
    + * @param {number} angle The rotation angle in radians.
    + * @param {number} ax The x component of the rotation axis.
    + * @param {number} ay The y component of the rotation axis.
    + * @param {number} az The z component of the rotation axis.
    + */
    +goog.vec.Matrix3.makeAxisAngleRotate = function(
    +    mat, angle, ax, ay, az) {
    +  var c = Math.cos(angle);
    +  var d = 1 - c;
    +  var s = Math.sin(angle);
    +
    +  goog.vec.Matrix3.setFromValues(mat,
    +      ax * ax * d + c,
    +      ax * ay * d + az * s,
    +      ax * az * d - ay * s,
    +
    +      ax * ay * d - az * s,
    +      ay * ay * d + c,
    +      ay * az * d + ax * s,
    +
    +      ax * az * d + ay * s,
    +      ay * az * d - ax * s,
    +      az * az * d + c);
    +};
    diff --git a/contrib/closure-library/goog/vec/matrix3_test.html b/contrib/closure-library/goog/vec/matrix3_test.html
    new file mode 100644
    index 0000000..d66b04f
    --- /dev/null
    +++ b/contrib/closure-library/goog/vec/matrix3_test.html
    @@ -0,0 +1,301 @@
    +
    +
    +
    +
    +
    +Closure Unit Tests - goog.vec.Vec3
    +
    +
    +
    +
    +
    +
    diff --git a/contrib/closure-library/goog/vec/matrix4.js b/contrib/closure-library/goog/vec/matrix4.js
    new file mode 100644
    index 0000000..383a1dc
    --- /dev/null
    +++ b/contrib/closure-library/goog/vec/matrix4.js
    @@ -0,0 +1,1405 @@
    +// Copyright 2011 The Closure Library Authors. All Rights Reserved.
    +//
    +// Licensed under the Apache License, Version 2.0 (the "License");
    +// you may not use this file except in compliance with the License.
    +// You may obtain a copy of the License at
    +//
    +//      http://www.apache.org/licenses/LICENSE-2.0
    +//
    +// Unless required by applicable law or agreed to in writing, software
    +// distributed under the License is distributed on an "AS-IS" BASIS,
    +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +// See the License for the specific language governing permissions and
    +// limitations under the License.
    +
    +/**
    + * @fileoverview WARNING: DEPRECATED.  Use Mat4 instead.
    + * Implements 4x4 matrices and their related functions which are
    + * compatible with WebGL. The API is structured to avoid unnecessary memory
    + * allocations.  The last parameter will typically be the output vector and
    + * an object can be both an input and output parameter to all methods except
    + * where noted. Matrix operations follow the mathematical form when multiplying
    + * vectors as follows: resultVec = matrix * vec.
    + *
    + */
    +goog.provide('goog.vec.Matrix4');
    +
    +goog.require('goog.vec');
    +goog.require('goog.vec.Vec3');
    +goog.require('goog.vec.Vec4');
    +
    +
    +/**
    + * @typedef {goog.vec.ArrayType}
    + */
    +goog.vec.Matrix4.Type;
    +
    +
    +/**
    + * Creates the array representation of a 4x4 matrix. The use of the array
    + * directly eliminates any overhead associated with the class representation
    + * defined above. The returned matrix is cleared to all zeros.
    + *
    + * @return {goog.vec.Matrix4.Type} The new, sixteen element array.
    + */
    +goog.vec.Matrix4.create = function() {
    +  return new Float32Array(16);
    +};
    +
    +
    +/**
    + * Creates the array representation of a 4x4 matrix. The use of the array
    + * directly eliminates any overhead associated with the class representation
    + * defined above. The returned matrix is initialized with the identity
    + *
    + * @return {goog.vec.Matrix4.Type} The new, sixteen element array.
    + */
    +goog.vec.Matrix4.createIdentity = function() {
    +  var mat = goog.vec.Matrix4.create();
    +  mat[0] = mat[5] = mat[10] = mat[15] = 1;
    +  return mat;
    +};
    +
    +
    +/**
    + * Creates a 4x4 matrix initialized from the given array.
    + *
    + * @param {goog.vec.ArrayType} matrix The array containing the
    + *     matrix values in column major order.
    + * @return {goog.vec.Matrix4.Type} The new, 16 element array.
    + */
    +goog.vec.Matrix4.createFromArray = function(matrix) {
    +  var newMatrix = goog.vec.Matrix4.create();
    +  goog.vec.Matrix4.setFromArray(newMatrix, matrix);
    +  return newMatrix;
    +};
    +
    +
    +/**
    + * Creates a 4x4 matrix initialized from the given values.
    + *
    + * @param {number} v00 The values at (0, 0).
    + * @param {number} v10 The values at (1, 0).
    + * @param {number} v20 The values at (2, 0).
    + * @param {number} v30 The values at (3, 0).
    + * @param {number} v01 The values at (0, 1).
    + * @param {number} v11 The values at (1, 1).
    + * @param {number} v21 The values at (2, 1).
    + * @param {number} v31 The values at (3, 1).
    + * @param {number} v02 The values at (0, 2).
    + * @param {number} v12 The values at (1, 2).
    + * @param {number} v22 The values at (2, 2).
    + * @param {number} v32 The values at (3, 2).
    + * @param {number} v03 The values at (0, 3).
    + * @param {number} v13 The values at (1, 3).
    + * @param {number} v23 The values at (2, 3).
    + * @param {number} v33 The values at (3, 3).
    + * @return {goog.vec.Matrix4.Type} The new, 16 element array.
    + */
    +goog.vec.Matrix4.createFromValues = function(
    +    v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32,
    +    v03, v13, v23, v33) {
    +  var newMatrix = goog.vec.Matrix4.create();
    +  goog.vec.Matrix4.setFromValues(
    +      newMatrix, v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32,
    +      v03, v13, v23, v33);
    +  return newMatrix;
    +};
    +
    +
    +/**
    + * Creates a clone of a 4x4 matrix.
    + *
    + * @param {goog.vec.Matrix4.Type} matrix The source 4x4 matrix.
    + * @return {goog.vec.Matrix4.Type} The new, 16 element matrix.
    + */
    +goog.vec.Matrix4.clone =
    +    goog.vec.Matrix4.createFromArray;
    +
    +
    +/**
    + * Retrieves the element at the requested row and column.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix containing the
    + *     value to retrieve.
    + * @param {number} row The row index.
    + * @param {number} column The column index.
    + * @return {number} The element value at the requested row, column indices.
    + */
    +goog.vec.Matrix4.getElement = function(mat, row, column) {
    +  return mat[row + column * 4];
    +};
    +
    +
    +/**
    + * Sets the element at the requested row and column.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix containing the
    + *     value to retrieve.
    + * @param {number} row The row index.
    + * @param {number} column The column index.
    + * @param {number} value The value to set at the requested row, column.
    + */
    +goog.vec.Matrix4.setElement = function(mat, row, column, value) {
    +  mat[row + column * 4] = value;
    +};
    +
    +
    +/**
    + * Initializes the matrix from the set of values. Note the values supplied are
    + * in column major order.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to receive the
    + *     values.
    + * @param {number} v00 The values at (0, 0).
    + * @param {number} v10 The values at (1, 0).
    + * @param {number} v20 The values at (2, 0).
    + * @param {number} v30 The values at (3, 0).
    + * @param {number} v01 The values at (0, 1).
    + * @param {number} v11 The values at (1, 1).
    + * @param {number} v21 The values at (2, 1).
    + * @param {number} v31 The values at (3, 1).
    + * @param {number} v02 The values at (0, 2).
    + * @param {number} v12 The values at (1, 2).
    + * @param {number} v22 The values at (2, 2).
    + * @param {number} v32 The values at (3, 2).
    + * @param {number} v03 The values at (0, 3).
    + * @param {number} v13 The values at (1, 3).
    + * @param {number} v23 The values at (2, 3).
    + * @param {number} v33 The values at (3, 3).
    + */
    +goog.vec.Matrix4.setFromValues = function(
    +    mat, v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32,
    +    v03, v13, v23, v33) {
    +  mat[0] = v00;
    +  mat[1] = v10;
    +  mat[2] = v20;
    +  mat[3] = v30;
    +  mat[4] = v01;
    +  mat[5] = v11;
    +  mat[6] = v21;
    +  mat[7] = v31;
    +  mat[8] = v02;
    +  mat[9] = v12;
    +  mat[10] = v22;
    +  mat[11] = v32;
    +  mat[12] = v03;
    +  mat[13] = v13;
    +  mat[14] = v23;
    +  mat[15] = v33;
    +};
    +
    +
    +/**
    + * Sets the matrix from the array of values stored in column major order.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to receive the
    + *     values.
    + * @param {goog.vec.ArrayType} values The column major ordered
    + *     array of values to store in the matrix.
    + */
    +goog.vec.Matrix4.setFromArray = function(mat, values) {
    +  mat[0] = values[0];
    +  mat[1] = values[1];
    +  mat[2] = values[2];
    +  mat[3] = values[3];
    +  mat[4] = values[4];
    +  mat[5] = values[5];
    +  mat[6] = values[6];
    +  mat[7] = values[7];
    +  mat[8] = values[8];
    +  mat[9] = values[9];
    +  mat[10] = values[10];
    +  mat[11] = values[11];
    +  mat[12] = values[12];
    +  mat[13] = values[13];
    +  mat[14] = values[14];
    +  mat[15] = values[15];
    +};
    +
    +
    +/**
    + * Sets the matrix from the array of values stored in row major order.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to receive the
    + *     values.
    + * @param {goog.vec.ArrayType} values The row major ordered array of
    + *     values to store in the matrix.
    + */
    +goog.vec.Matrix4.setFromRowMajorArray = function(mat, values) {
    +  mat[0] = values[0];
    +  mat[1] = values[4];
    +  mat[2] = values[8];
    +  mat[3] = values[12];
    +
    +  mat[4] = values[1];
    +  mat[5] = values[5];
    +  mat[6] = values[9];
    +  mat[7] = values[13];
    +
    +  mat[8] = values[2];
    +  mat[9] = values[6];
    +  mat[10] = values[10];
    +  mat[11] = values[14];
    +
    +  mat[12] = values[3];
    +  mat[13] = values[7];
    +  mat[14] = values[11];
    +  mat[15] = values[15];
    +};
    +
    +
    +/**
    + * Sets the diagonal values of the matrix from the given values.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to receive the
    + *     values.
    + * @param {number} v00 The values for (0, 0).
    + * @param {number} v11 The values for (1, 1).
    + * @param {number} v22 The values for (2, 2).
    + * @param {number} v33 The values for (3, 3).
    + */
    +goog.vec.Matrix4.setDiagonalValues = function(
    +    mat, v00, v11, v22, v33) {
    +  mat[0] = v00;
    +  mat[5] = v11;
    +  mat[10] = v22;
    +  mat[15] = v33;
    +};
    +
    +
    +/**
    + * Sets the diagonal values of the matrix from the given vector.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to receive the
    + *     values.
    + * @param {goog.vec.ArrayType} vec The vector containing the
    + *     values.
    + */
    +goog.vec.Matrix4.setDiagonal = function(mat, vec) {
    +  mat[0] = vec[0];
    +  mat[5] = vec[1];
    +  mat[10] = vec[2];
    +  mat[15] = vec[3];
    +};
    +
    +
    +/**
    + * Sets the specified column with the supplied values.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to recieve the
    + *     values.
    + * @param {number} column The column index to set the values on.
    + * @param {number} v0 The value for row 0.
    + * @param {number} v1 The value for row 1.
    + * @param {number} v2 The value for row 2.
    + * @param {number} v3 The value for row 3.
    + */
    +goog.vec.Matrix4.setColumnValues = function(
    +    mat, column, v0, v1, v2, v3) {
    +  var i = column * 4;
    +  mat[i] = v0;
    +  mat[i + 1] = v1;
    +  mat[i + 2] = v2;
    +  mat[i + 3] = v3;
    +};
    +
    +
    +/**
    + * Sets the specified column with the value from the supplied array.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to receive the
    + *     values.
    + * @param {number} column The column index to set the values on.
    + * @param {goog.vec.ArrayType} vec The vector of elements for the
    + *     column.
    + */
    +goog.vec.Matrix4.setColumn = function(mat, column, vec) {
    +  var i = column * 4;
    +  mat[i] = vec[0];
    +  mat[i + 1] = vec[1];
    +  mat[i + 2] = vec[2];
    +  mat[i + 3] = vec[3];
    +};
    +
    +
    +/**
    + * Retrieves the specified column from the matrix into the given vector
    + * array.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix supplying the
    + *     values.
    + * @param {number} column The column to get the values from.
    + * @param {goog.vec.ArrayType} vec The vector of elements to
    + *     receive the column.
    + */
    +goog.vec.Matrix4.getColumn = function(mat, column, vec) {
    +  var i = column * 4;
    +  vec[0] = mat[i];
    +  vec[1] = mat[i + 1];
    +  vec[2] = mat[i + 2];
    +  vec[3] = mat[i + 3];
    +};
    +
    +
    +/**
    + * Sets the columns of the matrix from the set of vector elements.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to receive the
    + *     values.
    + * @param {goog.vec.ArrayType} vec0 The values for column 0.
    + * @param {goog.vec.ArrayType} vec1 The values for column 1.
    + * @param {goog.vec.ArrayType} vec2 The values for column 2.
    + * @param {goog.vec.ArrayType} vec3 The values for column 3.
    + */
    +goog.vec.Matrix4.setColumns = function(
    +    mat, vec0, vec1, vec2, vec3) {
    +  goog.vec.Matrix4.setColumn(mat, 0, vec0);
    +  goog.vec.Matrix4.setColumn(mat, 1, vec1);
    +  goog.vec.Matrix4.setColumn(mat, 2, vec2);
    +  goog.vec.Matrix4.setColumn(mat, 3, vec3);
    +};
    +
    +
    +/**
    + * Retrieves the column values from the given matrix into the given vector
    + * elements.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix containing the
    + *     columns to retrieve.
    + * @param {goog.vec.ArrayType} vec0 The vector elements to receive
    + *     column 0.
    + * @param {goog.vec.ArrayType} vec1 The vector elements to receive
    + *     column 1.
    + * @param {goog.vec.ArrayType} vec2 The vector elements to receive
    + *     column 2.
    + * @param {goog.vec.ArrayType} vec3 The vector elements to receive
    + *     column 3.
    + */
    +goog.vec.Matrix4.getColumns = function(
    +    mat, vec0, vec1, vec2, vec3) {
    +  goog.vec.Matrix4.getColumn(mat, 0, vec0);
    +  goog.vec.Matrix4.getColumn(mat, 1, vec1);
    +  goog.vec.Matrix4.getColumn(mat, 2, vec2);
    +  goog.vec.Matrix4.getColumn(mat, 3, vec3);
    +};
    +
    +
    +/**
    + * Sets the row values from the supplied values.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to receive the
    + *     values.
    + * @param {number} row The index of the row to receive the values.
    + * @param {number} v0 The value for column 0.
    + * @param {number} v1 The value for column 1.
    + * @param {number} v2 The value for column 2.
    + * @param {number} v3 The value for column 3.
    + */
    +goog.vec.Matrix4.setRowValues = function(mat, row, v0, v1, v2, v3) {
    +  mat[row] = v0;
    +  mat[row + 4] = v1;
    +  mat[row + 8] = v2;
    +  mat[row + 12] = v3;
    +};
    +
    +
    +/**
    + * Sets the row values from the supplied vector.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to receive the
    + *     row values.
    + * @param {number} row The index of the row.
    + * @param {goog.vec.ArrayType} vec The vector containing the
    + *     values.
    + */
    +goog.vec.Matrix4.setRow = function(mat, row, vec) {
    +  mat[row] = vec[0];
    +  mat[row + 4] = vec[1];
    +  mat[row + 8] = vec[2];
    +  mat[row + 12] = vec[3];
    +};
    +
    +
    +/**
    + * Retrieves the row values into the given vector.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix supplying the
    + *     values.
    + * @param {number} row The index of the row supplying the values.
    + * @param {goog.vec.ArrayType} vec The vector to receive the
    + *     row.
    + */
    +goog.vec.Matrix4.getRow = function(mat, row, vec) {
    +  vec[0] = mat[row];
    +  vec[1] = mat[row + 4];
    +  vec[2] = mat[row + 8];
    +  vec[3] = mat[row + 12];
    +};
    +
    +
    +/**
    + * Sets the rows of the matrix from the supplied vectors.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to receive the
    + *     values.
    + * @param {goog.vec.ArrayType} vec0 The values for row 0.
    + * @param {goog.vec.ArrayType} vec1 The values for row 1.
    + * @param {goog.vec.ArrayType} vec2 The values for row 2.
    + * @param {goog.vec.ArrayType} vec3 The values for row 3.
    + */
    +goog.vec.Matrix4.setRows = function(
    +    mat, vec0, vec1, vec2, vec3) {
    +  goog.vec.Matrix4.setRow(mat, 0, vec0);
    +  goog.vec.Matrix4.setRow(mat, 1, vec1);
    +  goog.vec.Matrix4.setRow(mat, 2, vec2);
    +  goog.vec.Matrix4.setRow(mat, 3, vec3);
    +};
    +
    +
    +/**
    + * Retrieves the rows of the matrix into the supplied vectors.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to supply the
    + *     values.
    + * @param {goog.vec.ArrayType} vec0 The vector to receive row 0.
    + * @param {goog.vec.ArrayType} vec1 The vector to receive row 1.
    + * @param {goog.vec.ArrayType} vec2 The vector to receive row 2.
    + * @param {goog.vec.ArrayType} vec3 The vector to receive row 3.
    + */
    +goog.vec.Matrix4.getRows = function(
    +    mat, vec0, vec1, vec2, vec3) {
    +  goog.vec.Matrix4.getRow(mat, 0, vec0);
    +  goog.vec.Matrix4.getRow(mat, 1, vec1);
    +  goog.vec.Matrix4.getRow(mat, 2, vec2);
    +  goog.vec.Matrix4.getRow(mat, 3, vec3);
    +};
    +
    +
    +/**
    + * Clears the given matrix to zero.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to clear.
    + */
    +goog.vec.Matrix4.setZero = function(mat) {
    +  mat[0] = 0;
    +  mat[1] = 0;
    +  mat[2] = 0;
    +  mat[3] = 0;
    +  mat[4] = 0;
    +  mat[5] = 0;
    +  mat[6] = 0;
    +  mat[7] = 0;
    +  mat[8] = 0;
    +  mat[9] = 0;
    +  mat[10] = 0;
    +  mat[11] = 0;
    +  mat[12] = 0;
    +  mat[13] = 0;
    +  mat[14] = 0;
    +  mat[15] = 0;
    +};
    +
    +
    +/**
    + * Sets the given matrix to the identity matrix.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to set.
    + */
    +goog.vec.Matrix4.setIdentity = function(mat) {
    +  mat[0] = 1;
    +  mat[1] = 0;
    +  mat[2] = 0;
    +  mat[3] = 0;
    +  mat[4] = 0;
    +  mat[5] = 1;
    +  mat[6] = 0;
    +  mat[7] = 0;
    +  mat[8] = 0;
    +  mat[9] = 0;
    +  mat[10] = 1;
    +  mat[11] = 0;
    +  mat[12] = 0;
    +  mat[13] = 0;
    +  mat[14] = 0;
    +  mat[15] = 1;
    +};
    +
    +
    +/**
    + * Performs a per-component addition of the matrix mat0 and mat1, storing
    + * the result into resultMat.
    + *
    + * @param {goog.vec.ArrayType} mat0 The first addend.
    + * @param {goog.vec.ArrayType} mat1 The second addend.
    + * @param {goog.vec.ArrayType} resultMat The matrix to
    + *     receive the results (may be either mat0 or mat1).
    + * @return {goog.vec.ArrayType} return resultMat so that operations can be
    + *     chained together.
    + */
    +goog.vec.Matrix4.add = function(mat0, mat1, resultMat) {
    +  resultMat[0] = mat0[0] + mat1[0];
    +  resultMat[1] = mat0[1] + mat1[1];
    +  resultMat[2] = mat0[2] + mat1[2];
    +  resultMat[3] = mat0[3] + mat1[3];
    +  resultMat[4] = mat0[4] + mat1[4];
    +  resultMat[5] = mat0[5] + mat1[5];
    +  resultMat[6] = mat0[6] + mat1[6];
    +  resultMat[7] = mat0[7] + mat1[7];
    +  resultMat[8] = mat0[8] + mat1[8];
    +  resultMat[9] = mat0[9] + mat1[9];
    +  resultMat[10] = mat0[10] + mat1[10];
    +  resultMat[11] = mat0[11] + mat1[11];
    +  resultMat[12] = mat0[12] + mat1[12];
    +  resultMat[13] = mat0[13] + mat1[13];
    +  resultMat[14] = mat0[14] + mat1[14];
    +  resultMat[15] = mat0[15] + mat1[15];
    +  return resultMat;
    +};
    +
    +
    +/**
    + * Performs a per-component subtraction of the matrix mat0 and mat1,
    + * storing the result into resultMat.
    + *
    + * @param {goog.vec.ArrayType} mat0 The minuend.
    + * @param {goog.vec.ArrayType} mat1 The subtrahend.
    + * @param {goog.vec.ArrayType} resultMat The matrix to receive
    + *     the results (may be either mat0 or mat1).
    + * @return {goog.vec.ArrayType} return resultMat so that operations can be
    + *     chained together.
    + */
    +goog.vec.Matrix4.subtract = function(mat0, mat1, resultMat) {
    +  resultMat[0] = mat0[0] - mat1[0];
    +  resultMat[1] = mat0[1] - mat1[1];
    +  resultMat[2] = mat0[2] - mat1[2];
    +  resultMat[3] = mat0[3] - mat1[3];
    +  resultMat[4] = mat0[4] - mat1[4];
    +  resultMat[5] = mat0[5] - mat1[5];
    +  resultMat[6] = mat0[6] - mat1[6];
    +  resultMat[7] = mat0[7] - mat1[7];
    +  resultMat[8] = mat0[8] - mat1[8];
    +  resultMat[9] = mat0[9] - mat1[9];
    +  resultMat[10] = mat0[10] - mat1[10];
    +  resultMat[11] = mat0[11] - mat1[11];
    +  resultMat[12] = mat0[12] - mat1[12];
    +  resultMat[13] = mat0[13] - mat1[13];
    +  resultMat[14] = mat0[14] - mat1[14];
    +  resultMat[15] = mat0[15] - mat1[15];
    +  return resultMat;
    +};
    +
    +
    +/**
    + * Performs a component-wise multiplication of mat0 with the given scalar
    + * storing the result into resultMat.
    + *
    + * @param {goog.vec.ArrayType} mat0 The matrix to scale.
    + * @param {number} scalar The scalar value to multiple to each element of mat0.
    + * @param {goog.vec.ArrayType} resultMat The matrix to receive
    + *     the results (may be mat0).
    + * @return {goog.vec.ArrayType} return resultMat so that operations can be
    + *     chained together.
    + */
    +goog.vec.Matrix4.scale = function(mat0, scalar, resultMat) {
    +  resultMat[0] = mat0[0] * scalar;
    +  resultMat[1] = mat0[1] * scalar;
    +  resultMat[2] = mat0[2] * scalar;
    +  resultMat[3] = mat0[3] * scalar;
    +  resultMat[4] = mat0[4] * scalar;
    +  resultMat[5] = mat0[5] * scalar;
    +  resultMat[6] = mat0[6] * scalar;
    +  resultMat[7] = mat0[7] * scalar;
    +  resultMat[8] = mat0[8] * scalar;
    +  resultMat[9] = mat0[9] * scalar;
    +  resultMat[10] = mat0[10] * scalar;
    +  resultMat[11] = mat0[11] * scalar;
    +  resultMat[12] = mat0[12] * scalar;
    +  resultMat[13] = mat0[13] * scalar;
    +  resultMat[14] = mat0[14] * scalar;
    +  resultMat[15] = mat0[15] * scalar;
    +  return resultMat;
    +};
    +
    +
    +/**
    + * Multiplies the two matrices mat0 and mat1 using matrix multiplication,
    + * storing the result into resultMat.
    + *
    + * @param {goog.vec.ArrayType} mat0 The first (left hand) matrix.
    + * @param {goog.vec.ArrayType} mat1 The second (right hand)
    + *     matrix.
    + * @param {goog.vec.ArrayType} resultMat The matrix to receive
    + *     the results (may be either mat0 or mat1).
    + * @return {goog.vec.ArrayType} return resultMat so that operations can be
    + *     chained together.
    + */
    +goog.vec.Matrix4.multMat = function(mat0, mat1, resultMat) {
    +  var a00 = mat0[0], a10 = mat0[1], a20 = mat0[2], a30 = mat0[3];
    +  var a01 = mat0[4], a11 = mat0[5], a21 = mat0[6], a31 = mat0[7];
    +  var a02 = mat0[8], a12 = mat0[9], a22 = mat0[10], a32 = mat0[11];
    +  var a03 = mat0[12], a13 = mat0[13], a23 = mat0[14], a33 = mat0[15];
    +
    +  var b00 = mat1[0], b10 = mat1[1], b20 = mat1[2], b30 = mat1[3];
    +  var b01 = mat1[4], b11 = mat1[5], b21 = mat1[6], b31 = mat1[7];
    +  var b02 = mat1[8], b12 = mat1[9], b22 = mat1[10], b32 = mat1[11];
    +  var b03 = mat1[12], b13 = mat1[13], b23 = mat1[14], b33 = mat1[15];
    +
    +  resultMat[0] = a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30;
    +  resultMat[1] = a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30;
    +  resultMat[2] = a20 * b00 + a21 * b10 + a22 * b20 + a23 * b30;
    +  resultMat[3] = a30 * b00 + a31 * b10 + a32 * b20 + a33 * b30;
    +
    +  resultMat[4] = a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31;
    +  resultMat[5] = a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31;
    +  resultMat[6] = a20 * b01 + a21 * b11 + a22 * b21 + a23 * b31;
    +  resultMat[7] = a30 * b01 + a31 * b11 + a32 * b21 + a33 * b31;
    +
    +  resultMat[8] = a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32;
    +  resultMat[9] = a10 * b02 + a11 * b12 + a12 * b22 + a13 * b32;
    +  resultMat[10] = a20 * b02 + a21 * b12 + a22 * b22 + a23 * b32;
    +  resultMat[11] = a30 * b02 + a31 * b12 + a32 * b22 + a33 * b32;
    +
    +  resultMat[12] = a00 * b03 + a01 * b13 + a02 * b23 + a03 * b33;
    +  resultMat[13] = a10 * b03 + a11 * b13 + a12 * b23 + a13 * b33;
    +  resultMat[14] = a20 * b03 + a21 * b13 + a22 * b23 + a23 * b33;
    +  resultMat[15] = a30 * b03 + a31 * b13 + a32 * b23 + a33 * b33;
    +  return resultMat;
    +};
    +
    +
    +/**
    + * Transposes the given matrix mat storing the result into resultMat.
    + * @param {goog.vec.ArrayType} mat The matrix to transpose.
    + * @param {goog.vec.ArrayType} resultMat The matrix to receive
    + *     the results (may be mat).
    + * @return {goog.vec.ArrayType} return resultMat so that operations can be
    + *     chained together.
    + */
    +goog.vec.Matrix4.transpose = function(mat, resultMat) {
    +  if (resultMat == mat) {
    +    var a10 = mat[1], a20 = mat[2], a30 = mat[3];
    +    var a21 = mat[6], a31 = mat[7];
    +    var a32 = mat[11];
    +    resultMat[1] = mat[4];
    +    resultMat[2] = mat[8];
    +    resultMat[3] = mat[12];
    +    resultMat[4] = a10;
    +    resultMat[6] = mat[9];
    +    resultMat[7] = mat[13];
    +    resultMat[8] = a20;
    +    resultMat[9] = a21;
    +    resultMat[11] = mat[14];
    +    resultMat[12] = a30;
    +    resultMat[13] = a31;
    +    resultMat[14] = a32;
    +  } else {
    +    resultMat[0] = mat[0];
    +    resultMat[1] = mat[4];
    +    resultMat[2] = mat[8];
    +    resultMat[3] = mat[12];
    +
    +    resultMat[4] = mat[1];
    +    resultMat[5] = mat[5];
    +    resultMat[6] = mat[9];
    +    resultMat[7] = mat[13];
    +
    +    resultMat[8] = mat[2];
    +    resultMat[9] = mat[6];
    +    resultMat[10] = mat[10];
    +    resultMat[11] = mat[14];
    +
    +    resultMat[12] = mat[3];
    +    resultMat[13] = mat[7];
    +    resultMat[14] = mat[11];
    +    resultMat[15] = mat[15];
    +  }
    +  return resultMat;
    +};
    +
    +
    +/**
    + * Computes the determinant of the matrix.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to compute the
    + *     matrix for.
    + * @return {number} The determinant of the matrix.
    + */
    +goog.vec.Matrix4.determinant = function(mat) {
    +  var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3];
    +  var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7];
    +  var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11];
    +  var m03 = mat[12], m13 = mat[13], m23 = mat[14], m33 = mat[15];
    +
    +  var a0 = m00 * m11 - m10 * m01;
    +  var a1 = m00 * m21 - m20 * m01;
    +  var a2 = m00 * m31 - m30 * m01;
    +  var a3 = m10 * m21 - m20 * m11;
    +  var a4 = m10 * m31 - m30 * m11;
    +  var a5 = m20 * m31 - m30 * m21;
    +  var b0 = m02 * m13 - m12 * m03;
    +  var b1 = m02 * m23 - m22 * m03;
    +  var b2 = m02 * m33 - m32 * m03;
    +  var b3 = m12 * m23 - m22 * m13;
    +  var b4 = m12 * m33 - m32 * m13;
    +  var b5 = m22 * m33 - m32 * m23;
    +
    +  return a0 * b5 - a1 * b4 + a2 * b3 + a3 * b2 - a4 * b1 + a5 * b0;
    +};
    +
    +
    +/**
    + * Computes the inverse of mat storing the result into resultMat. If the
    + * inverse is defined, this function returns true, false otherwise.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix to invert.
    + * @param {goog.vec.ArrayType} resultMat The matrix to receive
    + *     the result (may be mat).
    + * @return {boolean} True if the inverse is defined. If false is returned,
    + *     resultMat is not modified.
    + */
    +goog.vec.Matrix4.invert = function(mat, resultMat) {
    +  var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3];
    +  var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7];
    +  var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11];
    +  var m03 = mat[12], m13 = mat[13], m23 = mat[14], m33 = mat[15];
    +
    +  var a0 = m00 * m11 - m10 * m01;
    +  var a1 = m00 * m21 - m20 * m01;
    +  var a2 = m00 * m31 - m30 * m01;
    +  var a3 = m10 * m21 - m20 * m11;
    +  var a4 = m10 * m31 - m30 * m11;
    +  var a5 = m20 * m31 - m30 * m21;
    +  var b0 = m02 * m13 - m12 * m03;
    +  var b1 = m02 * m23 - m22 * m03;
    +  var b2 = m02 * m33 - m32 * m03;
    +  var b3 = m12 * m23 - m22 * m13;
    +  var b4 = m12 * m33 - m32 * m13;
    +  var b5 = m22 * m33 - m32 * m23;
    +
    +  var det = a0 * b5 - a1 * b4 + a2 * b3 + a3 * b2 - a4 * b1 + a5 * b0;
    +  if (det == 0) {
    +    return false;
    +  }
    +
    +  var idet = 1.0 / det;
    +  resultMat[0] = (m11 * b5 - m21 * b4 + m31 * b3) * idet;
    +  resultMat[1] = (-m10 * b5 + m20 * b4 - m30 * b3) * idet;
    +  resultMat[2] = (m13 * a5 - m23 * a4 + m33 * a3) * idet;
    +  resultMat[3] = (-m12 * a5 + m22 * a4 - m32 * a3) * idet;
    +  resultMat[4] = (-m01 * b5 + m21 * b2 - m31 * b1) * idet;
    +  resultMat[5] = (m00 * b5 - m20 * b2 + m30 * b1) * idet;
    +  resultMat[6] = (-m03 * a5 + m23 * a2 - m33 * a1) * idet;
    +  resultMat[7] = (m02 * a5 - m22 * a2 + m32 * a1) * idet;
    +  resultMat[8] = (m01 * b4 - m11 * b2 + m31 * b0) * idet;
    +  resultMat[9] = (-m00 * b4 + m10 * b2 - m30 * b0) * idet;
    +  resultMat[10] = (m03 * a4 - m13 * a2 + m33 * a0) * idet;
    +  resultMat[11] = (-m02 * a4 + m12 * a2 - m32 * a0) * idet;
    +  resultMat[12] = (-m01 * b3 + m11 * b1 - m21 * b0) * idet;
    +  resultMat[13] = (m00 * b3 - m10 * b1 + m20 * b0) * idet;
    +  resultMat[14] = (-m03 * a3 + m13 * a1 - m23 * a0) * idet;
    +  resultMat[15] = (m02 * a3 - m12 * a1 + m22 * a0) * idet;
    +  return true;
    +};
    +
    +
    +/**
    + * Returns true if the components of mat0 are equal to the components of mat1.
    + *
    + * @param {goog.vec.ArrayType} mat0 The first matrix.
    + * @param {goog.vec.ArrayType} mat1 The second matrix.
    + * @return {boolean} True if the the two matrices are equivalent.
    + */
    +goog.vec.Matrix4.equals = function(mat0, mat1) {
    +  return mat0.length == mat1.length &&
    +      mat0[0] == mat1[0] &&
    +      mat0[1] == mat1[1] &&
    +      mat0[2] == mat1[2] &&
    +      mat0[3] == mat1[3] &&
    +      mat0[4] == mat1[4] &&
    +      mat0[5] == mat1[5] &&
    +      mat0[6] == mat1[6] &&
    +      mat0[7] == mat1[7] &&
    +      mat0[8] == mat1[8] &&
    +      mat0[9] == mat1[9] &&
    +      mat0[10] == mat1[10] &&
    +      mat0[11] == mat1[11] &&
    +      mat0[12] == mat1[12] &&
    +      mat0[13] == mat1[13] &&
    +      mat0[14] == mat1[14] &&
    +      mat0[15] == mat1[15];
    +};
    +
    +
    +/**
    + * Transforms the given vector with the given matrix storing the resulting,
    + * transformed vector into resultVec. The input vector is multiplied against the
    + * upper 3x4 matrix omitting the projective component.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix supplying the
    + *     transformation.
    + * @param {goog.vec.ArrayType} vec The 3 element vector to
    + *     transform.
    + * @param {goog.vec.ArrayType} resultVec The 3 element vector to
    + *     receive the results (may be vec).
    + * @return {goog.vec.ArrayType} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Matrix4.multVec3 = function(mat, vec, resultVec) {
    +  var x = vec[0], y = vec[1], z = vec[2];
    +  resultVec[0] = x * mat[0] + y * mat[4] + z * mat[8] + mat[12];
    +  resultVec[1] = x * mat[1] + y * mat[5] + z * mat[9] + mat[13];
    +  resultVec[2] = x * mat[2] + y * mat[6] + z * mat[10] + mat[14];
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Transforms the given vector with the given matrix storing the resulting,
    + * transformed vector into resultVec. The input vector is multiplied against the
    + * upper 3x3 matrix omitting the projective component and translation
    + * components.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix supplying the
    + *     transformation.
    + * @param {goog.vec.ArrayType} vec The 3 element vector to
    + *     transform.
    + * @param {goog.vec.ArrayType} resultVec The 3 element vector to
    + *     receive the results (may be vec).
    + * @return {goog.vec.ArrayType} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Matrix4.multVec3NoTranslate = function(
    +    mat, vec, resultVec) {
    +  var x = vec[0], y = vec[1], z = vec[2];
    +  resultVec[0] = x * mat[0] + y * mat[4] + z * mat[8];
    +  resultVec[1] = x * mat[1] + y * mat[5] + z * mat[9];
    +  resultVec[2] = x * mat[2] + y * mat[6] + z * mat[10];
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Transforms the given vector with the given matrix storing the resulting,
    + * transformed vector into resultVec. The input vector is multiplied against the
    + * full 4x4 matrix with the homogeneous divide applied to reduce the 4 element
    + * vector to a 3 element vector.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix supplying the
    + *     transformation.
    + * @param {goog.vec.ArrayType} vec The 3 element vector to
    + *     transform.
    + * @param {goog.vec.ArrayType} resultVec The 3 element vector
    + *     to receive the results (may be vec).
    + * @return {goog.vec.ArrayType} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Matrix4.multVec3Projective = function(
    +    mat, vec, resultVec) {
    +  var x = vec[0], y = vec[1], z = vec[2];
    +  var invw = 1 / (x * mat[3] + y * mat[7] + z * mat[11] + mat[15]);
    +  resultVec[0] = (x * mat[0] + y * mat[4] + z * mat[8] + mat[12]) * invw;
    +  resultVec[1] = (x * mat[1] + y * mat[5] + z * mat[9] + mat[13]) * invw;
    +  resultVec[2] = (x * mat[2] + y * mat[6] + z * mat[10] + mat[14]) * invw;
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Transforms the given vector with the given matrix storing the resulting,
    + * transformed vector into resultVec.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix supplying the
    + *     transformation.
    + * @param {goog.vec.ArrayType} vec The vector to transform.
    + * @param {goog.vec.ArrayType} resultVec The vector to
    + *     receive the results (may be vec).
    + * @return {goog.vec.ArrayType} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Matrix4.multVec4 = function(mat, vec, resultVec) {
    +  var x = vec[0], y = vec[1], z = vec[2], w = vec[3];
    +  resultVec[0] = x * mat[0] + y * mat[4] + z * mat[8] + w * mat[12];
    +  resultVec[1] = x * mat[1] + y * mat[5] + z * mat[9] + w * mat[13];
    +  resultVec[2] = x * mat[2] + y * mat[6] + z * mat[10] + w * mat[14];
    +  resultVec[3] = x * mat[3] + y * mat[7] + z * mat[11] + w * mat[15];
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Transforms the given vector with the given matrix storing the resulting,
    + * transformed vector into resultVec. The input matrix is multiplied against the
    + * upper 3x4 matrix omitting the projective component.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix supplying the
    + *     transformation.
    + * @param {goog.vec.ArrayType} vec The 3 element vector to
    + *     transform.
    + * @param {goog.vec.ArrayType} resultVec The 3 element vector to
    + *     receive the results (may be vec).
    + * @return {goog.vec.ArrayType} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Matrix4.multVec3ToArray = function(mat, vec, resultVec) {
    +  goog.vec.Matrix4.multVec3(
    +      mat, vec, (/** @type {goog.vec.ArrayType} */ resultVec));
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Transforms the given vector with the given matrix storing the resulting,
    + * transformed vector into resultVec.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix supplying the
    + *     transformation.
    + * @param {goog.vec.ArrayType} vec The vector to transform.
    + * @param {goog.vec.ArrayType} resultVec The vector to
    + *     receive the results (may be vec).
    + * @return {goog.vec.ArrayType} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Matrix4.multVec4ToArray = function(mat, vec, resultVec) {
    +  goog.vec.Matrix4.multVec4(
    +      mat, vec, (/** @type {goog.vec.ArrayType} */ resultVec));
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Initializes the given 4x4 matrix as a translation matrix with x, y and z
    + * translation factors.
    + * @param {goog.vec.ArrayType} mat The 4x4 (16-element) matrix
    + *     array to receive the new translation matrix.
    + * @param {number} x The translation along the x axis.
    + * @param {number} y The translation along the y axis.
    + * @param {number} z The translation along the z axis.
    + */
    +goog.vec.Matrix4.makeTranslate = function(mat, x, y, z) {
    +  goog.vec.Matrix4.setIdentity(mat);
    +  goog.vec.Matrix4.setColumnValues(mat, 3, x, y, z, 1);
    +};
    +
    +
    +/**
    + * Initializes the given 4x4 matrix as a scale matrix with x, y and z scale
    + * factors.
    + * @param {goog.vec.ArrayType} mat The 4x4 (16-element) matrix
    + *     array to receive the new translation matrix.
    + * @param {number} x The scale along the x axis.
    + * @param {number} y The scale along the y axis.
    + * @param {number} z The scale along the z axis.
    + */
    +goog.vec.Matrix4.makeScale = function(mat, x, y, z) {
    +  goog.vec.Matrix4.setIdentity(mat);
    +  goog.vec.Matrix4.setDiagonalValues(mat, x, y, z, 1);
    +};
    +
    +
    +/**
    + * Initializes the given 4x4 matrix as a rotation matrix with the given rotation
    + * angle about the axis defined by the vector (ax, ay, az).
    + * @param {goog.vec.ArrayType} mat The 4x4 (16-element) matrix
    + *     array to receive the new translation matrix.
    + * @param {number} angle The rotation angle in radians.
    + * @param {number} ax The x component of the rotation axis.
    + * @param {number} ay The y component of the rotation axis.
    + * @param {number} az The z component of the rotation axis.
    + */
    +goog.vec.Matrix4.makeAxisAngleRotate = function(
    +    mat, angle, ax, ay, az) {
    +  var c = Math.cos(angle);
    +  var d = 1 - c;
    +  var s = Math.sin(angle);
    +
    +  goog.vec.Matrix4.setFromValues(mat,
    +      ax * ax * d + c,
    +      ax * ay * d + az * s,
    +      ax * az * d - ay * s,
    +      0,
    +
    +      ax * ay * d - az * s,
    +      ay * ay * d + c,
    +      ay * az * d + ax * s,
    +      0,
    +
    +      ax * az * d + ay * s,
    +      ay * az * d - ax * s,
    +      az * az * d + c,
    +      0,
    +
    +      0, 0, 0, 1);
    +};
    +
    +
    +/**
    + * Initializes the given 4x4 matrix as a perspective projection matrix.
    + * @param {goog.vec.ArrayType} mat The 4x4 (16-element) matrix
    + *     array to receive the new translation matrix.
    + * @param {number} left The coordinate of the left clipping plane.
    + * @param {number} right The coordinate of the right clipping plane.
    + * @param {number} bottom The coordinate of the bottom clipping plane.
    + * @param {number} top The coordinate of the top clipping plane.
    + * @param {number} near The distance to the near clipping plane.
    + * @param {number} far The distance to the far clipping plane.
    + */
    +goog.vec.Matrix4.makeFrustum = function(
    +    mat, left, right, bottom, top, near, far) {
    +  var x = (2 * near) / (right - left);
    +  var y = (2 * near) / (top - bottom);
    +  var a = (right + left) / (right - left);
    +  var b = (top + bottom) / (top - bottom);
    +  var c = -(far + near) / (far - near);
    +  var d = -(2 * far * near) / (far - near);
    +
    +  goog.vec.Matrix4.setFromValues(mat,
    +      x, 0, 0, 0,
    +      0, y, 0, 0,
    +      a, b, c, -1,
    +      0, 0, d, 0
    +  );
    +};
    +
    +
    +/**
    + * Initializes the given 4x4 matrix as a perspective projection matrix given a
    + * field of view and aspect ratio.
    + * @param {goog.vec.ArrayType} mat The 4x4 (16-element) matrix
    + *     array to receive the new translation matrix.
    + * @param {number} fovy The field of view along the y (vertical) axis in
    + *     radians.
    + * @param {number} aspect The x (width) to y (height) aspect ratio.
    + * @param {number} near The distance to the near clipping plane.
    + * @param {number} far The distance to the far clipping plane.
    + */
    +goog.vec.Matrix4.makePerspective = function(
    +    mat, fovy, aspect, near, far) {
    +  var angle = fovy / 2;
    +  var dz = far - near;
    +  var sinAngle = Math.sin(angle);
    +  if (dz == 0 || sinAngle == 0 || aspect == 0) return;
    +
    +  var cot = Math.cos(angle) / sinAngle;
    +  goog.vec.Matrix4.setFromValues(mat,
    +      cot / aspect, 0, 0, 0,
    +      0, cot, 0, 0,
    +      0, 0, -(far + near) / dz, -1,
    +      0, 0, -(2 * near * far) / dz, 0
    +  );
    +};
    +
    +
    +/**
    + * Initializes the given 4x4 matrix as an orthographic projection matrix.
    + * @param {goog.vec.ArrayType} mat The 4x4 (16-element) matrix
    + *     array to receive the new translation matrix.
    + * @param {number} left The coordinate of the left clipping plane.
    + * @param {number} right The coordinate of the right clipping plane.
    + * @param {number} bottom The coordinate of the bottom clipping plane.
    + * @param {number} top The coordinate of the top clipping plane.
    + * @param {number} near The distance to the near clipping plane.
    + * @param {number} far The distance to the far clipping plane.
    + */
    +goog.vec.Matrix4.makeOrtho = function(
    +    mat, left, right, bottom, top, near, far) {
    +  var x = 2 / (right - left);
    +  var y = 2 / (top - bottom);
    +  var z = -2 / (far - near);
    +  var a = -(right + left) / (right - left);
    +  var b = -(top + bottom) / (top - bottom);
    +  var c = -(far + near) / (far - near);
    +
    +  goog.vec.Matrix4.setFromValues(mat,
    +      x, 0, 0, 0,
    +      0, y, 0, 0,
    +      0, 0, z, 0,
    +      a, b, c, 1
    +  );
    +};
    +
    +
    +/**
    + * Updates a matrix representing the modelview matrix of a camera so that
    + * the camera is 'looking at' the given center point.
    + * @param {goog.vec.ArrayType} viewMatrix The matrix.
    + * @param {goog.vec.ArrayType} eyePt The position of the eye point
    + *     (camera origin).
    + * @param {goog.vec.ArrayType} centerPt The point to aim the camera
    + *     at.
    + * @param {goog.vec.ArrayType} worldUpVec The vector that
    + *     identifies the up direction for the camera.
    + */
    +goog.vec.Matrix4.lookAt = function(
    +    viewMatrix, eyePt, centerPt, worldUpVec) {
    +  // Compute the direction vector from the eye point to the center point and
    +  // normalize.
    +  var fwdVec = goog.vec.Matrix4.tmpVec4_[0];
    +  goog.vec.Vec3.subtract(centerPt, eyePt, fwdVec);
    +  goog.vec.Vec3.normalize(fwdVec, fwdVec);
    +  fwdVec[3] = 0;
    +
    +  // Compute the side vector from the forward vector and the input up vector.
    +  var sideVec = goog.vec.Matrix4.tmpVec4_[1];
    +  goog.vec.Vec3.cross(fwdVec, worldUpVec, sideVec);
    +  goog.vec.Vec3.normalize(sideVec, sideVec);
    +  sideVec[3] = 0;
    +
    +  // Now the up vector to form the orthonormal basis.
    +  var upVec = goog.vec.Matrix4.tmpVec4_[2];
    +  goog.vec.Vec3.cross(sideVec, fwdVec, upVec);
    +  goog.vec.Vec3.normalize(upVec, upVec);
    +  upVec[3] = 0;
    +
    +  // Update the view matrix with the new orthonormal basis and position the
    +  // camera at the given eye point.
    +  goog.vec.Vec3.negate(fwdVec, fwdVec);
    +  goog.vec.Matrix4.setRow(viewMatrix, 0, sideVec);
    +  goog.vec.Matrix4.setRow(viewMatrix, 1, upVec);
    +  goog.vec.Matrix4.setRow(viewMatrix, 2, fwdVec);
    +  goog.vec.Matrix4.setRowValues(viewMatrix, 3, 0, 0, 0, 1);
    +  goog.vec.Matrix4.applyTranslate(
    +      viewMatrix, -eyePt[0], -eyePt[1], -eyePt[2]);
    +};
    +
    +
    +/**
    + * Decomposes a matrix into the lookAt vectors eyePt, fwdVec and worldUpVec.
    + * The matrix represents the modelview matrix of a camera. It is the inverse
    + * of lookAt except for the output of the fwdVec instead of centerPt.
    + * The centerPt itself cannot be recovered from a modelview matrix.
    + * @param {goog.vec.ArrayType} viewMatrix The matrix.
    + * @param {goog.vec.ArrayType} eyePt The position of the eye point
    + *     (camera origin).
    + * @param {goog.vec.ArrayType} fwdVec The vector describing where
    + *     the camera points to.
    + * @param {goog.vec.ArrayType} worldUpVec The vector that
    + *     identifies the up direction for the camera.
    + * @return {boolean} True if the method succeeds, false otherwise.
    + *     The method can only fail if the inverse of viewMatrix is not defined.
    + */
    +goog.vec.Matrix4.toLookAt = function(
    +    viewMatrix, eyePt, fwdVec, worldUpVec) {
    +  // Get eye of the camera.
    +  var viewMatrixInverse = goog.vec.Matrix4.tmpMatrix4_[0];
    +  if (!goog.vec.Matrix4.invert(viewMatrix, viewMatrixInverse)) {
    +    // The input matrix does not have a valid inverse.
    +    return false;
    +  }
    +
    +  if (eyePt) {
    +    eyePt[0] = viewMatrixInverse[12];
    +    eyePt[1] = viewMatrixInverse[13];
    +    eyePt[2] = viewMatrixInverse[14];
    +  }
    +
    +  // Get forward vector from the definition of lookAt.
    +  if (fwdVec || worldUpVec) {
    +    if (!fwdVec) {
    +      fwdVec = goog.vec.Matrix4.tmpVec3_[0];
    +    }
    +    fwdVec[0] = -viewMatrix[2];
    +    fwdVec[1] = -viewMatrix[6];
    +    fwdVec[2] = -viewMatrix[10];
    +    // Normalize forward vector.
    +    goog.vec.Vec3.normalize(fwdVec, fwdVec);
    +  }
    +
    +  if (worldUpVec) {
    +    // Get side vector from the definition of gluLookAt.
    +    var side = goog.vec.Matrix4.tmpVec3_[1];
    +    side[0] = viewMatrix[0];
    +    side[1] = viewMatrix[4];
    +    side[2] = viewMatrix[8];
    +    // Compute up vector as a up = side x forward.
    +    goog.vec.Vec3.cross(side, fwdVec, worldUpVec);
    +    // Normalize up vector.
    +    goog.vec.Vec3.normalize(worldUpVec, worldUpVec);
    +  }
    +  return true;
    +};
    +
    +
    +/**
    + * Constructs a rotation matrix from its Euler angles using the ZXZ convention.
    + * Given the euler angles [theta1, theta2, theta3], the rotation is defined as
    + * rotation = rotation_z(theta1) * rotation_x(theta2) * rotation_z(theta3),
    + * where rotation_x(theta) means rotation around the X axis of theta radians.
    + * @param {goog.vec.ArrayType} matrix The rotation matrix.
    + * @param {number} theta1 The angle of rotation around the Z axis in radians.
    + * @param {number} theta2 The angle of rotation around the X axis in radians.
    + * @param {number} theta3 The angle of rotation around the Z axis in radians.
    + */
    +goog.vec.Matrix4.fromEulerZXZ = function(
    +    matrix, theta1, theta2, theta3) {
    +  var c1 = Math.cos(theta1);
    +  var s1 = Math.sin(theta1);
    +
    +  var c2 = Math.cos(theta2);
    +  var s2 = Math.sin(theta2);
    +
    +  var c3 = Math.cos(theta3);
    +  var s3 = Math.sin(theta3);
    +
    +  matrix[0] = c1 * c3 - c2 * s1 * s3;
    +  matrix[1] = c2 * c1 * s3 + c3 * s1;
    +  matrix[2] = s3 * s2;
    +  matrix[3] = 0;
    +
    +  matrix[4] = -c1 * s3 - c3 * c2 * s1;
    +  matrix[5] = c1 * c2 * c3 - s1 * s3;
    +  matrix[6] = c3 * s2;
    +  matrix[7] = 0;
    +
    +  matrix[8] = s2 * s1;
    +  matrix[9] = -c1 * s2;
    +  matrix[10] = c2;
    +  matrix[11] = 0;
    +
    +  matrix[12] = 0;
    +  matrix[13] = 0;
    +  matrix[14] = 0;
    +  matrix[15] = 1;
    +};
    +
    +
    +/**
    + * Decomposes a rotation matrix into Euler angles using the ZXZ convention.
    + * @param {goog.vec.ArrayType} matrix The rotation matrix.
    + * @param {goog.vec.ArrayType} euler The ZXZ Euler angles in
    + *     radians. euler = [roll, tilt, pan].
    + */
    +goog.vec.Matrix4.toEulerZXZ = function(matrix, euler) {
    +  var s2 = Math.sqrt(matrix[2] * matrix[2] + matrix[6] * matrix[6]);
    +
    +  // There is an ambiguity in the sign of s2. We assume the tilt value
    +  // is between [-pi/2, 0], so s2 is always negative.
    +  if (s2 > goog.vec.EPSILON) {
    +    euler[2] = Math.atan2(-matrix[2], -matrix[6]);
    +    euler[1] = Math.atan2(-s2, matrix[10]);
    +    euler[0] = Math.atan2(-matrix[8], matrix[9]);
    +  } else {
    +    // There is also an arbitrary choice for roll = 0 or pan = 0 in this case.
    +    // We assume roll = 0 as some applications do not allow the camera to roll.
    +    euler[0] = 0;
    +    euler[1] = Math.atan2(-s2, matrix[10]);
    +    euler[2] = Math.atan2(matrix[1], matrix[0]);
    +  }
    +};
    +
    +
    +/**
    + * Applies a translation by x,y,z to the given matrix.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix.
    + * @param {number} x The translation along the x axis.
    + * @param {number} y The translation along the y axis.
    + * @param {number} z The translation along the z axis.
    + */
    +goog.vec.Matrix4.applyTranslate = function(mat, x, y, z) {
    +  goog.vec.Matrix4.setColumnValues(
    +      mat, 3,
    +      mat[0] * x + mat[4] * y + mat[8] * z + mat[12],
    +      mat[1] * x + mat[5] * y + mat[9] * z + mat[13],
    +      mat[2] * x + mat[6] * y + mat[10] * z + mat[14],
    +      mat[3] * x + mat[7] * y + mat[11] * z + mat[15]);
    +};
    +
    +
    +/**
    + * Applies an x,y,z scale to the given matrix.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix.
    + * @param {number} x The x scale factor.
    + * @param {number} y The y scale factor.
    + * @param {number} z The z scale factor.
    + */
    +goog.vec.Matrix4.applyScale = function(mat, x, y, z) {
    +  goog.vec.Matrix4.setFromValues(
    +      mat,
    +      mat[0] * x, mat[1] * x, mat[2] * x, mat[3] * x,
    +      mat[4] * y, mat[5] * y, mat[6] * y, mat[7] * y,
    +      mat[8] * z, mat[9] * z, mat[10] * z, mat[11] * z,
    +      mat[12], mat[13], mat[14], mat[15]);
    +};
    +
    +
    +/**
    + * Applies a rotation by angle about the x,y,z axis to the given matrix.
    + *
    + * @param {goog.vec.ArrayType} mat The matrix.
    + * @param {number} angle The angle in radians.
    + * @param {number} x The x component of the rotation axis.
    + * @param {number} y The y component of the rotation axis.
    + * @param {number} z The z component of the rotation axis.
    + */
    +goog.vec.Matrix4.applyRotate = function(mat, angle, x, y, z) {
    +  var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3];
    +  var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7];
    +  var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11];
    +  var m03 = mat[12], m13 = mat[13], m23 = mat[14], m33 = mat[15];
    +
    +  var cosAngle = Math.cos(angle);
    +  var sinAngle = Math.sin(angle);
    +  var diffCosAngle = 1 - cosAngle;
    +  var r00 = x * x * diffCosAngle + cosAngle;
    +  var r10 = x * y * diffCosAngle + z * sinAngle;
    +  var r20 = x * z * diffCosAngle - y * sinAngle;
    +
    +  var r01 = x * y * diffCosAngle - z * sinAngle;
    +  var r11 = y * y * diffCosAngle + cosAngle;
    +  var r21 = y * z * diffCosAngle + x * sinAngle;
    +
    +  var r02 = x * z * diffCosAngle + y * sinAngle;
    +  var r12 = y * z * diffCosAngle - x * sinAngle;
    +  var r22 = z * z * diffCosAngle + cosAngle;
    +
    +  goog.vec.Matrix4.setFromValues(
    +      mat,
    +      m00 * r00 + m01 * r10 + m02 * r20,
    +      m10 * r00 + m11 * r10 + m12 * r20,
    +      m20 * r00 + m21 * r10 + m22 * r20,
    +      m30 * r00 + m31 * r10 + m32 * r20,
    +
    +      m00 * r01 + m01 * r11 + m02 * r21,
    +      m10 * r01 + m11 * r11 + m12 * r21,
    +      m20 * r01 + m21 * r11 + m22 * r21,
    +      m30 * r01 + m31 * r11 + m32 * r21,
    +
    +      m00 * r02 + m01 * r12 + m02 * r22,
    +      m10 * r02 + m11 * r12 + m12 * r22,
    +      m20 * r02 + m21 * r12 + m22 * r22,
    +      m30 * r02 + m31 * r12 + m32 * r22,
    +
    +      m03, m13, m23, m33);
    +};
    +
    +
    +/**
    + * @type {Array.}
    + * @private
    + */
    +goog.vec.Matrix4.tmpVec3_ = [
    +  goog.vec.Vec3.create(),
    +  goog.vec.Vec3.create()
    +];
    +
    +
    +/**
    + * @type {Array.}
    + * @private
    + */
    +goog.vec.Matrix4.tmpVec4_ = [
    +  goog.vec.Vec4.create(),
    +  goog.vec.Vec4.create(),
    +  goog.vec.Vec4.create()
    +];
    +
    +
    +/**
    + * @type {Array.}
    + * @private
    + */
    +goog.vec.Matrix4.tmpMatrix4_ = [
    +  goog.vec.Matrix4.create()
    +];
    diff --git a/contrib/closure-library/goog/vec/matrix4_test.html b/contrib/closure-library/goog/vec/matrix4_test.html
    new file mode 100644
    index 0000000..9317509
    --- /dev/null
    +++ b/contrib/closure-library/goog/vec/matrix4_test.html
    @@ -0,0 +1,618 @@
    +
    +
    +
    +
    +
    +Closure Unit Tests - goog.vec.Matrix4
    +
    +
    +
    +
    +
    +
    diff --git a/contrib/closure-library/goog/vec/quaternion.js b/contrib/closure-library/goog/vec/quaternion.js
    new file mode 100644
    index 0000000..0db41e4
    --- /dev/null
    +++ b/contrib/closure-library/goog/vec/quaternion.js
    @@ -0,0 +1,330 @@
    +// Copyright 2011 The Closure Library Authors. All Rights Reserved.
    +//
    +// Licensed under the Apache License, Version 2.0 (the "License");
    +// you may not use this file except in compliance with the License.
    +// You may obtain a copy of the License at
    +//
    +//      http://www.apache.org/licenses/LICENSE-2.0
    +//
    +// Unless required by applicable law or agreed to in writing, software
    +// distributed under the License is distributed on an "AS-IS" BASIS,
    +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +// See the License for the specific language governing permissions and
    +// limitations under the License.
    +
    +
    +/**
    + * @fileoverview Implements quaternions and their conversion functions. In this
    + * implementation, quaternions are represented as 4 element vectors with the
    + * first 3 elements holding the imaginary components and the 4th element holding
    + * the real component.
    + *
    + */
    +goog.provide('goog.vec.Quaternion');
    +
    +goog.require('goog.vec');
    +goog.require('goog.vec.Vec4');
    +
    +
    +
    +/**
    + * @typedef {goog.vec.Vec4.Type}
    + */
    +goog.vec.Quaternion.Type;
    +
    +
    +/**
    + * Creates a quaternion (4 element vector), initialized to zero.
    + *
    + * @return {goog.vec.Quaternion.Type} The new quaternion.
    + */
    +goog.vec.Quaternion.create = goog.vec.Vec4.create;
    +
    +
    +/**
    + * Creates a new quaternion initialized with the values from the supplied
    + * array.
    + *
    + * @param {goog.vec.ArrayType} vec The source 4 element array.
    + * @return {goog.vec.Quaternion.Type} The new quaternion.
    + */
    +goog.vec.Quaternion.createFromArray =
    +    goog.vec.Vec4.createFromArray;
    +
    +
    +/**
    + * Creates a new quaternion initialized with the supplied values.
    + *
    + * @param {number} v0 The value for element at index 0.
    + * @param {number} v1 The value for element at index 1.
    + * @param {number} v2 The value for element at index 2.
    + * @param {number} v3 The value for element at index 3.
    + * @return {goog.vec.Quaternion.Type} The new quaternion.
    + */
    +goog.vec.Quaternion.createFromValues =
    +    goog.vec.Vec4.createFromValues;
    +
    +
    +/**
    + * Creates a clone of the given quaternion.
    + *
    + * @param {goog.vec.Quaternion.Type} q The source quaternion.
    + * @return {goog.vec.Quaternion.Type} The new quaternion.
    + */
    +goog.vec.Quaternion.clone =
    +    goog.vec.Vec4.clone;
    +
    +
    +/**
    + * Initializes the quaternion with the given values.
    + *
    + * @param {goog.vec.ArrayType} q The quaternion to receive
    + *     the values.
    + * @param {number} v0 The value for element at index 0.
    + * @param {number} v1 The value for element at index 1.
    + * @param {number} v2 The value for element at index 2.
    + * @param {number} v3 The value for element at index 2.
    + */
    +goog.vec.Quaternion.setFromValues =
    +    goog.vec.Vec4.setFromValues;
    +
    +
    +/**
    + * Initializes the quaternion with the given array of values.
    + *
    + * @param {goog.vec.ArrayType} q The quaternion to receive
    + *     the values.
    + * @param {goog.vec.ArrayType} values The array of values.
    + */
    +goog.vec.Quaternion.setFromArray =
    +    goog.vec.Vec4.setFromArray;
    +
    +
    +/**
    + * Adds the two quaternions.
    + *
    + * @param {goog.vec.ArrayType} quat0 The first addend.
    + * @param {goog.vec.ArrayType} quat1 The second addend.
    + * @param {goog.vec.ArrayType} resultQuat The quaternion to
    + *     receive the result. May be quat0 or quat1.
    + */
    +goog.vec.Quaternion.add = goog.vec.Vec4.add;
    +
    +
    +/**
    + * Negates a quaternion, storing the result into resultQuat.
    + *
    + * @param {goog.vec.ArrayType} quat0 The quaternion to negate.
    + * @param {goog.vec.ArrayType} resultQuat The quaternion to
    + *     receive the result. May be quat0.
    + */
    +goog.vec.Quaternion.negate = goog.vec.Vec4.negate;
    +
    +
    +/**
    + * Multiplies each component of quat0 with scalar storing the product into
    + * resultVec.
    + *
    + * @param {goog.vec.ArrayType} quat0 The source quaternion.
    + * @param {number} scalar The value to multiply with each component of quat0.
    + * @param {goog.vec.ArrayType} resultQuat The quaternion to
    + *     receive the result. May be quat0.
    + */
    +goog.vec.Quaternion.scale = goog.vec.Vec4.scale;
    +
    +
    +/**
    + * Returns the square magnitude of the given quaternion.
    + *
    + * @param {goog.vec.ArrayType} quat0 The quaternion.
    + * @return {number} The magnitude of the quaternion.
    + */
    +goog.vec.Quaternion.magnitudeSquared =
    +    goog.vec.Vec4.magnitudeSquared;
    +
    +
    +/**
    + * Returns the magnitude of the given quaternion.
    + *
    + * @param {goog.vec.ArrayType} quat0 The quaternion.
    + * @return {number} The magnitude of the quaternion.
    + */
    +goog.vec.Quaternion.magnitude =
    +    goog.vec.Vec4.magnitude;
    +
    +
    +/**
    + * Normalizes the given quaternion storing the result into resultVec.
    + *
    + * @param {goog.vec.ArrayType} quat0 The quaternion to normalize.
    + * @param {goog.vec.ArrayType} resultQuat The quaternion to
    + *     receive the result. May be quat0.
    + */
    +goog.vec.Quaternion.normalize = goog.vec.Vec4.normalize;
    +
    +
    +/**
    + * Computes the dot (scalar) product of two quaternions.
    + *
    + * @param {goog.vec.ArrayType} q0 The first quaternion.
    + * @param {goog.vec.ArrayType} q1 The second quaternion.
    + * @return {number} The scalar product.
    + */
    +goog.vec.Quaternion.dot = goog.vec.Vec4.dot;
    +
    +
    +/**
    + * Computes the conjugate of the quaternion in quat storing the result into
    + * resultQuat.
    + *
    + * @param {goog.vec.ArrayType} quat The source quaternion.
    + * @param {goog.vec.ArrayType} resultQuat The quaternion to
    + *     receive the result.
    + */
    +goog.vec.Quaternion.conjugate = function(quat, resultQuat) {
    +  resultQuat[0] = -quat[0];
    +  resultQuat[1] = -quat[1];
    +  resultQuat[2] = -quat[2];
    +  resultQuat[3] = quat[3];
    +};
    +
    +
    +/**
    + * Concatenates the two quaternions storing the result into resultQuat.
    + *
    + * @param {goog.vec.ArrayType} quat0 The first quaternion.
    + * @param {goog.vec.ArrayType} quat1 The second quaternion.
    + * @param {goog.vec.ArrayType} resultQuat The quaternion to
    + *     receive the result.
    + */
    +goog.vec.Quaternion.concat = function(quat0, quat1, resultQuat) {
    +  var x0 = quat0[0], y0 = quat0[1], z0 = quat0[2], w0 = quat0[3];
    +  var x1 = quat1[0], y1 = quat1[1], z1 = quat1[2], w1 = quat1[3];
    +  resultQuat[0] = w0 * x1 + x0 * w1 + y0 * z1 - z0 * y1;
    +  resultQuat[1] = w0 * y1 - x0 * z1 + y0 * w1 + z0 * x1;
    +  resultQuat[2] = w0 * z1 + x0 * y1 - y0 * x1 + z0 * w1;
    +  resultQuat[3] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;
    +};
    +
    +
    +/**
    + * Generates the quaternion from the given rotation matrix.
    + *
    + * @param {goog.vec.ArrayType} matrix The source matrix.
    + * @param {goog.vec.ArrayType} quat The resulting quaternion.
    + */
    +goog.vec.Quaternion.fromRotationMatrix4 = function(matrix, quat) {
    +  var sx = matrix[0], sy = matrix[5], sz = matrix[10];
    +  quat[3] = Math.sqrt(Math.max(0, 1 + sx + sy + sz)) / 2;
    +  quat[0] = Math.sqrt(Math.max(0, 1 + sx - sy - sz)) / 2;
    +  quat[1] = Math.sqrt(Math.max(0, 1 - sx + sy - sz)) / 2;
    +  quat[2] = Math.sqrt(Math.max(0, 1 - sx - sy + sz)) / 2;
    +
    +  quat[0] = (matrix[6] - matrix[9] < 0) != (quat[0] < 0) ? -quat[0] : quat[0];
    +  quat[1] = (matrix[8] - matrix[2] < 0) != (quat[1] < 0) ? -quat[1] : quat[1];
    +  quat[2] = (matrix[1] - matrix[4] < 0) != (quat[2] < 0) ? -quat[2] : quat[2];
    +};
    +
    +
    +/**
    + * Generates the rotation matrix from the given quaternion.
    + *
    + * @param {goog.vec.ArrayType} quat The source quaternion.
    + * @param {goog.vec.ArrayType} matrix The resulting matrix.
    + */
    +goog.vec.Quaternion.toRotationMatrix4 = function(quat, matrix) {
    +  var x = quat[0], y = quat[1], z = quat[2], w = quat[3];
    +  var x2 = 2 * x, y2 = 2 * y, z2 = 2 * z;
    +  var wx = x2 * w;
    +  var wy = y2 * w;
    +  var wz = z2 * w;
    +  var xx = x2 * x;
    +  var xy = y2 * x;
    +  var xz = z2 * x;
    +  var yy = y2 * y;
    +  var yz = z2 * y;
    +  var zz = z2 * z;
    +
    +  matrix[0] = 1 - (yy + zz);
    +  matrix[1] = xy + wz;
    +  matrix[2] = xz - wy;
    +  matrix[3] = 0;
    +  matrix[4] = xy - wz;
    +  matrix[5] = 1 - (xx + zz);
    +  matrix[6] = yz + wx;
    +  matrix[7] = 0;
    +  matrix[8] = xz + wy;
    +  matrix[9] = yz - wx;
    +  matrix[10] = 1 - (xx + yy);
    +  matrix[11] = 0;
    +  matrix[12] = 0;
    +  matrix[13] = 0;
    +  matrix[14] = 0;
    +  matrix[15] = 1;
    +};
    +
    +
    +/**
    + * Computes the spherical linear interpolated value from the given quaternions
    + * q0 and q1 according to the coefficient t. The resulting quaternion is stored
    + * in resultQuat.
    + *
    + * @param {goog.vec.ArrayType} q0 The first quaternion.
    + * @param {goog.vec.ArrayType} q1 The second quaternion.
    + * @param {number} t The interpolating coefficient.
    + * @param {goog.vec.ArrayType} resultQuat The quaternion to
    + *     receive the result.
    + */
    +goog.vec.Quaternion.slerp = function(q0, q1, t, resultQuat) {
    +  // Compute the dot product between q0 and q1 (cos of the angle between q0 and
    +  // q1). If it's outside the interval [-1,1], then the arccos is not defined.
    +  // The usual reason for this is that q0 and q1 are colinear. In this case
    +  // the angle between the two is zero, so just return q1.
    +  var cosVal = goog.vec.Quaternion.dot(q0, q1);
    +  if (cosVal > 1 || cosVal < -1) {
    +    goog.vec.Quaternion.setFromArray(resultQuat, q1);
    +    return;
    +  }
    +
    +  // Quaternions are a double cover on the space of rotations. That is, q and -q
    +  // represent the same rotation. Thus we have two possibilities when
    +  // interpolating between q0 and q1: going the short way or the long way. We
    +  // prefer the short way since that is the likely expectation from users.
    +  var factor = 1;
    +  if (cosVal < 0) {
    +    factor = -1;
    +    cosVal = -cosVal;
    +  }
    +
    +  // Compute the angle between q0 and q1. If it's very small, then just return
    +  // q1 to avoid a very large denominator below.
    +  var angle = Math.acos(cosVal);
    +  if (angle <= goog.vec.EPSILON) {
    +    goog.vec.Quaternion.setFromArray(resultQuat, q1);
    +    return;
    +  }
    +
    +  // Compute the coefficients and interpolate.
    +  var invSinVal = 1 / Math.sin(angle);
    +  var c0 = Math.sin((1 - t) * angle) * invSinVal;
    +  var c1 = factor * Math.sin(t * angle) * invSinVal;
    +
    +  resultQuat[0] = q0[0] * c0 + q1[0] * c1;
    +  resultQuat[1] = q0[1] * c0 + q1[1] * c1;
    +  resultQuat[2] = q0[2] * c0 + q1[2] * c1;
    +  resultQuat[3] = q0[3] * c0 + q1[3] * c1;
    +};
    +
    +
    +/**
    + * Compute the simple linear interpolation of the two quaternions q0 and q1
    + * according to the coefficient t. The resulting quaternion is stored in
    + * resultVec.
    + *
    + * @param {goog.vec.ArrayType} q0 The first quaternion.
    + * @param {goog.vec.ArrayType} q1 The second quaternion.
    + * @param {number} t The interpolation factor.
    + * @param {goog.vec.ArrayType} resultQuat The quaternion to
    + *     receive the results (may be q0 or q1).
    + */
    +goog.vec.Quaternion.nlerp = goog.vec.Vec4.lerp;
    diff --git a/contrib/closure-library/goog/vec/quaternion_test.html b/contrib/closure-library/goog/vec/quaternion_test.html
    new file mode 100644
    index 0000000..f02d2f2
    --- /dev/null
    +++ b/contrib/closure-library/goog/vec/quaternion_test.html
    @@ -0,0 +1,115 @@
    +
    +
    +
    +
    +
    +Closure Unit Tests - goog.vec.Quaternion
    +
    +
    +
    +
    +
    +
    diff --git a/contrib/closure-library/goog/vec/ray.js b/contrib/closure-library/goog/vec/ray.js
    new file mode 100644
    index 0000000..cd8de23
    --- /dev/null
    +++ b/contrib/closure-library/goog/vec/ray.js
    @@ -0,0 +1,90 @@
    +// Copyright 2011 The Closure Library Authors. All Rights Reserved.
    +//
    +// Licensed under the Apache License, Version 2.0 (the "License");
    +// you may not use this file except in compliance with the License.
    +// You may obtain a copy of the License at
    +//
    +//      http://www.apache.org/licenses/LICENSE-2.0
    +//
    +// Unless required by applicable law or agreed to in writing, software
    +// distributed under the License is distributed on an "AS-IS" BASIS,
    +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +// See the License for the specific language governing permissions and
    +// limitations under the License.
    +
    +/**
    + * @fileoverview Implements a 3D ray that are compatible with WebGL.
    + * Each element is a float32 since that is typically the desired size of a
    + * 3-vector in the GPU.  The API is structured to avoid unnecessary memory
    + * allocations.  The last parameter will typically be the output vector and
    + * an object can be both an input and output parameter to all methods except
    + * where noted.
    + *
    + */
    +goog.provide('goog.vec.Ray');
    +
    +goog.require('goog.vec.Vec3');
    +
    +
    +
    +/**
    + * Constructs a new ray with an optional origin and direction. If not specified,
    + * the default is [0, 0, 0].
    + * @param {goog.vec.ArrayType=} opt_origin The optional origin.
    + * @param {goog.vec.ArrayType=} opt_dir The optional direction.
    + * @constructor
    + */
    +goog.vec.Ray = function(opt_origin, opt_dir) {
    +  /**
    +   * @type {goog.vec.Vec3.Type}
    +   */
    +  this.origin = goog.vec.Vec3.createFromArray(
    +      opt_origin || [0, 0, 0]);
    +
    +  /**
    +   * @type {goog.vec.Vec3.Type}
    +   */
    +  this.dir = goog.vec.Vec3.createFromArray(
    +      opt_dir || [0, 0, 0]);
    +};
    +
    +
    +/**
    + * Sets the origin and direction of the ray.
    + * @param {goog.vec.ArrayType} origin The new origin.
    + * @param {goog.vec.ArrayType} dir The new direction.
    + */
    +goog.vec.Ray.prototype.set = function(origin, dir) {
    +  goog.vec.Vec3.setFromArray(this.origin, origin);
    +  goog.vec.Vec3.setFromArray(this.dir, dir);
    +};
    +
    +
    +/**
    + * Sets the origin of the ray.
    + * @param {goog.vec.ArrayType} origin the new origin.
    + */
    +goog.vec.Ray.prototype.setOrigin = function(origin) {
    +  goog.vec.Vec3.setFromArray(this.origin, origin);
    +};
    +
    +
    +/**
    + * Sets the direction of the ray.
    + * @param {goog.vec.ArrayType} dir The new direction.
    + */
    +goog.vec.Ray.prototype.setDir = function(dir) {
    +  goog.vec.Vec3.setFromArray(this.dir, dir);
    +};
    +
    +
    +/**
    + * Returns true if this ray is equal to the other ray.
    + * @param {goog.vec.Ray} other The other ray.
    + * @return {boolean} True if this ray is equal to the other ray.
    + */
    +goog.vec.Ray.prototype.equals = function(other) {
    +  return other != null &&
    +      goog.vec.Vec3.equals(this.origin, other.origin) &&
    +      goog.vec.Vec3.equals(this.dir, other.dir);
    +};
    diff --git a/contrib/closure-library/goog/vec/ray_test.html b/contrib/closure-library/goog/vec/ray_test.html
    new file mode 100644
    index 0000000..9fce927
    --- /dev/null
    +++ b/contrib/closure-library/goog/vec/ray_test.html
    @@ -0,0 +1,66 @@
    +
    +
    +
    +
    +
    +Closure Unit Tests - goog.vec.Vec3
    +
    +
    +
    +
    +
    +
    diff --git a/contrib/closure-library/goog/vec/vec.js b/contrib/closure-library/goog/vec/vec.js
    new file mode 100644
    index 0000000..3b6c79c
    --- /dev/null
    +++ b/contrib/closure-library/goog/vec/vec.js
    @@ -0,0 +1,45 @@
    +// Copyright 2011 The Closure Library Authors. All Rights Reserved.
    +//
    +// Licensed under the Apache License, Version 2.0 (the "License");
    +// you may not use this file except in compliance with the License.
    +// You may obtain a copy of the License at
    +//
    +//      http://www.apache.org/licenses/LICENSE-2.0
    +//
    +// Unless required by applicable law or agreed to in writing, software
    +// distributed under the License is distributed on an "AS-IS" BASIS,
    +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +// See the License for the specific language governing permissions and
    +// limitations under the License.
    +
    +
    +/**
    + * @fileoverview Supplies global data types and constants for the vector math
    + *     library.
    + */
    +goog.provide('goog.vec');
    +
    +/**
    + * On platforms that don't have native Float32Array support we use a javascript
    + * implementation so that this math library can be used on all platforms.
    + */
    +goog.require('goog.vec.Float32Array');
    +
    +
    +/**
    + * All vector and matrix operations are based upon arrays of numbers using
    + * either a standard Javascript Array or the Float32Array typed array.
    + *
    + * @typedef {Float32Array|Array.}
    + */
    +goog.vec.ArrayType;
    +
    +
    +/**
    + * For graphics work, 6 decimal places of accuracy are typically all that is
    + * required.
    + *
    + * @type {number}
    + * @const
    + */
    +goog.vec.EPSILON = 1e-6;
    diff --git a/contrib/closure-library/goog/vec/vec3.js b/contrib/closure-library/goog/vec/vec3.js
    new file mode 100644
    index 0000000..3e66a58
    --- /dev/null
    +++ b/contrib/closure-library/goog/vec/vec3.js
    @@ -0,0 +1,293 @@
    +// Copyright 2011 The Closure Library Authors. All Rights Reserved.
    +//
    +// Licensed under the Apache License, Version 2.0 (the "License");
    +// you may not use this file except in compliance with the License.
    +// You may obtain a copy of the License at
    +//
    +//      http://www.apache.org/licenses/LICENSE-2.0
    +//
    +// Unless required by applicable law or agreed to in writing, software
    +// distributed under the License is distributed on an "AS-IS" BASIS,
    +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +// See the License for the specific language governing permissions and
    +// limitations under the License.
    +
    +
    +/**
    + * @fileoverview Supplies 3 element vectors that are compatible with WebGL.
    + * Each element is a float32 since that is typically the desired size of a
    + * 3-vector in the GPU.  The API is structured to avoid unnecessary memory
    + * allocations.  The last parameter will typically be the output vector and
    + * an object can be both an input and output parameter to all methods except
    + * where noted.
    + *
    + */
    +goog.provide('goog.vec.Vec3');
    +
    +goog.require('goog.vec');
    +
    +
    +/**
    + * @typedef {goog.vec.ArrayType}
    + */
    +goog.vec.Vec3.Type;
    +
    +
    +/**
    + * Creates a 3 element vector of Float32Array. The array is initialized to zero.
    + *
    + * @return {goog.vec.Vec3.Type} The new 3 element array.
    + */
    +goog.vec.Vec3.create = function() {
    +  return new Float32Array(3);
    +};
    +
    +
    +/**
    + * Creates a new 3 element vector initialized with the value from the given
    + * array.
    + *
    + * @param {goog.vec.ArrayType} vec The source 3 element array.
    + * @return {goog.vec.Vec3.Type} The new 3 element array.
    + */
    +goog.vec.Vec3.createFromArray = function(vec) {
    +  var newVec = goog.vec.Vec3.create();
    +  goog.vec.Vec3.setFromArray(newVec, vec);
    +  return newVec;
    +};
    +
    +
    +/**
    + * Creates a new 3 element vector initialized with the supplied values.
    + *
    + * @param {number} v0 The value for element at index 0.
    + * @param {number} v1 The value for element at index 1.
    + * @param {number} v2 The value for element at index 2.
    + * @return {goog.vec.Vec3.Type} The new vector.
    + */
    +goog.vec.Vec3.createFromValues = function(v0, v1, v2) {
    +  var vec = goog.vec.Vec3.create();
    +  goog.vec.Vec3.setFromValues(vec, v0, v1, v2);
    +  return vec;
    +};
    +
    +
    +/**
    + * Creates a clone of the given 3 element vector.
    + *
    + * @param {goog.vec.Vec3.Type} vec The source 3 element vector.
    + * @return {goog.vec.Vec3.Type} The new cloned vector.
    + */
    +goog.vec.Vec3.clone = goog.vec.Vec3.createFromArray;
    +
    +
    +/**
    + * Initializes the vector with the given values.
    + *
    + * @param {goog.vec.ArrayType} vec The vector to receive the values.
    + * @param {number} v0 The value for element at index 0.
    + * @param {number} v1 The value for element at index 1.
    + * @param {number} v2 The value for element at index 2.
    + */
    +goog.vec.Vec3.setFromValues = function(vec, v0, v1, v2) {
    +  vec[0] = v0;
    +  vec[1] = v1;
    +  vec[2] = v2;
    +};
    +
    +
    +/**
    + * Initializes the vector with the given array of values.
    + *
    + * @param {goog.vec.ArrayType} vec The vector to receive the
    + *     values.
    + * @param {goog.vec.ArrayType} values The array of values.
    + */
    +goog.vec.Vec3.setFromArray = function(vec, values) {
    +  vec[0] = values[0];
    +  vec[1] = values[1];
    +  vec[2] = values[2];
    +};
    +
    +
    +/**
    + * Performs a component-wise addition of vec0 and vec1 together storing the
    + * result into resultVec.
    + *
    + * @param {goog.vec.ArrayType} vec0 The first addend.
    + * @param {goog.vec.ArrayType} vec1 The second addend.
    + * @param {goog.vec.ArrayType} resultVec The vector to
    + *     receive the result. May be vec0 or vec1.
    + * @return {goog.vec.ArrayType} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Vec3.add = function(vec0, vec1, resultVec) {
    +  resultVec[0] = vec0[0] + vec1[0];
    +  resultVec[1] = vec0[1] + vec1[1];
    +  resultVec[2] = vec0[2] + vec1[2];
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Performs a component-wise subtraction of vec1 from vec0 storing the
    + * result into resultVec.
    + *
    + * @param {goog.vec.ArrayType} vec0 The minuend.
    + * @param {goog.vec.ArrayType} vec1 The subtrahend.
    + * @param {goog.vec.ArrayType} resultVec The vector to
    + *     receive the result. May be vec0 or vec1.
    + * @return {goog.vec.ArrayType} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Vec3.subtract = function(vec0, vec1, resultVec) {
    +  resultVec[0] = vec0[0] - vec1[0];
    +  resultVec[1] = vec0[1] - vec1[1];
    +  resultVec[2] = vec0[2] - vec1[2];
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Negates vec0, storing the result into resultVec.
    + *
    + * @param {goog.vec.ArrayType} vec0 The vector to negate.
    + * @param {goog.vec.ArrayType} resultVec The vector to
    + *     receive the result. May be vec0.
    + * @return {goog.vec.ArrayType} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Vec3.negate = function(vec0, resultVec) {
    +  resultVec[0] = -vec0[0];
    +  resultVec[1] = -vec0[1];
    +  resultVec[2] = -vec0[2];
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Multiplies each component of vec0 with scalar storing the product into
    + * resultVec.
    + *
    + * @param {goog.vec.ArrayType} vec0 The source vector.
    + * @param {number} scalar The value to multiply with each component of vec0.
    + * @param {goog.vec.ArrayType} resultVec The vector to
    + *     receive the result. May be vec0.
    + * @return {goog.vec.ArrayType} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Vec3.scale = function(vec0, scalar, resultVec) {
    +  resultVec[0] = vec0[0] * scalar;
    +  resultVec[1] = vec0[1] * scalar;
    +  resultVec[2] = vec0[2] * scalar;
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Returns the magnitudeSquared of the given vector.
    + *
    + * @param {goog.vec.ArrayType} vec0 The vector.
    + * @return {number} The magnitude of the vector.
    + */
    +goog.vec.Vec3.magnitudeSquared = function(vec0) {
    +  var x = vec0[0], y = vec0[1], z = vec0[2];
    +  return x * x + y * y + z * z;
    +};
    +
    +
    +/**
    + * Returns the magnitude of the given vector.
    + *
    + * @param {goog.vec.ArrayType} vec0 The vector.
    + * @return {number} The magnitude of the vector.
    + */
    +goog.vec.Vec3.magnitude = function(vec0) {
    +  var x = vec0[0], y = vec0[1], z = vec0[2];
    +  return Math.sqrt(x * x + y * y + z * z);
    +};
    +
    +
    +/**
    + * Normalizes the given vector storing the result into resultVec.
    + *
    + * @param {goog.vec.ArrayType} vec0 The vector to normalize.
    + * @param {goog.vec.ArrayType} resultVec The vector to
    + *     receive the result. May be vec0.
    + * @return {goog.vec.ArrayType} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Vec3.normalize = function(vec0, resultVec) {
    +  var ilen = 1 / goog.vec.Vec3.magnitude(vec0);
    +  resultVec[0] = vec0[0] * ilen;
    +  resultVec[1] = vec0[1] * ilen;
    +  resultVec[2] = vec0[2] * ilen;
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Returns the scalar product of vectors v0 and v1.
    + *
    + * @param {goog.vec.ArrayType} v0 The first vector.
    + * @param {goog.vec.ArrayType} v1 The second vector.
    + * @return {number} The scalar product.
    + */
    +goog.vec.Vec3.dot = function(v0, v1) {
    +  return v0[0] * v1[0] + v0[1] * v1[1] + v0[2] * v1[2];
    +};
    +
    +
    +/**
    + * Computes the vector (cross) product of v0 and v1 storing the result into
    + * resultVec.
    + *
    + * @param {goog.vec.ArrayType} v0 The first vector.
    + * @param {goog.vec.ArrayType} v1 The second vector.
    + * @param {goog.vec.ArrayType} resultVec The vector to receive the
    + *     results. May be either v0 or v1.
    + * @return {goog.vec.ArrayType} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Vec3.cross = function(v0, v1, resultVec) {
    +  var x0 = v0[0], y0 = v0[1], z0 = v0[2];
    +  var x1 = v1[0], y1 = v1[1], z1 = v1[2];
    +  resultVec[0] = y0 * z1 - z0 * y1;
    +  resultVec[1] = z0 * x1 - x0 * z1;
    +  resultVec[2] = x0 * y1 - y0 * x1;
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Linearly interpolate from v0 to v1 according to f. The value of f should be
    + * in the range [0..1] otherwise the results are undefined.
    + *
    + * @param {goog.vec.ArrayType} v0 The first vector.
    + * @param {goog.vec.ArrayType} v1 The second vector.
    + * @param {number} f The interpolation factor.
    + * @param {goog.vec.ArrayType} resultVec The vector to receive the
    + *     results (may be v0 or v1).
    + * @return {goog.vec.ArrayType} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Vec3.lerp = function(v0, v1, f, resultVec) {
    +  var x = v0[0], y = v0[1], z = v0[2];
    +  resultVec[0] = (v1[0] - x) * f + x;
    +  resultVec[1] = (v1[1] - y) * f + y;
    +  resultVec[2] = (v1[2] - z) * f + z;
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Returns true if the components of v0 are equal to the components of v1.
    + *
    + * @param {goog.vec.ArrayType} v0 The first vector.
    + * @param {goog.vec.ArrayType} v1 The second vector.
    + * @return {boolean} True if the vectors are equal, false otherwise.
    + */
    +goog.vec.Vec3.equals = function(v0, v1) {
    +  return v0.length == v1.length &&
    +      v0[0] == v1[0] && v0[1] == v1[1] && v0[2] == v1[2];
    +};
    diff --git a/contrib/closure-library/goog/vec/vec3_test.html b/contrib/closure-library/goog/vec/vec3_test.html
    new file mode 100644
    index 0000000..820d9a1
    --- /dev/null
    +++ b/contrib/closure-library/goog/vec/vec3_test.html
    @@ -0,0 +1,192 @@
    +
    +
    +
    +
    +
    +Closure Unit Tests - goog.vec.Vec3
    +
    +
    +
    +
    +
    +
    diff --git a/contrib/closure-library/goog/vec/vec4.js b/contrib/closure-library/goog/vec/vec4.js
    new file mode 100644
    index 0000000..a61926b
    --- /dev/null
    +++ b/contrib/closure-library/goog/vec/vec4.js
    @@ -0,0 +1,282 @@
    +// Copyright 2011 The Closure Library Authors. All Rights Reserved.
    +//
    +// Licensed under the Apache License, Version 2.0 (the "License");
    +// you may not use this file except in compliance with the License.
    +// You may obtain a copy of the License at
    +//
    +//      http://www.apache.org/licenses/LICENSE-2.0
    +//
    +// Unless required by applicable law or agreed to in writing, software
    +// distributed under the License is distributed on an "AS-IS" BASIS,
    +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +// See the License for the specific language governing permissions and
    +// limitations under the License.
    +
    +
    +/**
    + * @fileoverview Supplies 4 element vectors that are compatible with WebGL.
    + * Each element is a float32 since that is typically the desired size of a
    + * 4-vector in the GPU.  The API is structured to avoid unnecessary memory
    + * allocations.  The last parameter will typically be the output vector and
    + * an object can be both an input and output parameter to all methods except
    + * where noted.
    + *
    + */
    +goog.provide('goog.vec.Vec4');
    +
    +goog.require('goog.vec');
    +
    +
    +/**
    + * @typedef {goog.vec.ArrayType}
    + */
    +goog.vec.Vec4.Type;
    +
    +
    +/**
    + * Creates a 4 element vector of Float32Array. The array is initialized to zero.
    + *
    + * @return {goog.vec.Vec4.Type} The new 4 element array.
    + */
    +goog.vec.Vec4.create = function() {
    +  return new Float32Array(4);
    +};
    +
    +
    +/**
    + * Creates a new 4 element vector initialized with the value from the given
    + * array.
    + *
    + * @param {goog.vec.ArrayType} vec The source 4 element array.
    + * @return {goog.vec.Vec4.Type} The new 4 element array.
    + */
    +goog.vec.Vec4.createFromArray = function(vec) {
    +  var newVec = goog.vec.Vec4.create();
    +  goog.vec.Vec4.setFromArray(newVec, vec);
    +  return newVec;
    +};
    +
    +
    +/**
    + * Creates a new 4 element vector initialized with the supplied values.
    + *
    + * @param {number} v0 The value for element at index 0.
    + * @param {number} v1 The value for element at index 1.
    + * @param {number} v2 The value for element at index 2.
    + * @param {number} v3 The value for element at index 2.
    + * @return {goog.vec.Vec4.Type} The new vector.
    + */
    +goog.vec.Vec4.createFromValues = function(v0, v1, v2, v3) {
    +  var vec = goog.vec.Vec4.create();
    +  goog.vec.Vec4.setFromValues(vec, v0, v1, v2, v3);
    +  return vec;
    +};
    +
    +
    +/**
    + * Creates a clone of the given 4 element vector.
    + *
    + * @param {goog.vec.Vec4.Type} vec The source 4 element vector.
    + * @return {goog.vec.Vec4.Type} The new cloned vector.
    + */
    +goog.vec.Vec4.clone = goog.vec.Vec4.createFromArray;
    +
    +
    +/**
    + * Initializes the vector with the given values.
    + *
    + * @param {goog.vec.ArrayType} vec The vector to receive the values.
    + * @param {number} v0 The value for element at index 0.
    + * @param {number} v1 The value for element at index 1.
    + * @param {number} v2 The value for element at index 2.
    + * @param {number} v3 The value for element at index 3.
    + */
    +goog.vec.Vec4.setFromValues = function(vec, v0, v1, v2, v3) {
    +  vec[0] = v0;
    +  vec[1] = v1;
    +  vec[2] = v2;
    +  vec[3] = v3;
    +};
    +
    +
    +/**
    + * Initializes the vector with the given array of values.
    + *
    + * @param {goog.vec.ArrayType} vec The vector to receive the
    + *     values.
    + * @param {goog.vec.ArrayType} values The array of values.
    + */
    +goog.vec.Vec4.setFromArray = function(vec, values) {
    +  vec[0] = values[0];
    +  vec[1] = values[1];
    +  vec[2] = values[2];
    +  vec[3] = values[3];
    +};
    +
    +
    +/**
    + * Performs a component-wise addition of vec0 and vec1 together storing the
    + * result into resultVec.
    + *
    + * @param {goog.vec.ArrayType} vec0 The first addend.
    + * @param {goog.vec.ArrayType} vec1 The second addend.
    + * @param {goog.vec.ArrayType} resultVec The vector to
    + *     receive the result. May be vec0 or vec1.
    + * @return {goog.vec.ArrayType} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Vec4.add = function(vec0, vec1, resultVec) {
    +  resultVec[0] = vec0[0] + vec1[0];
    +  resultVec[1] = vec0[1] + vec1[1];
    +  resultVec[2] = vec0[2] + vec1[2];
    +  resultVec[3] = vec0[3] + vec1[3];
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Performs a component-wise subtraction of vec1 from vec0 storing the
    + * result into resultVec.
    + *
    + * @param {goog.vec.ArrayType} vec0 The minuend.
    + * @param {goog.vec.ArrayType} vec1 The subtrahend.
    + * @param {goog.vec.ArrayType} resultVec The vector to
    + *     receive the result. May be vec0 or vec1.
    + * @return {goog.vec.ArrayType} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Vec4.subtract = function(vec0, vec1, resultVec) {
    +  resultVec[0] = vec0[0] - vec1[0];
    +  resultVec[1] = vec0[1] - vec1[1];
    +  resultVec[2] = vec0[2] - vec1[2];
    +  resultVec[3] = vec0[3] - vec1[3];
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Negates vec0, storing the result into resultVec.
    + *
    + * @param {goog.vec.ArrayType} vec0 The vector to negate.
    + * @param {goog.vec.ArrayType} resultVec The vector to
    + *     receive the result. May be vec0.
    + * @return {goog.vec.ArrayType} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Vec4.negate = function(vec0, resultVec) {
    +  resultVec[0] = -vec0[0];
    +  resultVec[1] = -vec0[1];
    +  resultVec[2] = -vec0[2];
    +  resultVec[3] = -vec0[3];
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Multiplies each component of vec0 with scalar storing the product into
    + * resultVec.
    + *
    + * @param {goog.vec.ArrayType} vec0 The source vector.
    + * @param {number} scalar The value to multiply with each component of vec0.
    + * @param {goog.vec.ArrayType} resultVec The vector to
    + *     receive the result. May be vec0.
    + * @return {goog.vec.ArrayType} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Vec4.scale = function(vec0, scalar, resultVec) {
    +  resultVec[0] = vec0[0] * scalar;
    +  resultVec[1] = vec0[1] * scalar;
    +  resultVec[2] = vec0[2] * scalar;
    +  resultVec[3] = vec0[3] * scalar;
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Returns the magnitudeSquared of the given vector.
    + *
    + * @param {goog.vec.ArrayType} vec0 The vector.
    + * @return {number} The magnitude of the vector.
    + */
    +goog.vec.Vec4.magnitudeSquared = function(vec0) {
    +  var x = vec0[0], y = vec0[1], z = vec0[2], w = vec0[3];
    +  return x * x + y * y + z * z + w * w;
    +};
    +
    +
    +/**
    + * Returns the magnitude of the given vector.
    + *
    + * @param {goog.vec.ArrayType} vec0 The vector.
    + * @return {number} The magnitude of the vector.
    + */
    +goog.vec.Vec4.magnitude = function(vec0) {
    +  var x = vec0[0], y = vec0[1], z = vec0[2], w = vec0[3];
    +  return Math.sqrt(x * x + y * y + z * z + w * w);
    +};
    +
    +
    +/**
    + * Normalizes the given vector storing the result into resultVec.
    + *
    + * @param {goog.vec.ArrayType} vec0 The vector to normalize.
    + * @param {goog.vec.ArrayType} resultVec The vector to
    + *     receive the result. May be vec0.
    + * @return {goog.vec.ArrayType} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Vec4.normalize = function(vec0, resultVec) {
    +  var ilen = 1 / goog.vec.Vec4.magnitude(vec0);
    +  resultVec[0] = vec0[0] * ilen;
    +  resultVec[1] = vec0[1] * ilen;
    +  resultVec[2] = vec0[2] * ilen;
    +  resultVec[3] = vec0[3] * ilen;
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Returns the scalar product of vectors v0 and v1.
    + *
    + * @param {goog.vec.ArrayType} v0 The first vector.
    + * @param {goog.vec.ArrayType} v1 The second vector.
    + * @return {number} The scalar product.
    + */
    +goog.vec.Vec4.dot = function(v0, v1) {
    +  return v0[0] * v1[0] + v0[1] * v1[1] + v0[2] * v1[2] + v0[3] * v1[3];
    +};
    +
    +
    +/**
    + * Linearly interpolate from v0 to v1 according to f. The value of f should be
    + * in the range [0..1] otherwise the results are undefined.
    + *
    + * @param {goog.vec.ArrayType} v0 The first vector.
    + * @param {goog.vec.ArrayType} v1 The second vector.
    + * @param {number} f The interpolation factor.
    + * @param {goog.vec.ArrayType} resultVec The vector to receive the
    + *     results (may be v0 or v1).
    + * @return {goog.vec.ArrayType} return resultVec so that operations can be
    + *     chained together.
    + */
    +goog.vec.Vec4.lerp = function(v0, v1, f, resultVec) {
    +  var x = v0[0], y = v0[1], z = v0[2], w = v0[3];
    +  resultVec[0] = (v1[0] - x) * f + x;
    +  resultVec[1] = (v1[1] - y) * f + y;
    +  resultVec[2] = (v1[2] - z) * f + z;
    +  resultVec[3] = (v1[3] - w) * f + w;
    +  return resultVec;
    +};
    +
    +
    +/**
    + * Returns true if the components of v0 are equal to the components of v1.
    + *
    + * @param {goog.vec.ArrayType} v0 The first vector.
    + * @param {goog.vec.ArrayType} v1 The second vector.
    + * @return {boolean} True if the vectors are equal, false otherwise.
    + */
    +goog.vec.Vec4.equals = function(v0, v1) {
    +  return v0.length == v1.length &&
    +      v0[0] == v1[0] && v0[1] == v1[1] && v0[2] == v1[2] && v0[3] == v1[3];
    +};
    diff --git a/contrib/closure-library/goog/vec/vec4_test.html b/contrib/closure-library/goog/vec/vec4_test.html
    new file mode 100644
    index 0000000..38927d7
    --- /dev/null
    +++ b/contrib/closure-library/goog/vec/vec4_test.html
    @@ -0,0 +1,169 @@
    +
    +
    +
    +
    +
    +Closure Unit Tests - goog.vec.Vec4
    +
    +
    +
    +
    +
    +
    diff --git a/contrib/closure-library/goog/vec/vec_perf.html b/contrib/closure-library/goog/vec/vec_perf.html
    new file mode 100644
    index 0000000..1aacb5f
    --- /dev/null
    +++ b/contrib/closure-library/goog/vec/vec_perf.html
    @@ -0,0 +1,101 @@
    +
    +
    +
    +
    +
    +  Closure Performance Tests - Vector math
    +  
    +  
    +  
    +
    +
    +  

    Closure Performance Tests - Vector Math

    +

    + User-agent: + +

    +
    +
    + + + + diff --git a/contrib/closure-library/goog/window/window.js b/contrib/closure-library/goog/window/window.js index c4c11d6..a4c42ef 100644 --- a/contrib/closure-library/goog/window/window.js +++ b/contrib/closure-library/goog/window/window.js @@ -20,6 +20,7 @@ goog.provide('goog.window'); goog.require('goog.string'); +goog.require('goog.userAgent'); /** @@ -112,8 +113,28 @@ goog.window.open = function(linkRef, opt_options, opt_parentWin) { // request headers. newWin = parentWin.open('', target, optionString); if (newWin) { + if (goog.userAgent.IE) { + // IE has problems parsing the content attribute if the url contains + // a semicolon. We can fix this by adding quotes around the url, but + // then we can't parse quotes in the URL correctly. We take a + // best-effort approach. + // + // If the URL has semicolons, wrap it in single quotes to protect + // the semicolons. + // If the URL has semicolons and single quotes, url-encode the single + // quotes as well. + // + // This is imperfect. Notice that both ' and ; are reserved characters + // in URIs, so this could do the wrong thing, but at least it will + // do the wrong thing in only rare cases. + // ugh. + if (href.indexOf(';') != -1) { + href = "'" + href.replace(/'/g, '%27') + "'"; + } + } + href = goog.string.htmlEscape(href); newWin.document.write(''); + href + '">'); newWin.document.close(); } } else { diff --git a/contrib/closure-library/goog/window/window_test.html b/contrib/closure-library/goog/window/window_test.html new file mode 100644 index 0000000..ac0e40b --- /dev/null +++ b/contrib/closure-library/goog/window/window_test.html @@ -0,0 +1,239 @@ + + + + + + +Closure Unit Tests - goog.window + + + + + + +

    Some links for testing referrer stripping manually.

    + + + + + + + + + + + diff --git a/externs/TypedArray.js b/externs/TypedArray.js deleted file mode 100644 index a3e83de..0000000 --- a/externs/TypedArray.js +++ /dev/null @@ -1,437 +0,0 @@ -/*jslint white: false, onevar: false, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, sub: true, nomen: false */ - -/** - * Lanyard is Copyright 2010 Jonathan Bringhurst. - * - * This file is part of Lanyard. - * - * Lanyard is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Lanyard is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Lanyard. If not, see . - * - * Portions of Lanyard which do not constitute a "Larger Work" may be licensed - * under the NASA OPEN SOURCE AGREEMENT VERSION 1.3. - * - * See http://worldwind.arc.nasa.gov/ for further information about NASA World Wind. - */ - -/** - * @fileoverview Externs for typed arrays. - * @externs - */ - -/** - * @constructor - * @param {number} length - */ -function ArrayBuffer(length) {} - -/** - * @constructor - * @param {*} args - */ -function ArrayBufferView(args) {} - -/** - * @return {ArrayBuffer} - */ -ArrayBufferView.prototype.buffer = function() {}; - -/** - * @return {number} - */ -ArrayBufferView.prototype.byteOffset = function() {}; - -/** - * @return {number} - */ -ArrayBufferView.prototype.byteLength = function() {}; - -/** - * @constructor - * @extends {ArrayBufferView} - * @param {*} args - */ -function Int8Array(args) {} - -/** - * @const - * @type {number} - */ -Int8Array.prototype.BYTES_PER_ELEMENT; - -/** - * @type {number} - */ -Int8Array.prototype.length; - -/** - * @param {number} index - * @return {number} - */ -Int8Array.prototype.get = function(index) {}; - -/** - * @param {number|Array.<*>} x - * @param {number} value - * @return {undefined} - */ -Int8Array.prototype.set = function(x, value) {}; - -/** - * @param {number} start - * @param {number} end - * @return {Array.<*>} - */ -Int8Array.prototype.slice = function(start, end) {}; - -/** - * @constructor - * @extends {ArrayBufferView} - * @param {*} args - */ -function Int16Array(args) {} - -/** - * @const - * @type {number} - */ -Int16Array.prototype.BYTES_PER_ELEMENT; - -/** - * @type {number} - */ -Int16Array.prototype.length; - -/** - * @param {number} index - * @return {number} - */ -Int16Array.prototype.get = function(index) {}; - -/** - * @param {number|Array.<*>} x - * @param {number} value - * @return {undefined} - */ -Int16Array.prototype.set = function(x, value) {}; - -/** - * @param {number} start - * @param {number} end - */ -Int16Array.prototype.slice = function(start, end) {}; - -/** - * @constructor - * @extends {ArrayBufferView} - * @param {*} args - */ -function Uint16Array(args) {} - -/** - * @const - * @type {number} - */ -Uint16Array.prototype.BYTES_PER_ELEMENT; - -/** - * @type {number} - */ -Uint16Array.prototype.length; - -/** - * @param {number} index - */ -Uint16Array.prototype.get = function(index) {}; - -/** - * @param {number|Array.<*>} x - * @param {number} value - * @return {undefined} - */ -Uint16Array.prototype.set = function(x, value) {}; - -/** - * @param {number} start - * @param {number} end - * @return {Array.<*>} - */ -Uint16Array.prototype.slice = function(start, end) {}; - -/** - * @constructor - * @extends {ArrayBufferView} - * @param {*} args - */ -function Int32Array(args) {} - -/** - * @const - * @type {number} - */ -Int32Array.prototype.BYTES_PER_ELEMENT; - -/** - * @type {number} - */ -Int32Array.prototype.length; - -/** - * @param {number} index - * @return {number} - */ -Int32Array.prototype.get = function(index) {}; - -/** - * @param {number|Array.<*>} x - * @param {number} value - * @return {undefined} - */ -Int32Array.prototype.set = function(x, value) {}; - -/** - * @param {number} start - * @param {number} end - * @return {Array.<*>} - */ -Int32Array.prototype.slice = function(start, end) {}; - -/** - * @constructor - * @extends {ArrayBufferView} - * @param {*} args - */ -function Uint32Array(args) {} - -/** - * @const - * @type {number} - */ -Uint32Array.prototype.BYTES_PER_ELEMENT; - -/** - * @type {number} - */ -Uint32Array.prototype.length; - -/** - * @param {number} index - * @return {number} - */ -Uint32Array.prototype.get = function(index) {}; - -/** - * @param {number|Array.<*>} x - * @param {number} value - * @return {undefined} - */ -Uint32Array.prototype.set = function(x, value) {}; - -/** - * @param {number} start - * @param {number} end - * @return {Array.<*>} - */ -Uint32Array.prototype.slice = function(start, end) {}; - -/** - * @constructor - * @extends {ArrayBufferView} - * @param {*} args - */ -function Float32Array(args) {} - -/** - * @const - * @type {number} - */ -Float32Array.prototype.BYTES_PER_ELEMENT; - -/** - * @type {number} - */ -Float32Array.prototype.length; - -/** - * @param {number} index - * @return {number} - */ -Float32Array.prototype.get = function(index) {}; - -/** - * @param {number|Array.<*>} x - * @param {number} value - * @return {undefined} - */ -Float32Array.prototype.set = function(x, value) {}; - -/** - * @param {number} start - * @param {number} end - * @return {Array.<*>} - */ -Float32Array.prototype.slice = function(start, end) {}; - -/** - * @constructor - * @extends {ArrayBufferView} - * @param {*} args - */ -function Float64Array(args) {} - -/** - * @const - * @type {number} - */ -Float64Array.prototype.BYTES_PER_ELEMENT; - -/** - * @type {number} - */ -Float64Array.prototype.length; - -/** - * @param {number} index - * @return {number} - */ -Float64Array.prototype.get = function(index) {}; - -/** - * @param {number|Array.<*>} x - * @param {number} value - * @return {Array.<*>} - */ -Float64Array.prototype.set = function(x, value) {}; - -/** - * @param {number} start - * @param {number} end - * @return {Array.<*>} - */ -Float64Array.prototype.slice = function(start, end) {}; - -/** - * @constructor - * @extends {ArrayBufferView} - * @param {ArrayBuffer|number} value - */ -function DataView(value) {} - -/** - * @param {number} byteOffset - * @return {number} - */ -DataView.prototype.getInt8 = function(byteOffset) {}; - -/** - * @param {number} byteOffset - * @return {number} - */ -DataView.prototype.getUint8 = function(byteOffset) {}; - -/** - * @param {number} byteOffset - * @param {boolean} littleEndian - * @return {number} - */ -DataView.prototype.getInt16 = function(byteOffset, littleEndian) {}; - -/** - * @param {number} byteOffset - * @param {boolean} littleEndian - * @return {number} - */ -DataView.prototype.getUint16 = function(byteOffset, littleEndian) {}; - -/** - * @param {number} byteOffset - * @param {boolean} littleEndian - * @return {number} - */ -DataView.prototype.getInt32 = function(byteOffset, littleEndian) {}; - -/** - * @param {number} byteOffset - * @param {boolean} littleEndian - * @return {number} - */ -DataView.prototype.getUint32 = function(byteOffset, littleEndian) {}; - -/** - * @param {number} byteOffset - * @param {boolean} littleEndian - * @return {number} - */ -DataView.prototype.getFloat32 = function(byteOffset, littleEndian) {}; - -/** - * @param {number} byteOffset - * @param {boolean} littleEndian - */ -DataView.prototype.getFloat64 = function(byteOffset, littleEndian) {}; - -/** - * @param {number} byteOffset - * @param {number} value - */ -DataView.prototype.setInt8 = function(byteOffset, value) {}; - -/** - * @param {number} byteOffset - * @param {number} value - */ -DataView.prototype.setUint8 = function(byteOffset, value) {}; - -/** - * @param {number} byteOffset - * @param {number} value - * @param {boolean} littleEndian - */ -DataView.prototype.setInt16 = function(byteOffset, value, littleEndian) {}; - -/** - * @param {number} byteOffset - * @param {number} value - * @param {boolean} littleEndian - */ -DataView.prototype.setUint16 = function(byteOffset, value, littleEndian) {}; - -/** - * @param {number} byteOffset - * @param {number} value - * @param {boolean} littleEndian - */ -DataView.prototype.setInt32 = function(byteOffset, value, littleEndian) {}; - -/** - * @param {number} byteOffset - * @param {number} value - * @param {boolean} littleEndian - */ -DataView.prototype.setUint32 = function(byteOffset, value, littleEndian) {}; - -/** - * @param {number} byteOffset - * @param {number} value - * @param {boolean} littleEndian - */ -DataView.prototype.setFloat32 = function(byteOffset, value, littleEndian) {}; - -/** - * @param {number} byteOffset - * @param {number} value - * @param {boolean} littleEndian - */ -DataView.prototype.setFloat64 = function(byteOffset, value, littleEndian) {}; - -/* EOF */ diff --git a/externs/WebGL.js b/externs/WebGL.js deleted file mode 100644 index 85b4e3b..0000000 --- a/externs/WebGL.js +++ /dev/null @@ -1,2863 +0,0 @@ -/*jslint white: false, onevar: false, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, sub: true, nomen: false */ - -/** - * Lanyard is Copyright 2010 Jonathan Bringhurst. - * - * This file is part of Lanyard. - * - * Lanyard is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Lanyard is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Lanyard. If not, see . - * - * Portions of Lanyard which do not constitute a "Larger Work" may be licensed - * under the NASA OPEN SOURCE AGREEMENT VERSION 1.3. - * - * See http://worldwind.arc.nasa.gov/ for further information about NASA World Wind. - */ - -/** - * @fileoverview Externs for WebGL. - * @externs - */ - -/** - * @constructor - */ -function WebGLContextAttributes() {} - -/** - * @type {boolean} - */ -WebGLContextAttributes.alpha; - -/** - * @type {boolean} - */ -WebGLContextAttributes.depth; - -/** - * @type {boolean} - */ -WebGLContextAttributes.stencil; - -/** - * @type {boolean} - */ -WebGLContextAttributes.antialias; - -/** - * @type {boolean} - */ -WebGLContextAttributes.premultipliedAlpha; - -/** - * @constructor - */ -function WebGLObject() {} - -/** - * @constructor - * @extends {WebGLObject} - */ -function WebGLBuffer() {} - -/** - * @constructor - * @extends {WebGLObject} - */ -function WebGLFramebuffer() {} - -/** - * @constructor - * @extends {WebGLObject} - */ -function WebGLProgram() {} - -/** - * @constructor - * @extends {WebGLObject} - */ -function WebGLRenderbuffer() {} - -/** - * @constructor - * @extends {WebGLObject} - */ -function WebGLShader() {} - -/** - * @constructor - * @extends {WebGLObject} - */ -function WebGLTexture() {} - -/** - * @constructor - */ -function WebGLUniformLocation() {} - -/** - * @constructor - */ -function WebGLActiveInfo() {} - -/** - * @type {number} - */ -WebGLActiveInfo.size; - -/** - * @type {number} - */ -WebGLActiveInfo.type; - -/** - * @type {string} - */ -WebGLActiveInfo.name; - -/** - * @constructor - */ -function WebGLRenderingContext() {} - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.DEPTH_BUFFER_BIT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STENCIL_BUFFER_BIT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.COLOR_BUFFER_BIT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.POINTS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.LINES; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.LINE_LOOP; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.LINE_STRIP; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TRIANGLES; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TRIANGLE_STRIP; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TRIANGLE_FAN; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ZERO; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ONE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.SRC_COLOR; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ONE_MINUS_SRC_COLOR; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.SRC_ALPHA; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ONE_MINUS_SRC_ALPHA; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.DST_ALPHA; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ONE_MINUS_DST_ALPHA; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.DST_COLOR; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ONE_MINUS_DST_COLOR; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.SRC_ALPHA_SATURATE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FUNC_ADD; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.BLEND_EQUATION; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.BLEND_EQUATION_RGB; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.BLEND_EQUATION_ALPHA; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FUNC_SUBTRACT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FUNC_REVERSE_SUBTRACT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.BLEND_DST_RGB; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.BLEND_SRC_RGB; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.BLEND_DST_ALPHA; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.BLEND_SRC_ALPHA; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.CONSTANT_COLOR; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ONE_MINUS_CONSTANT_COLOR; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.CONSTANT_ALPHA; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ONE_MINUS_CONSTANT_ALPHA; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.BLEND_COLOR; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ARRAY_BUFFER; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ELEMENT_ARRAY_BUFFER; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ARRAY_BUFFER_BINDING; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ELEMENT_ARRAY_BUFFER_BINDING; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STREAM_DRAW; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STATIC_DRAW; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.DYNAMIC_DRAW; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.BUFFER_SIZE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.BUFFER_USAGE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.CURRENT_VERTEX_ATTRIB; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FRONT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.BACK; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FRONT_AND_BACK; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE_2D; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.CULL_FACE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.BLEND; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.DITHER; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STENCIL_TEST; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.DEPTH_TEST; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.SCISSOR_TEST; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.POLYGON_OFFSET_FILL; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.SAMPLE_ALPHA_TO_COVERAGE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.SAMPLE_COVERAGE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.NO_ERROR; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.INVALID_ENUM; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.INVALID_VALUE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.INVALID_OPERATION; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.OUT_OF_MEMORY; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.CW; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.CCW; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.LINE_WIDTH; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ALIASED_POINT_SIZE_RANGE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ALIASED_LINE_WIDTH_RANGE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.CULL_FACE_MODE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FRONT_FACE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.DEPTH_RANGE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.DEPTH_WRITEMASK; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.DEPTH_CLEAR_VALUE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.DEPTH_FUNC; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STENCIL_CLEAR_VALUE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STENCIL_FUNC; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STENCIL_FAIL; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STENCIL_PASS_DEPTH_FAIL; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STENCIL_PASS_DEPTH_PASS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STENCIL_REF; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STENCIL_VALUE_MASK; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STENCIL_WRITEMASK; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STENCIL_BACK_FUNC; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STENCIL_BACK_FAIL; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STENCIL_BACK_PASS_DEPTH_FAIL; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STENCIL_BACK_PASS_DEPTH_PASS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STENCIL_BACK_REF; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STENCIL_BACK_VALUE_MASK; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STENCIL_BACK_WRITEMASK; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.VIEWPORT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.SCISSOR_BOX; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.COLOR_CLEAR_VALUE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.COLOR_WRITEMASK; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.UNPACK_ALIGNMENT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.PACK_ALIGNMENT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.MAX_TEXTURE_SIZE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.MAX_VIEWPORT_DIMS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.SUBPIXEL_BITS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.RED_BITS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.GREEN_BITS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.BLUE_BITS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ALPHA_BITS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.DEPTH_BITS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STENCIL_BITS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.POLYGON_OFFSET_UNITS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.POLYGON_OFFSET_FACTOR; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE_BINDING_2D; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.SAMPLE_BUFFERS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.SAMPLES; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.SAMPLE_COVERAGE_VALUE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.SAMPLE_COVERAGE_INVERT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.NUM_COMPRESSED_TEXTURE_FORMATS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.COMPRESSED_TEXTURE_FORMATS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.DONT_CARE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FASTEST; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.NICEST; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.GENERATE_MIPMAP_HINT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.BYTE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.UNSIGNED_BYTE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.SHORT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.UNSIGNED_SHORT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.INT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.UNSIGNED_INT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FLOAT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.DEPTH_COMPONENT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ALPHA; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.RGB; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.RGBA; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.LUMINANCE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.LUMINANCE_ALPHA; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.UNSIGNED_SHORT_4_4_4_4; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.UNSIGNED_SHORT_5_5_5_1; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.UNSIGNED_SHORT_5_6_5; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FRAGMENT_SHADER; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.VERTEX_SHADER; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.MAX_VERTEX_ATTRIBS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.MAX_VERTEX_UNIFORM_VECTORS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.MAX_VARYING_VECTORS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.MAX_COMBINED_TEXTURE_IMAGE_UNITS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.MAX_VERTEX_TEXTURE_IMAGE_UNITS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.MAX_TEXTURE_IMAGE_UNITS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.MAX_FRAGMENT_UNIFORM_VECTORS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.SHADER_TYPE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.DELETE_STATUS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.LINK_STATUS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.VALIDATE_STATUS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ATTACHED_SHADERS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ACTIVE_UNIFORMS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ACTIVE_UNIFORM_MAX_LENGTH; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ACTIVE_ATTRIBUTES; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ACTIVE_ATTRIBUTE_MAX_LENGTH; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.SHADING_LANGUAGE_VERSION; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.CURRENT_PROGRAM; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.NEVER; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.LESS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.EQUAL; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.LEQUAL; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.GREATER; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.NOTEQUAL; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.GEQUAL; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ALWAYS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.KEEP; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.REPLACE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.INCR; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.DECR; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.INVERT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.INCR_WRAP; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.DECR_WRAP; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.VENDOR; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.RENDERER; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.VERSION; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.NEAREST; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.LINEAR; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.NEAREST_MIPMAP_NEAREST; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.LINEAR_MIPMAP_NEAREST; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.NEAREST_MIPMAP_LINEAR; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.LINEAR_MIPMAP_LINEAR; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE_MAG_FILTER; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE_MIN_FILTER; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE_WRAP_S; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE_WRAP_T; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE_CUBE_MAP; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE_BINDING_CUBE_MAP; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE_CUBE_MAP_POSITIVE_X; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE_CUBE_MAP_NEGATIVE_X; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE_CUBE_MAP_POSITIVE_Y; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE_CUBE_MAP_NEGATIVE_Y; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE_CUBE_MAP_POSITIVE_Z; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE_CUBE_MAP_NEGATIVE_Z; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.MAX_CUBE_MAP_TEXTURE_SIZE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE0; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE1; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE2; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE3; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE4; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE5; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE6; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE7; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE8; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE9; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE10; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE11; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE12; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE13; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE14; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE15; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE16; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE17; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE18; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE19; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE20; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE21; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE22; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE23; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE24; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE25; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE26; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE27; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE28; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE29; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE30; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.TEXTURE31; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.ACTIVE_TEXTURE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.REPEAT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.CLAMP_TO_EDGE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.MIRRORED_REPEAT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FLOAT_VEC2; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FLOAT_VEC3; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FLOAT_VEC4; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.INT_VEC2; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.INT_VEC3; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.INT_VEC4; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.BOOL; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.BOOL_VEC2; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.BOOL_VEC3; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.BOOL_VEC4; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FLOAT_MAT2; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FLOAT_MAT3; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FLOAT_MAT4; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.SAMPLER_2D; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.SAMPLER_CUBE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.VERTEX_ATTRIB_ARRAY_ENABLED; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.VERTEX_ATTRIB_ARRAY_SIZE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.VERTEX_ATTRIB_ARRAY_STRIDE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.VERTEX_ATTRIB_ARRAY_TYPE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.VERTEX_ATTRIB_ARRAY_NORMALIZED; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.VERTEX_ATTRIB_ARRAY_POINTER; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.COMPILE_STATUS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.INFO_LOG_LENGTH; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.SHADER_SOURCE_LENGTH; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.LOW_FLOAT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.MEDIUM_FLOAT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.HIGH_FLOAT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.LOW_INT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.MEDIUM_INT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.HIGH_INT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FRAMEBUFFER; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.RENDERBUFFER; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.RGBA4; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.RGB5_A1; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.RGB565; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.DEPTH_COMPONENT16; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STENCIL_INDEX; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STENCIL_INDEX8; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.DEPTH_STENCIL; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.RENDERBUFFER_WIDTH; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.RENDERBUFFER_HEIGHT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.RENDERBUFFER_INTERNAL_FORMAT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.RENDERBUFFER_RED_SIZE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.RENDERBUFFER_GREEN_SIZE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.RENDERBUFFER_BLUE_SIZE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.RENDERBUFFER_ALPHA_SIZE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.RENDERBUFFER_DEPTH_SIZE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.RENDERBUFFER_STENCIL_SIZE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.COLOR_ATTACHMENT0; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.DEPTH_ATTACHMENT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.STENCIL_ATTACHMENT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.DEPTH_STENCIL_ATTACHMENT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.NONE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FRAMEBUFFER_COMPLETE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FRAMEBUFFER_INCOMPLETE_ATTACHMENT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FRAMEBUFFER_INCOMPLETE_DIMENSIONS; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FRAMEBUFFER_UNSUPPORTED; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.FRAMEBUFFER_BINDING; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.RENDERBUFFER_BINDING; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.MAX_RENDERBUFFER_SIZE; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.INVALID_FRAMEBUFFER_OPERATION; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.UNPACK_FLIP_Y_WEBGL; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.UNPACK_PREMULTIPLY_ALPHA_WEBGL; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.CONTEXT_LOST_WEBGL; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.UNPACK_COLORSPACE_CONVERSION_WEBGL; - -/** - * @const - * @type {number} - */ -WebGLRenderingContext.prototype.BROWSER_DEFAULT_WEBGL; - -/** - * @type {HTMLCanvasElement} - */ -WebGLRenderingContext.prototype.canvas; - -/** - * @return {WebGLContextAttributes} - */ -WebGLRenderingContext.prototype.getContextAttributed = function() {}; - -/** - * @return {boolean} - */ -WebGLRenderingContext.prototype.isContextLost = function() {}; - -/** - * @return {string} - */ -WebGLRenderingContext.prototype.getSupportedExtensions = function() {}; - -/** - * @param {string} name - * @return {Object} - */ -WebGLRenderingContext.prototype.getExtension = function(name) {}; - -/** - * @param {number} texture - */ -WebGLRenderingContext.prototype.activeTexture = function(texture) {}; - -/** - * @param {WebGLProgram} program - * @param {WebGLShader} shader - */ -WebGLRenderingContext.prototype.attachShader = function(program, shader) {}; - -/** - * @param {WebGLProgram} program - * @param {number} index - * @param {string} name - */ -WebGLRenderingContext.prototype.bindAttribLocation = function(program, index, name) {}; - -/** - * @param {number} target - * @param {WebGLBuffer} buffer - */ -WebGLRenderingContext.prototype.bindBuffer = function(target, buffer) {}; - -/** - * @param {number} target - * @param {WebGLFramebuffer} framebuffer - */ -WebGLRenderingContext.prototype.bindFramebuffer = function(target, framebuffer) {}; - -/** - * @param {number} target - * @param {WebGLRenderbuffer} renderbuffer - */ -WebGLRenderingContext.prototype.bindRenderbuffer = function(target, renderbuffer) {}; - -/** - * @param {number} target - * @param {WebGLTexture} texture - */ -WebGLRenderingContext.prototype.bindTexture = function(target, texture) {}; - -/** - * @param {number} red - * @param {number} green - * @param {number} blue - * @param {number} alpha - */ -WebGLRenderingContext.prototype.blendColor = function(red, green, blue, alpha) {}; - -/** - * @param {number} mode - */ -WebGLRenderingContext.prototype.blendEquation = function(mode) {}; - -/** - * @param {number} modeRGB - * @param {number} modeAlpha - */ -WebGLRenderingContext.prototype.blendEquationSeparate = function(modeRGB, modeAlpha) {}; - -/** - * @param {number} sfactor - * @param {number} dfactor - */ -WebGLRenderingContext.prototype.blendFunc = function(sfactor, dfactor) {}; - -/** - * @param {number} srcRGB - * @param {number} dstRGB - * @param {number} srcAlpha - * @param {number} dstAlpha - */ -WebGLRenderingContext.prototype.blendFuncSeparate = function(srcRGB, dstRGB, srcAlpha, dstAlpha) {}; - -/** - * @param {number} target - * @param {number|ArrayBufferView|ArrayBuffer} x size, data. - * @param {number} usage - */ -WebGLRenderingContext.prototype.bufferData = function(target, x, usage) {}; - -/** - * @param {number} target - * @param {number} offset - * @param {ArrayBufferView|ArrayBuffer} data - */ -WebGLRenderingContext.prototype.bufferSubData = function(target, offset, data) {}; - -/** - * @param {number} target - * @return {number} - */ -WebGLRenderingContext.prototype.checkFramebufferStatus = function(target) {}; - -/** - * @param {number} mask - */ -WebGLRenderingContext.prototype.clear = function(mask) {}; - -/** - * @param {number} red - * @param {number} green - * @param {number} blue - * @param {number} alpha - */ -WebGLRenderingContext.prototype.clearColor = function(red, green, blue, alpha) {}; - -/** - * @param {number} depth - */ -WebGLRenderingContext.prototype.clearDepth = function(depth) {}; - -/** - * @param {number} s - */ -WebGLRenderingContext.prototype.clearStencil = function(s) {}; - -/** - * @param {boolean} red - * @param {boolean} green - * @param {boolean} blue - * @param {boolean} alpha - */ -WebGLRenderingContext.prototype.colorMask = function(red, green, blue, alpha) {}; - -/** - * @param {WebGLShader} shader - */ -WebGLRenderingContext.prototype.compileShader = function(shader) {}; - -/** - * @param {number} target - * @param {number} level - * @param {number} internalformat - * @param {number} x - * @param {number} y - * @param {number} width - * @param {number} height - * @param {number} border - */ -WebGLRenderingContext.prototype.copyTexImage2D = - function(target, level, internalformat, x, y, width, height, border) {}; - -/** - * @param {number} target - * @param {number} level - * @param {number} xoffset - * @param {number} yoffset - * @param {number} x - * @param {number} y - * @param {number} width - * @param {number} height - */ -WebGLRenderingContext.prototype.copyTexSubImage2D = - function(target, level, xoffset, yoffset, x, y, width, height) {}; - -/** - * @return {WebGLBuffer} - */ -WebGLRenderingContext.prototype.createBuffer = function() {}; - -/** - * @return {WebGLFramebuffer} - */ -WebGLRenderingContext.prototype.createFramebuffer = function() {}; - -/** - * @return {WebGLProgram} - */ -WebGLRenderingContext.prototype.createProgram = function() {}; - -/** - * @return {WebGLRenderbuffer} - */ -WebGLRenderingContext.prototype.createRenderbuffer = function() {}; - -/** - * @param {number} type - * @return {WebGLShader} - */ -WebGLRenderingContext.prototype.createShader = function(type) {}; - -/** - * @return {WebGLTexture} - */ -WebGLRenderingContext.prototype.createTexture = function() {}; - -/** - * @param {number} mode - */ -WebGLRenderingContext.prototype.cullFace = function(mode) {}; - -/** - * @param {WebGLBuffer} buffer - */ -WebGLRenderingContext.prototype.deleteBuffer = function(buffer) {}; - -/** - * @param {WebGLFramebuffer} framebuffer - */ -WebGLRenderingContext.prototype.deleteFramebuffer = function(framebuffer) {}; - -/** - * @param {WebGLProgram} program - */ -WebGLRenderingContext.prototype.deleteProgram = function(program) {}; - -/** - * @param {WebGLRenderbuffer} renderbuffer - */ -WebGLRenderingContext.prototype.deleteRenderbuffer = function(renderbuffer) {}; - -/** - * @param {WebGLShader} shader - */ -WebGLRenderingContext.prototype.deleteShader = function(shader) {}; - -/** - * @param {WebGLTexture} texture - */ -WebGLRenderingContext.prototype.deleteTexture = function(texture) {}; - -/** - * @param {number} func - */ -WebGLRenderingContext.prototype.depthFunc = function(func) {}; - -/** - * @param {boolean} flag - */ -WebGLRenderingContext.prototype.depthMask = function(flag) {}; - -/** - * @param {number} zNear - * @param {number} zFar - */ -WebGLRenderingContext.prototype.depthRange = function(zNear, zFar) {}; - -/** - * @param {WebGLProgram} program - * @param {WebGLShader} shader - */ -WebGLRenderingContext.prototype.detachShader = function(program, shader) {}; - -/** - * @param {number} cap - */ -WebGLRenderingContext.prototype.disable = function(cap) {}; - -/** - * @param {number} index - */ -WebGLRenderingContext.prototype.disableVertexAttribArray = function(index) {}; - -/** - * @param {number} mode - * @param {number} first - * @param {number} count - */ -WebGLRenderingContext.prototype.drawArrays = function(mode, first, count) {}; - -/** - * @param {number} mode - * @param {number} count - * @param {number} type - * @param {number} offset - */ -WebGLRenderingContext.prototype.drawElements = function(mode, count, type, offset) {}; - -/** - * @param {number} cap - */ -WebGLRenderingContext.prototype.enable = function(cap) {}; - -/** - * @param {number} index - */ -WebGLRenderingContext.prototype.enableVertexAttribArray = function(index) {}; - -/** - */ -WebGLRenderingContext.prototype.finish = function() {}; - -/** - */ -WebGLRenderingContext.prototype.flush = function() {}; - -/** - * @param {number} target - * @param {number} attachment - * @param {number} renderbuffertarget - * @param {WebGLRenderbuffer} renderbuffer - */ -WebGLRenderingContext.prototype.framebufferRenderbuffer = - function(target, attachment, renderbuffertarget, renderbuffer) {}; - -/** - * @param {number} target - * @param {number} attachment - * @param {number} textarget - * @param {WebGLTexture} texture - * @param {number} level - */ -WebGLRenderingContext.prototype.framebufferTexture2D = - function(target, attachment, textarget, texture, level) {}; - -/** - * @param {number} mode - */ -WebGLRenderingContext.prototype.frontFace = function(mode) {}; - -/** - * @param {number} target - */ -WebGLRenderingContext.prototype.generateMipmap = function(target) {}; - -/** - * @param {WebGLProgram} program - * @param {number} index - * @return {WebGLActiveInfo} - */ -WebGLRenderingContext.prototype.getActiveAttrib = function(program, index) {}; - -/** - * @param {WebGLProgram} program - * @param {number} index - * @return {WebGLActiveInfo} - */ -WebGLRenderingContext.prototype.getActiveUniform = function(program, index) {}; - -/** - * @param {WebGLProgram} program - * @return {Array.} - */ -WebGLRenderingContext.prototype.getAttachedShaders = function(program) {}; - -/** - * @param {WebGLProgram} program - * @param {string} name - * @return {number} - */ -WebGLRenderingContext.prototype.getAttribLocation = function(program, name) {}; - -/** - * @param {number} pname - * @return {*} - */ -WebGLRenderingContext.prototype.getParameter = function(pname) {}; - -/** - * @param {number} target - * @param {number} pname - * @return {*} - */ -WebGLRenderingContext.prototype.getBufferParameter = function(target, pname) {}; - -/** - * @return {number} - */ -WebGLRenderingContext.prototype.getError = function() {}; - -/** - * @param {number} target - * @param {number} attachment - * @param {number} pname - * @return {*} - */ -WebGLRenderingContext.prototype.getFramebufferAttachmentParameter = - function(target, attachment, pname) {}; - -/** - * @param {WebGLProgram} program - * @param {number} pname - * @return {*} - */ -WebGLRenderingContext.prototype.getProgramParameter = function(program, pname) {}; - -/** - * @param {WebGLProgram} program - * @return {string} - */ -WebGLRenderingContext.prototype.getProgramInfoLog = function(program) {}; - -/** - * @param {number} target - * @param {number} pname - * @return {*} - */ -WebGLRenderingContext.prototype.getRenderbufferParameter = function(target, pname) {}; - -/** - * @param {WebGLShader} shader - * @param {number} pname - * @return {*} - */ -WebGLRenderingContext.prototype.getShaderParameter = function(shader, pname) {}; - -/** - * @param {WebGLShader} shader - * @return {string} - */ -WebGLRenderingContext.prototype.getShaderInfoLog = function(shader) {}; - -/** - * @param {WebGLShader} shader - * @return {string} - */ -WebGLRenderingContext.prototype.getShaderSource = function(shader) {}; - -/** - * @param {number} target - * @param {number} pname - * @return {*} - */ -WebGLRenderingContext.prototype.getTexParameter = function(target, pname) {}; - -/** - * @param {WebGLProgram} program - * @param {WebGLUniformLocation} loc - * @return {*} - */ -WebGLRenderingContext.prototype.getUniform = function(program, loc) {}; - -/** - * @param {WebGLProgram} program - * @param {string} name - * @return {WebGLUniformLocation} - */ -WebGLRenderingContext.prototype.getUniformLocation = function(program, name) {}; - -/** - * @param {number} index - * @param {number} pname - * @return {*} - */ -WebGLRenderingContext.prototype.getVertexAttrib = function(index, pname) {}; - -/** - * @param {number} index - * @param {number} pname - * @return {number} - */ -WebGLRenderingContext.prototype.getVertexAttribOffset = function(index, pname) {}; - -/** - * @param {number} target - * @param {number} mode - */ -WebGLRenderingContext.prototype.hint = function(target, mode) {}; - -/** - * @param {WebGLBuffer} buffer - * @return {boolean} - */ -WebGLRenderingContext.prototype.isBuffer = function(buffer) {}; - -/** - * @param {number} cap - * @return {boolean} - */ -WebGLRenderingContext.prototype.isEnabled = function(cap) {}; - -/** - * @param {WebGLFramebuffer} framebuffer - * @return {boolean} - */ -WebGLRenderingContext.prototype.isFramebuffer = function(framebuffer) {}; - -/** - * @param {WebGLProgram} program - * @return {boolean} - */ -WebGLRenderingContext.prototype.isProgram = function(program) {}; - -/** - * @param {WebGLRenderbuffer} renderbuffer - * @return {boolean} - */ -WebGLRenderingContext.prototype.isRenderbuffer = function(renderbuffer) {}; - -/** - * @param {WebGLShader} shader - * @return {boolean} - */ -WebGLRenderingContext.prototype.isShader = function(shader) {}; - -/** - * @param {WebGLTexture} texture - * @return {boolean} - */ -WebGLRenderingContext.prototype.isTexture = function(texture) {}; - -/** - * @param {number} width - */ -WebGLRenderingContext.prototype.lineWidth = function(width) {}; - -/** - * @param {WebGLProgram} program - */ -WebGLRenderingContext.prototype.linkProgram = function(program) {}; - -/** - * @param {number} pname - * @param {number} param - */ -WebGLRenderingContext.prototype.pixelStorei = function(pname, param) {}; - -/** - * @param {number} factor - * @param {number} units - */ -WebGLRenderingContext.prototype.polygonOffset = function(factor, units) {}; - -/** - * @param {number} x - * @param {number} y - * @param {number} width - * @param {number} height - * @param {number} format - * @param {number} type - * @param {ArrayBufferView} pixels - */ -WebGLRenderingContext.prototype.readPixels = - function(x, y, width, height, format, type, pixels) {}; - -/** - * @param {number} target - * @param {number} internalformat - * @param {number} width - * @param {number} height - */ -WebGLRenderingContext.prototype.renderbufferStorage = - function(target, internalformat, width, height) {}; - -/** - * @param {number} value - * @param {boolean} invert - */ -WebGLRenderingContext.prototype.sampleCoverage = function(value, invert) {}; - -/** - * @param {number} x - * @param {number} y - * @param {number} width - * @param {number} height - */ -WebGLRenderingContext.prototype.scissor = function(x, y, width, height) {}; - -/** - * @param {WebGLShader} shader - * @param {string} source - */ -WebGLRenderingContext.prototype.shaderSource = function(shader, source) {}; - -/** - * @param {number} func - * @param {number} ref - * @param {number} mask - */ -WebGLRenderingContext.prototype.stencilFunc = function(func, ref, mask) {}; - -/** - * @param {number} face - * @param {number} func - * @param {number} ref - * @param {number} mask - */ -WebGLRenderingContext.prototype.stencilFuncSeparate = function(face, func, ref, mask) {}; - -/** - * @param {number} mask - */ -WebGLRenderingContext.prototype.stencilMask = function(mask) {}; - -/** - * @param {number} face - * @param {number} mask - */ -WebGLRenderingContext.prototype.stencilMaskSeparate = function(face, mask) {}; - -/** - * @param {number} fail - * @param {number} zfail - * @param {number} zpass - */ -WebGLRenderingContext.prototype.stencilOp = function(fail, zfail, zpass) {}; - -/** - * @param {number} face - * @param {number} fail - * @param {number} zfail - * @param {number} zpass - */ -WebGLRenderingContext.prototype.stencilOpSeparate = function(face, fail, zfail, zpass) {}; - -/** - * @param {number} target - * @param {number} level - * @param {number} internalformat - * @param {number} x width, format. - * @param {number} y height, type. - * @param {number|ImageData|Image|HTMLCanvasElement|HTMLVideoElement} z border, pixels, image, canvas, video. - * @param {number=} format - * @param {number=} type - * @param {ArrayBufferView=} pixels - */ -WebGLRenderingContext.prototype.texImage2D = - function(target, level, internalformat, x, y, z, format, type, pixels) {}; - -/** - * @param {number} target - * @param {number} pname - * @param {number} param - */ -WebGLRenderingContext.prototype.texParameterf = function(target, pname, param) {}; - -/** - * @param {number} target - * @param {number} pname - * @param {number} param - */ -WebGLRenderingContext.prototype.texParameteri = function(target, pname, param) {}; - -/** - * @param {number} target - * @param {number} level - * @param {number} xoffset - * @param {number} yoffset - * @param {number} x width, format. - * @param {number} y height, type. - * @param {number|Image|HTMLCanvasElement|HTMLVideoElement} z format, pixels, canvas, video. - * @param {number=} type - * @param {ArrayBufferView=} pixels - */ -WebGLRenderingContext.prototype.texSubImage2D = - function(target, level, xoffset, yoffset, x, y, z, type, pixels) {}; - -/** - * @param {WebGLUniformLocation} loc - * @param {number} x - */ -WebGLRenderingContext.prototype.uniform1f = function(loc, x) {}; - -/** - * @param {WebGLUniformLocation} loc - * @param {Float32Array} v - */ -WebGLRenderingContext.prototype.uniform1fv = function(loc, v) {}; - -//WebGLRenderingContext.prototype.uniform1fv(WebGLUniformLocation location, sequence v); - -/** - * @param {WebGLUniformLocation} loc - * @param {number} x - */ -WebGLRenderingContext.prototype.uniform1i = function(loc, x) {}; - -/** - * @param {WebGLUniformLocation} loc - * @param {Int32Array} v - */ -WebGLRenderingContext.prototype.uniform1iv = function(loc, v) {}; - -//WebGLRenderingContext.prototype.uniform1iv(WebGLUniformLocation location, sequence v); - -/** - * @param {WebGLUniformLocation} loc - * @param {number} x - * @param {number} y - */ -WebGLRenderingContext.prototype.uniform2f = function(loc, x, y) {}; - -/** - * @param {WebGLUniformLocation} loc - * @param {Float32Array} v - */ -WebGLRenderingContext.prototype.uniform2fv = function(loc, v) {}; - -//WebGLRenderingContext.prototype.uniform2fv(WebGLUniformLocation location, sequence v); - -/** - * @param {WebGLUniformLocation} loc - * @param {number} x - * @param {number} y - */ -WebGLRenderingContext.prototype.uniform2i = function(loc, x, y) {}; - -/** - * @param {WebGLUniformLocation} loc - * @param {Int32Array} v - */ -WebGLRenderingContext.prototype.uniform2iv = function(loc, v) {}; - -//WebGLRenderingContext.prototype.uniform2iv(WebGLUniformLocation location, sequence v); - -/** - * @param {WebGLUniformLocation} loc - * @param {number} x - * @param {number} y - * @param {number} z - */ -WebGLRenderingContext.prototype.uniform3f = function(loc, x, y, z) {}; - -/** - * @param {WebGLUniformLocation} loc - * @param {Float32Array} v - */ -WebGLRenderingContext.prototype.uniform3fv = function(loc, v) {}; - -//WebGLRenderingContext.prototype.uniform3fv(WebGLUniformLocation location, sequence v); - -/** - * @param {WebGLUniformLocation} loc - * @param {number} x - * @param {number} y - * @param {number} z - */ -WebGLRenderingContext.prototype.uniform3i = function(loc, x, y, z) {}; - -/** - * @param {WebGLUniformLocation} loc - * @param {Int32Array} v - */ -WebGLRenderingContext.prototype.uniform3iv = function(loc, v) {}; - -//WebGLRenderingContext.prototype.uniform3iv(WebGLUniformLocation location, sequence v); - -/** - * @param {WebGLUniformLocation} loc - * @param {number} x - * @param {number} y - * @param {number} z - * @param {number} w - */ -WebGLRenderingContext.prototype.uniform4f = function(loc, x, y, z, w) {}; - -/** - * @param {WebGLUniformLocation} loc - * @param {Float32Array} v - */ -WebGLRenderingContext.prototype.uniform4fv = function(loc, v) {}; - -//WebGLRenderingContext.prototype.uniform4fv(WebGLUniformLocation location, sequence v); - -/** - * @param {WebGLUniformLocation} loc - * @param {number} x - * @param {number} y - * @param {number} z - * @param {number} w - */ -WebGLRenderingContext.prototype.uniform4i = function(loc, x, y, z, w) {}; - -/** - * @param {WebGLUniformLocation} loc - * @param {Int32Array} v - */ -WebGLRenderingContext.prototype.uniform4iv = function(loc, v) {}; - -//WebGLRenderingContext.prototype.uniform4iv(WebGLUniformLocation location, sequence v); - -/** - * @param {WebGLUniformLocation} loc - * @param {boolean} transpose - * @param {Float32Array} value - */ -WebGLRenderingContext.prototype.uniformMatrix2fv = function(loc, transpose, value) {}; - -//WebGLRenderingContext.prototype.uniformMatrix2fv(WebGLUniformLocation location, GLboolean transpose, -// sequence value); - -/** - * @param {WebGLUniformLocation} loc - * @param {boolean} transpose - * @param {Float32Array} value - */ -WebGLRenderingContext.prototype.uniformMatrix3fv = function(loc, transpose, value) {}; - -//WebGLRenderingContext.prototype.uniformMatrix3fv(WebGLUniformLocation location, GLboolean transpose, -// sequence value); - -/** - * @param {WebGLUniformLocation} loc - * @param {boolean} transpose - * @param {Float32Array} value - */ -WebGLRenderingContext.prototype.uniformMatrix4fv = function(loc, transpose, value) {}; - -//WebGLRenderingContext.prototype.uniformMatrix4fv(WebGLUniformLocation location, GLboolean transpose, -// sequence value); - -/** - * @param {WebGLProgram} program - */ -WebGLRenderingContext.prototype.useProgram = function(program) {}; - -/** - * @param {WebGLProgram} program - */ -WebGLRenderingContext.prototype.validateProgram = function(program) {}; - -/** - * @param {number} indx - * @param {number} x - */ -WebGLRenderingContext.prototype.vertexAttrib1f = function(indx, x) {}; - -/** - * @param {number} indx - * @param {Float32Array} values - */ -WebGLRenderingContext.prototype.vertexAttrib1fv = function(indx, values) {}; - -//WebGLRenderingContext.prototype.vertexAttrib1fv(GLuint indx, sequence values); - -/** - * @param {number} indx - * @param {number} x - * @param {number} y - */ -WebGLRenderingContext.prototype.vertexAttrib2f = function(indx, x, y) {}; - -/** - * @param {number} indx - * @param {Float32Array} values - */ -WebGLRenderingContext.prototype.vertexAttrib2fv = function(indx, values) {}; - -//WebGLRenderingContext.prototype.vertexAttrib2fv(GLuint indx, sequence values); - -/** - * @param {number} indx - * @param {number} x - * @param {number} y - * @param {number} z - */ -WebGLRenderingContext.prototype.vertexAttrib3f = function(indx, x, y, z) {}; - -/** - * @param {number} indx - * @param {Float32Array} values - */ -WebGLRenderingContext.prototype.vertexAttrib3fv = function(indx, values) {}; - -//WebGLRenderingContext.prototype.vertexAttrib3fv(GLuint indx, sequence values); - -/** - * @param {number} indx - * @param {number} x - * @param {number} y - * @param {number} z - * @param {number} w - */ -WebGLRenderingContext.prototype.vertexAttrib4f = function(indx, x, y, z, w) {}; - -/** - * @param {number} indx - * @param {Float32Array} values - */ -WebGLRenderingContext.prototype.vertexAttrib4fv = function(indx, values) {}; - -//WebGLRenderingContext.prototype.vertexAttrib4fv(GLuint indx, sequence values); - -/** - * @param {number} indx - * @param {number} size - * @param {number} type - * @param {boolean} normalized - * @param {number} stride - * @param {number} offset - */ -WebGLRenderingContext.prototype.vertexAttribPointer = - function(indx, size, type, normalized, stride, offset) {}; - -/** - * @param {number} x - * @param {number} y - * @param {number} width - * @param {number} height - */ -WebGLRenderingContext.prototype.viewport = function(x, y, width, height) {}; - -/** - * @constructor - * @extends {Event} - */ -function WebGLContextEvent() {} - -/** - * @type {string} - */ -WebGLContextEvent.prototype.statusMessage; - -/** - * @param {string} typeArg - * @param {boolean} canBubbleArg - * @param {boolean} cancelableArg - * @param {string} statusMessageArg - */ -WebGLContextEvent.prototype.initWebGLContextEvent = - function(typeArg, canBubbleArg, cancelableArg, statusMessageArg) {}; - -/* EOF */