diff --git a/.eslintignore b/.eslintignore
index bdfdfaeab2388d..19e0fcee9e1b5a 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -1,5 +1,4 @@
node_modules
-lib/internal/v8_prof_polyfill.js
lib/punycode.js
test/addons/??_*
test/fixtures
diff --git a/.eslintrc.js b/.eslintrc.js
index 260f53c4672b61..9340889b83dc5d 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -53,11 +53,6 @@ module.exports = {
overrides: [
{
files: [
- 'doc/api/esm.md',
- 'doc/api/module.md',
- 'doc/api/modules.md',
- 'doc/api/packages.md',
- 'doc/api/wasi.md',
'test/es-module/test-esm-type-flag.js',
'test/es-module/test-esm-type-flag-alias.js',
'*.mjs',
@@ -67,9 +62,24 @@ module.exports = {
},
{
files: ['**/*.md'],
- parserOptions: { ecmaFeatures: { impliedStrict: true } },
+ processor: 'markdown/markdown',
+ },
+ {
+ files: ['**/*.md/*.cjs', '**/*.md/*.js'],
+ parserOptions: {
+ sourceType: 'script',
+ ecmaFeatures: { impliedStrict: true }
+ },
rules: { strict: 'off' },
},
+ {
+ files: [
+ '**/*.md/*.mjs',
+ 'doc/api/esm.md/*.js',
+ 'doc/api/packages.md/*.js',
+ ],
+ parserOptions: { sourceType: 'module' },
+ },
],
rules: {
// ESLint built-in rules
@@ -162,6 +172,7 @@ module.exports = {
'no-multiple-empty-lines': ['error', { max: 2, maxEOF: 0, maxBOF: 0 }],
'no-new-require': 'error',
'no-new-symbol': 'error',
+ 'no-nonoctal-decimal-escape': 'error',
'no-obj-calls': 'error',
'no-octal': 'error',
'no-path-concat': 'error',
@@ -238,6 +249,8 @@ module.exports = {
'no-unreachable': 'error',
'no-unsafe-finally': 'error',
'no-unsafe-negation': 'error',
+ 'no-unsafe-optional-chaining': 'error',
+ 'no-unused-expressions': ['error', { allowShortCircuit: true }],
'no-unused-labels': 'error',
'no-unused-vars': ['error', { args: 'none', caughtErrors: 'all' }],
'no-use-before-define': ['error', {
@@ -255,6 +268,7 @@ module.exports = {
'no-void': 'error',
'no-whitespace-before-property': 'error',
'no-with': 'error',
+ 'object-curly-newline': 'error',
'object-curly-spacing': ['error', 'always'],
'one-var': ['error', { initialized: 'never' }],
'one-var-declaration-per-line': 'error',
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index df10388a2215ee..9184253c4c271c 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -114,3 +114,7 @@
/lib/internal/bootstrap/* @nodejs/startup
/tools/code_cache/* @nodejs/startup
/tools/snapshot/* @nodejs/startup
+
+# V8
+/deps/v8/* @nodejs/v8-update
+/tools/v8_gypfiles/* @nodejs/v8-update
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 56632fda4c67eb..f99a8abb394d14 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,9 +1,9 @@
+* [aduh95](https://github.com/aduh95) -
+**Antoine du Hamel** <duhamelantoine1995@gmail.com> (he/him)
* [apapirovski](https://github.com/apapirovski) -
**Anatoli Papirovski** <apapirovski@mac.com> (he/him)
* [BethGriggs](https://github.com/BethGriggs) -
@@ -169,10 +171,12 @@ For information about the governance of the Node.js project, see
**Shelley Vohr** <codebytere@gmail.com> (she/her)
* [danbev](https://github.com/danbev) -
**Daniel Bevenius** <daniel.bevenius@gmail.com> (he/him)
+* [danielleadams](https://github.com/danielleadams) -
+**Danielle Adams** <adamzdanielle@gmail.com> (she/her)
* [fhinkel](https://github.com/fhinkel) -
**Franziska Hinkelmann** <franziska.hinkelmann@gmail.com> (she/her)
* [gabrielschulhof](https://github.com/gabrielschulhof) -
-**Gabriel Schulhof** <gabriel.schulhof@intel.com>
+**Gabriel Schulhof** <gabrielschulhof@gmail.com>
* [gireeshpunathil](https://github.com/gireeshpunathil) -
**Gireesh Punathil** <gpunathi@in.ibm.com> (he/him)
* [jasnell](https://github.com/jasnell) -
@@ -187,6 +191,8 @@ For information about the governance of the Node.js project, see
**Mary Marchini** <oss@mmarchini.me> (she/her)
* [MylesBorins](https://github.com/MylesBorins) -
**Myles Borins** <myles.borins@gmail.com> (he/him)
+* [ronag](https://github.com/ronag) -
+**Robert Nagy** <ronagy@icloud.com>
* [targos](https://github.com/targos) -
**Michaël Zasso** <targos@protonmail.com> (he/him)
* [tniessen](https://github.com/tniessen) -
@@ -308,7 +314,7 @@ For information about the governance of the Node.js project, see
* [Flarna](https://github.com/Flarna) -
**Gerhard Stöbich** <deb2001-github@yahoo.de> (he/they)
* [gabrielschulhof](https://github.com/gabrielschulhof) -
-**Gabriel Schulhof** <gabriel.schulhof@intel.com>
+**Gabriel Schulhof** <gabrielschulhof@gmail.com>
* [gdams](https://github.com/gdams) -
**George Adams** <george.adams@uk.ibm.com> (he/him)
* [geek](https://github.com/geek) -
@@ -675,13 +681,13 @@ Other keys used to sign some previous releases:
Node.js is available under the
[MIT license](https://opensource.org/licenses/MIT). Node.js also includes
external libraries that are available under a variety of licenses. See
-[LICENSE](https://github.com/nodejs/node/blob/master/LICENSE) for the full
+[LICENSE](https://github.com/nodejs/node/blob/HEAD/LICENSE) for the full
license text.
-[Code of Conduct]: https://github.com/nodejs/admin/blob/master/CODE_OF_CONDUCT.md
+[Code of Conduct]: https://github.com/nodejs/admin/blob/HEAD/CODE_OF_CONDUCT.md
[Contributing to the project]: CONTRIBUTING.md
[Node.js Website]: https://nodejs.org/
[OpenJS Foundation]: https://openjsf.org/
-[Strategic Initiatives]: https://github.com/nodejs/TSC/blob/master/Strategic-Initiatives.md
+[Strategic Initiatives]: https://github.com/nodejs/TSC/blob/HEAD/Strategic-Initiatives.md
[Technical values and prioritization]: doc/guides/technical-values.md
-[Working Groups]: https://github.com/nodejs/TSC/blob/master/WORKING_GROUPS.md
+[Working Groups]: https://github.com/nodejs/TSC/blob/HEAD/WORKING_GROUPS.md
diff --git a/SECURITY.md b/SECURITY.md
index e121072ffe4381..859b88e8a175a9 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -26,7 +26,7 @@ maintainers and should also be coordinated through the Node.js Ecosystem
Security Team via [HackerOne](https://hackerone.com/nodejs-ecosystem).
Details regarding this process can be found in the
-[Security Working Group repository](https://github.com/nodejs/security-wg/blob/master/processes/third_party_vuln_process.md).
+[Security Working Group repository](https://github.com/nodejs/security-wg/blob/HEAD/processes/third_party_vuln_process.md).
Thank you for improving the security of Node.js and its ecosystem. Your efforts
and responsible disclosure are greatly appreciated and will be acknowledged.
diff --git a/benchmark/.eslintrc.yaml b/benchmark/.eslintrc.yaml
index 8ce0f9f6e148c1..6871299adece7b 100644
--- a/benchmark/.eslintrc.yaml
+++ b/benchmark/.eslintrc.yaml
@@ -6,10 +6,4 @@ env:
rules:
no-var: error
- comma-dangle:
- - error
- - arrays: 'always-multiline'
- objects: 'only-multiline'
- imports: 'only-multiline'
- exports: 'only-multiline'
prefer-arrow-callback: error
diff --git a/benchmark/_benchmark_progress.js b/benchmark/_benchmark_progress.js
index 1b7ac738f6de0d..6c925f34e68202 100644
--- a/benchmark/_benchmark_progress.js
+++ b/benchmark/_benchmark_progress.js
@@ -39,7 +39,6 @@ class BenchmarkProgress {
this.completedConfig = 0;
// Total number of configurations for the current file
this.scheduledConfig = 0;
- this.interval; // Updates the elapsed time.
}
startQueue(index) {
diff --git a/benchmark/_http-benchmarkers.js b/benchmark/_http-benchmarkers.js
index f25bcd319882f6..e5ba6188f1cc81 100644
--- a/benchmark/_http-benchmarkers.js
+++ b/benchmark/_http-benchmarkers.js
@@ -5,7 +5,7 @@ const path = require('path');
const fs = require('fs');
const requirementsURL =
- 'https://github.com/nodejs/node/blob/master/benchmark/writing-and-running-benchmarks.md#http-benchmark-requirements';
+ 'https://github.com/nodejs/node/blob/HEAD/benchmark/writing-and-running-benchmarks.md#http-benchmark-requirements';
// The port used by servers and wrk
exports.PORT = Number(process.env.PORT) || 12346;
diff --git a/benchmark/common.js b/benchmark/common.js
index bdccd6605f365e..3f7abf7363281d 100644
--- a/benchmark/common.js
+++ b/benchmark/common.js
@@ -12,7 +12,7 @@ class Benchmark {
this._ended = false;
// Holds process.hrtime value
- this._time = [0, 0];
+ this._time = 0n;
// Use the file name as the name of the benchmark
this.name = require.main.filename.slice(__dirname.length + 1);
@@ -218,12 +218,12 @@ class Benchmark {
throw new Error('Called start more than once in a single benchmark');
}
this._started = true;
- this._time = process.hrtime();
+ this._time = process.hrtime.bigint();
}
end(operations) {
// Get elapsed time now and do error checking later for accuracy.
- const elapsed = process.hrtime(this._time);
+ const time = process.hrtime.bigint();
if (!this._started) {
throw new Error('called end without start');
@@ -237,16 +237,19 @@ class Benchmark {
if (!process.env.NODEJS_BENCHMARK_ZERO_ALLOWED && operations <= 0) {
throw new Error('called end() with operation count <= 0');
}
- if (elapsed[0] === 0 && elapsed[1] === 0) {
+
+ this._ended = true;
+
+ if (time === this._time) {
if (!process.env.NODEJS_BENCHMARK_ZERO_ALLOWED)
throw new Error('insufficient clock precision for short benchmark');
// Avoid dividing by zero
- elapsed[1] = 1;
+ this.report(operations && Number.MAX_VALUE, 0n);
+ return;
}
- this._ended = true;
- const time = elapsed[0] + elapsed[1] / 1e9;
- const rate = operations / time;
+ const elapsed = time - this._time;
+ const rate = operations / (Number(elapsed) / 1e9);
this.report(rate, elapsed);
}
@@ -255,12 +258,21 @@ class Benchmark {
name: this.name,
conf: this.config,
rate,
- time: elapsed[0] + elapsed[1] / 1e9,
+ time: nanoSecondsToString(elapsed),
type: 'report',
});
}
}
+function nanoSecondsToString(bigint) {
+ const str = bigint.toString();
+ const decimalPointIndex = str.length - 9;
+ if (decimalPointIndex < 0) {
+ return `0.${'0'.repeat(-decimalPointIndex)}${str}`;
+ }
+ return `${str.slice(0, decimalPointIndex)}.${str.slice(decimalPointIndex)}`;
+}
+
function formatResult(data) {
// Construct configuration string, " A=a, B=b, ..."
let conf = '';
@@ -271,7 +283,7 @@ function formatResult(data) {
let rate = data.rate.toString().split('.');
rate[0] = rate[0].replace(/(\d)(?=(?:\d\d\d)+(?!\d))/g, '$1,');
rate = (rate[1] ? rate.join('.') : rate[0]);
- return `${data.name}${conf}: ${rate}`;
+ return `${data.name}${conf}: ${rate}\n`;
}
function sendResult(data) {
@@ -280,7 +292,7 @@ function sendResult(data) {
process.send(data);
} else {
// Otherwise report by stdout
- console.log(formatResult(data));
+ process.stdout.write(formatResult(data));
}
}
diff --git a/benchmark/es/destructuring-bench.js b/benchmark/es/destructuring-bench.js
index c07c0383da91ac..d412b82757f083 100644
--- a/benchmark/es/destructuring-bench.js
+++ b/benchmark/es/destructuring-bench.js
@@ -12,7 +12,8 @@ function runSwapManual(n) {
let x, y, r;
bench.start();
for (let i = 0; i < n; i++) {
- x = 1, y = 2;
+ x = 1;
+ y = 2;
r = x;
x = y;
y = r;
@@ -26,7 +27,8 @@ function runSwapDestructured(n) {
let x, y;
bench.start();
for (let i = 0; i < n; i++) {
- x = 1, y = 2;
+ x = 1;
+ y = 2;
[x, y] = [y, x];
assert.strictEqual(x, 2);
assert.strictEqual(y, 1);
diff --git a/benchmark/perf_hooks/bench-eventlooputil.js b/benchmark/perf_hooks/bench-eventlooputil.js
index 984b2b66aecbcf..1fd452afa91300 100644
--- a/benchmark/perf_hooks/bench-eventlooputil.js
+++ b/benchmark/perf_hooks/bench-eventlooputil.js
@@ -33,7 +33,7 @@ function main({ method, n }) {
function benchIdleTime(n) {
bench.start();
for (let i = 0; i < n; i++)
- nodeTiming.idleTime;
+ nodeTiming.idleTime; // eslint-disable-line no-unused-expressions
bench.end(n);
}
diff --git a/benchmark/process/bench-env.js b/benchmark/process/bench-env.js
index 5df521cc958389..e96c1d02507214 100644
--- a/benchmark/process/bench-env.js
+++ b/benchmark/process/bench-env.js
@@ -13,7 +13,7 @@ function main({ n, operation }) {
case 'get':
bench.start();
for (let i = 0; i < n; i++) {
- process.env.PATH;
+ process.env.PATH; // eslint-disable-line no-unused-expressions
}
bench.end(n);
break;
@@ -42,7 +42,7 @@ function main({ n, operation }) {
case 'query':
bench.start();
for (let i = 0; i < n; i++) {
- 'PATH' in process.env;
+ 'PATH' in process.env; // eslint-disable-line no-unused-expressions
}
bench.end(n);
break;
diff --git a/benchmark/string_decoder/string-decoder-create.js b/benchmark/string_decoder/string-decoder-create.js
index f7fa5e0246b860..641e562fdeab3d 100644
--- a/benchmark/string_decoder/string-decoder-create.js
+++ b/benchmark/string_decoder/string-decoder-create.js
@@ -12,8 +12,7 @@ const bench = common.createBenchmark(main, {
function main({ encoding, n }) {
bench.start();
for (let i = 0; i < n; ++i) {
- const sd = new StringDecoder(encoding);
- !!sd.encoding;
+ new StringDecoder(encoding);
}
bench.end(n);
}
diff --git a/common.gypi b/common.gypi
index aa4279d93ca35c..8fdb6d36df0b74 100644
--- a/common.gypi
+++ b/common.gypi
@@ -36,7 +36,7 @@
# Reset this number to 0 on major V8 upgrades.
# Increment by one for each non-official patch applied to deps/v8.
- 'v8_embedder_string': '-node.63',
+ 'v8_embedder_string': '-node.67',
##### V8 defaults for Node.js #####
diff --git a/configure b/configure
index ca2cd8aa9e6358..4fec68abf979e1 100755
--- a/configure
+++ b/configure
@@ -18,7 +18,10 @@ exec python "$0" "$@"
del _
import sys
-from distutils.spawn import find_executable
+try:
+ from shutil import which
+except ImportError:
+ from distutils.spawn import find_executable as which
print('Node.js configure: Found Python {0}.{1}.{2}...'.format(*sys.version_info))
acceptable_pythons = ((3, 9), (3, 8), (3, 7), (3, 6), (3, 5), (2, 7))
@@ -28,7 +31,7 @@ else:
python_cmds = ['python{0}.{1}'.format(*vers) for vers in acceptable_pythons]
sys.stderr.write('Please use {0}.\n'.format(' or '.join(python_cmds)))
for python_cmd in python_cmds:
- python_cmd_path = find_executable(python_cmd)
+ python_cmd_path = which(python_cmd)
if python_cmd_path and 'pyenv/shims' not in python_cmd_path:
sys.stderr.write('\t{0} {1}\n'.format(python_cmd_path,
' '.join(sys.argv[:1])))
diff --git a/configure.py b/configure.py
index a477bd1c9578d0..c56559626df228 100755
--- a/configure.py
+++ b/configure.py
@@ -14,7 +14,12 @@
import bz2
import io
-from distutils.spawn import find_executable as which
+# Fallback to find_executable from distutils.spawn is a stopgap for
+# supporting V8 builds, which do not yet support Python 3.
+try:
+ from shutil import which
+except ImportError:
+ from distutils.spawn import find_executable as which
from distutils.version import StrictVersion
# If not run from node/, cd to node/.
diff --git a/deps/cjs-module-lexer/CHANGELOG.md b/deps/cjs-module-lexer/CHANGELOG.md
index f71631cab5d7ff..d49499aaa2efcc 100644
--- a/deps/cjs-module-lexer/CHANGELOG.md
+++ b/deps/cjs-module-lexer/CHANGELOG.md
@@ -1,3 +1,10 @@
+1.2.1
+- Support Unicode escapes in strings (https://github.com/guybedford/cjs-module-lexer/pull/55)
+- Filter export strings to valid surrogate pairs (https://github.com/guybedford/cjs-module-lexer/pull/56)
+
+1.2.0
+- Support for non-identifier exports (https://github.com/guybedford/cjs-module-lexer/pull/54, @nicolo-ribaudo)
+
1.1.1
- Better support for Babel reexport getter function forms (https://github.com/guybedford/cjs-module-lexer/issues/50)
- Support Babel interopRequireWildcard reexports patterns (https://github.com/guybedford/cjs-module-lexer/issues/52)
diff --git a/deps/cjs-module-lexer/README.md b/deps/cjs-module-lexer/README.md
index 290af176f0885f..3893221beb79c7 100755
--- a/deps/cjs-module-lexer/README.md
+++ b/deps/cjs-module-lexer/README.md
@@ -70,29 +70,27 @@ IDENTIFIER: As defined by ECMA-262, without support for identifier `\` escapes,
STRING_LITERAL: A `"` or `'` bounded ECMA-262 string literal.
-IDENTIFIER_STRING: ( `"` IDENTIFIER `"` | `'` IDENTIFIER `'` )
-
MODULE_EXPORTS: `module` `.` `exports`
EXPORTS_IDENTIFIER: MODULE_EXPORTS_IDENTIFIER | `exports`
EXPORTS_DOT_ASSIGN: EXPORTS_IDENTIFIER `.` IDENTIFIER `=`
-EXPORTS_LITERAL_COMPUTED_ASSIGN: EXPORTS_IDENTIFIER `[` IDENTIFIER_STRING `]` `=`
+EXPORTS_LITERAL_COMPUTED_ASSIGN: EXPORTS_IDENTIFIER `[` STRING_LITERAL `]` `=`
-EXPORTS_LITERAL_PROP: (IDENTIFIER (`:` IDENTIFIER)?) | (IDENTIFIER_STRING `:` IDENTIFIER)
+EXPORTS_LITERAL_PROP: (IDENTIFIER (`:` IDENTIFIER)?) | (STRING_LITERAL `:` IDENTIFIER)
EXPORTS_SPREAD: `...` (IDENTIFIER | REQUIRE)
EXPORTS_MEMBER: EXPORTS_DOT_ASSIGN | EXPORTS_LITERAL_COMPUTED_ASSIGN
-EXPORTS_DEFINE: `Object` `.` `defineProperty `(` EXPORTS_IDENFITIER `,` IDENTIFIER_STRING
+EXPORTS_DEFINE: `Object` `.` `defineProperty `(` EXPORTS_IDENFITIER `,` STRING_LITERAL
EXPORTS_DEFINE_VALUE: EXPORTS_DEFINE `, {`
(`enumerable: true,`)?
(
`value:` |
- `get` (`: function` IDENTIFIER? )? `() {` return IDENTIFIER (`.` IDENTIFIER | `[` IDENTIFIER_STRING `]`)? `;`? `}` `,`?
+ `get` (`: function` IDENTIFIER? )? `() {` return IDENTIFIER (`.` IDENTIFIER | `[` STRING_LITERAL `]`)? `;`? `}` `,`?
)
`})`
@@ -127,8 +125,8 @@ EXPORT_STAR_LIB: `Object.keys(` IDENTIFIER$1 `).forEach(function (` IDENTIFIER$2
Spacing between tokens is taken to be any ECMA-262 whitespace, ECMA-262 block comment or ECMA-262 line comment.
* The returned export names are taken to be the combination of:
- 1. All `IDENTIFIER` and `IDENTIFIER_STRING` slots for `EXPORTS_MEMBER` and `EXPORTS_LITERAL` matches.
- 2. The first `IDENTIFIER_STRING` slot for all `EXPORTS_DEFINE_VALUE` matches where that same string is not an `EXPORTS_DEFINE` match that is not also an `EXPORTS_DEFINE_VALUE` match.
+ 1. All `IDENTIFIER` and `STRING_LITERAL` slots for `EXPORTS_MEMBER` and `EXPORTS_LITERAL` matches.
+ 2. The first `STRING_LITERAL` slot for all `EXPORTS_DEFINE_VALUE` matches where that same string is not an `EXPORTS_DEFINE` match that is not also an `EXPORTS_DEFINE_VALUE` match.
* The reexport specifiers are taken to be the combination of:
1. The `REQUIRE` matches of the last matched of either `MODULE_EXPORTS_ASSIGN` or `EXPORTS_LITERAL`.
2. All _top-level_ `EXPORT_STAR` `REQUIRE` matches and `EXPORTS_ASSIGN` matches whose `IDENTIFIER` also matches the first `IDENTIFIER` in `EXPORT_STAR_LIB`.
diff --git a/deps/cjs-module-lexer/dist/lexer.js b/deps/cjs-module-lexer/dist/lexer.js
index a1466ee81ae77d..4ac468b84952a4 100644
--- a/deps/cjs-module-lexer/dist/lexer.js
+++ b/deps/cjs-module-lexer/dist/lexer.js
@@ -1 +1 @@
-"use strict";exports.parse=parse;exports.init=init;const A=new Set(["implements","interface","let","package","private","protected","public","static","yield","enum"]);let Q;const B=1===new Uint8Array(new Uint16Array([1]).buffer)[0];function parse(g,I="@"){if(!Q)throw new Error("Not initialized");const D=g.length+1,N=(Q.__heap_base.value||Q.__heap_base)+4*D-Q.memory.buffer.byteLength;N>0&&Q.memory.grow(Math.ceil(N/65536));const k=Q.sa(D);if((B?C:E)(g,new Uint16Array(Q.memory.buffer,k,D)),!Q.parseCJS(k,g.length,0,0,0))throw Object.assign(new Error(`Parse error ${I}${Q.e()}:${g.slice(0,Q.e()).split("\n").length}:${Q.e()-g.lastIndexOf("\n",Q.e()-1)}`),{idx:Q.e()});let o=new Set,K=new Set,w=new Set;for(;Q.rre();)K.add(g.slice(Q.res(),Q.ree()));for(;Q.ru();)w.add(g.slice(Q.us(),Q.ue()));for(;Q.re();){let B=g.slice(Q.es(),Q.ee());A.has(B)||w.has(B)||o.add(B)}return{exports:[...o],reexports:[...K]}}function E(A,Q){const B=A.length;let E=0;for(;E>>8}}function C(A,Q){const B=A.length;let E=0;for(;E{const A=await WebAssembly.compile((B="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vKABEChB5gBHDQJBACgCvKABIgBBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQJEUNAkEAIABBEGoiADYCvKABAkAQKCIEQShGDQAgAEEAKAK8oAFGDQMgBBAuRQ0DCxAoIQALIABBKEcNAUEAQQAoArygAUECajYCvKABEChBKUcNAUEAQQAoArygAUECajYCvKABEChB+wBHDQFBAEEAKAK8oAFBAmo2ArygARAoQfIARw0BQQAoArygASIAQQJqQeUAQfQAQfUAQfIAQe4AEBNFDQFBACAAQQxqNgK8oAEQKBAuRQ0BAkACQAJAECgiAEHbAEYNACAAQS5HDQJBAEEAKAK8oAFBAmo2ArygARAoEC4NAQwEC0EAQQAoArygAUECajYCvKABAkACQBAoIgBBIkYNACAAQSdHDQUQHQwBCxAVC0EAQQAoArygAUECajYCvKABEChB3QBHDQNBAEEAKAK8oAFBAmo2ArygAQsQKCEACwJAIABBO0cNAEEAQQAoArygAUECajYCvKABECghAAsgAEH9AEcNAUEAQQAoArygAUECajYCvKABAkAQKCIAQSxHDQBBAEEAKAK8oAFBAmo2ArygARAoIQALIABB/QBHDQFBAEEAKAK8oAFBAmo2ArygARAoQSlHDQEgAyACQQAoApwfEQAADwsgAkHrAEcNASAARQ0BQQAoArygASIALwECQeUARw0BIAAvAQRB+QBHDQEgAC8BBkHzAEcNASAAQQZqIQFBACAAQQhqNgK8oAEQKEEoRw0BQQBBACgCvKABQQJqNgK8oAEQKCEAQQAoArygASECIAAQLkUNAUEAKAK8oAEhABAoQSlHDQFBAEEAKAK8oAEiAUECajYCvKABEChBLkcNAUEAQQAoArygAUECajYCvKABEChB5gBHDQFBACgCvKABIgNBAmpB7wBB8gBBxQBB4QBB4wBB6AAQJ0UNAUEAIANBDmo2ArygARAoIQNBACgCvKABIgRBfmohASADQShHDQFBACAEQQJqNgK8oAEQKEHmAEcNAUEAKAK8oAEiA0ECakH1AEHuAEHjAEH0AEHpAEHvAEHuABAkRQ0BQQAgA0EQajYCvKABEChBKEcNAUEAQQAoArygAUECajYCvKABECghA0EAKAK8oAEhBCADEC5FDQFBACgCvKABIQMQKEEpRw0BQQBBACgC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BEEAIABBEGoiADYCvKABAkAQKCIFQShGDQAgAEEAKAK8oAFGDQUgBRAuRQ0FCxAoIQALIABBKEcNA0EAQQAoArygAUECajYCvKABEChBKUcNA0EAQQAoArygAUECajYCvKABEChB+wBHDQNBAEEAKAK8oAFBAmo2ArygARAoQfIARw0DQQAoArygASIAQQJqQeUAQfQAQfUAQfIAQe4AEBNFDQNBACAAQQxqNgK8oAEQKBpBACgCvKABIgAgAiAGEEINA0EAIAAgB0EBdGo2ArygARAoQdsARw0DQQBBACgCvKABQQJqNgK8oAEQKBpBACgCvKABIgAgBCADEEINA0EAIAAgCEEBdGo2ArygARAoQd0ARw0DQQBBACgCvKABQQJqNgK8oAECQBAoIgBBO0cNAEEAQQAoArygAUECajYCvKABECghAAsgAEH9AEcNA0EAQQAoArygAUECajYCvKABAkAQKCIAQSxHDQBBAEEAKAK8oAFBAmo2ArygARAoIQALIABB/QBHDQNBAEEAKAK8oAFBAmo2ArygARAoQSlHDQNBAEEAKAK8oAFBAmo2ArygARAoIgBBO0cNAUEAQQAoArygAUECajYCvKABCxAoIQALIABB/QBHDQFBAEEAKAK8oAFBAmo2ArygARAoQSlHDQFBACgCtKABIQRBgCAhAANAAkACQCAEIABGDQAgByAAQQxqKAIAIABBCGooAgAiA2tBAXVHDQEgAiADIAYQQg0BIAAoAgAgAEEEaigCAEEAKAKgHxEAAEEAIAE2ArygAQsPCyAAQRBqIQAMAAsLIAMgAkEAKAKkHxEAAAtBACABNgK8oAELlQEBBH9BACgCvKABIQBBACgCwKABIQECQANAIAAiAkECaiEAIAIgAU8NAQJAIAAvAQAiA0HcAEYNAAJAIANBdmoiAkEDTQ0AIANBIkcNAkEAIAA2ArygAQ8LIAIOBAIBAQICCyACQQRqIQAgAi8BBEENRw0AIAJBBmogACACLwEGQQpGGyEADAALC0EAIAA2ArygARAeC1MBBH9BACgCvKABQQJqIQBBACgCwKABIQECQANAIAAiAkF+aiABTw0BIAJBAmohACACLwEAQXZqIgNBA0sNACADDgQBAAABAQsLQQAgAjYCvKABC3wBAn9BAEEAKAK8oAEiAEECajYCvKABIABBBmohAEEAKALAoAEhAQNAAkACQAJAIABBfGogAU8NACAAQX5qLwEAQSpHDQIgAC8BAEEvRw0CQQAgAEF+ajYCvKABDAELIABBfmohAAtBACAANgK8oAEPCyAAQQJqIQAMAAsLdQEBfwJAAkAgAEFfaiIBQQVLDQBBASABdEExcQ0BCyAAQUZqQf//A3FBBkkNACAAQVhqQf//A3FBB0kgAEEpR3ENAAJAIABBpX9qIgFBA0sNACABDgQBAAABAQsgAEH9AEcgAEGFf2pB//8DcUEESXEPC0EBCz0BAX9BASEBAkAgAEH3AEHoAEHpAEHsAEHlABA1DQAgAEHmAEHvAEHyABA2DQAgAEHpAEHmABAsIQELIAELrQEBA39BASEBAkACQAJAAkACQAJAAkAgAC8BACICQUVqIgNBA00NACACQZt/aiIDQQNNDQEgAkEpRg0DIAJB+QBHDQIgAEF+akHmAEHpAEHuAEHhAEHsAEHsABA3DwsgAw4EAgEBBQILIAMOBAIAAAMCC0EAIQELIAEPCyAAQX5qQeUAQewAQfMAEDYPCyAAQX5qQeMAQeEAQfQAQeMAEC0PCyAAQX5qLwEAQT1GC+0DAQJ/QQAhAQJAIAAvAQBBnH9qIgJBE0sNAAJAAkACQAJAAkACQAJAAkAgAg4UAAECCAgICAgICAMECAgFCAYICAcACyAAQX5qLwEAQZd/aiICQQNLDQcCQAJAIAIOBAAJCQEACyAAQXxqQfYAQe8AECwPCyAAQXxqQfkAQekAQeUAEDYPCyAAQX5qLwEAQY1/aiICQQFLDQYCQAJAIAIOAgABAAsCQCAAQXxqLwEAIgJB4QBGDQAgAkHsAEcNCCAAQXpqQeUAEDgPCyAAQXpqQeMAEDgPCyAAQXxqQeQAQeUAQewAQeUAEC0PCyAAQX5qLwEAQe8ARw0FIABBfGovAQBB5QBHDQUCQCAAQXpqLwEAIgJB8ABGDQAgAkHjAEcNBiAAQXhqQekAQe4AQfMAQfQAQeEAQe4AEDcPCyAAQXhqQfQAQfkAECwPC0EBIQEgAEF+aiIAQekAEDgNBCAAQfIAQeUAQfQAQfUAQfIAEDUPCyAAQX5qQeQAEDgPCyAAQX5qQeQAQeUAQeIAQfUAQecAQecAQeUAEDkPCyAAQX5qQeEAQfcAQeEAQekAEC0PCwJAIABBfmovAQAiAkHvAEYNACACQeUARw0BIABBfGpB7gAQOA8LIABBfGpB9ABB6ABB8gAQNiEBCyABC4cBAQN/A0BBAEEAKAK8oAEiAEECaiIBNgK8oAECQAJAAkAgAEEAKALAoAFPDQAgAS8BACIBQaV/aiICQQFNDQICQCABQXZqIgBBA00NACABQS9HDQQMAgsgAA4EAAMDAAALEB4LDwsCQAJAIAIOAgEAAQtBACAAQQRqNgK8oAEMAQsQQRoMAAsLlQEBBH9BACgCvKABIQBBACgCwKABIQECQANAIAAiAkECaiEAIAIgAU8NAQJAIAAvAQAiA0HcAEYNAAJAIANBdmoiAkEDTQ0AIANBJ0cNAkEAIAA2ArygAQ8LIAIOBAIBAQICCyACQQRqIQAgAi8BBEENRw0AIAJBBmogACACLwEGQQpGGyEADAALC0EAIAA2ArygARAeCzgBAX9BAEEBOgDwH0EAKAK8oAEhAEEAQQAoAsCgAUECajYCvKABQQAgAEEAKAKYH2tBAXU2AuwfC84BAQV/QQAoArygASEAQQAoAsCgASEBA0AgACICQQJqIQACQAJAIAIgAU8NACAALwEAIgNBpH9qIgRBBE0NASADQSRHDQIgAi8BBEH7AEcNAkEAQQAvAYRAIgBBAWo7AYRAQQAoAqBgIABBAXRqQQAvAYhAOwEAQQAgAkEEajYCvKABQQBBAC8BhkBBAWoiADsBiEBBACAAOwGGQA8LQQAgADYCvKABEB4PCwJAAkAgBA4FAQICAgABC0EAIAA2ArygAQ8LIAJBBGohAAwACwvSAgEDf0EAQQAoArygASIBQQ5qNgK8oAECQAJAAkAQKCICQdsARg0AIAJBPUYNASACQS5HDQJBAEEAKAK8oAFBAmo2ArygARAoIQJBACgCvKABIQAgAhAuRQ0CQQAoArygASECEChBPUcNAiAAIAJBACgCnB8RAAAPC0EAQQAoArygAUECajYCvKABAkAQKCICQSdGDQAgAkEiRw0CC0EAQQAoArygASIAQQJqIgM2ArygASAALwECEC5FDQFBACgCvKABIgAvAQAgAkcNAUEAIABBAmo2ArygARAoQd0ARw0BQQBBACgCvKABQQJqNgK8oAEQKEE9Rw0BIAMgAEEAKAKcHxEAAAwBCyAARQ0AQQAoAqgfEQEAQQBBACgCvKABQQJqNgK8oAECQBAoIgJB8gBGDQAgAkH7AEcNARAvDwtBARAQGgtBACABQQxqNgK8oAELNgECf0EAQQAoArygAUEMaiIANgK8oAEQKCEBAkACQEEAKAK8oAEgAEcNACABEEBFDQELEB4LC2wBAX9BAEEAKAK8oAEiAEEMajYCvKABAkAQKEEuRw0AQQBBACgCvKABQQJqNgK8oAEQKEHlAEcNAEEAKAK8oAFBAmpB+ABB8ABB7wBB8gBB9ABB8wAQJ0UNAEEBECAPC0EAIABBCmo2ArygAQvpAQEBf0EAIRcCQCAALwEAIAFHDQAgAC8BAiACRw0AIAAvAQQgA0cNACAALwEGIARHDQAgAC8BCCAFRw0AIAAvAQogBkcNACAALwEMIAdHDQAgAC8BDiAIRw0AIAAvARAgCUcNACAALwESIApHDQAgAC8BFCALRw0AIAAvARYgDEcNACAALwEYIA1HDQAgAC8BGiAORw0AIAAvARwgD0cNACAALwEeIBBHDQAgAC8BICARRw0AIAAvASIgEkcNACAALwEkIBNHDQAgAC8BJiAURw0AIAAvASggFUcNACAALwEqIBZGIRcLIBcLUwEBf0EAIQgCQCAALwEAIAFHDQAgAC8BAiACRw0AIAAvAQQgA0cNACAALwEGIARHDQAgAC8BCCAFRw0AIAAvAQogBkcNACAALwEMIAdGIQgLIAgLpAEBBH9BAEEAKAK8oAEiAEEMaiIBNgK8oAECQAJAAkACQAJAECgiAkFZaiIDQQdNDQAgAkEiRg0CIAJB+wBGDQIMAQsCQCADDggCAAECAQEBAwILQQBBAC8BhkAiA0EBajsBhkBBACgCsKABIANBAnRqIAA2AgAPC0EAKAK8oAEgAUYNAgtBAC8BhkBFDQBBAEEAKAK8oAFBfmo2ArygAQ8LEB4LCzQBAX9BASEBAkAgAEF3akH//wNxQQVJDQAgAEGAAXJBoAFGDQAgAEEuRyAAEEBxIQELIAELSQEBf0EAIQcCQCAALwEAIAFHDQAgAC8BAiACRw0AIAAvAQQgA0cNACAALwEGIARHDQAgAC8BCCAFRw0AIAAvAQogBkYhBwsgBwt6AQN/QQAoArygASEAAkADQAJAIAAvAQAiAUF3akEFSQ0AIAFBIEYNACABQaABRg0AIAFBL0cNAgJAIAAvAQIiAEEqRg0AIABBL0cNAxAWDAELEBcLQQBBACgCvKABIgJBAmoiADYCvKABIAJBACgCwKABSQ0ACwsgAQs5AQF/AkAgAC8BACIBQYD4A3FBgLgDRw0AIABBfmovAQBB/wdxQQp0IAFB/wdxckGAgARqIQELIAELfQEBfwJAIABBL0sNACAAQSRGDwsCQCAAQTpJDQBBACEBAkAgAEHBAEkNACAAQdsASQ0BAkAgAEHgAEsNACAAQd8ARg8LIABB+wBJDQECQCAAQf//A0sNACAAQaoBSQ0BIAAQOg8LQQEhASAAEDsNACAAEDwhAQsgAQ8LQQELYwEBfwJAIABBwABLDQAgAEEkRg8LQQEhAQJAIABB2wBJDQACQCAAQeAASw0AIABB3wBGDwsgAEH7AEkNAAJAIABB//8DSw0AQQAhASAAQaoBSQ0BIAAQPQ8LIAAQOyEBCyABC0wBA39BACEDAkAgAEF+aiIEQQAoApgfIgVJDQAgBC8BACABRw0AIAAvAQAgAkcNAAJAIAQgBUcNAEEBDwsgAEF8ai8BABAmIQMLIAMLZgEDf0EAIQUCQCAAQXpqIgZBACgCmB8iB0kNACAGLwEAIAFHDQAgAEF8ai8BACACRw0AIABBfmovAQAgA0cNACAALwEAIARHDQACQCAGIAdHDQBBAQ8LIABBeGovAQAQJiEFCyAFC4UBAQJ/IAAQPyIAECshAQJAAkAgAEHcAEYNAEEAIQIgAUUNAQtBACgCvKABQQJBBCAAQYCABEkbaiEAAkADQEEAIAA2ArygASAALwEAED8iAUUNAQJAIAEQKkUNACAAQQJBBCABQYCABEkbaiEADAELC0EAIQIgAUHcAEYNAQtBASECCyACC/YDAQR/QQAoArygASIAQX5qIQEDQEEAIABBAmo2ArygAQJAAkACQCAAQQAoAsCgAU8NABAoIQBBACgCvKABIQICQAJAIAAQLkUNAEEAKAK8oAEhAwJAAkAQKCIAQTpHDQBBAEEAKAK8oAFBAmo2ArygARAoEC5FDQFBACgCvKABLwEAIQALIAIgA0EAKAKcHxEAAAwCC0EAIAE2ArygAQ8LAkACQCAAQSJGDQAgAEEuRg0BIABBJ0cNBAtBAEEAKAK8oAEiAkECaiIDNgK8oAEgAi8BAhAuRQ0BQQAoArygASICLwEAIABHDQFBACACQQJqNgK8oAEQKCIAQTpHDQFBAEEAKAK8oAFBAmo2ArygAQJAECgQLkUNAEEAKAK8oAEvAQAhACADIAJBACgCnB8RAAAMAgtBACABNgK8oAEPC0EAKAK8oAEiAC8BAkEuRw0CIAAvAQRBLkcNAkEAIABBBmo2ArygAQJAAkACQCAALwEGIgBB8gBHDQBBARAQIQBBACgCvKABIQIgAA0BIAIvAQAhAAsgAEH//wNxEC4NAUEAIAE2ArygAQ8LQQAgAkECajYCvKABCxAoIQALIABB//8DcSIAQSxGDQIgAEH9AEYNAEEAIAE2ArygAQsPC0EAIAE2ArygAQ8LQQAoArygASEADAALC48BAQF/QQAhDgJAIAAvAQAgAUcNACAALwECIAJHDQAgAC8BBCADRw0AIAAvAQYgBEcNACAALwEIIAVHDQAgAC8BCiAGRw0AIAAvAQwgB0cNACAALwEOIAhHDQAgAC8BECAJRw0AIAAvARIgCkcNACAALwEUIAtHDQAgAC8BFiAMRw0AIAAvARggDUYhDgsgDguoAQECf0EAIQFBACgCvKABIQICQAJAIABB7QBHDQAgAkECakHvAEHkAEH1AEHsAEHlABATRQ0BQQAgAkEMajYCvKABAkAQKEEuRg0AQQAhAQwCC0EAQQAoArygAUECajYCvKABECghAAsgAEHlAEcNAEEAKAK8oAEiAEEOaiACIABBAmpB+ABB8ABB7wBB8gBB9ABB8wAQJyIBGyECC0EAIAI2ArygASABC2cBAX9BACEKAkAgAC8BACABRw0AIAAvAQIgAkcNACAALwEEIANHDQAgAC8BBiAERw0AIAAvAQggBUcNACAALwEKIAZHDQAgAC8BDCAHRw0AIAAvAQ4gCEcNACAALwEQIAlGIQoLIAoLcQEBf0EAIQsCQCAALwEAIAFHDQAgAC8BAiACRw0AIAAvAQQgA0cNACAALwEGIARHDQAgAC8BCCAFRw0AIAAvAQogBkcNACAALwEMIAdHDQAgAC8BDiAIRw0AIAAvARAgCUcNACAALwESIApGIQsLIAsLgwQBAn9BACECAkAQKEHPAEcNAEEAIQJBACgCvKABIgNBAmpB4gBB6gBB5QBB4wBB9AAQE0UNAEEAIQJBACADQQxqNgK8oAEQKEEuRw0AQQBBACgCvKABQQJqNgK8oAECQBAoIgNB8ABHDQBBACECQQAoArygASIDQQJqQfIAQe8AQfQAQe8AQfQAQfkAQfAAQeUAED5FDQFBACECQQAgA0ESajYCvKABEChBLkcNAUEAQQAoArygAUECajYCvKABECghAwtBACECIANB6ABHDQBBACECQQAoArygASIDQQJqQeEAQfMAQc8AQfcAQe4AQdAAQfIAQe8AQfAAQeUAQfIAQfQAQfkAEDBFDQBBACECQQAgA0EcajYCvKABEChBLkcNAEEAIQJBAEEAKAK8oAFBAmo2ArygARAoQeMARw0AQQAhAkEAKAK8oAEiAy8BAkHhAEcNACADLwEEQewARw0AIAMvAQZB7ABHDQBBACECQQAgA0EIajYCvKABEChBKEcNAEEAIQJBAEEAKAK8oAFBAmo2ArygARAoEC5FDQAQKEEsRw0AQQAhAkEAQQAoArygAUECajYCvKABECgaQQAoArygASIDIAAgAUEBdCIBEEINAEEAIQJBACADIAFqNgK8oAEQKEEpRw0AQQBBACgCvKABQQJqNgK8oAFBASECCyACC0kBA39BACEGAkAgAEF4aiIHQQAoApgfIghJDQAgByABIAIgAyAEIAUQE0UNAAJAIAcgCEcNAEEBDwsgAEF2ai8BABAmIQYLIAYLWQEDf0EAIQQCQCAAQXxqIgVBACgCmB8iBkkNACAFLwEAIAFHDQAgAEF+ai8BACACRw0AIAAvAQAgA0cNAAJAIAUgBkcNAEEBDwsgAEF6ai8BABAmIQQLIAQLSwEDf0EAIQcCQCAAQXZqIghBACgCmB8iCUkNACAIIAEgAiADIAQgBSAGECdFDQACQCAIIAlHDQBBAQ8LIABBdGovAQAQJiEHCyAHCz0BAn9BACECAkBBACgCmB8iAyAASw0AIAAvAQAgAUcNAAJAIAMgAEcNAEEBDwsgAEF+ai8BABAmIQILIAILTQEDf0EAIQgCQCAAQXRqIglBACgCmB8iCkkNACAJIAEgAiADIAQgBSAGIAcQJEUNAAJAIAkgCkcNAEEBDwsgAEFyai8BABAmIQgLIAgL+RIBA38CQCAAED0NACAAQfS/f2pBAkkNACAAQbcBRg0AIABBgHpqQfAASQ0AIABB/XZqQQVJDQAgAEGHB0YNACAAQe90akEtSQ0AAkAgAEHBdGoiAUEISw0AQQEgAXRB7QJxDQELIABB8HNqQQtJDQAgAEG1c2pBH0kNAAJAIABBqnJqIgFBEksNAEEBIAF0Qf/8GXENAQsgAEHwDEYNACAAQZZyakEESQ0AIABBwHBqQQpJDQAgAEHacGpBC0kNACAAQdBxakEbSQ0AIABBkQ5GDQAgAEGQcmpBCkkNACAAQcJtakESSQ0AIABBxm1qQQNJDQAgAEGdbmpBIUkNACAAQa1uakEPSQ0AIABBp29qQQNJDQAgAEHXb2pBBUkNACAAQdtvakEDSQ0AIABB5W9qQQlJDQAgAEHqb2pBBEkNACAAQf0PRg0AIABBlXBqQQlJDQACQCAAQa9taiIBQRJLDQBBASABdEH/gBhxDQELIABBmm1qQQpJDQACQAJAIABBxGxqIgFBJ00NACAAQf9sakEDSQ0CDAELIAEOKAEAAQEBAQEBAQAAAQEAAAEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAQEBCyAAQf4TRg0AIABBmmxqQQpJDQACQCAAQcRraiIBQRVLDQBBASABdEH9sI4BcQ0BCyAAQf9rakEDSQ0AIABB9RRGDQAgAEGaa2pBDEkNAAJAAkAgAEHEamoiAUEnTQ0AIABB/2pqQQNJDQIMAQsgAQ4oAQABAQEBAQEBAQABAQEAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQELIABBmmpqQQpJDQAgAEGGampBBkkNAAJAAkAgAEHEaWoiAUEnTQ0AIABB/2lqQQNJDQIMAQsgAQ4oAQABAQEBAQEBAAABAQAAAQEBAAAAAAAAAAABAQAAAAAAAAAAAAABAQELIABBmmlqQQpJDQACQCAAQcJoaiIBQRlLDQBBASABdEGf7oMQcQ0BCyAAQYIXRg0AIABBmmhqQQpJDQACQAJAIABBwmdqIgFBJU0NACAAQYBoakEFSQ0CDAELIAEOJgEBAQEBAQEAAQEBAAEBAQEAAAAAAAAAAQEAAAAAAAAAAAAAAAEBAQsgAEGaZ2pBCkkNAAJAAkAgAEHEZmoiAUEnTQ0AIABB/2ZqQQNJDQIMAQsgAQ4oAQABAQEBAQEBAAEBAQABAQEBAAAAAAAAAAEBAAAAAAAAAAAAAAABAQELIABBmmZqQQpJDQAgAEF8cSICQYAaRg0AAkAgAEHFZWoiAUEoSw0AIAEOKQEBAAEBAQEBAQEAAQEBAAEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAEBAQsgAEGaZWpBCkkNAAJAIABBtmRqIgFBDEsNAEEBIAF0QeEvcQ0BCyAAQf5kakECSQ0AIABBeHFB2BtGDQAgAEGaZGpBCkkNAAJAIABBz2NqIgFBHUsNAEEBIAF0QfmHgP4DcQ0BCyAAQY5kakECSQ0AIABBsR1GDQAgAEGwY2pBCkkNAAJAIABBzGJqIgFBCEsNACABQQZHDQELIABBuGJqQQZJDQAgAEHgYWpBCkkNACAAQQFyIgFBmR5GDQAgAEGwYmpBCkkNAAJAIABBy2FqIgNBCksNAEEBIAN0QZUMcQ0BCyAAQfNgakELSQ0AIAFBhx9GDQAgAEGPYWpBFEkNACAAQe5RakEDSQ0AIABBl1lqQQlJDQAgAEGjWWpBA0kNACAAQfFeakEPSQ0AIABB/l5qQQxJDQAgAEGPX2pBBEkNACAAQZlfakEHSQ0AIABBnl9qQQNJDQAgAEGiX2pBA0kNACAAQapfakEESQ0AIABBwF9qQQpJDQAgAEHVX2pBFEkNACAAQcYfRg0AIABB52BqQSRJDQAgAEHOUWpBA0kNACAAQa5RakECSQ0AIABBjlFqQQJJDQAgAEH1T2pBA0kNACAAQaBQakEKSQ0AIABB3S9GDQAgAEHMUGpBIEkNACAAQbBGakEDSQ0AIABBsEdqQQpJDQAgAEHAR2pBCkkNACAAQdxHakEUSQ0AIABBmkhqQQ5JDQAgAEHQSGpBCkkNACAAQd9IakENSQ0AIABBgElqQQNJDQAgAEGVSWpBCUkNACAAQbBJakEKSQ0AIABBzElqQRFJDQAgAEGASmpBBUkNACAAQdBKakEOSQ0AIABB8EpqQQpJDQAgAEGBS2pBC0kNACAAQaBLakEdSQ0AIABBq0tqQQpJDQAgAEHpS2pBBUkNACAAQbBMakELSQ0AIABBuk1qQQpJDQAgAEHQTWpBDEkNACAAQeBNakEMSQ0AIABBqTFGDQAgAEHwT2pBCkkNACAAQcBEakE6SQ0AIABBiUZqQQNJDQAgAEGORmpBA0kNACAAQe05Rg0AIABBrEZqQRVJDQAgAEGFRGpBBUkNAAJAIABBwb9/aiIBQRVLDQBBASABdEGDgIABcQ0BCyAAQZu+f2pBDEkNACAAQeHBAEYNACAAQbC+f2pBDUkNACAAQZGmf2pBA0kNACAAQf/aAEYNACAAQWBxQeDbAEYNACAAQdaff2pBBkkNACAAQeeef2pBAkkNACAAQYyzfWpBCkkNACAAQe/MAkYNACAAQeCzfWpBCkkNAAJAIABB9a99aiIBQRxLDQBBASABdEGBgID4AXENAQsgAEHisn1qQQJJDQAgAEGQsn1qQQJJDQACQAJAIABB/q99aiIBQQRNDQAgAEGAr31qQQJJDQIMAQsgAQ4FAQAAAAEBCyAAQc2sfWpBDkkNACACQYDTAkYNACAAQbmtfWpBDUkNACAAQdqtfWpBCEkNACAAQYGufWpBC0kNACAAQaCufWpBEkkNACAAQcyufWpBEkkNACAAQbCufWpBCkkNACAAQderfWpBDkkNACAAQeXTAkYNACAAQV9xQbCsfWpBCkkNAAJAIABBvat9aiIBQQpLDQBBASABdEGBDHENAQsgAEGwq31qQQpJDQACQCAAQZ2ofWoiAUEKSw0AIAFBCEcNAQsCQCAAQdCqfWoiAUERSw0AQQEgAXRBnYMLcQ0BCwJAIABBlap9aiIBQQtLDQBBASABdEGfGHENAQsgAEGFq31qQQNJDQAgAEFwcSIBQYD8A0YNACAAQZ72A0YNACAAQZCofWpBCkkNACAAQb/+A0YgAEHwgXxqQQpJIABBs4N8akEDSSAAQc2DfGpBAkkgAUGg/ANGcnJycg8LQQELXAEEf0GAgAQhAUGQCCECQX4hAwJAA0BBACEEIANBAmoiA0HnA0sNASACKAIAIAFqIgEgAEsNASACQQRqIQQgAkEIaiECIAQoAgAgAWoiASAASQ0AC0EBIQQLIAQLXAEEf0GAgAQhAUGwFyECQX4hAwJAA0BBACEEIANBAmoiA0H5AUsNASACKAIAIAFqIgEgAEsNASACQQRqIQQgAkEIaiECIAQoAgAgAWoiASAASQ0AC0EBIQQLIAQL7R8BBn9BASEBAkACQAJAIABB1n5qIgJBEEsNAEEBIAJ0QYGQBHENAQsgAEG6empBDEkNACAAQYh+akHKA0kNACAAQcB+akEXSQ0AIABBqH5qQR9JDQACQCAAQZB5aiICQRxLDQBBASACdEHf+YK6AXENAQsCQCAAQaB6aiICQQ5LDQBBASACdEGfoAFxDQELIABB9nZqQaYBSQ0AIABBiXhqQYsBSQ0AIABB8nhqQRRJDQAgAEHdeGpB0wBJDQAgAEGRdGpBBEkNACAAQbB0akEbSQ0AIABBoHVqQSlJDQAgAEHZCkYNACAAQc91akEmSQ0AAkACQAJAIABBj3NqQeMASQ0AIABBAXIiAkHvDEYNACAAQeBzakErSQ0AAkAgAEGrcmoiAUE8Tw0AQoGAjLCAnIGACCABrYhCAYNQRQ0BCyAAQe5xakEeSQ0AIABBtnBqQSFJDQAgAEGxD0YNACAAQbNxakHZAEkNAAJAIABBjHBqIgFBBksNAEEBIAF0QcMAcQ0BCyAAQYBwakEWSQ0AAkACQCAAQdxvaiIDQQRNDQAgAEGaEEYNAgwBC0EBIQEgAw4FBAAAAAQECyAAQfxtakE2SQ0AIABBym5qQQhJDQAgAEHgbmpBFUkNACAAQcBvakEZSQ0AIABBoG9qQQtJDQAgAEG9EkYNACAAQdASRg0AIABBqG1qQQpJDQAgAEGPbWpBEEkNAAJAIABB+2xqIgNBDE8NAEEBIQFB/xkgA0H//wNxdkEBcQ0ECyAAQe1sakEWSQ0AAkAgAEGEbGoiAUEUSw0AQQEgAXRBgfzhAHENAQsgAEHWbGpBB0kNAAJAIABBzmxqIgFBHEsNAEEBIAF0QfGRgIABcQ0BCwJAIABBpGxqIgFBFUsNAEEBIAF0QbuAwAFxDQELIABB7WtqQRZJDQACQCAAQdZraiIBQTVPDQBC/7aDgICA4AsgAa2IQgGDUEUNAQsgAEHtampBFkkNACAAQfFqakEDSQ0AIABBjmtqQQNJDQAgAEH7ampBCUkNAAJAAkACQCAAQdZqaiIDQSZNDQAgAEGHamoiAUEXSw0BQQEgAXRBgeC/BnFFDQEMAwtBASEBIAMOJwUFBQUFBQUBBQUBBQUFBQUBAQEFAQEBAQEBAQEBAQEBAQEBAQEBBQULIABBoGpqQQJJDQELIABB7WlqQRZJDQACQAJAAkAgAEGPaWoiA0EzTQ0AIABB1mlqIgFBE0sNAUEBIAF0Qf/2I3FFDQEMAwtBASEBIAMONAUBAQEBAQEBAQEBAQEBAQEBAQUBBQUFBQUFAQEBBQUFAQUFBQUBAQEFBQEFAQUFAQEBBQUFCyAAQaRpaiIBQQVLDQAgAUECRw0BCyAAQdhoakEDSQ0AIABB7mdqQRdJDQAgAEHyZ2pBA0kNACAAQftnakEISQ0AIABB0BdGDQAgAEHSaGpBDEkNACAAQb0YRg0AIABB1mdqQRBJDQACQCAAQahnaiIBQSlPDQBCh4aAgIAgIAGtiEIBg1BFDQELIABB1mZqQQpJDQAgAEHuZmpBF0kNACAAQftmakEISQ0AIABB8mZqQQNJDQACQCAAQftlaiIBQQtLDQAgAUEIRw0BCwJAIABBy2ZqIgFBCEsNAEEBIAF0QZ8CcQ0BCwJAIABBomZqIgFBFEsNAEEBIAF0QY2A4ABxDQELIABB7mVqQSlJDQAgAEG9GkYNACAAQc4aRg0AIABBzWRqQQlJDQAgAEHmZGpBGEkNACAAQftkakESSQ0AIABBhmVqQQZJDQAgAEGsZWpBA0kNACAAQaFlakEDSQ0AAkAgAEHDZGoiA0EKTw0AQQEhAUH5ByADQf//A3F2QQFxDQQLIAJBsxxGDQAgAEH/Y2pBMEkNACAAQcBjakEHSQ0AAkAgAEH/YmoiAUEMSw0AQQEgAXRByyVxDQELIABBfHEiA0GUHUYNACAAQediakEHSQ0AAkAgAEHfYmoiAUEmTw0AQtfsm4D5BSABrYhCAYNQRQ0BCyAAQYBgakErSQ0AIABB+GBqQQVJDQAgAEG3YWpBJEkNACAAQXhxIgRBwB5GDQAgAEGAHkYNACADQdwdRg0AAkAgAEHBX2oiAUEoTw0AQoGA+MPHGCABrYhCAYNQRQ0BCyAAQZJfakEDSQ0AIABB4F5qQSZJDQAgAEGOIUYNACAAQYtfakENSQ0AIABBxyFGDQAgAEHNIUYNACAAQbZbakEESQ0AIABBsF5qQStJDQAgAEGEXmpBzQJJDQACQCAAQbBbaiIFQQlPDQBBASEBQf8CIAVB//8DcXZBAXENBAsgAEHOWmpBBEkNACAAQfBaakEhSQ0AIABB9lpqQQRJDQAgAEGmW2pBBEkNACAAQaBbakEpSQ0AAkAgAEHIWmoiBUEJTw0AQQEhAUH/AiAFQf//A3F2QQFxDQQLIABBgFFqQTRJDQAgAEGSUWpBA0kNACAAQaBRakENSQ0AIABBwFFqQRJJDQAgAEHgUWpBEkkNACAAQfJRakEESQ0AIABBgFJqQQ1JDQAgAEGSUmpBC0kNACAAQeBSakHLAEkNACAAQf9SakEaSQ0AIABBkVNqQRFJDQAgAEH/V2pB7ARJDQAgAEGIWGpBBkkNACAAQeBYakHWAEkNACAAQXBxIgVBgCdGDQAgAEHoWWpBwwBJDQAgAEHuWWpBBEkNACAAQahaakE5SQ0AIABBvlpqQQRJDQAgAEG4WmpBD0kNACAAQdcvRg0AIABB3C9GDQAgAEHgT2pB2QBJDQAgAEGATGpBF0kNACAAQdBMakEaSQ0AIABBgE1qQSxJDQAgAEGQTWpBBUkNACAAQbBNakEeSQ0AIABBgE5qQR9JDQAgAEHQTmpBxgBJDQAgAEGqMUYNBCAAQYBPakEpSQ0EIABBu0lqQQdJDQQgAEH7SWpBL0kNBCAAQac1Rg0EIABB4EtqQTVJDQQgAEGXRmpBBEkNBCAAQcNGakEDSQ0EIABB8EZqQStJDQQgAEGAR2pBCUkNBCAAQaZHakEkSQ0EIABBs0dqQQNJDQQgAEGASGpBJEkNBCAAQcZIakEsSQ0EIAJBrzdGDQQgAEH9SGpBHkkNBCAAQZJGaiIGQQlJDQEMAgtBASEBDAILQQEhAUGPAyAGQf//A3F2QQFxDQELIARB0D5GDQEgAEG4QWpBBkkNASAAQeBBakEmSQ0BIABB6EFqQQZJDQEgAEGARmpBwAFJDQEgAEGARGpBlgJJDQECQCAAQadBaiIBQQRLDQBBASABdEEVcQ0CCyAAQaFBakEfSQ0BIABBgEFqQTVJDQECQCAAQcpAaiIEQQlPDQBBASEBQf8CIARB//8DcXZBAXENAQsgAEGOQGpBA0kNASAAQaBAakENSQ0BIABBqkBqQQZJDQEgA0HQP0YNASAAQb5AakEDSQ0BIABBukBqQQdJDQEgAEGKQGpBB0kNASAAQfHAAEYNASAAQf/AAEYNASAAQfC+f2pBDUkNASAAQYLCAEYNASAAQYfCAEYNASAAQZXCAEYNASAAQfa9f2pBCkkNAQJAIABB6L1/aiIEQRFPDQBBASEBQb+gBSAEdkEBcQ0BCyAAQda9f2pBEEkNASADQbzCAEYNAQJAIABBu71/aiIEQQpPDQBBASEBQZ8EIARB//8DcXZBAXENAQsgAEGgp39qQYUBSQ0BIABB0Kd/akEvSQ0BIABBoL1/akEpSQ0BIABBgKh/akEvSQ0BAkAgAEGVpn9qIgRBCU8NAEEBIQFBjwMgBEH//wNxdkEBcQ0BCyAAQYCmf2pBJkkNASAAQafaAEYNASAAQa3aAEYNASAAQYC2fWpBjQJJDQEgAEGwtn1qQS5JDQEgAEGAwH1qQY0JSQ0BIABBgOR+akHwowFJDQEgAEGAmH9qQbYzSQ0BIAVB8OMARg0BIABB4Jx/akEbSQ0BIABBz51/akHeAEkNASAAQfudf2pBK0kNASADQfzhAEYNASAAQd+ef2pB2gBJDQEgAEHlnn9qQQVJDQEgAEG/n39qQdYASQ0BIABByJ9/akEFSQ0BIABBz59/akEFSQ0BIABB359/akEJSQ0BIABB+59/akEDSQ0BIABBqKR/akEHSQ0BIABBsKR/akEHSQ0BIABBuKR/akEHSQ0BIABBwKR/akEHSQ0BIABByKR/akEHSQ0BIABB0KR/akEHSQ0BIABB2KR/akEHSQ0BIABB4KR/akEHSQ0BIABBgKV/akEXSQ0BIABB79oARg0BIABB0KV/akE4SQ0BIABB/q59akEySQ0BIABBwK99akE0SQ0BIABB9K99akEXSQ0BIABB+a99akEESQ0BIABB/a99akEDSQ0BIABBibB9akELSQ0BIABB9bB9akEvSQ0BIABB3rF9akHnAEkNASAAQemxfWpBCUkNASAAQeCyfWpB0ABJDQEgAEGBs31qQR9JDQEgAEHAs31qQS9JDQEgAkGrzAJGDQEgBUGQzAJGDQECQCAAQY6ufWoiAkENTw0AQQEhAUG/NCACQf//A3F2QQFxDQELIABBoK19akEdSQ0BIABB9q19akEcSQ0BIABB0K19akEXSQ0BIABBvKt9akEISQ0BIABBwKt9akEDSQ0BIABBgKx9akEpSQ0BIABBhqx9akEFSQ0BIABBmqx9akEKSQ0BIABBoKx9akEFSQ0BIABBz9MCRg0BIABB/Kx9akEvSQ0BIABBgqt9akEySQ0BIABB+tQCRg0BIABBoKt9akEXSQ0BAkAgAEHPqn1qIgJBEk8NAEEBIQFBsb4KIAJ2QQFxDQELIABBgIp8akEHSQ0BIABBkIt8akHqAEkNASAAQYCOfGpB7gJJDQEgAEG10HxqQTFJDQEgAEHQ0HxqQRdJDQEgAEGAqH1qQaTXAEkNASAAQZCpfWpB8wBJDQEgAEGkqX1qQQpJDQEgAEHQqX1qQStJDQEgAEHYqX1qQQdJDQEgAEHgqX1qQQdJDQEgAEHvqX1qQQZJDQEgAEF3cUH/qX1qQQZJDQEgAEGOqn1qQQNJDQEgAEGlqn1qQQNJDQEgAEGgqn1qQQtJDQECQCAAQe2JfGoiAkELTw0AQQEhAUGfCCACQf//A3F2QQFxDQELIABB4Yl8akEKSQ0BIABB1ol8akENSQ0BAkAgAEHIiXxqIgJBDU8NAEEBIQFB3zYgAkH//wNxdkEBcQ0BCyAAQa6AfGpBBkkNASAAQbaAfGpBBkkNASAAQb6AfGpBBkkNASAAQZqBfGpB2QBJDQEgAEG/gXxqQRpJDQEgAEHfgXxqQRpJDQEgAEGKg3xqQYcBSQ0BIABBkIN8akEFSQ0BIABBkIR8akEMSQ0BIABB7oR8akE2SQ0BIABBsIV8akHAAEkNASAAQbqJfGpB7ABJDQFBASEBIABBrYh8akHrAkkNACAAQaaAfGpBA0kPCyABDwtBAQtdAQF/QQAhCQJAIAAvAQAgAUcNACAALwECIAJHDQAgAC8BBCADRw0AIAAvAQYgBEcNACAALwEIIAVHDQAgAC8BCiAGRw0AIAAvAQwgB0cNACAALwEOIAhGIQkLIAkLNQACQCAAQYD4A3FBgLADRw0AIABBCnRBgPg/cUEAKAK8oAEvAQJB/wdxckGAgARqIQALIAALaAECf0EBIQECQAJAIABBX2oiAkEFSw0AQQEgAnRBMXENAQsgAEH4/wNxQShGDQAgAEFGakH//wNxQQZJDQACQCAAQaV/aiICQQNLDQAgAkEBRw0BCyAAQYV/akH//wNxQQRJIQELIAELjQEBBX9BACgCvKABIQBBACgCwKABIQEDfyAAQQJqIQICQAJAIAAgAU8NACACLwEAIgNBpH9qIgRBAU0NASACIQAgA0F2aiIDQQNLDQIgAiEAIAMOBAACAgAAC0EAIAI2ArygARAeQQAPCwJAAkAgBA4CAQABC0EAIAI2ArygAUHdAA8LIABBBGohAAwACwtJAQN/QQAhAwJAIAJFDQACQANAIAAtAAAiBCABLQAAIgVHDQEgAUEBaiEBIABBAWohACACQX9qIgINAAwCCwsgBCAFayEDCyADCwvCFwIAQYAIC5gXAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAgAAABkAAAACAAAAEgAAAAIAAAABAAAAAgAAAA4AAAADAAAADQAAACMAAAB6AAAARgAAADQAAAAMAQAAHAAAAAQAAAAwAAAAMAAAAB8AAAAOAAAAHQAAAAYAAAAlAAAACwAAAB0AAAADAAAAIwAAAAUAAAAHAAAAAgAAAAQAAAArAAAAnQAAABMAAAAjAAAABQAAACMAAAAFAAAAJwAAAAkAAAAzAAAAnQAAADYBAAAKAAAAFQAAAAsAAAAHAAAAmQAAAAUAAAADAAAAAAAAAAIAAAArAAAAAgAAAAEAAAAEAAAAAAAAAAMAAAAWAAAACwAAABYAAAAKAAAAHgAAAEIAAAASAAAAAgAAAAEAAAALAAAAFQAAAAsAAAAZAAAARwAAADcAAAAHAAAAAQAAAEEAAAAAAAAAEAAAAAMAAAACAAAAAgAAAAIAAAAcAAAAKwAAABwAAAAEAAAAHAAAACQAAAAHAAAAAgAAABsAAAAcAAAANQAAAAsAAAAVAAAACwAAABIAAAAOAAAAEQAAAG8AAABIAAAAOAAAADIAAAAOAAAAMgAAAA4AAAAjAAAAXQEAACkAAAAHAAAAAQAAAE8AAAAcAAAACwAAAAAAAAAJAAAAFQAAAGsAAAAUAAAAHAAAABYAAAANAAAANAAAAEwAAAAsAAAAIQAAABgAAAAbAAAAIwAAAB4AAAAAAAAAAwAAAAAAAAAJAAAAIgAAAAQAAAAAAAAADQAAAC8AAAAPAAAAAwAAABYAAAAAAAAAAgAAAAAAAAAkAAAAEQAAAAIAAAAYAAAAVQAAAAYAAAACAAAAAAAAAAIAAAADAAAAAgAAAA4AAAACAAAACQAAAAgAAAAuAAAAJwAAAAcAAAADAAAAAQAAAAMAAAAVAAAAAgAAAAYAAAACAAAAAQAAAAIAAAAEAAAABAAAAAAAAAATAAAAAAAAAA0AAAAEAAAAnwAAADQAAAATAAAAAwAAABUAAAACAAAAHwAAAC8AAAAVAAAAAQAAAAIAAAAAAAAAuQAAAC4AAAAqAAAAAwAAACUAAAAvAAAAFQAAAAAAAAA8AAAAKgAAAA4AAAAAAAAASAAAABoAAADmAAAAKwAAAHUAAAA/AAAAIAAAAAcAAAADAAAAAAAAAAMAAAAHAAAAAgAAAAEAAAACAAAAFwAAABAAAAAAAAAAAgAAAAAAAABfAAAABwAAAAMAAAAmAAAAEQAAAAAAAAACAAAAAAAAAB0AAAAAAAAACwAAACcAAAAIAAAAAAAAABYAAAAAAAAADAAAAC0AAAAUAAAAAAAAACMAAAA4AAAACAEAAAgAAAACAAAAJAAAABIAAAAAAAAAMgAAAB0AAABxAAAABgAAAAIAAAABAAAAAgAAACUAAAAWAAAAAAAAABoAAAAFAAAAAgAAAAEAAAACAAAAHwAAAA8AAAAAAAAASAEAABIAAAC+AAAAAAAAAFAAAACZAwAAZwAAAG4AAAASAAAAwwAAAL0KAAAuBAAA0g8AAEYCAAC6IQAAOAIAAAgAAAAeAAAAcgAAAB0AAAATAAAALwAAABEAAAADAAAAIAAAABQAAAAGAAAAEgAAALECAAA/AAAAgQAAAEoAAAAGAAAAAAAAAEMAAAAMAAAAQQAAAAEAAAACAAAAAAAAAB0AAAD3FwAACQAAANUEAAArAAAACAAAAPgiAAAeAQAAMgAAAAIAAAASAAAAAwAAAAkAAACLAQAABQkAAGoAAAAGAAAADAAAAAQAAAAIAAAACAAAAAkAAABnFwAAVAAAAAIAAABGAAAAAgAAAAEAAAADAAAAAAAAAAMAAAABAAAAAwAAAAMAAAACAAAACwAAAAIAAAAAAAAAAgAAAAYAAAACAAAAQAAAAAIAAAADAAAAAwAAAAcAAAACAAAABgAAAAIAAAAbAAAAAgAAAAMAAAACAAAABAAAAAIAAAAAAAAABAAAAAYAAAACAAAAUwEAAAMAAAAYAAAAAgAAABgAAAACAAAAHgAAAAIAAAAYAAAAAgAAAB4AAAACAAAAGAAAAAIAAAAeAAAAAgAAABgAAAACAAAAHgAAAAIAAAAYAAAAAgAAAAcAAAA1CQAALAAAAAsAAAAGAAAAEQAAAAAAAAByAQAAKwAAABUFAADEAAAAPAAAAEMAAAAIAAAAAAAAALUEAAADAAAAAgAAABoAAAACAAAAAQAAAAIAAAAAAAAAAwAAAAAAAAACAAAACQAAAAIAAAADAAAAAgAAAAAAAAACAAAAAAAAAAcAAAAAAAAABQAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAgAAAAIAAAACAAAAAQAAAAIAAAAAAAAAAwAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAABAAAAAgAAAAAAAAADAAAAAwAAAAIAAAAGAAAAAgAAAAMAAAACAAAAAwAAAAIAAAAAAAAAAgAAAAkAAAACAAAAEAAAAAYAAAACAAAAAgAAAAQAAAACAAAAEAAAAEURAADdpgAAIwAAADQQAAAMAAAA3QAAAAMAAACBFgAADwAAADAdAAAgDAAAHQIAAOMFAABKEwAA/QEAAAAAAADjAAAAAAAAAJYAAAAEAAAAJgEAAAkAAABYBQAAAgAAAAIAAAABAAAABgAAAAMAAAApAAAAAgAAAAUAAAAAAAAApgAAAAEAAAA+AgAAAwAAAAkAAAAJAAAAcgEAAAEAAACaAAAACgAAALAAAAACAAAANgAAAA4AAAAgAAAACQAAABAAAAADAAAALgAAAAoAAAA2AAAACQAAAAcAAAACAAAAJQAAAA0AAAACAAAACQAAAAYAAAABAAAALQAAAAAAAAANAAAAAgAAADEAAAANAAAACQAAAAMAAAACAAAACwAAAFMAAAALAAAABwAAAAAAAAChAAAACwAAAAYAAAAJAAAABwAAAAMAAAA4AAAAAQAAAAIAAAAGAAAAAwAAAAEAAAADAAAAAgAAAAoAAAAAAAAACwAAAAEAAAADAAAABgAAAAQAAAAEAAAAwQAAABEAAAAKAAAACQAAAAUAAAAAAAAAUgAAABMAAAANAAAACQAAANYAAAAGAAAAAwAAAAgAAAAcAAAAAQAAAFMAAAAQAAAAEAAAAAkAAABSAAAADAAAAAkAAAAJAAAAVAAAAA4AAAAFAAAACQAAAPMAAAAOAAAApgAAAAkAAABHAAAABQAAAAIAAAABAAAAAwAAAAMAAAACAAAAAAAAAAIAAAABAAAADQAAAAkAAAB4AAAABgAAAAMAAAAGAAAABAAAAAAAAAAdAAAACQAAACkAAAAGAAAAAgAAAAMAAAAJAAAAAAAAAAoAAAAKAAAALwAAAA8AAACWAQAABwAAAAIAAAAHAAAAEQAAAAkAAAA5AAAAFQAAAAIAAAANAAAAewAAAAUAAAAEAAAAAAAAAAIAAAABAAAAAgAAAAYAAAACAAAAAAAAAAkAAAAJAAAAMQAAAAQAAAACAAAAAQAAAAIAAAAEAAAACQAAAAkAAABKAQAAAwAAAGpLAAAJAAAAhwAAAAQAAAA8AAAABgAAABoAAAAJAAAA9gMAAAAAAAACAAAANgAAAAgAAAADAAAAUgAAAAAAAAAMAAAAAQAAAKxMAAABAAAAxxQAAAQAAAAEAAAABQAAAAkAAAAHAAAAAwAAAAYAAAAfAAAAAwAAAJUAAAACAAAAigUAADEAAAABAgAANgAAAAUAAAAxAAAACQAAAAAAAAAPAAAAAAAAABcAAAAEAAAAAgAAAA4AAABRBQAABgAAAAIAAAAQAAAAAwAAAAYAAAACAAAAAQAAAAIAAAAEAAAABgEAAAYAAAAKAAAACQAAAKMBAAANAAAA1wUAAAYAAABuAAAABgAAAAYAAAAJAAAAlxIAAAkAAAAHBQwA7wAAAABBmB8LHFCMAAABAAAAAgAAAAMAAAAEAAAAAAQAAPAfAAA=","undefined"!=typeof window&&"function"==typeof atob?Uint8Array.from(atob(B),A=>A.charCodeAt(0)):Buffer.from(B,"base64")));var B;const{exports:E}=await WebAssembly.instantiate(A);Q=E})())}
\ No newline at end of file
+"use strict";exports.parse=parse;exports.init=init;let A;const Q=1===new Uint8Array(new Uint16Array([1]).buffer)[0];function parse(g,I="@"){if(!A)throw new Error("Not initialized");const D=g.length+1,N=(A.__heap_base.value||A.__heap_base)+4*D-A.memory.buffer.byteLength;N>0&&A.memory.grow(Math.ceil(N/65536));const k=A.sa(D);if((Q?C:E)(g,new Uint16Array(A.memory.buffer,k,D)),!A.parseCJS(k,g.length,0,0,0))throw Object.assign(new Error(`Parse error ${I}${A.e()}:${g.slice(0,A.e()).split("\n").length}:${A.e()-g.lastIndexOf("\n",A.e()-1)}`),{idx:A.e()});let w=new Set,J=new Set,K=new Set;for(;A.rre();){const Q=B(g.slice(A.res(),A.ree()));Q&&J.add(Q)}for(;A.ru();)K.add(B(g.slice(A.us(),A.ue())));for(;A.re();){let Q=B(g.slice(A.es(),A.ee()));void 0===Q||K.has(Q)||w.add(Q)}return{exports:[...w],reexports:[...J]}}function B(A){if('"'!==A[0]&&"'"!==A[0])return A;try{const Q=(0,eval)(A);for(let A=0;A>>8}}function C(A,Q){const B=A.length;let E=0;for(;E{const Q=await WebAssembly.compile((B="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EBENACACLwEAQS5HDQELQQAgAkESajYCvKABAkAgAi8BEiIDQdMARw0AIAIvARRB9ABHDQEgAi8BFkHhAEcNASACLwEYQfIARw0BQQAgAkEaajYCvKABIAIvARohAwsgA0H//wNxQShHDQBBACgCsKABQQAoAoxANgIAQQBBATsBhkBBAEEAKAK8oAEiAkECajYCvKABIAIvAQJB8gBHDQBBAhAQGgtBAEEAKAK8oAE2AoxADAELAkAgAkEEakHtAEHwAEHvAEHyAEH0ABATRQ0AIAAQEUUNABAkQQAoArygASEAC0EAIAA2AoxAC0EAKALAoAEhA0EAKAK8oAEhAgwACwsgAgv3AQEEf0EAIQECQEEAKAK8oAEiAkECakHlAEHxAEH1AEHpAEHyAEHlABAmRQ0AQQAhAUEAIAJBDmo2ArygAQJAECdBKEcNAEEAQQAoArygAUECajYCvKABECchA0EAKAK8oAEhBAJAIANBJ0YNACADQSJHDQELIAMQHEEAQQAoArygAUECaiIDNgK8oAEQJ0EpRw0AAkAgAEF/aiIBQQFLDQACQAJAIAEOAgEAAQsgBCADQQAoAqAfEQAAQQEPCyAEIANBACgCoB8RAABBAQ8LQQAoArSgASAENgIAQQAoArSgASADNgIEQQEPC0EAIAI2ArygAQsgAQsdAAJAQQAoApgfIABHDQBBAQ8LIABBfmovAQAQJQv+AgEEf0EAKAKYHyEBAkADQCAAQX5qIQIgAC8BACIDQSBHDQEgACABSyEEIAIhACAEDQALCwJAIANBPUcNAAJAA0AgAkF+aiEAIAIvAQBBIEcNASACIAFLIQQgACECIAQNAAsLIABBAmohAiAAQQRqIQNBACEEAkADQCACECghACACIAFNDQEgAEUNASAAQdwARg0CIAAQKUUNASACQX5BfCAAQYCABEkbaiECIAAQKiEEDAALCyAEQQFxRQ0AIAIvAQBBIEcNAEEAKAK0oAEiBEEAKAKwH0YNACAEIAM2AgwgBCACQQJqNgIIIAJBfmohAEEgIQICQANAIABBAmogAU0NASACQf//A3FBIEcNASAALwEAIQIgAEF+aiEADAALCyACQf//A3FBjn9qIgJBAksNAAJAAkACQCACDgMAAwEACyAAQfYAQeEAECsNAQwCCyAAQewAQeUAECsNACAAQeMAQe8AQe4AQfMAECxFDQELQQAgBEEQajYCtKABCws/AQF/QQAhBgJAIAAvAQAgAUcNACAALwECIAJHDQAgAC8BBCADRw0AIAAvAQYgBEcNACAALwEIIAVGIQYLIAYLliYBCH9BAEEAKAK8oAEiAUEMajYCvKABIAFBCmohAQJAECdBLkcNAEEAQQAoArygAUECajYCvKABAkACQBAnIgJB5ABHDQBBACgCvKABIgBBAmpB5QBB5gBB6QBB7gBB5QBB0ABB8gBB7wBB8ABB5QBB8gBB9ABB+QAQL0UNAkEAIABBHGo2ArygASAAQRpqIQEQJ0EoRw0CQQBBACgCvKABQQJqNgK8oAEQJxAwRQ0CECdBLEcNAkEAQQAoArygAUECajYCvKABAkAQJyIAQSdGDQAgAEEiRw0DC0EAKAK8oAEhAiAAEBxBAEEAKAK8oAFBAmoiADYCvKABECdBLEcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygAQJAECciA0HlAEcNAEEAKAK8oAEiA0ECakHuAEH1AEHtAEHlAEHyAEHhAEHiAEHsAEHlABAxRQ0CQQAgA0EUajYCvKABECdBOkcNAkEAQQAoArygAUECajYCvKABECdB9ABHDQJBACgCvKABIgMvAQJB8gBHDQIgAy8BBEH1AEcNAiADLwEGQeUARw0CQQAgA0EIajYCvKABECdBLEcNAkEAQQAoArygAUECajYCvKABECchAwsCQCADQecARg0AIANB9gBHDQJBACgCvKABIgMvAQJB4QBHDQIgAy8BBEHsAEcNAiADLwEGQfUARw0CIAMvAQhB5QBHDQJBACADQQpqNgK8oAEQJ0E6Rw0CIAIgAEEAKAKcHxEAAEEAIAE2ArygAQ8LQQAoArygASIDLwECQeUARw0BIAMvAQRB9ABHDQFBACADQQZqNgK8oAECQBAnIgNBOkcNAEEAQQAoArygAUECajYCvKABECdB5gBHDQJBACgCvKABIgNBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQI0UNAkEAIANBEGoiAzYCvKABAkAQJyIEQShGDQAgA0EAKAK8oAFGDQMgBBAtRQ0DCxAnIQMLIANBKEcNAUEAQQAoArygAUECajYCvKABECdBKUcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygARAnQfIARw0BQQAoArygASIDQQJqQeUAQfQAQfUAQfIAQe4AEBNFDQFBACADQQxqNgK8oAEQJxAtRQ0BAkACQAJAECciA0HbAEYNACADQS5HDQJBAEEAKAK8oAFBAmo2ArygARAnEC0NAQwEC0EAQQAoArygAUECajYCvKABAkAQJyIDQSdGDQAgA0EiRw0ECyADEBxBAEEAKAK8oAFBAmo2ArygARAnQd0ARw0DQQBBACgCvKABQQJqNgK8oAELECchAwsCQCADQTtHDQBBAEEAKAK8oAFBAmo2ArygARAnIQMLIANB/QBHDQFBAEEAKAK8oAFBAmo2ArygAQJAECciA0EsRw0AQQBBACgCvKABQQJqNgK8oAEQJyEDCyADQf0ARw0BQQBBACgCvKABQQJqNgK8oAEQJ0EpRw0BIAIgAEEAKAKcHxEAAA8LIAJB6wBHDQEgAEUNAUEAKAK8oAEiAC8BAkHlAEcNASAALwEEQfkARw0BIAAvAQZB8wBHDQEgAEEGaiEBQQAgAEEIajYCvKABECdBKEcNAUEAQQAoArygAUECajYCvKABECchAEEAKAK8oAEhAiAAEC1FDQFBACgCvKABIQAQJ0EpRw0BQQBBACgCvKABIgFBAmo2ArygARAnQS5HDQFBAEEAKAK8oAFBAmo2ArygARAnQeYARw0BQQAoArygASIDQQJqQe8AQfIAQcUAQeEAQeMAQegAECZFDQFBACADQQ5qNgK8oAEQJyEDQQAoArygASIEQX5qIQEgA0EoRw0BQQAgBEECajYCvKABECdB5gBHDQFBACgCvKABIgNBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQI0UNAUEAIANBEGo2ArygARAnQShHDQFBAEEAKAK8oAFBAmo2ArygARAnIQNBACgCvKABIQQgAxAtRQ0BQQAoArygASEDECdBKUcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygARAnQekARw0BQQAoArygASIFLwECQeYARw0BQQAgBUEEajYCvKABECdBKEcNAUEAQQAoArygAUECajYCvKABECcaQQAoArygASIFIAQgAyAEayIDEEENASAAIAJrIgZBAXUhB0EAIAUgA0EBdSIIQQF0ajYCvKAB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AEHuABATRQ0DQQAgAEEMajYCvKABECcaQQAoArygASIAIAIgBhBBDQNBACAAIAdBAXRqNgK8oAEQJ0HbAEcNA0EAQQAoArygAUECajYCvKABECcaQQAoArygASIAIAQgAxBBDQNBACAAIAhBAXRqNgK8oAEQJ0HdAEcNA0EAQQAoArygAUECajYCvKABAkAQJyIAQTtHDQBBAEEAKAK8oAFBAmo2ArygARAnIQALIABB/QBHDQNBAEEAKAK8oAFBAmo2ArygAQJAECciAEEsRw0AQQBBACgCvKABQQJqNgK8oAEQJyEACyAAQf0ARw0DQQBBACgCvKABQQJqNgK8oAEQJ0EpRw0DQQBBACgCvKABQQJqNgK8oAEQJyIAQTtHDQFBAEEAKAK8oAFBAmo2ArygAQsQJyEACyAAQf0ARw0BQQBBACgCvKABQQJqNgK8oAEQJ0EpRw0BQQAoArSgASEEQYAgIQADQAJAAkAgBCAARg0AIAcgAEEMaigCACAAQQhqKAIAIgNrQQF1Rw0BIAIgAyAGEEENASAAKAIAIABBBGooAgBBACgCoB8RAABBACABNgK8oAELDwsgAEEQaiEADAALCyACIABBACgCpB8RAAALQQAgATYCvKABC1MBBH9BACgCvKABQQJqIQBBACgCwKABIQECQANAIAAiAkF+aiABTw0BIAJBAmohACACLwEAQXZqIgNBA0sNACADDgQBAAABAQsLQQAgAjYCvKABC3wBAn9BAEEAKAK8oAEiAEECajYCvKABIABBBmohAEEAKALAoAEhAQNAAkACQAJAIABBfGogAU8NACAAQX5qLwEAQSpHDQIgAC8BAEEvRw0CQQAgAEF+ajYCvKABDAELIABBfmohAAtBACAANgK8oAEPCyAAQQJqIQAMAAsLdQEBfwJAAkAgAEFfaiIBQQVLDQBBASABdEExcQ0BCyAAQUZqQf//A3FBBkkNACAAQVhqQf//A3FBB0kgAEEpR3ENAAJAIABBpX9qIgFBA0sNACABDgQBAAABAQsgAEH9AEcgAEGFf2pB//8DcUEESXEPC0EBCz0BAX9BASEBAkAgAEH3AEHoAEHpAEHsAEHlABA0DQAgAEHmAEHvAEHyABA1DQAgAEHpAEHmABArIQELIAELrQEBA39BASEBAkACQAJAAkACQAJAAkAgAC8BACICQUVq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IgRBACgCmB8iBUkNACAELwEAIAFHDQAgAC8BACACRw0AAkAgBCAFRw0AQQEPCyAAQXxqLwEAECUhAwsgAwtmAQN/QQAhBQJAIABBemoiBkEAKAKYHyIHSQ0AIAYvAQAgAUcNACAAQXxqLwEAIAJHDQAgAEF+ai8BACADRw0AIAAvAQAgBEcNAAJAIAYgB0cNAEEBDwsgAEF4ai8BABAlIQULIAULhQEBAn8gABA+IgAQKiEBAkACQCAAQdwARg0AQQAhAiABRQ0BC0EAKAK8oAFBAkEEIABBgIAESRtqIQACQANAQQAgADYCvKABIAAvAQAQPiIBRQ0BAkAgARApRQ0AIABBAkEEIAFBgIAESRtqIQAMAQsLQQAhAiABQdwARg0BC0EBIQILIAIL2gMBBH9BACgCvKABIgBBfmohAQNAQQAgAEECajYCvKABAkACQAJAIABBACgCwKABTw0AECchAEEAKAK8oAEhAgJAAkAgABAtRQ0AQQAoArygASEDAkACQBAnIgBBOkcNAEEAQQAoArygAUECajYCvKABECcQLUUNAUEAKAK8oAEvAQAhAAsgAiADQQAoApwfEQAADAILQQAgATYCvKABDwsCQAJAIABBIkYNACAAQS5GDQEgAEEnRw0EC0EAKAK8oAEhAiAAEBxBAEEAKAK8oAFBAmoiAzYCvKABECciAEE6Rw0BQQBBACgCvKABQQJqNgK8oAECQBAnEC1FDQBBACgCvKABLwEAIQAgAiADQQAoApwfEQAADAILQQAgATYCvKABDwtBACgCvKABIgAvAQJBLkcNAiAALwEEQS5HDQJBACAAQQZqNgK8oAECQAJAAkAgAC8BBiIAQfIARw0AQQEQECEAQQAoArygASECIAANASACLwEAIQALIABB//8DcRAtDQFBACABNgK8oAEPC0EAIAJBAmo2ArygAQsQJyEACyAAQf//A3EiAEEsRg0CIABB/QBGDQBBACABNgK8oAELDwtBACABNgK8oAEPC0EAKAK8oAEhAAwACwuPAQEBf0EAIQ4CQCAALwEAIAFHDQAgAC8BAiACRw0AIAAvAQQgA0cNACAALwEGIARHDQAgAC8BCCAFRw0AIAAvAQogBkcNACAALwEMIAdHDQAgAC8BDiAIRw0AIAAvARAgCUcNACAALwESIApHDQAgAC8BFCALRw0AIAAv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","undefined"!=typeof window&&"function"==typeof atob?Uint8Array.from(atob(B),A=>A.charCodeAt(0)):Buffer.from(B,"base64")));var B;const{exports:E}=await WebAssembly.instantiate(Q);A=E})())}
\ No newline at end of file
diff --git a/deps/cjs-module-lexer/dist/lexer.mjs b/deps/cjs-module-lexer/dist/lexer.mjs
index 42c77ef82ae71b..acb87e58e2cb71 100644
--- a/deps/cjs-module-lexer/dist/lexer.mjs
+++ b/deps/cjs-module-lexer/dist/lexer.mjs
@@ -1,2 +1,2 @@
-/* cjs-module-lexer 1.1.1 */
-const A=new Set(["implements","interface","let","package","private","protected","public","static","yield","enum"]);let Q;const B=1===new Uint8Array(new Uint16Array([1]).buffer)[0];export function parse(g,I="@"){if(!Q)throw new Error("Not initialized");const D=g.length+1,N=(Q.__heap_base.value||Q.__heap_base)+4*D-Q.memory.buffer.byteLength;N>0&&Q.memory.grow(Math.ceil(N/65536));const k=Q.sa(D);if((B?C:E)(g,new Uint16Array(Q.memory.buffer,k,D)),!Q.parseCJS(k,g.length,0,0,0))throw Object.assign(new Error(`Parse error ${I}${Q.e()}:${g.slice(0,Q.e()).split("\n").length}:${Q.e()-g.lastIndexOf("\n",Q.e()-1)}`),{idx:Q.e()});let o=new Set,K=new Set,w=new Set;for(;Q.rre();)K.add(g.slice(Q.res(),Q.ree()));for(;Q.ru();)w.add(g.slice(Q.us(),Q.ue()));for(;Q.re();){let B=g.slice(Q.es(),Q.ee());A.has(B)||w.has(B)||o.add(B)}return{exports:[...o],reexports:[...K]}}function E(A,Q){const B=A.length;let E=0;for(;E>>8}}function C(A,Q){const B=A.length;let E=0;for(;E{const A=await WebAssembly.compile((B="AGFzbQEAAAABrAERYAJ/fwBgAABgAX8Bf2AAAX9gBn9/f39/fwF/YAF/AGAXf39/f39/f39/f39/f39/f39/f39/f38Bf2AIf39/f39/f38Bf2AHf39/f39/fwF/YAN/f38Bf2AFf39/f38Bf2AOf39/f39/f39/f39/f38Bf2AKf39/f39/f39/fwF/YAt/f39/f39/f39/fwF/YAJ/fwF/YAR/f39/AX9gCX9/f39/f39/fwF/A0RDAgMDAwMDAwMDAwMAAAABBAICBQQFAQEBAgICAgEBAQEFAQEGBwECCAMCAgIJCgIBCwIMDQ4EDwgOBwICAgIQAgIDCQQFAXABBQUFAwEAAQYPAn8BQdCYAgt/AEHQmAILB1wOBm1lbW9yeQIAAnNhAAABZQABAmVzAAICZWUAAwNyZXMABANyZWUABQJ1cwAGAnVlAAcCcmUACANycmUACQJydQAKCHBhcnNlQ0pTAA8LX19oZWFwX2Jhc2UDAQkKAQBBAQsECwwNDgqupAFDeAEBf0EAKAKYHyIBIABBAXRqIgBBADsBAEEAIABBAmoiADYC5B9BACAANgLoH0EAQQA2AsAfQQBBADYCyB9BAEEANgLEH0EAQQA2AswfQQBBADYC1B9BAEEANgLQH0EAQQA2AtgfQQBBADYC4B9BAEEANgLcHyABCwgAQQAoAuwfCxUAQQAoAsQfKAIAQQAoApgfa0EBdQsVAEEAKALEHygCBEEAKAKYH2tBAXULFQBBACgC0B8oAgBBACgCmB9rQQF1CxUAQQAoAtAfKAIEQQAoApgfa0EBdQsVAEEAKALcHygCAEEAKAKYH2tBAXULFQBBACgC3B8oAgRBACgCmB9rQQF1CyUBAX9BAEEAKALEHyIAQQhqQcAfIAAbKAIAIgA2AsQfIABBAEcLJQEBf0EAQQAoAtAfIgBBCGpBzB8gABsoAgAiADYC0B8gAEEARwslAQF/QQBBACgC3B8iAEEIakHYHyAAGygCACIANgLcHyAAQQBHC0gBAX9BACgCyB8iAkEIakHAHyACG0EAKALoHyICNgIAQQAgAjYCyB9BACACQQxqNgLoHyACQQA2AgggAiABNgIEIAIgADYCAAtIAQF/QQAoAtQfIgJBCGpBzB8gAhtBACgC6B8iAjYCAEEAIAI2AtQfQQAgAkEMajYC6B8gAkEANgIIIAIgATYCBCACIAA2AgALSAEBf0EAKALgHyICQQhqQdgfIAIbQQAoAugfIgI2AgBBACACNgLgH0EAIAJBDGo2AugfIAJBADYCCCACIAE2AgQgAiAANgIACxIAQQBBADYCzB9BAEEANgLUHwuoDwBBACABNgKAQEEAIAA2ApgfAkAgAkUNAEEAIAI2ApwfCwJAIANFDQBBACADNgKgHwsCQCAERQ0AQQAgBDYCpB8LQQBB//8DOwGIQEEAQaDAADYCoGBBAEGw4AA2ArCgAUEAQYAgNgK0oAFBAEEAKAKsHzYCjEBBACAAQX5qIgI2ArygAUEAIAIgAUEBdGoiAzYCwKABQQBBADsBhkBBAEEAOwGEQEEAQQA6AJBAQQBBADYC7B9BAEEAOgDwH0EAQQA6ALigAQJAAkAgAC8BAEEjRw0AIAAvAQJBIUcNAEEBIQIgAUECRg0BQQAgAEECajYCvKABIABBBGohAAJAA0AgACICQX5qIANPDQEgAkECaiEAIAIvAQBBdmoiAUEDSw0AIAEOBAEAAAEBCwtBACACNgK8oAELA0BBACACQQJqIgA2ArygAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAiADTw0AAkAgAC8BACIBQXdqIgNBF0sNAEEBIAN0QZ+AgARxDRcLAkACQAJAQQAvAYZAIgMNACABQaF/aiIEQQ5NDQQgAUFZaiIEQQhNDQUgAUGFf2oiBEECTQ0GIAFBIkYNAiABQc8ARg0BIAFB8gBHDRYCQEEAEBBFDQAgABARRQ0AIAIQEgtBAEEAKAK8oAE2AoxADBkLIAFBWWoiBEEITQ0GIAFBoH9qIgRBBU0NByABQYV/aiIEQQJNDQggAUEiRg0BIAFBzwBGDQAgAUHtAEcNFQwUCyACQQRqQeIAQeoAQeUAQeMAQfQAEBNFDRQgABARRQ0UIANFEBQMFAsQFQwTC0EALwGIQEH//wNGQQAvAYZARXFBAC0A8B9FcQ8LIAQODxIFEREOEQ8RERETEREREBILIAQOCQYMCBAQEBAQBQYLIAQOAwkPBwkLIAQOCQQKCQ4ODg4OAwQLIAQOBgENDQoNCwELIAQOAwYMAwYLQQAvAYhAQf7/A0YNAwwECwJAAkAgAi8BBCICQSpGDQAgAkEvRw0BEBYMDwsQFwwOCwJAAkACQAJAQQAoAoxAIgAvAQAiAhAYRQ0AIAJBVWoiA0EDSw0CAkACQAJAIAMOBAEFAgABCyAAQX5qLwEAQVBqQf//A3FBCkkNAwwECyAAQX5qLwEAQStGDQIMAwsgAEF+ai8BAEEtRg0BDAILAkACQCACQf0ARg0AIAJBL0YNASACQSlHDQJBACgCsKABIANBAnRqKAIAEBlFDQIMAwtBACgCsKABIANBAnRqKAIAEBoNAiADQdCgAWotAABFDQEMAgtBAC0AkEANAQsgABAbIQMgAkUNAEEBIQIgA0UNAQsQHEEAIQILQQAgAjoAkEAMCgsQHQwJC0EAIANBf2oiADsBhkACQCADQQAvAYhAIgJHDQBBAEEALwGEQEF/aiICOwGEQEEAQQAoAqBgIAJB//8DcUEBdGovAQA7AYhADAILIAJB//8DRg0IIABB//8DcSACTw0ICxAeQQAhAgwMCxAfDAYLIANB0KABakEALQC4oAE6AABBACADQQFqOwGGQEEAKAKwoAEgA0ECdGpBACgCjEA2AgBBAEEAOgC4oAEMBQtBACADQX9qOwGGQAwEC0EAIANBAWo7AYZAQQAoArCgASADQQJ0akEAKAKMQDYCAAwDCyAAEBFFDQIgAi8BBEHsAEcNAiACLwEGQeEARw0CIAIvAQhB8wBHDQIgAi8BCkHzAEcNAgJAAkAgAi8BDCIDQXdqIgJBF0sNAEEBIAJ0QZ+AgARxDQELIANBoAFHDQMLQQBBAToAuKABDAILIAJBBGpB+ABB8ABB7wBB8gBB9AAQE0UNASAAEBFFDQECQCACLwEOQfMARw0AQQAQIAwCCyADDQEQIQwBCyACQQRqQe8AQeQAQfUAQewAQeUAEBNFDQAgABARRQ0AECILQQBBACgCvKABNgKMQAwCCwJAAkAgAkEEaiIDQekAQe4AQfQAQeUAQfIAQe8AQfAAQdIAQeUAQfEAQfUAQekAQfIAQeUAQdcAQekAQewAQeQAQeMAQeEAQfIAQeQAECNFDQACQCAAEBENACACLwEAQS5HDQELQQAgAkEwajYCvKABIAIvATBBKEcNAUEAIAJBMmo2ArygAUEAQQE7AYZAQQAoArCgAUEAKAKMQDYCAEEAEBBFDQEgABARRQ0BIAIQEgwBCyADQd8AQeUAQfgAQfAAQe8AQfIAQfQAECRFDQACQCAAEBENACACLwEAQS5HDQELQQAgAkESajYCvKABAkAgAi8BEiIDQdMARw0AIAIvARRB9ABHDQEgAi8BFkHhAEcNASACLwEYQfIARw0BQQAgAkEaajYCvKABIAIvARohAwsgA0H//wNxQShHDQBBACgCsKABQQAoAoxANgIAQQBBATsBhkBBAEEAKAK8oAEiAkECajYCvKABIAIvAQJB8gBHDQBBAhAQGgtBAEEAKAK8oAE2AoxADAELAkAgAkEEakHtAEHwAEHvAEHyAEH0ABATRQ0AIAAQEUUNABAlQQAoArygASEAC0EAIAA2AoxAC0EAKALAoAEhA0EAKAK8oAEhAgwACwsgAgvrAgEEf0EAIQECQEEAKAK8oAEiAkECakHlAEHxAEH1AEHpAEHyAEHlABAnRQ0AQQAhAUEAIAJBDmo2ArygAQJAEChBKEcNAEEAQQAoArygAUECajYCvKABECghA0EAKAK8oAFBAmohBAJAIANBIkYNACADQSdHDQEQHUEAQQAoArygASIDQQJqNgK8oAEQKEEpRw0BAkAgAEF/aiIBQQFLDQACQAJAIAEOAgEAAQsgBCADQQAoAqAfEQAAQQEPCyAEIANBACgCoB8RAABBAQ8LQQAoArSgASAENgIAQQAoArSgASADNgIEQQEPCxAVQQBBACgCvKABIgNBAmo2ArygARAoQSlHDQACQCAAQX9qIgFBAUsNAAJAAkAgAQ4CAQABCyAEIANBACgCoB8RAABBAQ8LIAQgA0EAKAKgHxEAAEEBDwtBACgCtKABIAQ2AgBBACgCtKABIAM2AgRBAQ8LQQAgAjYCvKABCyABCx0AAkBBACgCmB8gAEcNAEEBDwsgAEF+ai8BABAmC/4CAQR/QQAoApgfIQECQANAIABBfmohAiAALwEAIgNBIEcNASAAIAFLIQQgAiEAIAQNAAsLAkAgA0E9Rw0AAkADQCACQX5qIQAgAi8BAEEgRw0BIAIgAUshBCAAIQIgBA0ACwsgAEECaiECIABBBGohA0EAIQQCQANAIAIQKSEAIAIgAU0NASAARQ0BIABB3ABGDQIgABAqRQ0BIAJBfkF8IABBgIAESRtqIQIgABArIQQMAAsLIARBAXFFDQAgAi8BAEEgRw0AQQAoArSgASIEQQAoArAfRg0AIAQgAzYCDCAEIAJBAmo2AgggAkF+aiEAQSAhAgJAA0AgAEECaiABTQ0BIAJB//8DcUEgRw0BIAAvAQAhAiAAQX5qIQAMAAsLIAJB//8DcUGOf2oiAkECSw0AAkACQAJAIAIOAwADAQALIABB9gBB4QAQLA0BDAILIABB7ABB5QAQLA0AIABB4wBB7wBB7gBB8wAQLUUNAQtBACAEQRBqNgK0oAELCz8BAX9BACEGAkAgAC8BACABRw0AIAAvAQIgAkcNACAALwEEIANHDQAgAC8BBiAERw0AIAAvAQggBUYhBgsgBgu3JgEIf0EAQQAoArygASIBQQxqNgK8oAEgAUEKaiEBAkAQKEEuRw0AQQBBACgCvKABQQJqNgK8oAECQAJAECgiAkHkAEcNAEEAKAK8oAEiAEECakHlAEHmAEHpAEHuAEHlAEHQAEHyAEHvAEHwAEHlAEHyAEH0AEH5ABAwRQ0CQQAgAEEcajYCvKABIABBGmohARAoQShHDQJBAEEAKAK8oAFBAmo2ArygARAoEDFFDQIQKEEsRw0CQQBBACgCvKABQQJqNgK8oAECQBAoIgBBJ0YNACAAQSJHDQMLQQBBACgCvKABIgJBAmoiAzYCvKABIAIvAQIQLkUNAkEAKAK8oAEiAi8BACAARw0CQQAgAkECajYCvKABEChBLEcNAUEAQQAoArygAUECajYCvKABEChB+wBHDQFBAEEAKAK8oAFBAmo2ArygAQJAECgiAEHlAEcNAEEAKAK8oAEiAEECakHuAEH1AEHtAEHlAEHyAEHhAEHiAEHsAEHlABAyRQ0CQQAgAEEUajYCvKABEChBOkcNAkEAQQAoArygAUECajYCvKABEChB9ABHDQJBACgCvKABIgAvAQJB8gBHDQIgAC8BBEH1AEcNAiAALwEGQeUARw0CQQAgAEEIajYCvKABEChBLEcNAkEAQQAoArygAUECajYCvKABECghAAsCQCAAQecARg0AIABB9gBHDQJBACgCvKABIgAvAQJB4QBHDQIgAC8BBEHsAEcNAiAALwEGQfUARw0CIAAvAQhB5QBHDQJBACAAQQpqNgK8oAEQKEE6Rw0CIAMgAkEAKAKcHxEAAEEAIAE2ArygAQ8LQQAoArygASIALwECQeUARw0BIAAvAQRB9ABHDQFBACAAQQZqNgK8oAECQBAoIgBBOkcNAEEAQQAoArygAUECajYCvKABEChB5gBHDQJBACgCvKABIgBBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQJEUNAkEAIABBEGoiADYCvKABAkAQKCIEQShGDQAgAEEAKAK8oAFGDQMgBBAuRQ0DCxAoIQALIABBKEcNAUEAQQAoArygAUECajYCvKABEChBKUcNAUEAQQAoArygAUECajYCvKABEChB+wBHDQFBAEEAKAK8oAFBAmo2ArygARAoQfIARw0BQQAoArygASIAQQJqQeUAQfQAQfUAQfIAQe4AEBNFDQFBACAAQQxqNgK8oAEQKBAuRQ0BAkACQAJAECgiAEHbAEYNACAAQS5HDQJBAEEAKAK8oAFBAmo2ArygARAoEC4NAQwEC0EAQQAoArygAUECajYCvKABAkACQBAoIgBBIkYNACAAQSdHDQUQHQwBCxAVC0EAQQAoArygAUECajYCvKABEChB3QBHDQNBAEEAKAK8oAFBAmo2ArygAQsQKCEACwJAIABBO0cNAEEAQQAoArygAUECajYCvKABECghAAsgAEH9AEcNAUEAQQAoArygAUECajYCvKABAkAQKCIAQSxHDQBBAEEAKAK8oAFBAmo2ArygARAoIQALIABB/QBHDQFBAEEAKAK8oAFBAmo2ArygARAoQSlHDQEgAyACQQAoApwfEQAADwsgAkHrAEcNASAARQ0BQQAoArygASIALwECQeUARw0BIAAvAQRB+QBHDQEgAC8BBkHzAEcNASAAQQZqIQFBACAAQQhqNgK8oAEQKEEoRw0BQQBBACgCvKABQQJqNgK8oAEQKCEAQQAoArygASECIAAQLkUNAUEAKAK8oAEhABAoQSlHDQFBAEEAKAK8oAEiAUECajYCvKABEChBLkcNAUEAQQAoArygAUECajYCvKABEChB5gBHDQFBACgCvKABIgNBAmpB7wBB8gBBxQBB4QBB4wBB6AAQJ0UNAUEAIANBDmo2ArygARAoIQNBACgCvKABIgRBfmohASADQShHDQFBACAEQQJqNgK8oAEQKEHmAEcNAUEAKAK8oAEiA0ECakH1AEHuAEHjAEH0AEHpAEHvAEHuABAkRQ0BQQAgA0EQajYCvKABEChBKEcNAUEAQQAoArygAUECajYCvKABECghA0EAKAK8oAEhBCADEC5FDQFBACgCvKABIQMQKEEpRw0BQQBBACgC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BEEAIABBEGoiADYCvKABAkAQKCIFQShGDQAgAEEAKAK8oAFGDQUgBRAuRQ0FCxAoIQALIABBKEcNA0EAQQAoArygAUECajYCvKABEChBKUcNA0EAQQAoArygAUECajYCvKABEChB+wBHDQNBAEEAKAK8oAFBAmo2ArygARAoQfIARw0DQQAoArygASIAQQJqQeUAQfQAQfUAQfIAQe4AEBNFDQNBACAAQQxqNgK8oAEQKBpBACgCvKABIgAgAiAGEEINA0EAIAAgB0EBdGo2ArygARAoQdsARw0DQQBBACgCvKABQQJqNgK8oAEQKBpBACgCvKABIgAgBCADEEINA0EAIAAgCEEBdGo2ArygARAoQd0ARw0DQQBBACgCvKABQQJqNgK8oAECQBAoIgBBO0cNAEEAQQAoArygAUECajYCvKABECghAAsgAEH9AEcNA0EAQQAoArygAUECajYCvKABAkAQKCIAQSxHDQBBAEEAKAK8oAFBAmo2ArygARAoIQALIABB/QBHDQNBAEEAKAK8oAFBAmo2ArygARAoQSlHDQNBAEEAKAK8oAFBAmo2ArygARAoIgBBO0cNAUEAQQAoArygAUECajYCvKABCxAoIQALIABB/QBHDQFBAEEAKAK8oAFBAmo2ArygARAoQSlHDQFBACgCtKABIQRBgCAhAANAAkACQCAEIABGDQAgByAAQQxqKAIAIABBCGooAgAiA2tBAXVHDQEgAiADIAYQQg0BIAAoAgAgAEEEaigCAEEAKAKgHxEAAEEAIAE2ArygAQsPCyAAQRBqIQAMAAsLIAMgAkEAKAKkHxEAAAtBACABNgK8oAELlQEBBH9BACgCvKABIQBBACgCwKABIQECQANAIAAiAkECaiEAIAIgAU8NAQJAIAAvAQAiA0HcAEYNAAJAIANBdmoiAkEDTQ0AIANBIkcNAkEAIAA2ArygAQ8LIAIOBAIBAQICCyACQQRqIQAgAi8BBEENRw0AIAJBBmogACACLwEGQQpGGyEADAALC0EAIAA2ArygARAeC1MBBH9BACgCvKABQQJqIQBBACgCwKABIQECQANAIAAiAkF+aiABTw0BIAJBAmohACACLwEAQXZqIgNBA0sNACADDgQBAAABAQsLQQAgAjYCvKABC3wBAn9BAEEAKAK8oAEiAEECajYCvKABIABBBmohAEEA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","undefined"!=typeof window&&"function"==typeof atob?Uint8Array.from(atob(B),A=>A.charCodeAt(0)):Buffer.from(B,"base64")));var B;const{exports:E}=await WebAssembly.instantiate(A);Q=E})())}
\ No newline at end of file
+/* cjs-module-lexer 1.2.1 */
+let A;const Q=1===new Uint8Array(new Uint16Array([1]).buffer)[0];export function parse(g,I="@"){if(!A)throw new Error("Not initialized");const D=g.length+1,N=(A.__heap_base.value||A.__heap_base)+4*D-A.memory.buffer.byteLength;N>0&&A.memory.grow(Math.ceil(N/65536));const k=A.sa(D);if((Q?C:E)(g,new Uint16Array(A.memory.buffer,k,D)),!A.parseCJS(k,g.length,0,0,0))throw Object.assign(new Error(`Parse error ${I}${A.e()}:${g.slice(0,A.e()).split("\n").length}:${A.e()-g.lastIndexOf("\n",A.e()-1)}`),{idx:A.e()});let w=new Set,J=new Set,K=new Set;for(;A.rre();){const Q=B(g.slice(A.res(),A.ree()));Q&&J.add(Q)}for(;A.ru();)K.add(B(g.slice(A.us(),A.ue())));for(;A.re();){let Q=B(g.slice(A.es(),A.ee()));void 0===Q||K.has(Q)||w.add(Q)}return{exports:[...w],reexports:[...J]}}function B(A){if('"'!==A[0]&&"'"!==A[0])return A;try{const Q=(0,eval)(A);for(let A=0;A>>8}}function C(A,Q){const B=A.length;let E=0;for(;E{const Q=await WebAssembly.compile((B="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EBENACACLwEAQS5HDQELQQAgAkESajYCvKABAkAgAi8BEiIDQdMARw0AIAIvARRB9ABHDQEgAi8BFkHhAEcNASACLwEYQfIARw0BQQAgAkEaajYCvKABIAIvARohAwsgA0H//wNxQShHDQBBACgCsKABQQAoAoxANgIAQQBBATsBhkBBAEEAKAK8oAEiAkECajYCvKABIAIvAQJB8gBHDQBBAhAQGgtBAEEAKAK8oAE2AoxADAELAkAgAkEEakHtAEHwAEHvAEHyAEH0ABATRQ0AIAAQEUUNABAkQQAoArygASEAC0EAIAA2AoxAC0EAKALAoAEhA0EAKAK8oAEhAgwACwsgAgv3AQEEf0EAIQECQEEAKAK8oAEiAkECakHlAEHxAEH1AEHpAEHyAEHlABAmRQ0AQQAhAUEAIAJBDmo2ArygAQJAECdBKEcNAEEAQQAoArygAUECajYCvKABECchA0EAKAK8oAEhBAJAIANBJ0YNACADQSJHDQELIAMQHEEAQQAoArygAUECaiIDNgK8oAEQJ0EpRw0AAkAgAEF/aiIBQQFLDQACQAJAIAEOAgEAAQsgBCADQQAoAqAfEQAAQQEPCyAEIANBACgCoB8RAABBAQ8LQQAoArSgASAENgIAQQAoArSgASADNgIEQQEPC0EAIAI2ArygAQsgAQsdAAJAQQAoApgfIABHDQBBAQ8LIABBfmovAQAQJQv+AgEEf0EAKAKYHyEBAkADQCAAQX5qIQIgAC8BACIDQSBHDQEgACABSyEEIAIhACAEDQALCwJAIANBPUcNAAJAA0AgAkF+aiEAIAIvAQBBIEcNASACIAFLIQQgACECIAQNAAsLIABBAmohAiAAQQRqIQNBACEEAkADQCACECghACACIAFNDQEgAEUNASAAQdwARg0CIAAQKUUNASACQX5BfCAAQYCABEkbaiECIAAQKiEEDAALCyAEQQFxRQ0AIAIvAQBBIEcNAEEAKAK0oAEiBEEAKAKwH0YNACAEIAM2AgwgBCACQQJqNgIIIAJBfmohAEEgIQICQANAIABBAmogAU0NASACQf//A3FBIEcNASAALwEAIQIgAEF+aiEADAALCyACQf//A3FBjn9qIgJBAksNAAJAAkACQCACDgMAAwEACyAAQfYAQeEAECsNAQwCCyAAQewAQeUAECsNACAAQeMAQe8AQe4AQfMAECxFDQELQQAgBEEQajYCtKABCws/AQF/QQAhBgJAIAAvAQAgAUcNACAALwECIAJHDQAgAC8BBCADRw0AIAAvAQYgBEcNACAALwEIIAVGIQYLIAYLliYBCH9BAEEAKAK8oAEiAUEMajYCvKABIAFBCmohAQJAECdBLkcNAEEAQQAoArygAUECajYCvKABAkACQBAnIgJB5ABHDQBBACgCvKABIgBBAmpB5QBB5gBB6QBB7gBB5QBB0ABB8gBB7wBB8ABB5QBB8gBB9ABB+QAQL0UNAkEAIABBHGo2ArygASAAQRpqIQEQJ0EoRw0CQQBBACgCvKABQQJqNgK8oAEQJxAwRQ0CECdBLEcNAkEAQQAoArygAUECajYCvKABAkAQJyIAQSdGDQAgAEEiRw0DC0EAKAK8oAEhAiAAEBxBAEEAKAK8oAFBAmoiADYCvKABECdBLEcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygAQJAECciA0HlAEcNAEEAKAK8oAEiA0ECakHuAEH1AEHtAEHlAEHyAEHhAEHiAEHsAEHlABAxRQ0CQQAgA0EUajYCvKABECdBOkcNAkEAQQAoArygAUECajYCvKABECdB9ABHDQJBACgCvKABIgMvAQJB8gBHDQIgAy8BBEH1AEcNAiADLwEGQeUARw0CQQAgA0EIajYCvKABECdBLEcNAkEAQQAoArygAUECajYCvKABECchAwsCQCADQecARg0AIANB9gBHDQJBACgCvKABIgMvAQJB4QBHDQIgAy8BBEHsAEcNAiADLwEGQfUARw0CIAMvAQhB5QBHDQJBACADQQpqNgK8oAEQJ0E6Rw0CIAIgAEEAKAKcHxEAAEEAIAE2ArygAQ8LQQAoArygASIDLwECQeUARw0BIAMvAQRB9ABHDQFBACADQQZqNgK8oAECQBAnIgNBOkcNAEEAQQAoArygAUECajYCvKABECdB5gBHDQJBACgCvKABIgNBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQI0UNAkEAIANBEGoiAzYCvKABAkAQJyIEQShGDQAgA0EAKAK8oAFGDQMgBBAtRQ0DCxAnIQMLIANBKEcNAUEAQQAoArygAUECajYCvKABECdBKUcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygARAnQfIARw0BQQAoArygASIDQQJqQeUAQfQAQfUAQfIAQe4AEBNFDQFBACADQQxqNgK8oAEQJxAtRQ0BAkACQAJAECciA0HbAEYNACADQS5HDQJBAEEAKAK8oAFBAmo2ArygARAnEC0NAQwEC0EAQQAoArygAUECajYCvKABAkAQJyIDQSdGDQAgA0EiRw0ECyADEBxBAEEAKAK8oAFBAmo2ArygARAnQd0ARw0DQQBBACgCvKABQQJqNgK8oAELECchAwsCQCADQTtHDQBBAEEAKAK8oAFBAmo2ArygARAnIQMLIANB/QBHDQFBAEEAKAK8oAFBAmo2ArygAQJAECciA0EsRw0AQQBBACgCvKABQQJqNgK8oAEQJyEDCyADQf0ARw0BQQBBACgCvKABQQJqNgK8oAEQJ0EpRw0BIAIgAEEAKAKcHxEAAA8LIAJB6wBHDQEgAEUNAUEAKAK8oAEiAC8BAkHlAEcNASAALwEEQfkARw0BIAAvAQZB8wBHDQEgAEEGaiEBQQAgAEEIajYCvKABECdBKEcNAUEAQQAoArygAUECajYCvKABECchAEEAKAK8oAEhAiAAEC1FDQFBACgCvKABIQAQJ0EpRw0BQQBBACgCvKABIgFBAmo2ArygARAnQS5HDQFBAEEAKAK8oAFBAmo2ArygARAnQeYARw0BQQAoArygASIDQQJqQe8AQfIAQcUAQeEAQeMAQegAECZFDQFBACADQQ5qNgK8oAEQJyEDQQAoArygASIEQX5qIQEgA0EoRw0BQQAgBEECajYCvKABECdB5gBHDQFBACgCvKABIgNBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQI0UNAUEAIANBEGo2ArygARAnQShHDQFBAEEAKAK8oAFBAmo2ArygARAnIQNBACgCvKABIQQgAxAtRQ0BQQAoArygASEDECdBKUcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygARAnQekARw0BQQAoArygASIFLwECQeYARw0BQQAgBUEEajYCvKABECdBKEcNAUEAQQAoArygAUECajYCvKABECcaQQAoArygASIFIAQgAyAEayIDEEENASAAIAJrIgZBAXUhB0EAIAUgA0EBdSIIQQF0ajYCvKAB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AEHuABATRQ0DQQAgAEEMajYCvKABECcaQQAoArygASIAIAIgBhBBDQNBACAAIAdBAXRqNgK8oAEQJ0HbAEcNA0EAQQAoArygAUECajYCvKABECcaQQAoArygASIAIAQgAxBBDQNBACAAIAhBAXRqNgK8oAEQJ0HdAEcNA0EAQQAoArygAUECajYCvKABAkAQJyIAQTtHDQBBAEEAKAK8oAFBAmo2ArygARAnIQALIABB/QBHDQNBAEEAKAK8oAFBAmo2ArygAQJAECciAEEsRw0AQQBBACgCvKABQQJqNgK8oAEQJyEACyAAQf0ARw0DQQBBACgCvKABQQJqNgK8oAEQJ0EpRw0DQQBBACgCvKABQQJqNgK8oAEQJyIAQTtHDQFBAEEAKAK8oAFBAmo2ArygAQsQJyEACyAAQf0ARw0BQQBBACgCvKABQQJqNgK8oAEQJ0EpRw0BQQAoArSgASEEQYAgIQADQAJAAkAgBCAARg0AIAcgAEEMaigCACAAQQhqKAIAIgNrQQF1Rw0BIAIgAyAGEEENASAAKAIAIABBBGooAgBBACgCoB8RAABBACABNgK8oAELDwsgAEEQaiEADAALCyACIABBACgCpB8RAAALQQAgATYCvKABC1MBBH9BACgCvKABQQJqIQBBACgCwKABIQECQANAIAAiAkF+aiABTw0BIAJBAmohACACLwEAQXZqIgNBA0sNACADDgQBAAABAQsLQQAgAjYCvKABC3wBAn9BAEEAKAK8oAEiAEECajYCvKABIABBBmohAEEAKALAoAEhAQNAAkACQAJAIABBfGogAU8NACAAQX5qLwEAQSpHDQIgAC8BAEEvRw0CQQAgAEF+ajYCvKABDAELIABBfmohAAtBACAANgK8oAEPCyAAQQJqIQAMAAsLdQEBfwJAAkAgAEFfaiIBQQVLDQBBASABdEExcQ0BCyAAQUZqQf//A3FBBkkNACAAQVhqQf//A3FBB0kgAEEpR3ENAAJAIABBpX9qIgFBA0sNACABDgQBAAABAQsgAEH9AEcgAEGFf2pB//8DcUEESXEPC0EBCz0BAX9BASEBAkAgAEH3AEHoAEHpAEHsAEHlABA0DQAgAEHmAEHvAEHyABA1DQAgAEHpAEHmABArIQELIAELrQEBA39BASEBAkACQAJAAkACQAJAAkAgAC8BACICQUVq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IgRBACgCmB8iBUkNACAELwEAIAFHDQAgAC8BACACRw0AAkAgBCAFRw0AQQEPCyAAQXxqLwEAECUhAwsgAwtmAQN/QQAhBQJAIABBemoiBkEAKAKYHyIHSQ0AIAYvAQAgAUcNACAAQXxqLwEAIAJHDQAgAEF+ai8BACADRw0AIAAvAQAgBEcNAAJAIAYgB0cNAEEBDwsgAEF4ai8BABAlIQULIAULhQEBAn8gABA+IgAQKiEBAkACQCAAQdwARg0AQQAhAiABRQ0BC0EAKAK8oAFBAkEEIABBgIAESRtqIQACQANAQQAgADYCvKABIAAvAQAQPiIBRQ0BAkAgARApRQ0AIABBAkEEIAFBgIAESRtqIQAMAQsLQQAhAiABQdwARg0BC0EBIQILIAIL2gMBBH9BACgCvKABIgBBfmohAQNAQQAgAEECajYCvKABAkACQAJAIABBACgCwKABTw0AECchAEEAKAK8oAEhAgJAAkAgABAtRQ0AQQAoArygASEDAkACQBAnIgBBOkcNAEEAQQAoArygAUECajYCvKABECcQLUUNAUEAKAK8oAEvAQAhAAsgAiADQQAoApwfEQAADAILQQAgATYCvKABDwsCQAJAIABBIkYNACAAQS5GDQEgAEEnRw0EC0EAKAK8oAEhAiAAEBxBAEEAKAK8oAFBAmoiAzYCvKABECciAEE6Rw0BQQBBACgCvKABQQJqNgK8oAECQBAnEC1FDQBBACgCvKABLwEAIQAgAiADQQAoApwfEQAADAILQQAgATYCvKABDwtBACgCvKABIgAvAQJBLkcNAiAALwEEQS5HDQJBACAAQQZqNgK8oAECQAJAAkAgAC8BBiIAQfIARw0AQQEQECEAQQAoArygASECIAANASACLwEAIQALIABB//8DcRAtDQFBACABNgK8oAEPC0EAIAJBAmo2ArygAQsQJyEACyAAQf//A3EiAEEsRg0CIABB/QBGDQBBACABNgK8oAELDwtBACABNgK8oAEPC0EAKAK8oAEhAAwACwuPAQEBf0EAIQ4CQCAALwEAIAFHDQAgAC8BAiACRw0AIAAvAQQgA0cNACAALwEGIARHDQAgAC8BCCAFRw0AIAAvAQogBkcNACAALwEMIAdHDQAgAC8BDiAIRw0AIAAvARAgCUcNACAALwESIApHDQAgAC8BFCALRw0AIAAv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","undefined"!=typeof window&&"function"==typeof atob?Uint8Array.from(atob(B),A=>A.charCodeAt(0)):Buffer.from(B,"base64")));var B;const{exports:E}=await WebAssembly.instantiate(Q);A=E})())}
\ No newline at end of file
diff --git a/deps/cjs-module-lexer/lexer.js b/deps/cjs-module-lexer/lexer.js
index 5e61e8291ea40e..b66e37204b41d6 100755
--- a/deps/cjs-module-lexer/lexer.js
+++ b/deps/cjs-module-lexer/lexer.js
@@ -37,8 +37,6 @@ const Import = 0;
const ExportAssign = 1;
const ExportStar = 2;
-const strictReserved = new Set(['implements', 'interface', 'let', 'package', 'private', 'protected', 'public', 'static', 'yield', 'enum']);
-
function parseCJS (source, name = '@') {
resetState();
try {
@@ -49,14 +47,39 @@ function parseCJS (source, name = '@') {
e.loc = pos;
throw e;
}
- const result = { exports: [..._exports].filter(expt => !unsafeGetters.has(expt)), reexports: [...reexports] };
+ const result = { exports: [..._exports].filter(expt => expt !== undefined && !unsafeGetters.has(expt)), reexports: [...reexports].filter(reexpt => reexpt !== undefined) };
resetState();
return result;
}
-function addExport (name) {
- if (!strictReserved.has(name))
- _exports.add(name);
+function decode (str) {
+ if (str[0] === '"' || str[0] === '\'') {
+ try {
+ const decoded = (0, eval)(str);
+ // Filter to exclude non-matching UTF-16 surrogate strings
+ for (let i = 0; i < decoded.length; i++) {
+ const surrogatePrefix = decoded.charCodeAt(i) & 0xFC00;
+ if (surrogatePrefix < 0xD800) {
+ // Not a surrogate
+ continue;
+ }
+ else if (surrogatePrefix === 0xD800) {
+ // Validate surrogate pair
+ if ((decoded.charCodeAt(++i) & 0xFC00) !== 0xDC00)
+ return;
+ }
+ else {
+ // Out-of-range surrogate code (above 0xD800)
+ return;
+ }
+ }
+ return decoded;
+ }
+ catch {}
+ }
+ else {
+ return str;
+ }
}
function parseSource (cjsSource) {
@@ -173,10 +196,8 @@ function parseSource (cjsSource) {
// TODO:
+ fillIn->gender = getGenderString(
+ getDerivedGender(loc, "per", numeratorUnitData, denominatorUnitData, status), status);
+}
+
+void LongNameHandler::processPatternTimes(MeasureUnitImpl &&productUnit,
+ Locale loc,
+ const UNumberUnitWidth &width,
+ const char *caseVariant,
+ UnicodeString *outArray,
+ UErrorCode &status) {
+ if (U_FAILURE(status)) {
+ return;
+ }
+ if (productUnit.complexity == UMEASURE_UNIT_MIXED) {
+ // These are handled by MixedUnitLongNameHandler
+ status = U_UNSUPPORTED_ERROR;
+ return;
+ }
+
+#if U_DEBUG
+ for (int32_t pluralIndex = 0; pluralIndex < ARRAY_LENGTH; pluralIndex++) {
+ U_ASSERT(outArray[pluralIndex].length() == 0);
+ U_ASSERT(!outArray[pluralIndex].isBogus());
+ }
+#endif
+
+ if (productUnit.identifier.isEmpty()) {
+ // TODO(icu-units#28): consider when serialize should be called.
+ // identifier might also be empty for MeasureUnit().
+ productUnit.serialize(status);
+ }
+ if (U_FAILURE(status)) {
+ return;
+ }
+ if (productUnit.identifier.length() == 0) {
+ // MeasureUnit(): no units: return empty strings.
+ return;
+ }
+
+ MeasureUnit builtinUnit;
+ if (MeasureUnit::findBySubType(productUnit.identifier.toStringPiece(), &builtinUnit)) {
+ // TODO(icu-units#145): spec doesn't cover builtin-per-builtin, it
+ // breaks them all down. Do we want to drop this?
+ // - findBySubType isn't super efficient, if we skip it and go to basic
+ // singles, we don't have to construct MeasureUnit's anymore.
+ // - Check all the existing unit tests that fail without this: is it due
+ // to incorrect fallback via getMeasureData?
+ // - Do those unit tests cover this code path representatively?
+ if (builtinUnit != MeasureUnit()) {
+ getMeasureData(loc, builtinUnit, width, caseVariant, outArray, status);
+ maybeCalculateGender(loc, builtinUnit, outArray, status);
+ }
+ return;
+ }
+
+ // 2. Set timesPattern to be getValue(times, locale, length)
+ UnicodeString timesPattern = getCompoundValue("times", loc, width, status);
+ SimpleFormatter timesPatternFormatter(timesPattern, 2, 2, status);
+ if (U_FAILURE(status)) {
+ return;
+ }
+
+ PlaceholderPosition globalPlaceholder[ARRAY_LENGTH];
+ UChar globalJoinerChar = 0;
+ // Numbered list items are from the algorithms at
+ // https://unicode.org/reports/tr35/tr35-general.html#compound-units:
+ //
+ // pattern(...) point 5:
+ // - Set both globalPlaceholder and globalPlaceholderPosition to be empty
+ //
+ // 3. Set result to be empty
+ for (int32_t pluralIndex = 0; pluralIndex < ARRAY_LENGTH; pluralIndex++) {
+ // Initial state: empty string pattern, via all falling back to OTHER:
+ if (pluralIndex == StandardPlural::Form::OTHER) {
+ outArray[pluralIndex].remove();
+ } else {
+ outArray[pluralIndex].setToBogus();
+ }
+ globalPlaceholder[pluralIndex] = PH_EMPTY;
+ }
+
+ // Empty string represents "compound" (propagate the plural form).
+ const char *pluralCategory = "";
+ DerivedComponents derivedTimesPlurals(loc, "plural", "times");
+ DerivedComponents derivedTimesCases(loc, "case", "times");
+ DerivedComponents derivedPowerCases(loc, "case", "power");
+
+ // 4. For each single_unit in product_unit
+ for (int32_t singleUnitIndex = 0; singleUnitIndex < productUnit.singleUnits.length();
+ singleUnitIndex++) {
+ SingleUnitImpl *singleUnit = productUnit.singleUnits[singleUnitIndex];
+ const char *singlePluralCategory;
+ const char *singleCaseVariant;
+ // TODO(icu-units#28): ensure we have unit tests that change/fail if we
+ // assign incorrect case variants here:
+ if (singleUnitIndex < productUnit.singleUnits.length() - 1) {
+ // 4.1. If hasMultiple
+ singlePluralCategory = derivedTimesPlurals.value0(pluralCategory);
+ singleCaseVariant = derivedTimesCases.value0(caseVariant);
+ pluralCategory = derivedTimesPlurals.value1(pluralCategory);
+ caseVariant = derivedTimesCases.value1(caseVariant);
+ } else {
+ singlePluralCategory = derivedTimesPlurals.value1(pluralCategory);
+ singleCaseVariant = derivedTimesCases.value1(caseVariant);
+ }
+
+ // 4.2. Get the gender of that single_unit
+ MeasureUnit simpleUnit;
+ if (!MeasureUnit::findBySubType(singleUnit->getSimpleUnitID(), &simpleUnit)) {
+ // Ideally all simple units should be known, but they're not:
+ // 100-kilometer is internally treated as a simple unit, but it is
+ // not a built-in unit and does not have formatting data in CLDR 39.
+ //
+ // TODO(icu-units#28): test (desirable) invariants in unit tests.
+ status = U_UNSUPPORTED_ERROR;
return;
}
- UnicodeString secondaryString = secondaryCompiled.getTextWithNoArguments().trim();
- // TODO: Why does UnicodeString need to be explicit in the following line?
- compiled.format(UnicodeString(u"{0}"), secondaryString, perUnitFormat, status);
+ const char *gender = getGenderString(getGenderForBuiltin(loc, simpleUnit, status), status);
+
+ // 4.3. If singleUnit starts with a dimensionality_prefix, such as 'square-'
+ U_ASSERT(singleUnit->dimensionality > 0);
+ int32_t dimensionality = singleUnit->dimensionality;
+ UnicodeString dimensionalityPrefixPatterns[ARRAY_LENGTH];
+ if (dimensionality != 1) {
+ // 4.3.1. set dimensionalityPrefixPattern to be
+ // getValue(that dimensionality_prefix, locale, length, singlePluralCategory, singleCaseVariant, gender),
+ // such as "{0} kwadratowym"
+ CharString dimensionalityKey("compound/power", status);
+ dimensionalityKey.appendNumber(dimensionality, status);
+ getInflectedMeasureData(dimensionalityKey.toStringPiece(), loc, width, gender,
+ singleCaseVariant, dimensionalityPrefixPatterns, status);
+ if (U_FAILURE(status)) {
+ // At the time of writing, only pow2 and pow3 are supported.
+ // Attempting to format other powers results in a
+ // U_RESOURCE_TYPE_MISMATCH. We convert the error if we
+ // understand it:
+ if (status == U_RESOURCE_TYPE_MISMATCH && dimensionality > 3) {
+ status = U_UNSUPPORTED_ERROR;
+ }
+ return;
+ }
+
+ // TODO(icu-units#139):
+ // 4.3.2. set singlePluralCategory to be power0(singlePluralCategory)
+
+ // 4.3.3. set singleCaseVariant to be power0(singleCaseVariant)
+ singleCaseVariant = derivedPowerCases.value0(singleCaseVariant);
+ // 4.3.4. remove the dimensionality_prefix from singleUnit
+ singleUnit->dimensionality = 1;
+ }
+
+ // 4.4. if singleUnit starts with an si_prefix, such as 'centi'
+ UMeasurePrefix prefix = singleUnit->unitPrefix;
+ UnicodeString prefixPattern;
+ if (prefix != UMEASURE_PREFIX_ONE) {
+ // 4.4.1. set siPrefixPattern to be getValue(that si_prefix, locale,
+ // length), such as "centy{0}"
+ CharString prefixKey;
+ // prefixKey looks like "1024p3" or "10p-2":
+ prefixKey.appendNumber(umeas_getPrefixBase(prefix), status);
+ prefixKey.append('p', status);
+ prefixKey.appendNumber(umeas_getPrefixPower(prefix), status);
+ // Contains a pattern like "centy{0}".
+ prefixPattern = getCompoundValue(prefixKey.toStringPiece(), loc, width, status);
+
+ // 4.4.2. set singlePluralCategory to be prefix0(singlePluralCategory)
+ //
+ // TODO(icu-units#139): that refers to these rules:
+ //
+ // though I'm not sure what other value they might end up having.
+ //
+ // 4.4.3. set singleCaseVariant to be prefix0(singleCaseVariant)
+ //
+ // TODO(icu-units#139): that refers to:
+ // but the prefix (value0) doesn't have case, the rest simply
+ // propagates.
+
+ // 4.4.4. remove the si_prefix from singleUnit
+ singleUnit->unitPrefix = UMEASURE_PREFIX_ONE;
+ }
+
+ // 4.5. Set corePattern to be the getValue(singleUnit, locale, length,
+ // singlePluralCategory, singleCaseVariant), such as "{0} metrem"
+ UnicodeString singleUnitArray[ARRAY_LENGTH];
+ // At this point we are left with a Simple Unit:
+ U_ASSERT(uprv_strcmp(singleUnit->build(status).getIdentifier(), singleUnit->getSimpleUnitID()) ==
+ 0);
+ getMeasureData(loc, singleUnit->build(status), width, singleCaseVariant, singleUnitArray,
+ status);
if (U_FAILURE(status)) {
+ // Shouldn't happen if we have data for all single units
return;
}
+
+ // Calculate output gender
+ if (!singleUnitArray[GENDER_INDEX].isBogus()) {
+ U_ASSERT(!singleUnitArray[GENDER_INDEX].isEmpty());
+ UnicodeString uVal;
+
+ if (prefix != UMEASURE_PREFIX_ONE) {
+ singleUnitArray[GENDER_INDEX] =
+ getDerivedGender(loc, "prefix", singleUnitArray, nullptr, status);
+ }
+
+ if (dimensionality != 1) {
+ singleUnitArray[GENDER_INDEX] =
+ getDerivedGender(loc, "power", singleUnitArray, nullptr, status);
+ }
+
+ UnicodeString timesGenderRule = getDeriveCompoundRule(loc, "gender", "times", status);
+ if (timesGenderRule.length() == 1) {
+ switch (timesGenderRule[0]) {
+ case u'0':
+ if (singleUnitIndex == 0) {
+ U_ASSERT(outArray[GENDER_INDEX].isBogus());
+ outArray[GENDER_INDEX] = singleUnitArray[GENDER_INDEX];
+ }
+ break;
+ case u'1':
+ if (singleUnitIndex == productUnit.singleUnits.length() - 1) {
+ U_ASSERT(outArray[GENDER_INDEX].isBogus());
+ outArray[GENDER_INDEX] = singleUnitArray[GENDER_INDEX];
+ }
+ }
+ } else {
+ if (outArray[GENDER_INDEX].isBogus()) {
+ outArray[GENDER_INDEX] = timesGenderRule;
+ }
+ }
+ }
+
+ // Calculate resulting patterns for each plural form
+ for (int32_t pluralIndex = 0; pluralIndex < StandardPlural::Form::COUNT; pluralIndex++) {
+ StandardPlural::Form plural = static_cast(pluralIndex);
+
+ // singleUnitArray[pluralIndex] looks something like "{0} Meter"
+ if (outArray[pluralIndex].isBogus()) {
+ if (singleUnitArray[pluralIndex].isBogus()) {
+ // Let the usual plural fallback mechanism take care of this
+ // plural form
+ continue;
+ } else {
+ // Since our singleUnit can have a plural form that outArray
+ // doesn't yet have (relying on fallback to OTHER), we start
+ // by grabbing it with the normal plural fallback mechanism
+ outArray[pluralIndex] = getWithPlural(outArray, plural, status);
+ if (U_FAILURE(status)) {
+ return;
+ }
+ }
+ }
+
+ if (uprv_strcmp(singlePluralCategory, "") != 0) {
+ plural = static_cast(getIndex(singlePluralCategory, status));
+ }
+
+ // 4.6. Extract(corePattern, coreUnit, placeholder, placeholderPosition) from that pattern.
+ UnicodeString coreUnit;
+ PlaceholderPosition placeholderPosition;
+ UChar joinerChar;
+ extractCorePattern(getWithPlural(singleUnitArray, plural, status), coreUnit,
+ placeholderPosition, joinerChar);
+
+ // 4.7 If the position is middle, then fail
+ if (placeholderPosition == PH_MIDDLE) {
+ status = U_UNSUPPORTED_ERROR;
+ return;
+ }
+
+ // 4.8. If globalPlaceholder is empty
+ if (globalPlaceholder[pluralIndex] == PH_EMPTY) {
+ globalPlaceholder[pluralIndex] = placeholderPosition;
+ globalJoinerChar = joinerChar;
+ } else {
+ // Expect all units involved to have the same placeholder position
+ U_ASSERT(globalPlaceholder[pluralIndex] == placeholderPosition);
+ // TODO(icu-units#28): Do we want to add a unit test that checks
+ // for consistent joiner chars? Probably not, given how
+ // inconsistent they are. File a CLDR ticket with examples?
+ }
+ // Now coreUnit would be just "Meter"
+
+ // 4.9. If siPrefixPattern is not empty
+ if (prefix != UMEASURE_PREFIX_ONE) {
+ SimpleFormatter prefixCompiled(prefixPattern, 1, 1, status);
+ if (U_FAILURE(status)) {
+ return;
+ }
+
+ // 4.9.1. Set coreUnit to be the combineLowercasing(locale, length, siPrefixPattern,
+ // coreUnit)
+ UnicodeString tmp;
+ // combineLowercasing(locale, length, prefixPattern, coreUnit)
+ //
+ // TODO(icu-units#28): run this only if prefixPattern does not
+ // contain space characters - do languages "as", "bn", "hi",
+ // "kk", etc have concepts of upper and lower case?:
+ if (width == UNUM_UNIT_WIDTH_FULL_NAME) {
+ coreUnit.toLower(loc);
+ }
+ prefixCompiled.format(coreUnit, tmp, status);
+ if (U_FAILURE(status)) {
+ return;
+ }
+ coreUnit = tmp;
+ }
+
+ // 4.10. If dimensionalityPrefixPattern is not empty
+ if (dimensionality != 1) {
+ SimpleFormatter dimensionalityCompiled(
+ getWithPlural(dimensionalityPrefixPatterns, plural, status), 1, 1, status);
+ if (U_FAILURE(status)) {
+ return;
+ }
+
+ // 4.10.1. Set coreUnit to be the combineLowercasing(locale, length,
+ // dimensionalityPrefixPattern, coreUnit)
+ UnicodeString tmp;
+ // combineLowercasing(locale, length, prefixPattern, coreUnit)
+ //
+ // TODO(icu-units#28): run this only if prefixPattern does not
+ // contain space characters - do languages "as", "bn", "hi",
+ // "kk", etc have concepts of upper and lower case?:
+ if (width == UNUM_UNIT_WIDTH_FULL_NAME) {
+ coreUnit.toLower(loc);
+ }
+ dimensionalityCompiled.format(coreUnit, tmp, status);
+ if (U_FAILURE(status)) {
+ return;
+ }
+ coreUnit = tmp;
+ }
+
+ if (outArray[pluralIndex].length() == 0) {
+ // 4.11. If the result is empty, set result to be coreUnit
+ outArray[pluralIndex] = coreUnit;
+ } else {
+ // 4.12. Otherwise set result to be format(timesPattern, result, coreUnit)
+ UnicodeString tmp;
+ timesPatternFormatter.format(outArray[pluralIndex], coreUnit, tmp, status);
+ outArray[pluralIndex] = tmp;
+ }
+ }
+ }
+ for (int32_t pluralIndex = 0; pluralIndex < StandardPlural::Form::COUNT; pluralIndex++) {
+ if (globalPlaceholder[pluralIndex] == PH_BEGINNING) {
+ UnicodeString tmp;
+ tmp.append(u"{0}", 3);
+ if (globalJoinerChar != 0) {
+ tmp.append(globalJoinerChar);
+ }
+ tmp.append(outArray[pluralIndex]);
+ outArray[pluralIndex] = tmp;
+ } else if (globalPlaceholder[pluralIndex] == PH_END) {
+ if (globalJoinerChar != 0) {
+ outArray[pluralIndex].append(globalJoinerChar);
+ }
+ outArray[pluralIndex].append(u"{0}", 3);
+ }
}
- fillIn->rules = rules;
- fillIn->parent = parent;
- fillIn->multiSimpleFormatsToModifiers(primaryData, perUnitFormat,
- {UFIELD_CATEGORY_NUMBER, UNUM_MEASURE_UNIT_FIELD}, status);
}
UnicodeString LongNameHandler::getUnitDisplayName(
@@ -329,7 +1455,7 @@ UnicodeString LongNameHandler::getUnitDisplayName(
return ICU_Utility::makeBogusString();
}
UnicodeString simpleFormats[ARRAY_LENGTH];
- getMeasureData(loc, unit, width, simpleFormats, status);
+ getMeasureData(loc, unit, width, "", simpleFormats, status);
return simpleFormats[DNAM_INDEX];
}
@@ -343,7 +1469,7 @@ UnicodeString LongNameHandler::getUnitPattern(
return ICU_Utility::makeBogusString();
}
UnicodeString simpleFormats[ARRAY_LENGTH];
- getMeasureData(loc, unit, width, simpleFormats, status);
+ getMeasureData(loc, unit, width, "", simpleFormats, status);
// The above already handles fallback from other widths to short
if (U_FAILURE(status)) {
return ICU_Utility::makeBogusString();
@@ -366,6 +1492,7 @@ LongNameHandler* LongNameHandler::forCurrencyLongNames(const Locale &loc, const
getCurrencyLongNameData(loc, currency, simpleFormats, status);
if (U_FAILURE(status)) { return nullptr; }
result->simpleFormatsToModifiers(simpleFormats, {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD}, status);
+ // TODO(icu-units#28): currency gender?
return result;
}
@@ -390,8 +1517,12 @@ void LongNameHandler::multiSimpleFormatsToModifiers(const UnicodeString *leadFor
UnicodeString leadFormat = getWithPlural(leadFormats, plural, status);
if (U_FAILURE(status)) { return; }
UnicodeString compoundFormat;
- trailCompiled.format(leadFormat, compoundFormat, status);
- if (U_FAILURE(status)) { return; }
+ if (leadFormat.length() == 0) {
+ compoundFormat = trailFormat;
+ } else {
+ trailCompiled.format(leadFormat, compoundFormat, status);
+ if (U_FAILURE(status)) { return; }
+ }
SimpleFormatter compoundCompiled(compoundFormat, 0, 1, status);
if (U_FAILURE(status)) { return; }
fModifiers[i] = SimpleModifier(compoundCompiled, field, false, {this, SIGNUM_POS_ZERO, plural});
@@ -405,29 +1536,53 @@ void LongNameHandler::processQuantity(DecimalQuantity &quantity, MicroProps &mic
}
StandardPlural::Form pluralForm = utils::getPluralSafe(micros.rounder, rules, quantity, status);
micros.modOuter = &fModifiers[pluralForm];
+ micros.gender = gender;
}
const Modifier* LongNameHandler::getModifier(Signum /*signum*/, StandardPlural::Form plural) const {
return &fModifiers[plural];
}
-void MixedUnitLongNameHandler::forMeasureUnit(const Locale &loc, const MeasureUnit &mixedUnit,
- const UNumberUnitWidth &width, const PluralRules *rules,
+void MixedUnitLongNameHandler::forMeasureUnit(const Locale &loc,
+ const MeasureUnit &mixedUnit,
+ const UNumberUnitWidth &width,
+ const char *unitDisplayCase,
+ const PluralRules *rules,
const MicroPropsGenerator *parent,
- MixedUnitLongNameHandler *fillIn, UErrorCode &status) {
+ MixedUnitLongNameHandler *fillIn,
+ UErrorCode &status) {
U_ASSERT(mixedUnit.getComplexity(status) == UMEASURE_UNIT_MIXED);
U_ASSERT(fillIn != nullptr);
+ if (U_FAILURE(status)) {
+ return;
+ }
MeasureUnitImpl temp;
- const MeasureUnitImpl& impl = MeasureUnitImpl::forMeasureUnit(mixedUnit, temp, status);
- fillIn->fMixedUnitCount = impl.units.length();
+ const MeasureUnitImpl &impl = MeasureUnitImpl::forMeasureUnit(mixedUnit, temp, status);
+ // Defensive, for production code:
+ if (impl.complexity != UMEASURE_UNIT_MIXED) {
+ // Should be using the normal LongNameHandler
+ status = U_UNSUPPORTED_ERROR;
+ return;
+ }
+
+ fillIn->fMixedUnitCount = impl.singleUnits.length();
fillIn->fMixedUnitData.adoptInstead(new UnicodeString[fillIn->fMixedUnitCount * ARRAY_LENGTH]);
for (int32_t i = 0; i < fillIn->fMixedUnitCount; i++) {
// Grab data for each of the components.
UnicodeString *unitData = &fillIn->fMixedUnitData[i * ARRAY_LENGTH];
- getMeasureData(loc, impl.units[i]->build(status), width, unitData, status);
+ // TODO(CLDR-14502): check from the CLDR-14502 ticket whether this
+ // propagation of unitDisplayCase is correct:
+ getMeasureData(loc, impl.singleUnits[i]->build(status), width, unitDisplayCase, unitData,
+ status);
+ // TODO(ICU-21494): if we add support for gender for mixed units, we may
+ // need maybeCalculateGender() here.
}
+ // TODO(icu-units#120): Make sure ICU doesn't output zero-valued
+ // high-magnitude fields
+ // * for mixed units count N, produce N listFormatters, one for each subset
+ // that might be formatted.
UListFormatterWidth listWidth = ULISTFMT_WIDTH_SHORT;
if (width == UNUM_UNIT_WIDTH_NARROW) {
listWidth = ULISTFMT_WIDTH_NARROW;
@@ -437,12 +1592,14 @@ void MixedUnitLongNameHandler::forMeasureUnit(const Locale &loc, const MeasureUn
}
fillIn->fListFormatter.adoptInsteadAndCheckErrorCode(
ListFormatter::createInstance(loc, ULISTFMT_TYPE_UNITS, listWidth, status), status);
+ // TODO(ICU-21494): grab gender of each unit, calculate the gender
+ // associated with this list formatter, save it for later.
fillIn->rules = rules;
fillIn->parent = parent;
- // We need a localised NumberFormatter for the integers of the bigger units
+ // We need a localised NumberFormatter for the numbers of the bigger units
// (providing Arabic numerals, for example).
- fillIn->fIntegerFormatter = NumberFormatter::withLocale(loc);
+ fillIn->fNumberFormatter = NumberFormatter::withLocale(loc);
}
void MixedUnitLongNameHandler::processQuantity(DecimalQuantity &quantity, MicroProps µs,
@@ -462,12 +1619,6 @@ const Modifier *MixedUnitLongNameHandler::getMixedUnitModifier(DecimalQuantity &
status = U_UNSUPPORTED_ERROR;
return µs.helpers.emptyWeakModifier;
}
- // If we don't have at least one mixedMeasure, the LongNameHandler would be
- // sufficient and we shouldn't be running MixedUnitLongNameHandler code:
- U_ASSERT(micros.mixedMeasuresCount > 0);
- // mixedMeasures does not contain the last value:
- U_ASSERT(fMixedUnitCount == micros.mixedMeasuresCount + 1);
- U_ASSERT(fListFormatter.isValid());
// Algorithm:
//
@@ -492,39 +1643,45 @@ const Modifier *MixedUnitLongNameHandler::getMixedUnitModifier(DecimalQuantity &
return µs.helpers.emptyWeakModifier;
}
+ StandardPlural::Form quantityPlural = StandardPlural::Form::OTHER;
for (int32_t i = 0; i < micros.mixedMeasuresCount; i++) {
DecimalQuantity fdec;
- fdec.setToLong(micros.mixedMeasures[i]);
- if (i > 0 && fdec.isNegative()) {
- // If numbers are negative, only the first number needs to have its
- // negative sign formatted.
- fdec.negate();
- }
- StandardPlural::Form pluralForm = utils::getStandardPlural(rules, fdec);
- UnicodeString simpleFormat =
- getWithPlural(&fMixedUnitData[i * ARRAY_LENGTH], pluralForm, status);
- SimpleFormatter compiledFormatter(simpleFormat, 0, 1, status);
+ // If numbers are negative, only the first number needs to have its
+ // negative sign formatted.
+ int64_t number = i > 0 ? std::abs(micros.mixedMeasures[i]) : micros.mixedMeasures[i];
- UnicodeString num;
- auto appendable = UnicodeStringAppendable(num);
- fIntegerFormatter.formatDecimalQuantity(fdec, status).appendTo(appendable, status);
- compiledFormatter.format(num, outputMeasuresList[i], status);
- // TODO(icu-units#67): fix field positions
- }
+ if (micros.indexOfQuantity == i) { // Insert placeholder for `quantity`
+ // If quantity is not the first value and quantity is negative
+ if (micros.indexOfQuantity > 0 && quantity.isNegative()) {
+ quantity.negate();
+ }
- // Reiterated: we have at least one mixedMeasure:
- U_ASSERT(micros.mixedMeasuresCount > 0);
- // Thus if negative, a negative has already been formatted:
- if (quantity.isNegative()) {
- quantity.negate();
+ StandardPlural::Form quantityPlural =
+ utils::getPluralSafe(micros.rounder, rules, quantity, status);
+ UnicodeString quantityFormatWithPlural =
+ getWithPlural(&fMixedUnitData[i * ARRAY_LENGTH], quantityPlural, status);
+ SimpleFormatter quantityFormatter(quantityFormatWithPlural, 0, 1, status);
+ quantityFormatter.format(UnicodeString(u"{0}"), outputMeasuresList[i], status);
+ } else {
+ fdec.setToLong(number);
+ StandardPlural::Form pluralForm = utils::getStandardPlural(rules, fdec);
+ UnicodeString simpleFormat =
+ getWithPlural(&fMixedUnitData[i * ARRAY_LENGTH], pluralForm, status);
+ SimpleFormatter compiledFormatter(simpleFormat, 0, 1, status);
+ UnicodeString num;
+ auto appendable = UnicodeStringAppendable(num);
+
+ fNumberFormatter.formatDecimalQuantity(fdec, status).appendTo(appendable, status);
+ compiledFormatter.format(num, outputMeasuresList[i], status);
+ }
}
- UnicodeString *finalSimpleFormats = &fMixedUnitData[(fMixedUnitCount - 1) * ARRAY_LENGTH];
- StandardPlural::Form finalPlural = utils::getPluralSafe(micros.rounder, rules, quantity, status);
- UnicodeString finalSimpleFormat = getWithPlural(finalSimpleFormats, finalPlural, status);
- SimpleFormatter finalFormatter(finalSimpleFormat, 0, 1, status);
- finalFormatter.format(UnicodeString(u"{0}"), outputMeasuresList[fMixedUnitCount - 1], status);
+ // TODO(ICU-21494): implement gender for lists of mixed units. Presumably we
+ // can set micros.gender to the gender associated with the list formatter in
+ // use below (once we have correct support for that). And then document this
+ // appropriately? "getMixedUnitModifier" doesn't sound like it would do
+ // something like this.
// Combine list into a "premixed" pattern
UnicodeString premixedFormatPattern;
@@ -535,26 +1692,27 @@ const Modifier *MixedUnitLongNameHandler::getMixedUnitModifier(DecimalQuantity &
return µs.helpers.emptyWeakModifier;
}
- // TODO(icu-units#67): fix field positions
- // Return a SimpleModifier for the "premixed" pattern
micros.helpers.mixedUnitModifier =
- SimpleModifier(premixedCompiled, kUndefinedField, false, {this, SIGNUM_POS_ZERO, finalPlural});
+ SimpleModifier(premixedCompiled, kUndefinedField, false, {this, SIGNUM_POS_ZERO, quantityPlural});
return µs.helpers.mixedUnitModifier;
}
const Modifier *MixedUnitLongNameHandler::getModifier(Signum /*signum*/,
StandardPlural::Form /*plural*/) const {
- // TODO(units): investigate this method when investigating where
- // LongNameHandler::getModifier() gets used. To be sure it remains
+ // TODO(icu-units#28): investigate this method when investigating where
+ // ModifierStore::getModifier() gets used. To be sure it remains
// unreachable:
UPRV_UNREACHABLE;
return nullptr;
}
-LongNameMultiplexer *
-LongNameMultiplexer::forMeasureUnits(const Locale &loc, const MaybeStackVector &units,
- const UNumberUnitWidth &width, const PluralRules *rules,
- const MicroPropsGenerator *parent, UErrorCode &status) {
+LongNameMultiplexer *LongNameMultiplexer::forMeasureUnits(const Locale &loc,
+ const MaybeStackVector &units,
+ const UNumberUnitWidth &width,
+ const char *unitDisplayCase,
+ const PluralRules *rules,
+ const MicroPropsGenerator *parent,
+ UErrorCode &status) {
LocalPointer result(new LongNameMultiplexer(parent), status);
if (U_FAILURE(status)) {
return nullptr;
@@ -566,15 +1724,16 @@ LongNameMultiplexer::forMeasureUnits(const Locale &loc, const MaybeStackVectorfMeasureUnits.adoptInstead(new MeasureUnit[units.length()]);
for (int32_t i = 0, length = units.length(); i < length; i++) {
- const MeasureUnit& unit = *units[i];
+ const MeasureUnit &unit = *units[i];
result->fMeasureUnits[i] = unit;
if (unit.getComplexity(status) == UMEASURE_UNIT_MIXED) {
MixedUnitLongNameHandler *mlnh = result->fMixedUnitHandlers.createAndCheckErrorCode(status);
- MixedUnitLongNameHandler::forMeasureUnit(loc, unit, width, rules, NULL, mlnh, status);
+ MixedUnitLongNameHandler::forMeasureUnit(loc, unit, width, unitDisplayCase, rules, NULL,
+ mlnh, status);
result->fHandlers[i] = mlnh;
} else {
LongNameHandler *lnh = result->fLongNameHandlers.createAndCheckErrorCode(status);
- LongNameHandler::forMeasureUnit(loc, unit, MeasureUnit(), width, rules, NULL, lnh, status);
+ LongNameHandler::forMeasureUnit(loc, unit, width, unitDisplayCase, rules, NULL, lnh, status);
result->fHandlers[i] = lnh;
}
if (U_FAILURE(status)) {
diff --git a/deps/icu-small/source/i18n/number_longnames.h b/deps/icu-small/source/i18n/number_longnames.h
index 67f2316a9cd4bd..bca55e010317dc 100644
--- a/deps/icu-small/source/i18n/number_longnames.h
+++ b/deps/icu-small/source/i18n/number_longnames.h
@@ -16,6 +16,8 @@
U_NAMESPACE_BEGIN namespace number {
namespace impl {
+// LongNameHandler takes care of formatting currency and measurement unit names,
+// as well as populating the gender of measure units.
class LongNameHandler : public MicroPropsGenerator, public ModifierStore, public UMemory {
public:
static UnicodeString getUnitDisplayName(
@@ -24,6 +26,8 @@ class LongNameHandler : public MicroPropsGenerator, public ModifierStore, public
UNumberUnitWidth width,
UErrorCode& status);
+ // This function does not support inflections or other newer NumberFormatter
+ // features: it exists to support the older not-recommended MeasureFormat.
static UnicodeString getUnitPattern(
const Locale& loc,
const MeasureUnit& unit,
@@ -38,9 +42,6 @@ class LongNameHandler : public MicroPropsGenerator, public ModifierStore, public
/**
* Construct a localized LongNameHandler for the specified MeasureUnit.
*
- * Compound units can be constructed via `unit` and `perUnit`. Both of these
- * must then be built-in units.
- *
* Mixed units are not supported, use MixedUnitLongNameHandler::forMeasureUnit.
*
* This function uses a fillIn intead of returning a pointer, because we
@@ -48,17 +49,21 @@ class LongNameHandler : public MicroPropsGenerator, public ModifierStore, public
* didn't create itself).
*
* @param loc The desired locale.
- * @param unit The measure unit to construct a LongNameHandler for. If
- * `perUnit` is also defined, `unit` must not be a mixed unit.
- * @param perUnit If `unit` is a mixed unit, `perUnit` must be "none".
+ * @param unitRef The measure unit to construct a LongNameHandler for.
* @param width Specifies the desired unit rendering.
+ * @param unitDisplayCase Specifies the desired grammatical case. If the
+ * specified case is not found, we fall back to nominative or no-case.
* @param rules Does not take ownership.
* @param parent Does not take ownership.
* @param fillIn Required.
*/
- static void forMeasureUnit(const Locale &loc, const MeasureUnit &unit, const MeasureUnit &perUnit,
- const UNumberUnitWidth &width, const PluralRules *rules,
- const MicroPropsGenerator *parent, LongNameHandler *fillIn,
+ static void forMeasureUnit(const Locale &loc,
+ const MeasureUnit &unitRef,
+ const UNumberUnitWidth &width,
+ const char *unitDisplayCase,
+ const PluralRules *rules,
+ const MicroPropsGenerator *parent,
+ LongNameHandler *fillIn,
UErrorCode &status);
/**
@@ -68,10 +73,6 @@ class LongNameHandler : public MicroPropsGenerator, public ModifierStore, public
void
processQuantity(DecimalQuantity &quantity, MicroProps µs, UErrorCode &status) const U_OVERRIDE;
- // TODO(units): investigate whether we might run into Mixed Unit trouble
- // with this. This override for ModifierStore::getModifier does not support
- // mixed units: investigate under which circumstances it gets called (check
- // both ImmutablePatternModifier and in NumberRangeFormatterImpl).
const Modifier* getModifier(Signum signum, StandardPlural::Form plural) const U_OVERRIDE;
private:
@@ -81,6 +82,9 @@ class LongNameHandler : public MicroPropsGenerator, public ModifierStore, public
const PluralRules *rules;
// Not owned
const MicroPropsGenerator *parent;
+ // Grammatical gender of the formatted result. Not owned: must point at
+ // static or global strings.
+ const char *gender = "";
LongNameHandler(const PluralRules *rules, const MicroPropsGenerator *parent)
: rules(rules), parent(parent) {
@@ -96,13 +100,25 @@ class LongNameHandler : public MicroPropsGenerator, public ModifierStore, public
// Allow macrosToMicroGenerator to call the private default constructor.
friend class NumberFormatterImpl;
- // Fills in LongNameHandler fields for formatting compound units identified
- // via `unit` and `perUnit`. Both `unit` and `perUnit` need to be built-in
- // units (for which data exists).
- static void forCompoundUnit(const Locale &loc, const MeasureUnit &unit, const MeasureUnit &perUnit,
- const UNumberUnitWidth &width, const PluralRules *rules,
- const MicroPropsGenerator *parent, LongNameHandler *fillIn,
- UErrorCode &status);
+ // Fills in LongNameHandler fields for formatting units identified `unit`.
+ static void forArbitraryUnit(const Locale &loc,
+ const MeasureUnit &unit,
+ const UNumberUnitWidth &width,
+ const char *unitDisplayCase,
+ LongNameHandler *fillIn,
+ UErrorCode &status);
+
+ // Roughly corresponds to patternTimes(...) in the spec:
+ // https://unicode.org/reports/tr35/tr35-general.html#compound-units
+ //
+ // productUnit is an rvalue reference to indicate this function consumes it,
+ // leaving it in a not-useful / undefined state.
+ static void processPatternTimes(MeasureUnitImpl &&productUnit,
+ Locale loc,
+ const UNumberUnitWidth &width,
+ const char *caseVariant,
+ UnicodeString *outArray,
+ UErrorCode &status);
// Sets fModifiers to use the patterns from `simpleFormats`.
void simpleFormatsToModifiers(const UnicodeString *simpleFormats, Field field, UErrorCode &status);
@@ -111,7 +127,7 @@ class LongNameHandler : public MicroPropsGenerator, public ModifierStore, public
// and `trailFormat` appended to each.
//
// With a leadFormat of "{0}m" and a trailFormat of "{0}/s", it produces a
- // pattern of "{0}m/s" by inserting the leadFormat pattern into trailFormat.
+ // pattern of "{0}m/s" by inserting each leadFormat pattern into trailFormat.
void multiSimpleFormatsToModifiers(const UnicodeString *leadFormats, UnicodeString trailFormat,
Field field, UErrorCode &status);
};
@@ -131,13 +147,19 @@ class MixedUnitLongNameHandler : public MicroPropsGenerator, public ModifierStor
* @param mixedUnit The mixed measure unit to construct a
* MixedUnitLongNameHandler for.
* @param width Specifies the desired unit rendering.
+ * @param unitDisplayCase Specifies the desired grammatical case. If the
+ * specified case is not found, we fall back to nominative or no-case.
* @param rules Does not take ownership.
* @param parent Does not take ownership.
* @param fillIn Required.
*/
- static void forMeasureUnit(const Locale &loc, const MeasureUnit &mixedUnit,
- const UNumberUnitWidth &width, const PluralRules *rules,
- const MicroPropsGenerator *parent, MixedUnitLongNameHandler *fillIn,
+ static void forMeasureUnit(const Locale &loc,
+ const MeasureUnit &mixedUnit,
+ const UNumberUnitWidth &width,
+ const char *unitDisplayCase,
+ const PluralRules *rules,
+ const MicroPropsGenerator *parent,
+ MixedUnitLongNameHandler *fillIn,
UErrorCode &status);
/**
@@ -156,21 +178,24 @@ class MixedUnitLongNameHandler : public MicroPropsGenerator, public ModifierStor
private:
// Not owned
const PluralRules *rules;
+
// Not owned
const MicroPropsGenerator *parent;
// Total number of units in the MeasureUnit this handler was configured for:
// for "foot-and-inch", this will be 2.
int32_t fMixedUnitCount = 1;
+
// Stores unit data for each of the individual units. For each unit, it
// stores ARRAY_LENGTH strings, as returned by getMeasureData. (Each unit
// with index `i` has ARRAY_LENGTH strings starting at index
// `i*ARRAY_LENGTH` in this array.)
LocalArray fMixedUnitData;
- // A localized NumberFormatter used to format the integer-valued bigger
- // units of Mixed Unit measurements.
- LocalizedNumberFormatter fIntegerFormatter;
- // A localised list formatter for joining mixed units together.
+
+ // Formats the larger units of Mixed Unit measurements.
+ LocalizedNumberFormatter fNumberFormatter;
+
+ // Joins mixed units together.
LocalPointer fListFormatter;
MixedUnitLongNameHandler(const PluralRules *rules, const MicroPropsGenerator *parent)
@@ -207,8 +232,11 @@ class LongNameMultiplexer : public MicroPropsGenerator, public UMemory {
// `units`. An individual unit might be a mixed unit.
static LongNameMultiplexer *forMeasureUnits(const Locale &loc,
const MaybeStackVector &units,
- const UNumberUnitWidth &width, const PluralRules *rules,
- const MicroPropsGenerator *parent, UErrorCode &status);
+ const UNumberUnitWidth &width,
+ const char *unitDisplayCase,
+ const PluralRules *rules,
+ const MicroPropsGenerator *parent,
+ UErrorCode &status);
// The output unit must be provided via `micros.outputUnit`, it must match
// one of the units provided to the factory function.
diff --git a/deps/icu-small/source/i18n/number_microprops.h b/deps/icu-small/source/i18n/number_microprops.h
index 058c5923b4567b..a18d5fc470eda1 100644
--- a/deps/icu-small/source/i18n/number_microprops.h
+++ b/deps/icu-small/source/i18n/number_microprops.h
@@ -36,8 +36,7 @@ class IntMeasures : public MaybeStackArray {
* Stack Capacity: most mixed units are expected to consist of two or three
* subunits, so one or two integer measures should be enough.
*/
- IntMeasures() : MaybeStackArray() {
- }
+ IntMeasures() : MaybeStackArray() {}
/**
* Copy constructor.
@@ -84,6 +83,11 @@ struct MicroProps : public MicroPropsGenerator {
bool useCurrency;
char nsName[9];
+ // No ownership: must point at a string which will outlive MicroProps
+ // instances, e.g. a string with static storage duration, or just a string
+ // that will never be deallocated or modified.
+ const char *gender;
+
// Note: This struct has no direct ownership of the following pointers.
const DecimalFormatSymbols* symbols;
@@ -122,9 +126,14 @@ struct MicroProps : public MicroPropsGenerator {
// play.
MeasureUnit outputUnit;
- // In the case of mixed units, this is the set of integer-only units
- // *preceding* the final unit.
+ // Contains all the values of each unit in mixed units. For quantity (which is the floating value of
+ // the smallest unit in the mixed unit), the value stores in `quantity`.
+ // NOTE: the value of quantity in `mixedMeasures` will be left unset.
IntMeasures mixedMeasures;
+
+ // Points to quantity position, -1 if the position is not set yet.
+ int32_t indexOfQuantity = -1;
+
// Number of mixedMeasures that have been populated
int32_t mixedMeasuresCount = 0;
diff --git a/deps/icu-small/source/i18n/number_multiplier.cpp b/deps/icu-small/source/i18n/number_multiplier.cpp
index 8f07e548de121b..58e1e441bd28c5 100644
--- a/deps/icu-small/source/i18n/number_multiplier.cpp
+++ b/deps/icu-small/source/i18n/number_multiplier.cpp
@@ -46,6 +46,7 @@ Scale::Scale(const Scale& other)
}
Scale& Scale::operator=(const Scale& other) {
+ if (this == &other) { return *this; } // self-assignment: no-op
fMagnitude = other.fMagnitude;
if (other.fArbitrary != nullptr) {
UErrorCode localStatus = U_ZERO_ERROR;
diff --git a/deps/icu-small/source/i18n/number_output.cpp b/deps/icu-small/source/i18n/number_output.cpp
index 7129b94e0f86e4..2c2c25eaedb427 100644
--- a/deps/icu-small/source/i18n/number_output.cpp
+++ b/deps/icu-small/source/i18n/number_output.cpp
@@ -39,6 +39,11 @@ MeasureUnit FormattedNumber::getOutputUnit(UErrorCode& status) const {
return fData->outputUnit;
}
+const char *FormattedNumber::getGender(UErrorCode &status) const {
+ UPRV_FORMATTED_VALUE_METHOD_GUARD("")
+ return fData->gender;
+}
+
void FormattedNumber::getDecimalQuantity(impl::DecimalQuantity& output, UErrorCode& status) const {
UPRV_FORMATTED_VALUE_METHOD_GUARD(UPRV_NOARG)
output = fData->quantity;
@@ -52,16 +57,6 @@ UPRV_FORMATTED_VALUE_SUBCLASS_AUTO_IMPL(FormattedNumberRange)
#define UPRV_NOARG
-UnicodeString FormattedNumberRange::getFirstDecimal(UErrorCode& status) const {
- UPRV_FORMATTED_VALUE_METHOD_GUARD(ICU_Utility::makeBogusString())
- return fData->quantity1.toScientificString();
-}
-
-UnicodeString FormattedNumberRange::getSecondDecimal(UErrorCode& status) const {
- UPRV_FORMATTED_VALUE_METHOD_GUARD(ICU_Utility::makeBogusString())
- return fData->quantity2.toScientificString();
-}
-
void FormattedNumberRange::getDecimalNumbers(ByteSink& sink1, ByteSink& sink2, UErrorCode& status) const {
UPRV_FORMATTED_VALUE_METHOD_GUARD(UPRV_NOARG)
impl::DecNum decnum1;
diff --git a/deps/icu-small/source/i18n/number_patternstring.cpp b/deps/icu-small/source/i18n/number_patternstring.cpp
index 9d845056069b80..ac9e8b7e8e4d75 100644
--- a/deps/icu-small/source/i18n/number_patternstring.cpp
+++ b/deps/icu-small/source/i18n/number_patternstring.cpp
@@ -1106,6 +1106,20 @@ PatternSignType PatternStringUtils::resolveSignDisplay(UNumberSignDisplay signDi
}
break;
+ case UNUM_SIGN_NEGATIVE:
+ case UNUM_SIGN_ACCOUNTING_NEGATIVE:
+ switch (signum) {
+ case SIGNUM_NEG:
+ return PATTERN_SIGN_TYPE_NEG;
+ case SIGNUM_NEG_ZERO:
+ case SIGNUM_POS_ZERO:
+ case SIGNUM_POS:
+ return PATTERN_SIGN_TYPE_POS;
+ default:
+ break;
+ }
+ break;
+
case UNUM_SIGN_NEVER:
return PATTERN_SIGN_TYPE_POS;
diff --git a/deps/icu-small/source/i18n/number_rounding.cpp b/deps/icu-small/source/i18n/number_rounding.cpp
index a8fd6bc892a8a5..40392ee857e493 100644
--- a/deps/icu-small/source/i18n/number_rounding.cpp
+++ b/deps/icu-small/source/i18n/number_rounding.cpp
@@ -193,6 +193,12 @@ Precision Precision::minMaxSignificantDigits(int32_t minSignificantDigits, int32
}
}
+Precision Precision::trailingZeroDisplay(UNumberTrailingZeroDisplay trailingZeroDisplay) const {
+ Precision result(*this); // copy constructor
+ result.fTrailingZeroDisplay = trailingZeroDisplay;
+ return result;
+}
+
IncrementPrecision Precision::increment(double roundingIncrement) {
if (roundingIncrement > 0.0) {
return constructIncrement(roundingIncrement, 0);
@@ -205,10 +211,32 @@ CurrencyPrecision Precision::currency(UCurrencyUsage currencyUsage) {
return constructCurrency(currencyUsage);
}
+Precision FractionPrecision::withSignificantDigits(
+ int32_t minSignificantDigits,
+ int32_t maxSignificantDigits,
+ UNumberRoundingPriority priority) const {
+ if (fType == RND_ERROR) { return *this; } // no-op in error state
+ if (minSignificantDigits >= 1 &&
+ maxSignificantDigits >= minSignificantDigits &&
+ maxSignificantDigits <= kMaxIntFracSig) {
+ return constructFractionSignificant(
+ *this,
+ minSignificantDigits,
+ maxSignificantDigits,
+ priority);
+ } else {
+ return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
+ }
+}
+
Precision FractionPrecision::withMinDigits(int32_t minSignificantDigits) const {
if (fType == RND_ERROR) { return *this; } // no-op in error state
if (minSignificantDigits >= 1 && minSignificantDigits <= kMaxIntFracSig) {
- return constructFractionSignificant(*this, minSignificantDigits, -1);
+ return constructFractionSignificant(
+ *this,
+ 1,
+ minSignificantDigits,
+ UNUM_ROUNDING_PRIORITY_RELAXED);
} else {
return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
}
@@ -217,7 +245,10 @@ Precision FractionPrecision::withMinDigits(int32_t minSignificantDigits) const {
Precision FractionPrecision::withMaxDigits(int32_t maxSignificantDigits) const {
if (fType == RND_ERROR) { return *this; } // no-op in error state
if (maxSignificantDigits >= 1 && maxSignificantDigits <= kMaxIntFracSig) {
- return constructFractionSignificant(*this, -1, maxSignificantDigits);
+ return constructFractionSignificant(*this,
+ 1,
+ maxSignificantDigits,
+ UNUM_ROUNDING_PRIORITY_STRICT);
} else {
return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
}
@@ -231,11 +262,11 @@ Precision Precision::withCurrency(const CurrencyUnit ¤cy, UErrorCode &stat
double increment = ucurr_getRoundingIncrementForUsage(isoCode, fUnion.currencyUsage, &status);
int32_t minMaxFrac = ucurr_getDefaultFractionDigitsForUsage(
isoCode, fUnion.currencyUsage, &status);
- if (increment != 0.0) {
- return constructIncrement(increment, minMaxFrac);
- } else {
- return constructFraction(minMaxFrac, minMaxFrac);
- }
+ Precision retval = (increment != 0.0)
+ ? static_cast(constructIncrement(increment, minMaxFrac))
+ : static_cast(constructFraction(minMaxFrac, minMaxFrac));
+ retval.fTrailingZeroDisplay = fTrailingZeroDisplay;
+ return retval;
}
// Public method on CurrencyPrecision subclass
@@ -280,10 +311,15 @@ Precision Precision::constructSignificant(int32_t minSig, int32_t maxSig) {
}
Precision
-Precision::constructFractionSignificant(const FractionPrecision &base, int32_t minSig, int32_t maxSig) {
+Precision::constructFractionSignificant(
+ const FractionPrecision &base,
+ int32_t minSig,
+ int32_t maxSig,
+ UNumberRoundingPriority priority) {
FractionSignificantSettings settings = base.fUnion.fracSig;
settings.fMinSig = static_cast(minSig);
settings.fMaxSig = static_cast(maxSig);
+ settings.fPriority = priority;
PrecisionUnion union_;
union_.fracSig = settings;
return {RND_FRACTION_SIGNIFICANT, union_};
@@ -383,6 +419,7 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const
if (fPassThrough) {
return;
}
+ int32_t resolvedMinFraction = 0;
switch (fPrecision.fType) {
case Precision::RND_BOGUS:
case Precision::RND_ERROR:
@@ -399,8 +436,8 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const
getRoundingMagnitudeFraction(fPrecision.fUnion.fracSig.fMaxFrac),
fRoundingMode,
status);
- value.setMinFraction(
- uprv_max(0, -getDisplayMagnitudeFraction(fPrecision.fUnion.fracSig.fMinFrac)));
+ resolvedMinFraction =
+ uprv_max(0, -getDisplayMagnitudeFraction(fPrecision.fUnion.fracSig.fMinFrac));
break;
case Precision::RND_SIGNIFICANT:
@@ -408,8 +445,8 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const
getRoundingMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMaxSig),
fRoundingMode,
status);
- value.setMinFraction(
- uprv_max(0, -getDisplayMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMinSig)));
+ resolvedMinFraction =
+ uprv_max(0, -getDisplayMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMinSig));
// Make sure that digits are displayed on zero.
if (value.isZeroish() && fPrecision.fUnion.fracSig.fMinSig > 0) {
value.setMinInteger(1);
@@ -417,23 +454,21 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const
break;
case Precision::RND_FRACTION_SIGNIFICANT: {
- int32_t displayMag = getDisplayMagnitudeFraction(fPrecision.fUnion.fracSig.fMinFrac);
- int32_t roundingMag = getRoundingMagnitudeFraction(fPrecision.fUnion.fracSig.fMaxFrac);
- if (fPrecision.fUnion.fracSig.fMinSig == -1) {
- // Max Sig override
- int32_t candidate = getRoundingMagnitudeSignificant(
- value,
- fPrecision.fUnion.fracSig.fMaxSig);
- roundingMag = uprv_max(roundingMag, candidate);
+ int32_t roundingMag1 = getRoundingMagnitudeFraction(fPrecision.fUnion.fracSig.fMaxFrac);
+ int32_t roundingMag2 = getRoundingMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMaxSig);
+ int32_t roundingMag;
+ if (fPrecision.fUnion.fracSig.fPriority == UNUM_ROUNDING_PRIORITY_RELAXED) {
+ roundingMag = uprv_min(roundingMag1, roundingMag2);
} else {
- // Min Sig override
- int32_t candidate = getDisplayMagnitudeSignificant(
- value,
- fPrecision.fUnion.fracSig.fMinSig);
- roundingMag = uprv_min(roundingMag, candidate);
+ roundingMag = uprv_max(roundingMag1, roundingMag2);
}
value.roundToMagnitude(roundingMag, fRoundingMode, status);
- value.setMinFraction(uprv_max(0, -displayMag));
+
+ int32_t displayMag1 = getDisplayMagnitudeFraction(fPrecision.fUnion.fracSig.fMinFrac);
+ int32_t displayMag2 = getDisplayMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMinSig);
+ int32_t displayMag = uprv_min(displayMag1, displayMag2);
+ resolvedMinFraction = uprv_max(0, -displayMag);
+
break;
}
@@ -442,7 +477,7 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const
fPrecision.fUnion.increment.fIncrement,
fRoundingMode,
status);
- value.setMinFraction(fPrecision.fUnion.increment.fMinFrac);
+ resolvedMinFraction = fPrecision.fUnion.increment.fMinFrac;
break;
case Precision::RND_INCREMENT_ONE:
@@ -450,7 +485,7 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const
-fPrecision.fUnion.increment.fMaxFrac,
fRoundingMode,
status);
- value.setMinFraction(fPrecision.fUnion.increment.fMinFrac);
+ resolvedMinFraction = fPrecision.fUnion.increment.fMinFrac;
break;
case Precision::RND_INCREMENT_FIVE:
@@ -458,7 +493,7 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const
-fPrecision.fUnion.increment.fMaxFrac,
fRoundingMode,
status);
- value.setMinFraction(fPrecision.fUnion.increment.fMinFrac);
+ resolvedMinFraction = fPrecision.fUnion.increment.fMinFrac;
break;
case Precision::RND_CURRENCY:
@@ -468,10 +503,17 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const
default:
UPRV_UNREACHABLE;
}
+
+ if (fPrecision.fTrailingZeroDisplay == UNUM_TRAILING_ZERO_AUTO ||
+ // PLURAL_OPERAND_T returns fraction digits as an integer
+ value.getPluralOperand(PLURAL_OPERAND_T) != 0) {
+ value.setMinFraction(resolvedMinFraction);
+ }
}
void RoundingImpl::apply(impl::DecimalQuantity &value, int32_t minInt, UErrorCode /*status*/) {
// This method is intended for the one specific purpose of helping print "00.000E0".
+ // Question: Is it useful to look at trailingZeroDisplay here?
U_ASSERT(isSignificantDigits());
U_ASSERT(value.isZeroish());
value.setMinFraction(fPrecision.fUnion.fracSig.fMinSig - minInt);
diff --git a/deps/icu-small/source/i18n/number_roundingutils.h b/deps/icu-small/source/i18n/number_roundingutils.h
index e85cbae9fdd2ea..06fadd29fd544e 100644
--- a/deps/icu-small/source/i18n/number_roundingutils.h
+++ b/deps/icu-small/source/i18n/number_roundingutils.h
@@ -104,6 +104,45 @@ getRoundingDirection(bool isEven, bool isNegative, Section section, RoundingMode
}
break;
+ case RoundingMode::UNUM_ROUND_HALF_ODD:
+ switch (section) {
+ case SECTION_MIDPOINT:
+ return !isEven;
+ case SECTION_LOWER:
+ return true;
+ case SECTION_UPPER:
+ return false;
+ default:
+ break;
+ }
+ break;
+
+ case RoundingMode::UNUM_ROUND_HALF_CEILING:
+ switch (section) {
+ case SECTION_MIDPOINT:
+ return isNegative;
+ case SECTION_LOWER:
+ return true;
+ case SECTION_UPPER:
+ return false;
+ default:
+ break;
+ }
+ break;
+
+ case RoundingMode::UNUM_ROUND_HALF_FLOOR:
+ switch (section) {
+ case SECTION_MIDPOINT:
+ return !isNegative;
+ case SECTION_LOWER:
+ return true;
+ case SECTION_UPPER:
+ return false;
+ default:
+ break;
+ }
+ break;
+
default:
break;
}
@@ -204,7 +243,7 @@ class RoundingImpl {
* - see blueprint_helpers::parseIncrementOption().
*
* Referencing MacroProps means needing to pull in the .o files that have the
- * destructors for the SymbolsWrapper, Usage, and Scale classes.
+ * destructors for the SymbolsWrapper, StringProp, and Scale classes.
*/
void parseIncrementOption(const StringSegment &segment, Precision &outPrecision, UErrorCode &status);
diff --git a/deps/icu-small/source/i18n/number_skeletons.cpp b/deps/icu-small/source/i18n/number_skeletons.cpp
index 028525a589db91..97d74303a4358e 100644
--- a/deps/icu-small/source/i18n/number_skeletons.cpp
+++ b/deps/icu-small/source/i18n/number_skeletons.cpp
@@ -68,6 +68,9 @@ void U_CALLCONV initNumberSkeletons(UErrorCode& status) {
b.add(u"rounding-mode-down", STEM_ROUNDING_MODE_DOWN, status);
b.add(u"rounding-mode-up", STEM_ROUNDING_MODE_UP, status);
b.add(u"rounding-mode-half-even", STEM_ROUNDING_MODE_HALF_EVEN, status);
+ b.add(u"rounding-mode-half-odd", STEM_ROUNDING_MODE_HALF_ODD, status);
+ b.add(u"rounding-mode-half-ceiling", STEM_ROUNDING_MODE_HALF_CEILING, status);
+ b.add(u"rounding-mode-half-floor", STEM_ROUNDING_MODE_HALF_FLOOR, status);
b.add(u"rounding-mode-half-down", STEM_ROUNDING_MODE_HALF_DOWN, status);
b.add(u"rounding-mode-half-up", STEM_ROUNDING_MODE_HALF_UP, status);
b.add(u"rounding-mode-unnecessary", STEM_ROUNDING_MODE_UNNECESSARY, status);
@@ -91,6 +94,8 @@ void U_CALLCONV initNumberSkeletons(UErrorCode& status) {
b.add(u"sign-accounting-always", STEM_SIGN_ACCOUNTING_ALWAYS, status);
b.add(u"sign-except-zero", STEM_SIGN_EXCEPT_ZERO, status);
b.add(u"sign-accounting-except-zero", STEM_SIGN_ACCOUNTING_EXCEPT_ZERO, status);
+ b.add(u"sign-negative", STEM_SIGN_NEGATIVE, status);
+ b.add(u"sign-accounting-negative", STEM_SIGN_ACCOUNTING_NEGATIVE, status);
b.add(u"decimal-auto", STEM_DECIMAL_AUTO, status);
b.add(u"decimal-always", STEM_DECIMAL_ALWAYS, status);
if (U_FAILURE(status)) { return; }
@@ -121,6 +126,8 @@ void U_CALLCONV initNumberSkeletons(UErrorCode& status) {
b.add(u"()!", STEM_SIGN_ACCOUNTING_ALWAYS, status);
b.add(u"+?", STEM_SIGN_EXCEPT_ZERO, status);
b.add(u"()?", STEM_SIGN_ACCOUNTING_EXCEPT_ZERO, status);
+ b.add(u"+-", STEM_SIGN_NEGATIVE, status);
+ b.add(u"()-", STEM_SIGN_ACCOUNTING_NEGATIVE, status);
if (U_FAILURE(status)) { return; }
// Build the CharsTrie
@@ -213,6 +220,12 @@ UNumberFormatRoundingMode stem_to_object::roundingMode(skeleton::StemEnum stem)
return UNUM_ROUND_UP;
case STEM_ROUNDING_MODE_HALF_EVEN:
return UNUM_ROUND_HALFEVEN;
+ case STEM_ROUNDING_MODE_HALF_ODD:
+ return UNUM_ROUND_HALF_ODD;
+ case STEM_ROUNDING_MODE_HALF_CEILING:
+ return UNUM_ROUND_HALF_CEILING;
+ case STEM_ROUNDING_MODE_HALF_FLOOR:
+ return UNUM_ROUND_HALF_FLOOR;
case STEM_ROUNDING_MODE_HALF_DOWN:
return UNUM_ROUND_HALFDOWN;
case STEM_ROUNDING_MODE_HALF_UP:
@@ -278,6 +291,10 @@ UNumberSignDisplay stem_to_object::signDisplay(skeleton::StemEnum stem) {
return UNUM_SIGN_EXCEPT_ZERO;
case STEM_SIGN_ACCOUNTING_EXCEPT_ZERO:
return UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO;
+ case STEM_SIGN_NEGATIVE:
+ return UNUM_SIGN_NEGATIVE;
+ case STEM_SIGN_ACCOUNTING_NEGATIVE:
+ return UNUM_SIGN_ACCOUNTING_NEGATIVE;
default:
return UNUM_SIGN_COUNT; // for objects, throw; for enums, return COUNT
}
@@ -312,6 +329,15 @@ void enum_to_stem_string::roundingMode(UNumberFormatRoundingMode value, UnicodeS
case UNUM_ROUND_HALFEVEN:
sb.append(u"rounding-mode-half-even", -1);
break;
+ case UNUM_ROUND_HALF_ODD:
+ sb.append(u"rounding-mode-half-odd", -1);
+ break;
+ case UNUM_ROUND_HALF_CEILING:
+ sb.append(u"rounding-mode-half-ceiling", -1);
+ break;
+ case UNUM_ROUND_HALF_FLOOR:
+ sb.append(u"rounding-mode-half-floor", -1);
+ break;
case UNUM_ROUND_HALFDOWN:
sb.append(u"rounding-mode-half-down", -1);
break;
@@ -399,6 +425,12 @@ void enum_to_stem_string::signDisplay(UNumberSignDisplay value, UnicodeString& s
case UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO:
sb.append(u"sign-accounting-except-zero", -1);
break;
+ case UNUM_SIGN_NEGATIVE:
+ sb.append(u"sign-negative", -1);
+ break;
+ case UNUM_SIGN_ACCOUNTING_NEGATIVE:
+ sb.append(u"sign-accounting-negative", -1);
+ break;
default:
UPRV_UNREACHABLE;
}
@@ -584,7 +616,7 @@ skeleton::parseStem(const StringSegment& segment, const UCharsTrie& stemTrie, Se
case u'@':
CHECK_NULL(seen, precision, status);
blueprint_helpers::parseDigitsStem(segment, macros, status);
- return STATE_NULL;
+ return STATE_PRECISION;
case u'E':
CHECK_NULL(seen, notation, status);
blueprint_helpers::parseScientificStem(segment, macros, status);
@@ -650,7 +682,7 @@ skeleton::parseStem(const StringSegment& segment, const UCharsTrie& stemTrie, Se
case STEM_PRECISION_INTEGER:
return STATE_FRACTION_PRECISION; // allows for "precision-integer/@##"
default:
- return STATE_NULL;
+ return STATE_PRECISION;
}
case STEM_ROUNDING_MODE_CEILING:
@@ -658,6 +690,9 @@ skeleton::parseStem(const StringSegment& segment, const UCharsTrie& stemTrie, Se
case STEM_ROUNDING_MODE_DOWN:
case STEM_ROUNDING_MODE_UP:
case STEM_ROUNDING_MODE_HALF_EVEN:
+ case STEM_ROUNDING_MODE_HALF_ODD:
+ case STEM_ROUNDING_MODE_HALF_CEILING:
+ case STEM_ROUNDING_MODE_HALF_FLOOR:
case STEM_ROUNDING_MODE_HALF_DOWN:
case STEM_ROUNDING_MODE_HALF_UP:
case STEM_ROUNDING_MODE_UNNECESSARY:
@@ -697,6 +732,8 @@ skeleton::parseStem(const StringSegment& segment, const UCharsTrie& stemTrie, Se
case STEM_SIGN_ACCOUNTING_ALWAYS:
case STEM_SIGN_EXCEPT_ZERO:
case STEM_SIGN_ACCOUNTING_EXCEPT_ZERO:
+ case STEM_SIGN_NEGATIVE:
+ case STEM_SIGN_ACCOUNTING_NEGATIVE:
CHECK_NULL(seen, sign, status);
macros.sign = stem_to_object::signDisplay(stem);
return STATE_NULL;
@@ -776,7 +813,7 @@ ParseState skeleton::parseOption(ParseState stem, const StringSegment& segment,
return STATE_NULL;
case STATE_INCREMENT_PRECISION:
blueprint_helpers::parseIncrementOption(segment, macros, status);
- return STATE_NULL;
+ return STATE_PRECISION;
case STATE_INTEGER_WIDTH:
blueprint_helpers::parseIntegerWidthOption(segment, macros, status);
return STATE_NULL;
@@ -816,6 +853,22 @@ ParseState skeleton::parseOption(ParseState stem, const StringSegment& segment,
switch (stem) {
case STATE_FRACTION_PRECISION:
if (blueprint_helpers::parseFracSigOption(segment, macros, status)) {
+ return STATE_PRECISION;
+ }
+ if (U_FAILURE(status)) {
+ return {};
+ }
+ // If the fracSig option was not found, try normal precision options.
+ stem = STATE_PRECISION;
+ break;
+ default:
+ break;
+ }
+
+ // Trailing zeros option
+ switch (stem) {
+ case STATE_PRECISION:
+ if (blueprint_helpers::parseTrailingZeroOption(segment, macros, status)) {
return STATE_NULL;
}
if (U_FAILURE(status)) {
@@ -890,6 +943,10 @@ void GeneratorHelpers::generateSkeleton(const MacroProps& macros, UnicodeString&
status = U_UNSUPPORTED_ERROR;
return;
}
+ if (macros.unitDisplayCase.isSet()) {
+ status = U_UNSUPPORTED_ERROR;
+ return;
+ }
if (macros.affixProvider != nullptr) {
status = U_UNSUPPORTED_ERROR;
return;
@@ -1041,37 +1098,12 @@ void blueprint_helpers::parseIdentifierUnitOption(const StringSegment& segment,
SKELETON_UCHAR_TO_CHAR(buffer, segment.toTempUnicodeString(), 0, segment.length(), status);
ErrorCode internalStatus;
- auto fullUnit = MeasureUnitImpl::forIdentifier(buffer.toStringPiece(), internalStatus);
+ macros.unit = MeasureUnit::forIdentifier(buffer.toStringPiece(), internalStatus);
if (internalStatus.isFailure()) {
// throw new SkeletonSyntaxException("Invalid core unit identifier", segment, e);
status = U_NUMBER_SKELETON_SYNTAX_ERROR;
return;
}
-
- // Mixed units can only be represented by full MeasureUnit instances, so we
- // don't split the denominator into macros.perUnit.
- if (fullUnit.complexity == UMEASURE_UNIT_MIXED) {
- macros.unit = std::move(fullUnit).build(status);
- return;
- }
-
- // When we have a built-in unit (e.g. meter-per-second), we don't split it up
- MeasureUnit testBuiltin = fullUnit.copy(status).build(status);
- if (uprv_strcmp(testBuiltin.getType(), "") != 0) {
- macros.unit = std::move(testBuiltin);
- return;
- }
-
- // TODO(ICU-20941): Clean this up.
- for (int32_t i = 0; i < fullUnit.units.length(); i++) {
- SingleUnitImpl* subUnit = fullUnit.units[i];
- if (subUnit->dimensionality > 0) {
- macros.unit = macros.unit.product(subUnit->build(status), status);
- } else {
- subUnit->dimensionality *= -1;
- macros.perUnit = macros.perUnit.product(subUnit->build(status), status);
- }
- }
}
void blueprint_helpers::parseUnitUsageOption(const StringSegment &segment, MacroProps ¯os,
@@ -1226,6 +1258,7 @@ void blueprint_helpers::parseScientificStem(const StringSegment& segment, MacroP
} else if (segment.charAt(offset) == u'?') {
signDisplay = UNUM_SIGN_EXCEPT_ZERO;
} else {
+ // NOTE: Other sign displays are not included because they aren't useful in this context
goto fail;
}
offset++;
@@ -1284,21 +1317,14 @@ bool blueprint_helpers::parseFracSigOption(const StringSegment& segment, MacroPr
break;
}
}
- // For the frac-sig option, there must be minSig or maxSig but not both.
- // Valid: @+, @@+, @@@+
- // Valid: @#, @##, @###
- // Invalid: @, @@, @@@
- // Invalid: @@#, @@##, @@@#
if (offset < segment.length()) {
if (isWildcardChar(segment.charAt(offset))) {
+ // @+, @@+, @@@+
maxSig = -1;
offset++;
- } else if (minSig > 1) {
- // @@#, @@##, @@@#
- // throw new SkeletonSyntaxException("Invalid digits option for fraction rounder", segment);
- status = U_NUMBER_SKELETON_SYNTAX_ERROR;
- return false;
} else {
+ // @#, @##, @###
+ // @@#, @@##, @@@#
maxSig = minSig;
for (; offset < segment.length(); offset++) {
if (segment.charAt(offset) == u'#') {
@@ -1310,25 +1336,56 @@ bool blueprint_helpers::parseFracSigOption(const StringSegment& segment, MacroPr
}
} else {
// @, @@, @@@
- // throw new SkeletonSyntaxException("Invalid digits option for fraction rounder", segment);
- status = U_NUMBER_SKELETON_SYNTAX_ERROR;
- return false;
+ maxSig = minSig;
}
+ UNumberRoundingPriority priority;
if (offset < segment.length()) {
- // throw new SkeletonSyntaxException("Invalid digits option for fraction rounder", segment);
+ if (maxSig == -1) {
+ // The wildcard character is not allowed with the priority annotation
+ status = U_NUMBER_SKELETON_SYNTAX_ERROR;
+ return false;
+ }
+ if (segment.codePointAt(offset) == u'r') {
+ priority = UNUM_ROUNDING_PRIORITY_RELAXED;
+ offset++;
+ } else if (segment.codePointAt(offset) == u's') {
+ priority = UNUM_ROUNDING_PRIORITY_STRICT;
+ offset++;
+ } else {
+ U_ASSERT(offset < segment.length());
+ }
+ if (offset < segment.length()) {
+ // Invalid digits option for fraction rounder
+ status = U_NUMBER_SKELETON_SYNTAX_ERROR;
+ return false;
+ }
+ } else if (maxSig == -1) {
+ // withMinDigits
+ maxSig = minSig;
+ minSig = 1;
+ priority = UNUM_ROUNDING_PRIORITY_RELAXED;
+ } else if (minSig == 1) {
+ // withMaxDigits
+ priority = UNUM_ROUNDING_PRIORITY_STRICT;
+ } else {
+ // Digits options with both min and max sig require the priority option
status = U_NUMBER_SKELETON_SYNTAX_ERROR;
return false;
}
auto& oldPrecision = static_cast(macros.precision);
- if (maxSig == -1) {
- macros.precision = oldPrecision.withMinDigits(minSig);
- } else {
- macros.precision = oldPrecision.withMaxDigits(maxSig);
- }
+ macros.precision = oldPrecision.withSignificantDigits(minSig, maxSig, priority);
return true;
}
+bool blueprint_helpers::parseTrailingZeroOption(const StringSegment& segment, MacroProps& macros, UErrorCode&) {
+ if (segment == u"w") {
+ macros.precision = macros.precision.trailingZeroDisplay(UNUM_TRAILING_ZERO_HIDE_IF_WHOLE);
+ return true;
+ }
+ return false;
+}
+
void blueprint_helpers::parseIncrementOption(const StringSegment &segment, MacroProps ¯os,
UErrorCode &status) {
number::impl::parseIncrementOption(segment, macros.precision, status);
@@ -1537,7 +1594,7 @@ bool GeneratorHelpers::unit(const MacroProps& macros, UnicodeString& sb, UErrorC
bool GeneratorHelpers::usage(const MacroProps& macros, UnicodeString& sb, UErrorCode& /* status */) {
if (macros.usage.isSet()) {
sb.append(u"usage/", -1);
- sb.append(UnicodeString(macros.usage.fUsage, -1, US_INV));
+ sb.append(UnicodeString(macros.usage.fValue, -1, US_INV));
return true;
}
return false;
@@ -1556,10 +1613,11 @@ bool GeneratorHelpers::precision(const MacroProps& macros, UnicodeString& sb, UE
const Precision::FractionSignificantSettings& impl = macros.precision.fUnion.fracSig;
blueprint_helpers::generateFractionStem(impl.fMinFrac, impl.fMaxFrac, sb, status);
sb.append(u'/');
- if (impl.fMinSig == -1) {
- blueprint_helpers::generateDigitsStem(1, impl.fMaxSig, sb, status);
+ blueprint_helpers::generateDigitsStem(impl.fMinSig, impl.fMaxSig, sb, status);
+ if (impl.fPriority == UNUM_ROUNDING_PRIORITY_RELAXED) {
+ sb.append(u'r');
} else {
- blueprint_helpers::generateDigitsStem(impl.fMinSig, -1, sb, status);
+ sb.append(u's');
}
} else if (macros.precision.fType == Precision::RND_INCREMENT
|| macros.precision.fType == Precision::RND_INCREMENT_ONE
@@ -1583,6 +1641,10 @@ bool GeneratorHelpers::precision(const MacroProps& macros, UnicodeString& sb, UE
return false;
}
+ if (macros.precision.fTrailingZeroDisplay == UNUM_TRAILING_ZERO_HIDE_IF_WHOLE) {
+ sb.append(u"/w", -1);
+ }
+
// NOTE: Always return true for rounding because the default value depends on other options.
return true;
}
diff --git a/deps/icu-small/source/i18n/number_skeletons.h b/deps/icu-small/source/i18n/number_skeletons.h
index 201267e635cd6a..af636504283059 100644
--- a/deps/icu-small/source/i18n/number_skeletons.h
+++ b/deps/icu-small/source/i18n/number_skeletons.h
@@ -42,6 +42,7 @@ enum ParseState {
STATE_SCIENTIFIC,
STATE_FRACTION_PRECISION,
+ STATE_PRECISION,
// Section 2: An option is required:
@@ -85,6 +86,9 @@ enum StemEnum {
STEM_ROUNDING_MODE_DOWN,
STEM_ROUNDING_MODE_UP,
STEM_ROUNDING_MODE_HALF_EVEN,
+ STEM_ROUNDING_MODE_HALF_ODD,
+ STEM_ROUNDING_MODE_HALF_CEILING,
+ STEM_ROUNDING_MODE_HALF_FLOOR,
STEM_ROUNDING_MODE_HALF_DOWN,
STEM_ROUNDING_MODE_HALF_UP,
STEM_ROUNDING_MODE_UNNECESSARY,
@@ -108,6 +112,8 @@ enum StemEnum {
STEM_SIGN_ACCOUNTING_ALWAYS,
STEM_SIGN_EXCEPT_ZERO,
STEM_SIGN_ACCOUNTING_EXCEPT_ZERO,
+ STEM_SIGN_NEGATIVE,
+ STEM_SIGN_ACCOUNTING_NEGATIVE,
STEM_DECIMAL_AUTO,
STEM_DECIMAL_ALWAYS,
@@ -273,6 +279,9 @@ void parseIntegerStem(const StringSegment& segment, MacroProps& macros, UErrorCo
/** @return Whether we successfully found and parsed a frac-sig option. */
bool parseFracSigOption(const StringSegment& segment, MacroProps& macros, UErrorCode& status);
+/** @return Whether we successfully found and parsed a trailing zero option. */
+bool parseTrailingZeroOption(const StringSegment& segment, MacroProps& macros, UErrorCode& status);
+
void parseIncrementOption(const StringSegment& segment, MacroProps& macros, UErrorCode& status);
void
diff --git a/deps/icu-small/source/i18n/number_usageprefs.cpp b/deps/icu-small/source/i18n/number_usageprefs.cpp
index 0d9cb06c50a2ab..ed426da086e327 100644
--- a/deps/icu-small/source/i18n/number_usageprefs.cpp
+++ b/deps/icu-small/source/i18n/number_usageprefs.cpp
@@ -28,116 +28,124 @@ using icu::StringSegment;
using icu::units::ConversionRates;
// Copy constructor
-Usage::Usage(const Usage &other) : Usage() {
+StringProp::StringProp(const StringProp &other) : StringProp() {
this->operator=(other);
}
// Copy assignment operator
-Usage &Usage::operator=(const Usage &other) {
+StringProp &StringProp::operator=(const StringProp &other) {
+ if (this == &other) { return *this; } // self-assignment: no-op
fLength = 0;
fError = other.fError;
- if (fUsage != nullptr) {
- uprv_free(fUsage);
- fUsage = nullptr;
+ if (fValue != nullptr) {
+ uprv_free(fValue);
+ fValue = nullptr;
}
- if (other.fUsage == nullptr) {
+ if (other.fValue == nullptr) {
return *this;
}
if (U_FAILURE(other.fError)) {
// We don't bother trying to allocating memory if we're in any case busy
- // copying an errored Usage.
+ // copying an errored StringProp.
return *this;
}
- fUsage = (char *)uprv_malloc(other.fLength + 1);
- if (fUsage == nullptr) {
+ fValue = (char *)uprv_malloc(other.fLength + 1);
+ if (fValue == nullptr) {
fError = U_MEMORY_ALLOCATION_ERROR;
return *this;
}
fLength = other.fLength;
- uprv_strncpy(fUsage, other.fUsage, fLength + 1);
+ uprv_strncpy(fValue, other.fValue, fLength + 1);
return *this;
}
// Move constructor
-Usage::Usage(Usage &&src) U_NOEXCEPT : fUsage(src.fUsage), fLength(src.fLength), fError(src.fError) {
+StringProp::StringProp(StringProp &&src) U_NOEXCEPT : fValue(src.fValue),
+ fLength(src.fLength),
+ fError(src.fError) {
// Take ownership away from src if necessary
- src.fUsage = nullptr;
+ src.fValue = nullptr;
}
// Move assignment operator
-Usage &Usage::operator=(Usage &&src) U_NOEXCEPT {
+StringProp &StringProp::operator=(StringProp &&src) U_NOEXCEPT {
if (this == &src) {
return *this;
}
- if (fUsage != nullptr) {
- uprv_free(fUsage);
+ if (fValue != nullptr) {
+ uprv_free(fValue);
}
- fUsage = src.fUsage;
+ fValue = src.fValue;
fLength = src.fLength;
fError = src.fError;
// Take ownership away from src if necessary
- src.fUsage = nullptr;
+ src.fValue = nullptr;
return *this;
}
-Usage::~Usage() {
- if (fUsage != nullptr) {
- uprv_free(fUsage);
- fUsage = nullptr;
+StringProp::~StringProp() {
+ if (fValue != nullptr) {
+ uprv_free(fValue);
+ fValue = nullptr;
}
}
-void Usage::set(StringPiece value) {
- if (fUsage != nullptr) {
- uprv_free(fUsage);
- fUsage = nullptr;
+void StringProp::set(StringPiece value) {
+ if (fValue != nullptr) {
+ uprv_free(fValue);
+ fValue = nullptr;
}
fLength = value.length();
- fUsage = (char *)uprv_malloc(fLength + 1);
- if (fUsage == nullptr) {
+ fValue = (char *)uprv_malloc(fLength + 1);
+ if (fValue == nullptr) {
fLength = 0;
fError = U_MEMORY_ALLOCATION_ERROR;
return;
}
- uprv_strncpy(fUsage, value.data(), fLength);
- fUsage[fLength] = 0;
+ uprv_strncpy(fValue, value.data(), fLength);
+ fValue[fLength] = 0;
}
// Populates micros.mixedMeasures and modifies quantity, based on the values in
// measures.
void mixedMeasuresToMicros(const MaybeStackVector &measures, DecimalQuantity *quantity,
MicroProps *micros, UErrorCode status) {
- micros->mixedMeasuresCount = measures.length() - 1;
- if (micros->mixedMeasuresCount > 0) {
-#ifdef U_DEBUG
- U_ASSERT(micros->outputUnit.getComplexity(status) == UMEASURE_UNIT_MIXED);
- U_ASSERT(U_SUCCESS(status));
- // Check that we received measurements with the expected MeasureUnits:
- MeasureUnitImpl temp;
- const MeasureUnitImpl& impl = MeasureUnitImpl::forMeasureUnit(micros->outputUnit, temp, status);
- U_ASSERT(U_SUCCESS(status));
- U_ASSERT(measures.length() == impl.units.length());
- for (int32_t i = 0; i < measures.length(); i++) {
- U_ASSERT(measures[i]->getUnit() == impl.units[i]->build(status));
- }
- (void)impl;
-#endif
- // Mixed units: except for the last value, we pass all values to the
- // LongNameHandler via micros->mixedMeasures.
- if (micros->mixedMeasures.getCapacity() < micros->mixedMeasuresCount) {
- if (micros->mixedMeasures.resize(micros->mixedMeasuresCount) == nullptr) {
- status = U_MEMORY_ALLOCATION_ERROR;
- return;
- }
+ micros->mixedMeasuresCount = measures.length();
+
+ if (micros->mixedMeasures.getCapacity() < micros->mixedMeasuresCount) {
+ if (micros->mixedMeasures.resize(micros->mixedMeasuresCount) == nullptr) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return;
}
- for (int32_t i = 0; i < micros->mixedMeasuresCount; i++) {
+ }
+
+ for (int32_t i = 0; i < micros->mixedMeasuresCount; i++) {
+ switch (measures[i]->getNumber().getType()) {
+ case Formattable::kInt64:
micros->mixedMeasures[i] = measures[i]->getNumber().getInt64();
+ break;
+
+ case Formattable::kDouble:
+ U_ASSERT(micros->indexOfQuantity < 0);
+ quantity->setToDouble(measures[i]->getNumber().getDouble());
+ micros->indexOfQuantity = i;
+ break;
+
+ default:
+ U_ASSERT(0 == "Found a Measure Number which is neither a double nor an int");
+ UPRV_UNREACHABLE;
+ break;
}
- } else {
- micros->mixedMeasuresCount = 0;
+
+ if (U_FAILURE(status)) {
+ return;
+ }
+ }
+
+ if (micros->indexOfQuantity < 0) {
+ // There is no quantity.
+ status = U_INTERNAL_PROGRAM_ERROR;
}
- // The last value (potentially the only value) gets passed on via quantity.
- quantity->setToDouble(measures[measures.length() - 1]->getNumber().getDouble());
}
UsagePrefsHandler::UsagePrefsHandler(const Locale &locale,
@@ -170,22 +178,20 @@ void UsagePrefsHandler::processQuantity(DecimalQuantity &quantity, MicroProps &m
mixedMeasuresToMicros(routedMeasures, &quantity, µs, status);
}
-UnitConversionHandler::UnitConversionHandler(const MeasureUnit &inputUnit, const MeasureUnit &outputUnit,
+UnitConversionHandler::UnitConversionHandler(const MeasureUnit &targetUnit,
const MicroPropsGenerator *parent, UErrorCode &status)
- : fOutputUnit(outputUnit), fParent(parent) {
+ : fOutputUnit(targetUnit), fParent(parent) {
MeasureUnitImpl tempInput, tempOutput;
- const MeasureUnitImpl &inputUnitImpl = MeasureUnitImpl::forMeasureUnit(inputUnit, tempInput, status);
- const MeasureUnitImpl &outputUnitImpl =
- MeasureUnitImpl::forMeasureUnit(outputUnit, tempOutput, status);
- // TODO: this should become an initOnce thing? Review with other
- // ConversionRates usages.
ConversionRates conversionRates(status);
if (U_FAILURE(status)) {
return;
}
+
+ const MeasureUnitImpl &targetUnitImpl =
+ MeasureUnitImpl::forMeasureUnit(targetUnit, tempOutput, status);
fUnitConverter.adoptInsteadAndCheckErrorCode(
- new ComplexUnitsConverter(inputUnitImpl, outputUnitImpl, conversionRates, status), status);
+ new ComplexUnitsConverter(targetUnitImpl, conversionRates, status), status);
}
void UnitConversionHandler::processQuantity(DecimalQuantity &quantity, MicroProps µs,
diff --git a/deps/icu-small/source/i18n/number_usageprefs.h b/deps/icu-small/source/i18n/number_usageprefs.h
index 9e8bd936bd7248..70547225a00761 100644
--- a/deps/icu-small/source/i18n/number_usageprefs.h
+++ b/deps/icu-small/source/i18n/number_usageprefs.h
@@ -97,14 +97,15 @@ class U_I18N_API UnitConversionHandler : public MicroPropsGenerator, public UMem
/**
* Constructor.
*
- * @param inputUnit Specifies the input MeasureUnit. Mixed units are not
- * supported as input (because input is just a single decimal quantity).
- * @param outputUnit Specifies the output MeasureUnit.
+ * @param targetUnit Specifies the output MeasureUnit. The input MeasureUnit
+ * is derived from it: in case of a mixed unit, the biggest unit is
+ * taken as the input unit. If not a mixed unit, the input unit will be
+ * the same as the output unit and no unit conversion takes place.
* @param parent The parent MicroPropsGenerator.
* @param status Receives status.
*/
- UnitConversionHandler(const MeasureUnit &inputUnit, const MeasureUnit &outputUnit,
- const MicroPropsGenerator *parent, UErrorCode &status);
+ UnitConversionHandler(const MeasureUnit &targetUnit, const MicroPropsGenerator *parent,
+ UErrorCode &status);
/**
* Obtains the appropriate output values from the Unit Converter.
diff --git a/deps/icu-small/source/i18n/number_utypes.h b/deps/icu-small/source/i18n/number_utypes.h
index d97eadc5cdb96e..50c861787f4ed9 100644
--- a/deps/icu-small/source/i18n/number_utypes.h
+++ b/deps/icu-small/source/i18n/number_utypes.h
@@ -42,6 +42,9 @@ class U_I18N_API UFormattedNumberData : public FormattedValueStringBuilderImpl {
// TODO(units,hugovdm): populate this correctly for the general case - it's
// currently only implemented for the .usage() use case.
MeasureUnit outputUnit;
+
+ // The gender of the formatted output.
+ const char *gender = "";
};
diff --git a/deps/icu-small/source/i18n/numfmt.cpp b/deps/icu-small/source/i18n/numfmt.cpp
index bf78179bcddefe..bffefa5e3998b8 100644
--- a/deps/icu-small/source/i18n/numfmt.cpp
+++ b/deps/icu-small/source/i18n/numfmt.cpp
@@ -13,7 +13,7 @@
* Date Name Description
* 02/19/97 aliu Converted from java.
* 03/18/97 clhuang Implemented with C++ APIs.
-* 04/17/97 aliu Enlarged MAX_INTEGER_DIGITS to fully accomodate the
+* 04/17/97 aliu Enlarged MAX_INTEGER_DIGITS to fully accommodate the
* largest double, by default.
* Changed DigitCount to int per code review.
* 07/20/98 stephen Changed operator== to check for grouping
diff --git a/deps/icu-small/source/i18n/numrange_fluent.cpp b/deps/icu-small/source/i18n/numrange_fluent.cpp
index d9286d1d713d2c..f1060b3c21d45e 100644
--- a/deps/icu-small/source/i18n/numrange_fluent.cpp
+++ b/deps/icu-small/source/i18n/numrange_fluent.cpp
@@ -245,6 +245,7 @@ LocalizedNumberRangeFormatter::LocalizedNumberRangeFormatter(NFS&& src) U_N
}
LocalizedNumberRangeFormatter& LocalizedNumberRangeFormatter::operator=(const LNF& other) {
+ if (this == &other) { return *this; } // self-assignment: no-op
NFS::operator=(static_cast&>(other));
// Do not steal; just clear
delete fAtomicFormatter.exchange(nullptr);
diff --git a/deps/icu-small/source/i18n/numrange_impl.cpp b/deps/icu-small/source/i18n/numrange_impl.cpp
index 3aae5c23548349..aa713f1398b502 100644
--- a/deps/icu-small/source/i18n/numrange_impl.cpp
+++ b/deps/icu-small/source/i18n/numrange_impl.cpp
@@ -305,7 +305,7 @@ void NumberRangeFormatterImpl::formatRange(UFormattedNumberRangeData& data,
// INNER MODIFIER
collapseInner = micros1.modInner->semanticallyEquivalent(*micros2.modInner);
- // All done checking for collapsability.
+ // All done checking for collapsibility.
break;
}
@@ -328,6 +328,7 @@ void NumberRangeFormatterImpl::formatRange(UFormattedNumberRangeData& data,
#define UPRV_INDEX_1 (lengthPrefix + length1)
#define UPRV_INDEX_2 (lengthPrefix + length1 + lengthInfix)
#define UPRV_INDEX_3 (lengthPrefix + length1 + lengthInfix + length2)
+ #define UPRV_INDEX_4 (lengthPrefix + length1 + lengthInfix + length2 + lengthSuffix)
int32_t lengthRange = SimpleModifier::formatTwoArgPattern(
fRangeFormatter,
@@ -367,31 +368,38 @@ void NumberRangeFormatterImpl::formatRange(UFormattedNumberRangeData& data,
// TODO: Support padding?
if (collapseInner) {
- // Note: this is actually a mix of prefix and suffix, but adding to infix length works
const Modifier& mod = resolveModifierPlurals(*micros1.modInner, *micros2.modInner);
- lengthInfix += mod.apply(string, UPRV_INDEX_0, UPRV_INDEX_3, status);
+ lengthSuffix += mod.apply(string, UPRV_INDEX_0, UPRV_INDEX_4, status);
+ lengthPrefix += mod.getPrefixLength();
+ lengthSuffix -= mod.getPrefixLength();
} else {
length1 += micros1.modInner->apply(string, UPRV_INDEX_0, UPRV_INDEX_1, status);
- length2 += micros2.modInner->apply(string, UPRV_INDEX_2, UPRV_INDEX_3, status);
+ length2 += micros2.modInner->apply(string, UPRV_INDEX_2, UPRV_INDEX_4, status);
}
if (collapseMiddle) {
- // Note: this is actually a mix of prefix and suffix, but adding to infix length works
const Modifier& mod = resolveModifierPlurals(*micros1.modMiddle, *micros2.modMiddle);
- lengthInfix += mod.apply(string, UPRV_INDEX_0, UPRV_INDEX_3, status);
+ lengthSuffix += mod.apply(string, UPRV_INDEX_0, UPRV_INDEX_4, status);
+ lengthPrefix += mod.getPrefixLength();
+ lengthSuffix -= mod.getPrefixLength();
} else {
length1 += micros1.modMiddle->apply(string, UPRV_INDEX_0, UPRV_INDEX_1, status);
- length2 += micros2.modMiddle->apply(string, UPRV_INDEX_2, UPRV_INDEX_3, status);
+ length2 += micros2.modMiddle->apply(string, UPRV_INDEX_2, UPRV_INDEX_4, status);
}
if (collapseOuter) {
- // Note: this is actually a mix of prefix and suffix, but adding to infix length works
const Modifier& mod = resolveModifierPlurals(*micros1.modOuter, *micros2.modOuter);
- lengthInfix += mod.apply(string, UPRV_INDEX_0, UPRV_INDEX_3, status);
+ lengthSuffix += mod.apply(string, UPRV_INDEX_0, UPRV_INDEX_4, status);
+ lengthPrefix += mod.getPrefixLength();
+ lengthSuffix -= mod.getPrefixLength();
} else {
length1 += micros1.modOuter->apply(string, UPRV_INDEX_0, UPRV_INDEX_1, status);
- length2 += micros2.modOuter->apply(string, UPRV_INDEX_2, UPRV_INDEX_3, status);
+ length2 += micros2.modOuter->apply(string, UPRV_INDEX_2, UPRV_INDEX_4, status);
}
+
+ // Now that all pieces are added, save the span info.
+ data.appendSpanInfo(UFIELD_CATEGORY_NUMBER_RANGE_SPAN, 0, UPRV_INDEX_0, length1, status);
+ data.appendSpanInfo(UFIELD_CATEGORY_NUMBER_RANGE_SPAN, 1, UPRV_INDEX_2, length2, status);
}
diff --git a/deps/icu-small/source/i18n/olsontz.cpp b/deps/icu-small/source/i18n/olsontz.cpp
index cb142f7b9e080f..67aa1f7af81d68 100644
--- a/deps/icu-small/source/i18n/olsontz.cpp
+++ b/deps/icu-small/source/i18n/olsontz.cpp
@@ -274,6 +274,7 @@ OlsonTimeZone::OlsonTimeZone(const OlsonTimeZone& other) :
* Assignment operator
*/
OlsonTimeZone& OlsonTimeZone::operator=(const OlsonTimeZone& other) {
+ if (this == &other) { return *this; } // self-assignment: no-op
canonicalID = other.canonicalID;
transitionTimesPre32 = other.transitionTimesPre32;
@@ -399,9 +400,9 @@ void OlsonTimeZone::getOffset(UDate date, UBool local, int32_t& rawoff,
}
}
-void
-OlsonTimeZone::getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
- int32_t& rawoff, int32_t& dstoff, UErrorCode& ec) const {
+void OlsonTimeZone::getOffsetFromLocal(UDate date, UTimeZoneLocalOption nonExistingTimeOpt,
+ UTimeZoneLocalOption duplicatedTimeOpt,
+ int32_t& rawoff, int32_t& dstoff, UErrorCode& ec) const {
if (U_FAILURE(ec)) {
return;
}
@@ -812,7 +813,7 @@ OlsonTimeZone::initTransitionRules(UErrorCode& status) {
if (finalZone->useDaylightTime()) {
/*
* Note: When an OlsonTimeZone is constructed, we should set the final year
- * as the start year of finalZone. However, the bounday condition used for
+ * as the start year of finalZone. However, the boundary condition used for
* getting offset from finalZone has some problems.
* For now, we do not set the valid start year when the construction time
* and create a clone and set the start year when extracting rules.
diff --git a/deps/icu-small/source/i18n/olsontz.h b/deps/icu-small/source/i18n/olsontz.h
index 643a695369ef48..6bedb8792b0cd4 100644
--- a/deps/icu-small/source/i18n/olsontz.h
+++ b/deps/icu-small/source/i18n/olsontz.h
@@ -187,8 +187,10 @@ class U_I18N_API OlsonTimeZone: public BasicTimeZone {
/**
* BasicTimeZone API.
*/
- virtual void getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
- int32_t& rawoff, int32_t& dstoff, UErrorCode& ec) const;
+ virtual void getOffsetFromLocal(
+ UDate date, UTimeZoneLocalOption nonExistingTimeOpt,
+ UTimeZoneLocalOption duplicatedTimeOpt,
+ int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) const;
/**
* TimeZone API. This method has no effect since objects of this
diff --git a/deps/icu-small/source/i18n/plurrule.cpp b/deps/icu-small/source/i18n/plurrule.cpp
index 884db7c4f59311..bc106acce23aef 100644
--- a/deps/icu-small/source/i18n/plurrule.cpp
+++ b/deps/icu-small/source/i18n/plurrule.cpp
@@ -60,6 +60,7 @@ static const UChar PK_VAR_I[]={LOW_I,0};
static const UChar PK_VAR_F[]={LOW_F,0};
static const UChar PK_VAR_T[]={LOW_T,0};
static const UChar PK_VAR_E[]={LOW_E,0};
+static const UChar PK_VAR_C[]={LOW_C,0};
static const UChar PK_VAR_V[]={LOW_V,0};
static const UChar PK_WITHIN[]={LOW_W,LOW_I,LOW_T,LOW_H,LOW_I,LOW_N,0};
static const UChar PK_DECIMAL[]={LOW_D,LOW_E,LOW_C,LOW_I,LOW_M,LOW_A,LOW_L,0};
@@ -421,7 +422,6 @@ getSamplesFromString(const UnicodeString &samples, double *destDbl,
destFd[sampleCount++] = fixed;
}
} else {
-
FixedDecimal fixedLo(sampleRange.tempSubStringBetween(0, tildeIndex), status);
FixedDecimal fixedHi(sampleRange.tempSubStringBetween(tildeIndex+1), status);
double rangeLo = fixedLo.source;
@@ -514,6 +514,7 @@ PluralRules::getSamples(const UnicodeString &keyword, FixedDecimal *dest,
if (rc == nullptr) {
return 0;
}
+
int32_t numSamples = getSamplesFromString(rc->fIntegerSamples, nullptr, dest, destCapacity, status);
if (numSamples == 0) {
numSamples = getSamplesFromString(rc->fDecimalSamples, nullptr, dest, destCapacity, status);
@@ -706,6 +707,7 @@ PluralRuleParser::parse(const UnicodeString& ruleData, PluralRules *prules, UErr
case tVariableF:
case tVariableT:
case tVariableE:
+ case tVariableC:
case tVariableV:
U_ASSERT(curAndConstraint != nullptr);
curAndConstraint->digitsType = type;
@@ -1092,6 +1094,8 @@ static UnicodeString tokenString(tokenType tok) {
s.append(LOW_T); break;
case tVariableE:
s.append(LOW_E); break;
+ case tVariableC:
+ s.append(LOW_C); break;
default:
s.append(TILDE);
}
@@ -1269,6 +1273,7 @@ PluralRuleParser::checkSyntax(UErrorCode &status)
case tVariableF:
case tVariableT:
case tVariableE:
+ case tVariableC:
case tVariableV:
if (type != tIs && type != tMod && type != tIn &&
type != tNot && type != tWithin && type != tEqual && type != tNotEqual) {
@@ -1286,6 +1291,7 @@ PluralRuleParser::checkSyntax(UErrorCode &status)
type == tVariableF ||
type == tVariableT ||
type == tVariableE ||
+ type == tVariableC ||
type == tVariableV ||
type == tAt)) {
status = U_UNEXPECTED_TOKEN;
@@ -1318,6 +1324,7 @@ PluralRuleParser::checkSyntax(UErrorCode &status)
type != tVariableF &&
type != tVariableT &&
type != tVariableE &&
+ type != tVariableC &&
type != tVariableV) {
status = U_UNEXPECTED_TOKEN;
}
@@ -1497,6 +1504,8 @@ PluralRuleParser::getKeyType(const UnicodeString &token, tokenType keyType)
keyType = tVariableT;
} else if (0 == token.compare(PK_VAR_E, 1)) {
keyType = tVariableE;
+ } else if (0 == token.compare(PK_VAR_C, 1)) {
+ keyType = tVariableC;
} else if (0 == token.compare(PK_VAR_V, 1)) {
keyType = tVariableV;
} else if (0 == token.compare(PK_IS, 2)) {
@@ -1596,11 +1605,17 @@ PluralOperand tokenTypeToPluralOperand(tokenType tt) {
return PLURAL_OPERAND_T;
case tVariableE:
return PLURAL_OPERAND_E;
+ case tVariableC:
+ return PLURAL_OPERAND_E;
default:
UPRV_UNREACHABLE; // unexpected.
}
}
+FixedDecimal::FixedDecimal(double n, int32_t v, int64_t f, int32_t e, int32_t c) {
+ init(n, v, f, e, c);
+}
+
FixedDecimal::FixedDecimal(double n, int32_t v, int64_t f, int32_t e) {
init(n, v, f, e);
// check values. TODO make into unit test.
@@ -1642,16 +1657,30 @@ FixedDecimal::FixedDecimal() {
FixedDecimal::FixedDecimal(const UnicodeString &num, UErrorCode &status) {
CharString cs;
int32_t parsedExponent = 0;
+ int32_t parsedCompactExponent = 0;
int32_t exponentIdx = num.indexOf(u'e');
if (exponentIdx < 0) {
exponentIdx = num.indexOf(u'E');
}
+ int32_t compactExponentIdx = num.indexOf(u'c');
+ if (compactExponentIdx < 0) {
+ compactExponentIdx = num.indexOf(u'C');
+ }
+
if (exponentIdx >= 0) {
cs.appendInvariantChars(num.tempSubString(0, exponentIdx), status);
int32_t expSubstrStart = exponentIdx + 1;
parsedExponent = ICU_Utility::parseAsciiInteger(num, expSubstrStart);
}
+ else if (compactExponentIdx >= 0) {
+ cs.appendInvariantChars(num.tempSubString(0, compactExponentIdx), status);
+ int32_t expSubstrStart = compactExponentIdx + 1;
+ parsedCompactExponent = ICU_Utility::parseAsciiInteger(num, expSubstrStart);
+
+ parsedExponent = parsedCompactExponent;
+ exponentIdx = compactExponentIdx;
+ }
else {
cs.appendInvariantChars(num, status);
}
@@ -1706,13 +1735,20 @@ void FixedDecimal::init(double n, int32_t v, int64_t f) {
init(n, v, f, exponent);
}
-
void FixedDecimal::init(double n, int32_t v, int64_t f, int32_t e) {
+ // Currently, `c` is an alias for `e`
+ init(n, v, f, e, e);
+}
+
+void FixedDecimal::init(double n, int32_t v, int64_t f, int32_t e, int32_t c) {
isNegative = n < 0.0;
source = fabs(n);
_isNaN = uprv_isNaN(source);
_isInfinite = uprv_isInfinite(source);
exponent = e;
+ if (exponent == 0) {
+ exponent = c;
+ }
if (_isNaN || _isInfinite) {
v = 0;
f = 0;
@@ -1843,6 +1879,7 @@ double FixedDecimal::getPluralOperand(PluralOperand operand) const {
case PLURAL_OPERAND_T: return static_cast(decimalDigitsWithoutTrailingZeros);
case PLURAL_OPERAND_V: return visibleDecimalDigitCount;
case PLURAL_OPERAND_E: return exponent;
+ case PLURAL_OPERAND_C: return exponent;
default:
UPRV_UNREACHABLE; // unexpected.
}
@@ -1876,12 +1913,12 @@ bool FixedDecimal::operator==(const FixedDecimal &other) const {
UnicodeString FixedDecimal::toString() const {
char pattern[15];
char buffer[20];
- if (exponent == 0) {
- snprintf(pattern, sizeof(pattern), "%%.%df", visibleDecimalDigitCount);
- snprintf(buffer, sizeof(buffer), pattern, source);
- } else {
+ if (exponent != 0) {
snprintf(pattern, sizeof(pattern), "%%.%dfe%%d", visibleDecimalDigitCount);
snprintf(buffer, sizeof(buffer), pattern, source, exponent);
+ } else {
+ snprintf(pattern, sizeof(pattern), "%%.%df", visibleDecimalDigitCount);
+ snprintf(buffer, sizeof(buffer), pattern, source);
}
return UnicodeString(buffer, -1, US_INV);
}
diff --git a/deps/icu-small/source/i18n/plurrule_impl.h b/deps/icu-small/source/i18n/plurrule_impl.h
index 8849e67e571da6..69d44f83d4a0fa 100644
--- a/deps/icu-small/source/i18n/plurrule_impl.h
+++ b/deps/icu-small/source/i18n/plurrule_impl.h
@@ -145,6 +145,7 @@ enum tokenType {
tVariableV,
tVariableT,
tVariableE,
+ tVariableC,
tDecimal,
tInteger,
tEOF
@@ -222,11 +223,20 @@ enum PluralOperand {
PLURAL_OPERAND_W,
/**
- * Suppressed exponent for compact notation (exponent needed in
- * scientific notation with compact notation to approximate i).
+ * Suppressed exponent for scientific notation (exponent needed in
+ * scientific notation to approximate i).
*/
PLURAL_OPERAND_E,
+ /**
+ * This operand is currently treated as an alias for `PLURAL_OPERAND_E`.
+ * In the future, it will represent:
+ *
+ * Suppressed exponent for compact notation (exponent needed in
+ * compact notation to approximate i).
+ */
+ PLURAL_OPERAND_C,
+
/**
* THIS OPERAND IS DEPRECATED AND HAS BEEN REMOVED FROM THE SPEC.
*
@@ -280,8 +290,10 @@ class U_I18N_API FixedDecimal: public IFixedDecimal, public UObject {
* @param n the number, e.g. 12.345
* @param v The number of visible fraction digits, e.g. 3
* @param f The fraction digits, e.g. 345
- * @param e The exponent, e.g. 7 in 1.2e7 (for compact/scientific)
+ * @param e The exponent, e.g. 7 in 1.2e7, for scientific notation
+ * @param c Currently: an alias for param `e`.
*/
+ FixedDecimal(double n, int32_t v, int64_t f, int32_t e, int32_t c);
FixedDecimal(double n, int32_t v, int64_t f, int32_t e);
FixedDecimal(double n, int32_t v, int64_t f);
FixedDecimal(double n, int32_t);
@@ -302,6 +314,7 @@ class U_I18N_API FixedDecimal: public IFixedDecimal, public UObject {
int32_t getVisibleFractionDigitCount() const;
+ void init(double n, int32_t v, int64_t f, int32_t e, int32_t c);
void init(double n, int32_t v, int64_t f, int32_t e);
void init(double n, int32_t v, int64_t f);
void init(double n);
diff --git a/deps/icu-small/source/i18n/rbt.cpp b/deps/icu-small/source/i18n/rbt.cpp
index 02d0ce6ceb20f8..65199478449014 100644
--- a/deps/icu-small/source/i18n/rbt.cpp
+++ b/deps/icu-small/source/i18n/rbt.cpp
@@ -101,7 +101,7 @@ RuleBasedTransliterator::RuleBasedTransliterator(
}*/
/**
- * Covenience constructor with no filter.
+ * Convenience constructor with no filter.
*/
/*RuleBasedTransliterator::RuleBasedTransliterator(
const UnicodeString& id,
@@ -114,7 +114,7 @@ RuleBasedTransliterator::RuleBasedTransliterator(
}*/
/**
- * Covenience constructor with no filter and FORWARD direction.
+ * Convenience constructor with no filter and FORWARD direction.
*/
/*RuleBasedTransliterator::RuleBasedTransliterator(
const UnicodeString& id,
@@ -126,7 +126,7 @@ RuleBasedTransliterator::RuleBasedTransliterator(
}*/
/**
- * Covenience constructor with FORWARD direction.
+ * Convenience constructor with FORWARD direction.
*/
/*RuleBasedTransliterator::RuleBasedTransliterator(
const UnicodeString& id,
diff --git a/deps/icu-small/source/i18n/rbt.h b/deps/icu-small/source/i18n/rbt.h
index 6c34824181fec3..4d9991c48f8b72 100644
--- a/deps/icu-small/source/i18n/rbt.h
+++ b/deps/icu-small/source/i18n/rbt.h
@@ -80,7 +80,7 @@ class RuleBasedTransliterator : public Transliterator {
UErrorCode& status);*/
/**
- * Covenience constructor with no filter.
+ * Convenience constructor with no filter.
* @internal Use transliterator factory methods instead since this class will be removed in that release.
*/
/*RuleBasedTransliterator(const UnicodeString& id,
@@ -89,7 +89,7 @@ class RuleBasedTransliterator : public Transliterator {
UErrorCode& status);*/
/**
- * Covenience constructor with no filter and FORWARD direction.
+ * Convenience constructor with no filter and FORWARD direction.
* @internal Use transliterator factory methods instead since this class will be removed in that release.
*/
/*RuleBasedTransliterator(const UnicodeString& id,
@@ -97,7 +97,7 @@ class RuleBasedTransliterator : public Transliterator {
UErrorCode& status);*/
/**
- * Covenience constructor with FORWARD direction.
+ * Convenience constructor with FORWARD direction.
* @internal Use transliterator factory methods instead since this class will be removed in that release.
*/
/*RuleBasedTransliterator(const UnicodeString& id,
@@ -108,7 +108,7 @@ class RuleBasedTransliterator : public Transliterator {
friend class TransliteratorRegistry; // to access TransliterationRuleData convenience ctor
/**
- * Covenience constructor.
+ * Convenience constructor.
* @param id the id for the transliterator.
* @param theData the rule data for the transliterator.
* @param adoptedFilter the filter for the transliterator
diff --git a/deps/icu-small/source/i18n/rbt_pars.cpp b/deps/icu-small/source/i18n/rbt_pars.cpp
index 802d65d0ac9bbe..69465aecb9b142 100644
--- a/deps/icu-small/source/i18n/rbt_pars.cpp
+++ b/deps/icu-small/source/i18n/rbt_pars.cpp
@@ -945,7 +945,7 @@ void TransliteratorParser::parseRules(const UnicodeString& rule,
if (c == RULE_COMMENT_CHAR) {
pos = rule.indexOf((UChar)0x000A /*\n*/, pos) + 1;
if (pos == 0) {
- break; // No "\n" found; rest of rule is a commnet
+ break; // No "\n" found; rest of rule is a comment
}
continue; // Either fall out or restart with next line
}
@@ -1159,7 +1159,7 @@ void TransliteratorParser::setVariableRange(int32_t start, int32_t end, UErrorCo
/**
* Assert that the given character is NOT within the variable range.
- * If it is, return FALSE. This is neccesary to ensure that the
+ * If it is, return FALSE. This is necessary to ensure that the
* variable range does not overlap characters used in a rule.
*/
UBool TransliteratorParser::checkVariableRange(UChar32 ch) const {
diff --git a/deps/icu-small/source/i18n/rbt_pars.h b/deps/icu-small/source/i18n/rbt_pars.h
index 3e6517cfeb9078..9336d410d351e5 100644
--- a/deps/icu-small/source/i18n/rbt_pars.h
+++ b/deps/icu-small/source/i18n/rbt_pars.h
@@ -210,7 +210,7 @@ class TransliteratorParser : public UMemory {
/**
* Assert that the given character is NOT within the variable range.
- * If it is, return false. This is neccesary to ensure that the
+ * If it is, return false. This is necessary to ensure that the
* variable range does not overlap characters used in a rule.
* @param ch the given character.
* @return True, if the given character is NOT within the variable range.
diff --git a/deps/icu-small/source/i18n/rbtz.cpp b/deps/icu-small/source/i18n/rbtz.cpp
index 2c3747abdafeaf..9d8eea9263a280 100644
--- a/deps/icu-small/source/i18n/rbtz.cpp
+++ b/deps/icu-small/source/i18n/rbtz.cpp
@@ -403,9 +403,9 @@ RuleBasedTimeZone::getOffset(UDate date, UBool local, int32_t& rawOffset,
getOffsetInternal(date, local, kFormer, kLatter, rawOffset, dstOffset, status);
}
-void
-RuleBasedTimeZone::getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
- int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) const {
+void RuleBasedTimeZone::getOffsetFromLocal(UDate date, UTimeZoneLocalOption nonExistingTimeOpt,
+ UTimeZoneLocalOption duplicatedTimeOpt,
+ int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) const {
getOffsetInternal(date, TRUE, nonExistingTimeOpt, duplicatedTimeOpt, rawOffset, dstOffset, status);
}
diff --git a/deps/icu-small/source/i18n/regexcmp.cpp b/deps/icu-small/source/i18n/regexcmp.cpp
index 7b67ce82b5db12..6c3a9e10ba12f2 100644
--- a/deps/icu-small/source/i18n/regexcmp.cpp
+++ b/deps/icu-small/source/i18n/regexcmp.cpp
@@ -557,7 +557,7 @@ UBool RegexCompile::doParseActions(int32_t action)
//
// Note: Addition of transparent input regions, with the need to
// restore the original regions when failing out of a lookahead
- // block, complicated this sequence. Some conbined opcodes
+ // block, complicated this sequence. Some combined opcodes
// might make sense - or might not, lookahead aren't that common.
//
// Caution: min match length optimization knows about this
@@ -2397,7 +2397,7 @@ void RegexCompile::compileSet(UnicodeSet *theSet)
}
// Remove any strings from the set.
// There shoudn't be any, but just in case.
- // (Case Closure can add them; if we had a simple case closure avaialble that
+ // (Case Closure can add them; if we had a simple case closure available that
// ignored strings, that would be better.)
theSet->removeAllStrings();
int32_t setSize = theSet->size();
@@ -2485,7 +2485,7 @@ void RegexCompile::compileInterval(int32_t InitOp, int32_t LoopOp)
fRXPat->fCompiledPat->setElementAt(fIntervalLow, topOfBlock+2);
fRXPat->fCompiledPat->setElementAt(fIntervalUpper, topOfBlock+3);
- // Apend the CTR_LOOP op. The operand is the location of the CTR_INIT op.
+ // Append the CTR_LOOP op. The operand is the location of the CTR_INIT op.
// Goes at end of the block being looped over, so just append to the code so far.
appendOp(LoopOp, topOfBlock);
@@ -3475,6 +3475,9 @@ int32_t RegexCompile::minMatchLength(int32_t start, int32_t end) {
// value may be longer than the actual maximum; it must
// never be shorter.
//
+// start, end: the range of the pattern to check.
+// end is inclusive.
+//
//------------------------------------------------------------------------------
int32_t RegexCompile::maxMatchLength(int32_t start, int32_t end) {
if (U_FAILURE(*fStatus)) {
@@ -3720,14 +3723,14 @@ int32_t RegexCompile::maxMatchLength(int32_t start, int32_t end) {
// Look-behind. Scan forward until the matching look-around end,
// without processing the look-behind block.
int32_t dataLoc = URX_VAL(op);
- for (loc = loc + 1; loc < end; ++loc) {
+ for (loc = loc + 1; loc <= end; ++loc) {
op = (int32_t)fRXPat->fCompiledPat->elementAti(loc);
int32_t opType = URX_TYPE(op);
if ((opType == URX_LA_END || opType == URX_LBN_END) && (URX_VAL(op) == dataLoc)) {
break;
}
}
- U_ASSERT(loc < end);
+ U_ASSERT(loc <= end);
}
break;
diff --git a/deps/icu-small/source/i18n/reldatefmt.cpp b/deps/icu-small/source/i18n/reldatefmt.cpp
index 5d43606169c8a8..d41ff22b9c212a 100644
--- a/deps/icu-small/source/i18n/reldatefmt.cpp
+++ b/deps/icu-small/source/i18n/reldatefmt.cpp
@@ -95,7 +95,7 @@ class RelativeDateTimeCacheData: public SharedObject {
const UnicodeString emptyString;
- // Mappping from source to target styles for alias fallback.
+ // Mapping from source to target styles for alias fallback.
int32_t fallBackCache[UDAT_STYLE_COUNT];
void adoptCombinedDateAndTime(SimpleFormatter *fmtToAdopt) {
diff --git a/deps/icu-small/source/i18n/reldtfmt.cpp b/deps/icu-small/source/i18n/reldtfmt.cpp
index c74c30c20ca383..2bc59c5128b43a 100644
--- a/deps/icu-small/source/i18n/reldtfmt.cpp
+++ b/deps/icu-small/source/i18n/reldtfmt.cpp
@@ -334,7 +334,7 @@ UDate
RelativeDateFormat::parse( const UnicodeString& text,
ParsePosition& pos) const {
// redefined here because the other parse() function hides this function's
- // cunterpart on DateFormat
+ // counterpart on DateFormat
return DateFormat::parse(text, pos);
}
diff --git a/deps/icu-small/source/i18n/rematch.cpp b/deps/icu-small/source/i18n/rematch.cpp
index 653ef4d6c1f8d1..e358dbd1e983f8 100644
--- a/deps/icu-small/source/i18n/rematch.cpp
+++ b/deps/icu-small/source/i18n/rematch.cpp
@@ -3913,7 +3913,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) {
// First time through loop.
lbStartIdx = fp->fInputIdx - minML;
if (lbStartIdx > 0) {
- // move index to a code point boudary, if it's not on one already.
+ // move index to a code point boundary, if it's not on one already.
UTEXT_SETNATIVEINDEX(fInputText, lbStartIdx);
lbStartIdx = UTEXT_GETNATIVEINDEX(fInputText);
}
@@ -3999,7 +3999,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) {
// First time through loop.
lbStartIdx = fp->fInputIdx - minML;
if (lbStartIdx > 0) {
- // move index to a code point boudary, if it's not on one already.
+ // move index to a code point boundary, if it's not on one already.
UTEXT_SETNATIVEINDEX(fInputText, lbStartIdx);
lbStartIdx = UTEXT_GETNATIVEINDEX(fInputText);
}
diff --git a/deps/icu-small/source/i18n/scriptset.h b/deps/icu-small/source/i18n/scriptset.h
index a41ab737a6dc38..b770995832872d 100644
--- a/deps/icu-small/source/i18n/scriptset.h
+++ b/deps/icu-small/source/i18n/scriptset.h
@@ -51,7 +51,7 @@ class U_I18N_API ScriptSet: public UMemory {
ScriptSet &reset(UScriptCode script, UErrorCode &status);
ScriptSet &intersect(const ScriptSet &other);
ScriptSet &intersect(UScriptCode script, UErrorCode &status);
- UBool intersects(const ScriptSet &other) const; // Sets contain at least one script in commmon.
+ UBool intersects(const ScriptSet &other) const; // Sets contain at least one script in common.
UBool contains(const ScriptSet &other) const; // All set bits in other are also set in this.
ScriptSet &setAll();
diff --git a/deps/icu-small/source/i18n/simpletz.cpp b/deps/icu-small/source/i18n/simpletz.cpp
index 12c220595cd2c1..0007d4aec8977e 100644
--- a/deps/icu-small/source/i18n/simpletz.cpp
+++ b/deps/icu-small/source/i18n/simpletz.cpp
@@ -42,7 +42,7 @@ U_NAMESPACE_BEGIN
UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SimpleTimeZone)
// Use only for decodeStartRule() and decodeEndRule() where the year is not
-// available. Set February to 29 days to accomodate rules with that date
+// available. Set February to 29 days to accommodate rules with that date
// and day-of-week-on-or-before-that-date mode (DOW_LE_DOM_MODE).
// The compareToRule() method adjusts to February 28 in non-leap years.
//
@@ -509,8 +509,10 @@ SimpleTimeZone::getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
}
void
-SimpleTimeZone::getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
- int32_t& rawOffsetGMT, int32_t& savingsDST, UErrorCode& status) const {
+SimpleTimeZone::getOffsetFromLocal(UDate date, UTimeZoneLocalOption nonExistingTimeOpt,
+ UTimeZoneLocalOption duplicatedTimeOpt, int32_t& rawOffsetGMT,
+ int32_t& savingsDST, UErrorCode& status) const
+{
if (U_FAILURE(status)) {
return;
}
diff --git a/deps/icu-small/source/i18n/smpdtfmt.cpp b/deps/icu-small/source/i18n/smpdtfmt.cpp
index 4717899cf38d7d..a3ec7cb026591c 100644
--- a/deps/icu-small/source/i18n/smpdtfmt.cpp
+++ b/deps/icu-small/source/i18n/smpdtfmt.cpp
@@ -231,6 +231,13 @@ static const int32_t gFieldRangeBias[] = {
static const int32_t HEBREW_CAL_CUR_MILLENIUM_START_YEAR = 5000;
static const int32_t HEBREW_CAL_CUR_MILLENIUM_END_YEAR = 6000;
+/**
+ * Maximum range for detecting daylight offset of a time zone when parsed time zone
+ * string indicates it's daylight saving time, but the detected time zone does not
+ * observe daylight saving time at the parsed date.
+ */
+static const double MAX_DAYLIGHT_DETECTION_RANGE = 30*365*24*60*60*1000.0;
+
static UMutex LOCK;
UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SimpleDateFormat)
@@ -2575,51 +2582,47 @@ SimpleDateFormat::parse(const UnicodeString& text, Calendar& cal, ParsePosition&
} else { // tztype == TZTYPE_DST
if (dst == 0) {
if (btz != NULL) {
- UDate time = localMillis + raw;
- // We use the nearest daylight saving time rule.
- TimeZoneTransition beforeTrs, afterTrs;
- UDate beforeT = time, afterT = time;
- int32_t beforeSav = 0, afterSav = 0;
- UBool beforeTrsAvail, afterTrsAvail;
-
- // Search for DST rule before or on the time
- while (TRUE) {
- beforeTrsAvail = btz->getPreviousTransition(beforeT, TRUE, beforeTrs);
- if (!beforeTrsAvail) {
+ // This implementation resolves daylight saving time offset
+ // closest rule after the given time.
+ UDate baseTime = localMillis + raw;
+ UDate time = baseTime;
+ UDate limit = baseTime + MAX_DAYLIGHT_DETECTION_RANGE;
+ TimeZoneTransition trs;
+ UBool trsAvail;
+
+ // Search for DST rule after the given time
+ while (time < limit) {
+ trsAvail = btz->getNextTransition(time, FALSE, trs);
+ if (!trsAvail) {
break;
}
- beforeT = beforeTrs.getTime() - 1;
- beforeSav = beforeTrs.getFrom()->getDSTSavings();
- if (beforeSav != 0) {
+ resolvedSavings = trs.getTo()->getDSTSavings();
+ if (resolvedSavings != 0) {
break;
}
+ time = trs.getTime();
}
- // Search for DST rule after the time
- while (TRUE) {
- afterTrsAvail = btz->getNextTransition(afterT, FALSE, afterTrs);
- if (!afterTrsAvail) {
- break;
+ if (resolvedSavings == 0) {
+ // If no DST rule after the given time was found, search for
+ // DST rule before.
+ time = baseTime;
+ limit = baseTime - MAX_DAYLIGHT_DETECTION_RANGE;
+ while (time > limit) {
+ trsAvail = btz->getPreviousTransition(time, TRUE, trs);
+ if (!trsAvail) {
+ break;
+ }
+ resolvedSavings = trs.getFrom()->getDSTSavings();
+ if (resolvedSavings != 0) {
+ break;
+ }
+ time = trs.getTime() - 1;
}
- afterT = afterTrs.getTime();
- afterSav = afterTrs.getTo()->getDSTSavings();
- if (afterSav != 0) {
- break;
- }
- }
- if (beforeTrsAvail && afterTrsAvail) {
- if (time - beforeT > afterT - time) {
- resolvedSavings = afterSav;
- } else {
- resolvedSavings = beforeSav;
+ if (resolvedSavings == 0) {
+ resolvedSavings = btz->getDSTSavings();
}
- } else if (beforeTrsAvail && beforeSav != 0) {
- resolvedSavings = beforeSav;
- } else if (afterTrsAvail && afterSav != 0) {
- resolvedSavings = afterSav;
- } else {
- resolvedSavings = btz->getDSTSavings();
}
} else {
resolvedSavings = tz.getDSTSavings();
diff --git a/deps/icu-small/source/i18n/sortkey.cpp b/deps/icu-small/source/i18n/sortkey.cpp
index fb030c499083e6..430fd5d3500948 100644
--- a/deps/icu-small/source/i18n/sortkey.cpp
+++ b/deps/icu-small/source/i18n/sortkey.cpp
@@ -20,7 +20,7 @@
//
// 6/20/97 helena Java class name change.
// 6/23/97 helena Added comments to make code more readable.
-// 6/26/98 erm Canged to use byte arrays instead of UnicodeString
+// 6/26/98 erm Changed to use byte arrays instead of UnicodeString
// 7/31/98 erm hashCode: minimum inc should be 2 not 1,
// Cleaned up operator=
// 07/12/99 helena HPUX 11 CC port.
diff --git a/deps/icu-small/source/i18n/standardplural.cpp b/deps/icu-small/source/i18n/standardplural.cpp
index 0391034b3e4a8d..5a6069bf7ddc47 100644
--- a/deps/icu-small/source/i18n/standardplural.cpp
+++ b/deps/icu-small/source/i18n/standardplural.cpp
@@ -23,7 +23,7 @@
U_NAMESPACE_BEGIN
static const char *gKeywords[StandardPlural::COUNT] = {
- "zero", "one", "two", "few", "many", "other"
+ "zero", "one", "two", "few", "many", "other", "=0", "=1"
};
const char *StandardPlural::getKeyword(Form p) {
@@ -60,21 +60,55 @@ int32_t StandardPlural::indexOrNegativeFromString(const char *keyword) {
return ZERO;
}
break;
+ case '=':
+ if (uprv_strcmp(keyword, "0") == 0) {
+ return EQ_0;
+ } else if (uprv_strcmp(keyword, "1") == 0) {
+ return EQ_1;
+ }
+ break;
+ // Also allow "0" and "1"
+ case '0':
+ if (*keyword == 0) {
+ return EQ_0;
+ }
+ break;
+ case '1':
+ if (*keyword == 0) {
+ return EQ_1;
+ }
+ break;
default:
break;
}
return -1;
}
-static const UChar gZero[] = { 0x7A, 0x65, 0x72, 0x6F };
-static const UChar gOne[] = { 0x6F, 0x6E, 0x65 };
-static const UChar gTwo[] = { 0x74, 0x77, 0x6F };
-static const UChar gFew[] = { 0x66, 0x65, 0x77 };
-static const UChar gMany[] = { 0x6D, 0x61, 0x6E, 0x79 };
-static const UChar gOther[] = { 0x6F, 0x74, 0x68, 0x65, 0x72 };
+static const UChar gZero[] = u"zero";
+static const UChar gOne[] = u"one";
+static const UChar gTwo[] = u"two";
+static const UChar gFew[] = u"few";
+static const UChar gMany[] = u"many";
+static const UChar gOther[] = u"other";
+static const UChar gEq0[] = u"=0";
+static const UChar gEq1[] = u"=1";
int32_t StandardPlural::indexOrNegativeFromString(const UnicodeString &keyword) {
switch (keyword.length()) {
+ case 1:
+ if (keyword.charAt(0) == '0') {
+ return EQ_0;
+ } else if (keyword.charAt(0) == '1') {
+ return EQ_1;
+ }
+ break;
+ case 2:
+ if (keyword.compare(gEq0, 2) == 0) {
+ return EQ_0;
+ } else if (keyword.compare(gEq1, 2) == 0) {
+ return EQ_1;
+ }
+ break;
case 3:
if (keyword.compare(gOne, 3) == 0) {
return ONE;
diff --git a/deps/icu-small/source/i18n/standardplural.h b/deps/icu-small/source/i18n/standardplural.h
index 33e1d605f6856b..16593065c8aa91 100644
--- a/deps/icu-small/source/i18n/standardplural.h
+++ b/deps/icu-small/source/i18n/standardplural.h
@@ -35,6 +35,8 @@ class U_I18N_API StandardPlural {
FEW,
MANY,
OTHER,
+ EQ_0,
+ EQ_1,
COUNT
};
diff --git a/deps/icu-small/source/i18n/stsearch.cpp b/deps/icu-small/source/i18n/stsearch.cpp
index 32481a14004075..003d86b64016f0 100644
--- a/deps/icu-small/source/i18n/stsearch.cpp
+++ b/deps/icu-small/source/i18n/stsearch.cpp
@@ -184,7 +184,7 @@ StringSearch::clone() const {
// operator overloading ---------------------------------------------
StringSearch & StringSearch::operator=(const StringSearch &that)
{
- if ((*this) != that) {
+ if (this != &that) {
UErrorCode status = U_ZERO_ERROR;
m_text_ = that.m_text_;
m_breakiterator_ = that.m_breakiterator_;
diff --git a/deps/icu-small/source/i18n/timezone.cpp b/deps/icu-small/source/i18n/timezone.cpp
index 1461b80494e109..fe564e6530e7b1 100644
--- a/deps/icu-small/source/i18n/timezone.cpp
+++ b/deps/icu-small/source/i18n/timezone.cpp
@@ -1678,7 +1678,7 @@ TimeZone::getIDForWindowsID(const UnicodeString& winid, const char* region, Unic
winidKey[winKeyLen] = 0;
ures_getByKey(zones, winidKey, zones, &tmperr); // use tmperr, because windows mapping might not
- // be avaiable by design
+ // be available by design
if (U_FAILURE(tmperr)) {
ures_close(zones);
return id;
diff --git a/deps/icu-small/source/i18n/translit.cpp b/deps/icu-small/source/i18n/translit.cpp
index a2ade1b4fe8578..c2a15837bedb0d 100644
--- a/deps/icu-small/source/i18n/translit.cpp
+++ b/deps/icu-small/source/i18n/translit.cpp
@@ -170,6 +170,7 @@ Transliterator* Transliterator::clone() const {
* Assignment operator.
*/
Transliterator& Transliterator::operator=(const Transliterator& other) {
+ if (this == &other) { return *this; } // self-assignment: no-op
ID = other.ID;
// NUL-terminate the ID string
ID.getTerminatedBuffer();
diff --git a/deps/icu-small/source/i18n/transreg.h b/deps/icu-small/source/i18n/transreg.h
index 04ed3fb501059c..0a0698862be1ac 100644
--- a/deps/icu-small/source/i18n/transreg.h
+++ b/deps/icu-small/source/i18n/transreg.h
@@ -144,7 +144,7 @@ class TransliteratorRegistry : public UMemory {
public:
/**
- * Contructor
+ * Constructor
* @param status Output param set to success/failure code.
*/
TransliteratorRegistry(UErrorCode& status);
diff --git a/deps/icu-small/source/i18n/tzfmt.cpp b/deps/icu-small/source/i18n/tzfmt.cpp
index 267d507aa7eca6..e70005a384085e 100644
--- a/deps/icu-small/source/i18n/tzfmt.cpp
+++ b/deps/icu-small/source/i18n/tzfmt.cpp
@@ -1873,7 +1873,7 @@ TimeZoneFormat::parseOffsetFieldsWithPattern(const UnicodeString& text, int32_t
// When TimeZoneFormat parse() is called from SimpleDateFormat,
// leading space characters might be truncated. If the first pattern text
// starts with such character (e.g. Bidi control), then we need to
- // skip the leading space charcters.
+ // skip the leading space characters.
if (idx < text.length() && !PatternProps::isWhiteSpace(text.char32At(idx))) {
while (len > 0) {
UChar32 ch;
diff --git a/deps/icu-small/source/i18n/ucal.cpp b/deps/icu-small/source/i18n/ucal.cpp
index 275ef7ea87e273..39a9508ca93443 100644
--- a/deps/icu-small/source/i18n/ucal.cpp
+++ b/deps/icu-small/source/i18n/ucal.cpp
@@ -33,8 +33,8 @@ U_NAMESPACE_USE
static TimeZone*
_createTimeZone(const UChar* zoneID, int32_t len, UErrorCode* ec) {
- TimeZone* zone = NULL;
- if (ec != NULL && U_SUCCESS(*ec)) {
+ TimeZone* zone = nullptr;
+ if (ec != nullptr && U_SUCCESS(*ec)) {
// Note that if zoneID is invalid, we get back GMT. This odd
// behavior is by design and goes back to the JDK. The only
// failure we will see is a memory allocation failure.
@@ -42,7 +42,7 @@ _createTimeZone(const UChar* zoneID, int32_t len, UErrorCode* ec) {
UnicodeString zoneStrID;
zoneStrID.setTo((UBool)(len < 0), zoneID, l); /* temporary read-only alias */
zone = TimeZone::createTimeZone(zoneStrID);
- if (zone == NULL) {
+ if (zone == nullptr) {
*ec = U_MEMORY_ALLOCATION_ERROR;
}
}
@@ -58,20 +58,20 @@ ucal_openTimeZoneIDEnumeration(USystemTimeZoneType zoneType, const char* region,
U_CAPI UEnumeration* U_EXPORT2
ucal_openTimeZones(UErrorCode* ec) {
- return uenum_openFromStringEnumeration(TimeZone::createEnumeration(), ec);
+ return ucal_openTimeZoneIDEnumeration(UCAL_ZONE_TYPE_ANY, nullptr, nullptr, ec);
}
U_CAPI UEnumeration* U_EXPORT2
ucal_openCountryTimeZones(const char* country, UErrorCode* ec) {
- return uenum_openFromStringEnumeration(TimeZone::createEnumeration(country), ec);
+ return ucal_openTimeZoneIDEnumeration(UCAL_ZONE_TYPE_ANY, country, nullptr, ec);
}
U_CAPI int32_t U_EXPORT2
ucal_getDefaultTimeZone(UChar* result, int32_t resultCapacity, UErrorCode* ec) {
int32_t len = 0;
- if (ec != NULL && U_SUCCESS(*ec)) {
+ if (ec != nullptr && U_SUCCESS(*ec)) {
TimeZone* zone = TimeZone::createDefault();
- if (zone == NULL) {
+ if (zone == nullptr) {
*ec = U_MEMORY_ALLOCATION_ERROR;
} else {
UnicodeString id;
@@ -86,7 +86,7 @@ ucal_getDefaultTimeZone(UChar* result, int32_t resultCapacity, UErrorCode* ec) {
U_CAPI void U_EXPORT2
ucal_setDefaultTimeZone(const UChar* zoneID, UErrorCode* ec) {
TimeZone* zone = _createTimeZone(zoneID, -1, ec);
- if (zone != NULL) {
+ if (zone != nullptr) {
TimeZone::adoptDefault(zone);
}
}
@@ -94,9 +94,9 @@ ucal_setDefaultTimeZone(const UChar* zoneID, UErrorCode* ec) {
U_CAPI int32_t U_EXPORT2
ucal_getHostTimeZone(UChar* result, int32_t resultCapacity, UErrorCode* ec) {
int32_t len = 0;
- if (ec != NULL && U_SUCCESS(*ec)) {
+ if (ec != nullptr && U_SUCCESS(*ec)) {
TimeZone *zone = TimeZone::detectHostTimeZone();
- if (zone == NULL) {
+ if (zone == nullptr) {
*ec = U_MEMORY_ALLOCATION_ERROR;
} else {
UnicodeString id;
@@ -114,7 +114,7 @@ ucal_getDSTSavings(const UChar* zoneID, UErrorCode* ec) {
TimeZone* zone = _createTimeZone(zoneID, -1, ec);
if (U_SUCCESS(*ec)) {
SimpleTimeZone* stz = dynamic_cast(zone);
- if (stz != NULL) {
+ if (stz != nullptr) {
result = stz->getDSTSavings();
} else {
// Since there is no getDSTSavings on TimeZone, we use a
@@ -219,10 +219,10 @@ ucal_setTimeZone( UCalendar* cal,
if(U_FAILURE(*status))
return;
- TimeZone* zone = (zoneID==NULL) ? TimeZone::createDefault()
+ TimeZone* zone = (zoneID==nullptr) ? TimeZone::createDefault()
: _createTimeZone(zoneID, len, status);
- if (zone != NULL) {
+ if (zone != nullptr) {
((Calendar*)cal)->adoptTimeZone(zone);
}
}
@@ -255,8 +255,8 @@ ucal_getTimeZoneDisplayName(const UCalendar* cal,
const TimeZone& tz = ((Calendar*)cal)->getTimeZone();
UnicodeString id;
- if(!(result==NULL && resultLength==0)) {
- // NULL destination for pure preflighting: empty dummy string
+ if (!(result == nullptr && resultLength == 0)) {
+ // Null destination for pure preflighting: empty dummy string
// otherwise, alias the destination buffer
id.setTo(result, 0, resultLength);
}
@@ -298,12 +298,12 @@ ucal_setGregorianChange(UCalendar *cal, UDate date, UErrorCode *pErrorCode) {
}
Calendar *cpp_cal = (Calendar *)cal;
GregorianCalendar *gregocal = dynamic_cast(cpp_cal);
- // Not if(gregocal == NULL) {
+ // Not if(gregocal == nullptr) {
// because we really want to work only with a GregorianCalendar, not with
// its subclasses like BuddhistCalendar.
- if (cpp_cal == NULL) {
- // We normally don't check "this" pointers for NULL, but this here avoids
- // compiler-generated exception-throwing code in case cal == NULL.
+ if (cpp_cal == nullptr) {
+ // We normally don't check "this" pointers for nullptr, but this here avoids
+ // compiler-generated exception-throwing code in case cal == nullptr.
*pErrorCode = U_ILLEGAL_ARGUMENT_ERROR;
return;
}
@@ -321,11 +321,11 @@ ucal_getGregorianChange(const UCalendar *cal, UErrorCode *pErrorCode) {
}
const Calendar *cpp_cal = (const Calendar *)cal;
const GregorianCalendar *gregocal = dynamic_cast(cpp_cal);
- // Not if(gregocal == NULL) {
+ // Not if(gregocal == nullptr) {
// see comments in ucal_setGregorianChange().
- if (cpp_cal == NULL) {
- // We normally don't check "this" pointers for NULL, but this here avoids
- // compiler-generated exception-throwing code in case cal == NULL.
+ if (cpp_cal == nullptr) {
+ // We normally don't check "this" pointers for nullptr, but this here avoids
+ // compiler-generated exception-throwing code in case cal == nullptr.
*pErrorCode = U_ILLEGAL_ARGUMENT_ERROR;
return (UDate)0;
}
@@ -572,11 +572,11 @@ ucal_getLimit( const UCalendar* cal,
U_CAPI const char * U_EXPORT2
ucal_getLocaleByType(const UCalendar *cal, ULocDataLocaleType type, UErrorCode* status)
{
- if (cal == NULL) {
+ if (cal == nullptr) {
if (U_SUCCESS(*status)) {
*status = U_ILLEGAL_ARGUMENT_ERROR;
}
- return NULL;
+ return nullptr;
}
return ((Calendar*)cal)->getLocaleID(type, *status);
}
@@ -617,7 +617,7 @@ U_CAPI const char * U_EXPORT2
ucal_getType(const UCalendar *cal, UErrorCode* status)
{
if (U_FAILURE(*status)) {
- return NULL;
+ return nullptr;
}
return ((Calendar*)cal)->getType();
}
@@ -662,8 +662,8 @@ ucal_getFieldDifference(UCalendar* cal, UDate target,
static const UEnumeration defaultKeywordValues = {
- NULL,
- NULL,
+ nullptr,
+ nullptr,
ulist_close_keyword_values_iterator,
ulist_count_keyword_values,
uenum_unextDefault,
@@ -690,7 +690,7 @@ static const char * const CAL_TYPES[] = {
"islamic-umalqura",
"islamic-tbla",
"islamic-rgsa",
- NULL
+ nullptr
};
U_CAPI UEnumeration* U_EXPORT2
@@ -700,16 +700,16 @@ ucal_getKeywordValuesForLocale(const char * /* key */, const char* locale, UBool
(void)ulocimp_getRegionForSupplementalData(locale, TRUE, prefRegion, sizeof(prefRegion), status);
// Read preferred calendar values from supplementalData calendarPreference
- UResourceBundle *rb = ures_openDirect(NULL, "supplementalData", status);
+ UResourceBundle *rb = ures_openDirect(nullptr, "supplementalData", status);
ures_getByKey(rb, "calendarPreferenceData", rb, status);
- UResourceBundle *order = ures_getByKey(rb, prefRegion, NULL, status);
- if (*status == U_MISSING_RESOURCE_ERROR && rb != NULL) {
+ UResourceBundle *order = ures_getByKey(rb, prefRegion, nullptr, status);
+ if (*status == U_MISSING_RESOURCE_ERROR && rb != nullptr) {
*status = U_ZERO_ERROR;
- order = ures_getByKey(rb, "001", NULL, status);
+ order = ures_getByKey(rb, "001", nullptr, status);
}
// Create a list of calendar type strings
- UList *values = NULL;
+ UList *values = nullptr;
if (U_SUCCESS(*status)) {
values = ulist_createEmptyList(status);
if (U_SUCCESS(*status)) {
@@ -717,7 +717,7 @@ ucal_getKeywordValuesForLocale(const char * /* key */, const char* locale, UBool
int32_t len;
const UChar *type = ures_getStringByIndex(order, i, &len, status);
char *caltype = (char*)uprv_malloc(len + 1);
- if (caltype == NULL) {
+ if (caltype == nullptr) {
*status = U_MEMORY_ALLOCATION_ERROR;
break;
}
@@ -732,7 +732,7 @@ ucal_getKeywordValuesForLocale(const char * /* key */, const char* locale, UBool
if (U_SUCCESS(*status) && !commonlyUsed) {
// If not commonlyUsed, add other available values
- for (int32_t i = 0; CAL_TYPES[i] != NULL; i++) {
+ for (int32_t i = 0; CAL_TYPES[i] != nullptr; i++) {
if (!ulist_containsString(values, CAL_TYPES[i], (int32_t)uprv_strlen(CAL_TYPES[i]))) {
ulist_addItemEndList(values, CAL_TYPES[i], FALSE, status);
if (U_FAILURE(*status)) {
@@ -743,7 +743,7 @@ ucal_getKeywordValuesForLocale(const char * /* key */, const char* locale, UBool
}
if (U_FAILURE(*status)) {
ulist_deleteList(values);
- values = NULL;
+ values = nullptr;
}
}
}
@@ -751,16 +751,16 @@ ucal_getKeywordValuesForLocale(const char * /* key */, const char* locale, UBool
ures_close(order);
ures_close(rb);
- if (U_FAILURE(*status) || values == NULL) {
- return NULL;
+ if (U_FAILURE(*status) || values == nullptr) {
+ return nullptr;
}
// Create string enumeration
UEnumeration *en = (UEnumeration*)uprv_malloc(sizeof(UEnumeration));
- if (en == NULL) {
+ if (en == nullptr) {
*status = U_MEMORY_ALLOCATION_ERROR;
ulist_deleteList(values);
- return NULL;
+ return nullptr;
}
ulist_resetList(values);
memcpy(en, &defaultKeywordValues, sizeof(UEnumeration));
@@ -778,7 +778,7 @@ ucal_getTimeZoneTransitionDate(const UCalendar* cal, UTimeZoneTransitionType typ
UDate base = ((Calendar*)cal)->getTime(*status);
const TimeZone& tz = ((Calendar*)cal)->getTimeZone();
const BasicTimeZone * btz = dynamic_cast(&tz);
- if (btz != NULL && U_SUCCESS(*status)) {
+ if (btz != nullptr && U_SUCCESS(*status)) {
TimeZoneTransition tzt;
UBool inclusive = (type == UCAL_TZ_TRANSITION_NEXT_INCLUSIVE || type == UCAL_TZ_TRANSITION_PREVIOUS_INCLUSIVE);
UBool result = (type == UCAL_TZ_TRANSITION_NEXT || type == UCAL_TZ_TRANSITION_NEXT_INCLUSIVE)?
@@ -828,4 +828,28 @@ ucal_getTimeZoneIDForWindowsID(const UChar* winid, int32_t len, const char* regi
return resultLen;
}
+U_CAPI void U_EXPORT2 ucal_getTimeZoneOffsetFromLocal(
+ const UCalendar* cal,
+ UTimeZoneLocalOption nonExistingTimeOpt,
+ UTimeZoneLocalOption duplicatedTimeOpt,
+ int32_t* rawOffset, int32_t* dstOffset, UErrorCode* status)
+{
+ if (U_FAILURE(*status)) {
+ return;
+ }
+ UDate date = ((Calendar*)cal)->getTime(*status);
+ if (U_FAILURE(*status)) {
+ return;
+ }
+ const TimeZone& tz = ((Calendar*)cal)->getTimeZone();
+ const BasicTimeZone* btz = dynamic_cast(&tz);
+ if (btz == nullptr) {
+ *status = U_ILLEGAL_ARGUMENT_ERROR;
+ return;
+ }
+ btz->getOffsetFromLocal(
+ date, nonExistingTimeOpt, duplicatedTimeOpt,
+ *rawOffset, *dstOffset, *status);
+}
+
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/deps/icu-small/source/i18n/uni2name.cpp b/deps/icu-small/source/i18n/uni2name.cpp
index 9df3924ae5f147..729a1e5fa82a62 100644
--- a/deps/icu-small/source/i18n/uni2name.cpp
+++ b/deps/icu-small/source/i18n/uni2name.cpp
@@ -81,7 +81,7 @@ void UnicodeNameTransliterator::handleTransliterate(Replaceable& text, UTransPos
return;
}
- // Accomodate the longest possible name plus padding
+ // Accommodate the longest possible name plus padding
char* buf = (char*) uprv_malloc(maxLen);
if (buf == NULL) {
offsets.start = offsets.limit;
diff --git a/deps/icu-small/source/i18n/unicode/basictz.h b/deps/icu-small/source/i18n/unicode/basictz.h
index 7199fb341deec8..ea8720ed13cf41 100644
--- a/deps/icu-small/source/i18n/unicode/basictz.h
+++ b/deps/icu-small/source/i18n/unicode/basictz.h
@@ -152,6 +152,17 @@ class U_I18N_API BasicTimeZone: public TimeZone {
virtual void getSimpleRulesNear(UDate date, InitialTimeZoneRule*& initial,
AnnualTimeZoneRule*& std, AnnualTimeZoneRule*& dst, UErrorCode& status) const;
+#ifndef U_FORCE_HIDE_DRAFT_API
+ /**
+ * Get time zone offsets from local wall time.
+ * @draft ICU 69
+ */
+ virtual void getOffsetFromLocal(
+ UDate date, UTimeZoneLocalOption nonExistingTimeOpt,
+ UTimeZoneLocalOption duplicatedTimeOpt, int32_t& rawOffset,
+ int32_t& dstOffset, UErrorCode& status) const;
+
+#endif /* U_FORCE_HIDE_DRAFT_API */
#ifndef U_HIDE_INTERNAL_API
/**
@@ -161,17 +172,17 @@ class U_I18N_API BasicTimeZone: public TimeZone {
enum {
kStandard = 0x01,
kDaylight = 0x03,
- kFormer = 0x04,
- kLatter = 0x0C
+ kFormer = 0x04, /* UCAL_TZ_LOCAL_FORMER */
+ kLatter = 0x0C /* UCAL_TZ_LOCAL_LATTER */
};
-#endif /* U_HIDE_INTERNAL_API */
/**
* Get time zone offsets from local wall time.
* @internal
*/
- virtual void getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
+ void getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) const;
+#endif /* U_HIDE_INTERNAL_API */
protected:
diff --git a/deps/icu-small/source/i18n/unicode/calendar.h b/deps/icu-small/source/i18n/unicode/calendar.h
index cc84bb274dee04..be774ab26fb619 100644
--- a/deps/icu-small/source/i18n/unicode/calendar.h
+++ b/deps/icu-small/source/i18n/unicode/calendar.h
@@ -47,6 +47,8 @@ U_NAMESPACE_BEGIN
class ICUServiceFactory;
+// Do not conditionalize the following with #ifndef U_HIDE_INTERNAL_API,
+// it is a return type for a virtual method (@internal)
/**
* @internal
*/
@@ -1849,7 +1851,7 @@ class U_I18N_API Calendar : public UObject {
* @param startValue starting (least max) value of field
* @param endValue ending (greatest max) value of field
* @param status return type
- * @internal
+ * @internal (private)
*/
int32_t getActualHelper(UCalendarDateFields field, int32_t startValue, int32_t endValue, UErrorCode &status) const;
diff --git a/deps/icu-small/source/i18n/unicode/datefmt.h b/deps/icu-small/source/i18n/unicode/datefmt.h
index 21217e567acf7d..bbba0785edaccc 100644
--- a/deps/icu-small/source/i18n/unicode/datefmt.h
+++ b/deps/icu-small/source/i18n/unicode/datefmt.h
@@ -139,7 +139,7 @@ template class U_I18N_API EnumSet
* You can also use forms of the parse and format methods with ParsePosition and
* FieldPosition to allow you to
diff --git a/deps/icu-small/source/i18n/unicode/dcfmtsym.h b/deps/icu-small/source/i18n/unicode/dcfmtsym.h
index b2c39a0236e4aa..d0f844a51a369f 100644
--- a/deps/icu-small/source/i18n/unicode/dcfmtsym.h
+++ b/deps/icu-small/source/i18n/unicode/dcfmtsym.h
@@ -446,7 +446,7 @@ class U_I18N_API DecimalFormatSymbols : public UObject {
inline const UnicodeString& getConstDigitSymbol(int32_t digit) const;
/**
- * Returns that pattern stored in currecy info. Internal API for use by NumberFormat API.
+ * Returns that pattern stored in currency info. Internal API for use by NumberFormat API.
* @internal
*/
inline const char16_t* getCurrencyPattern(void) const;
diff --git a/deps/icu-small/source/i18n/unicode/dtptngen.h b/deps/icu-small/source/i18n/unicode/dtptngen.h
index 357a25d9a8e197..dab7dcfb3dc61a 100644
--- a/deps/icu-small/source/i18n/unicode/dtptngen.h
+++ b/deps/icu-small/source/i18n/unicode/dtptngen.h
@@ -492,7 +492,6 @@ class U_I18N_API DateTimePatternGenerator : public UObject {
#if !UCONFIG_NO_FORMATTING
-#ifndef U_HIDE_DRAFT_API
/**
* Get the default hour cycle for a locale. Uses the locale that the
* DateTimePatternGenerator was initially created with.
@@ -503,10 +502,9 @@ class U_I18N_API DateTimePatternGenerator : public UObject {
* which must not indicate a failure before the function call.
* Set to U_UNSUPPORTED_ERROR if used on an empty instance.
* @return the default hour cycle.
- * @draft ICU 67
+ * @stable ICU 67
*/
UDateFormatHourCycle getDefaultHourCycle(UErrorCode& status) const;
-#endif /* U_HIDE_DRAFT_API */
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/deps/icu-small/source/i18n/unicode/listformatter.h b/deps/icu-small/source/i18n/unicode/listformatter.h
index eddb5dab6701b3..3cc750c8387499 100644
--- a/deps/icu-small/source/i18n/unicode/listformatter.h
+++ b/deps/icu-small/source/i18n/unicode/listformatter.h
@@ -198,22 +198,6 @@ class U_I18N_API ListFormatter : public UObject{
static ListFormatter* createInstance(
const Locale& locale, UListFormatterType type, UListFormatterWidth width, UErrorCode& errorCode);
-#ifndef U_HIDE_INTERNAL_API
- /**
- * Creates a ListFormatter appropriate for a locale and style.
- *
- * TODO(ICU-20888): Remove this in ICU 68.
- *
- * @param locale The locale.
- * @param style the style, either "standard", "or", "unit", "unit-narrow", or "unit-short"
- * @param errorCode ICU error code, set if no data available for the given locale.
- * @return A ListFormatter object created from internal data derived from
- * CLDR data.
- * @internal
- */
- static ListFormatter* createInstance(const Locale& locale, const char* style, UErrorCode& errorCode);
-#endif /* U_HIDE_INTERNAL_API */
-
/**
* Destructor.
*
@@ -273,6 +257,15 @@ class U_I18N_API ListFormatter : public UObject{
#endif /* U_HIDE_INTERNAL_API */
private:
+
+ /**
+ * Creates a ListFormatter appropriate for a locale and style.
+ *
+ * @param locale The locale.
+ * @param style the style, either "standard", "or", "unit", "unit-narrow", or "unit-short"
+ */
+ static ListFormatter* createInstance(const Locale& locale, const char* style, UErrorCode& errorCode);
+
static void initializeHash(UErrorCode& errorCode);
static const ListFormatInternal* getListFormatInternal(const Locale& locale, const char *style, UErrorCode& errorCode);
struct ListPatternsSink;
diff --git a/deps/icu-small/source/i18n/unicode/measfmt.h b/deps/icu-small/source/i18n/unicode/measfmt.h
index f95f39f0d5e6a2..f48dada2abf02a 100644
--- a/deps/icu-small/source/i18n/unicode/measfmt.h
+++ b/deps/icu-small/source/i18n/unicode/measfmt.h
@@ -91,7 +91,8 @@ class DateFormat;
/**
* IMPORTANT: New users are strongly encouraged to see if
* numberformatter.h fits their use case. Although not deprecated, this header
- * is provided for backwards compatibility only.
+ * is provided for backwards compatibility only, and has much more limited
+ * capabilities.
*
* @see Format
* @author Alan Liu
diff --git a/deps/icu-small/source/i18n/unicode/measunit.h b/deps/icu-small/source/i18n/unicode/measunit.h
index ed8773c7710f3e..0985ba0706eaa4 100644
--- a/deps/icu-small/source/i18n/unicode/measunit.h
+++ b/deps/icu-small/source/i18n/unicode/measunit.h
@@ -30,201 +30,333 @@
U_NAMESPACE_BEGIN
class StringEnumeration;
-struct MeasureUnitImpl;
+class MeasureUnitImpl;
+
+namespace number {
+namespace impl {
+class LongNameHandler;
+}
+} // namespace number
-#ifndef U_HIDE_DRAFT_API
/**
* Enumeration for unit complexity. There are three levels:
*
- * - SINGLE: A single unit, optionally with a power and/or SI prefix. Examples: hectare,
- * square-kilometer, kilojoule, per-second.
+ * - SINGLE: A single unit, optionally with a power and/or SI or binary prefix.
+ * Examples: hectare, square-kilometer, kilojoule, per-second, mebibyte.
* - COMPOUND: A unit composed of the product of multiple single units. Examples:
* meter-per-second, kilowatt-hour, kilogram-meter-per-square-second.
* - MIXED: A unit composed of the sum of multiple single units. Examples: foot+inch,
* hour+minute+second, degree+arcminute+arcsecond.
*
* The complexity determines which operations are available. For example, you cannot set the power
- * or SI prefix of a compound unit.
+ * or prefix of a compound unit.
*
- * @draft ICU 67
+ * @stable ICU 67
*/
enum UMeasureUnitComplexity {
/**
* A single unit, like kilojoule.
*
- * @draft ICU 67
+ * @stable ICU 67
*/
UMEASURE_UNIT_SINGLE,
/**
* A compound unit, like meter-per-second.
*
- * @draft ICU 67
+ * @stable ICU 67
*/
UMEASURE_UNIT_COMPOUND,
/**
* A mixed unit, like hour+minute.
*
- * @draft ICU 67
+ * @stable ICU 67
*/
UMEASURE_UNIT_MIXED
};
+
+#ifndef U_HIDE_DRAFT_API
/**
- * Enumeration for SI prefixes, such as "kilo".
+ * Enumeration for SI and binary prefixes, e.g. "kilo-", "nano-", "mebi-".
+ *
+ * Enum values should be treated as opaque: use umeas_getPrefixPower() and
+ * umeas_getPrefixBase() to find their corresponding values.
*
- * @draft ICU 67
+ * @draft ICU 69
+ * @see umeas_getPrefixBase
+ * @see umeas_getPrefixPower
*/
-typedef enum UMeasureSIPrefix {
+typedef enum UMeasurePrefix {
+ /**
+ * The absence of an SI or binary prefix.
+ *
+ * The integer representation of this enum value is an arbitrary
+ * implementation detail and should not be relied upon: use
+ * umeas_getPrefixPower() to obtain meaningful values.
+ *
+ * @draft ICU 69
+ */
+ UMEASURE_PREFIX_ONE = 30 + 0,
/**
* SI prefix: yotta, 10^24.
*
- * @draft ICU 67
+ * @draft ICU 69
+ */
+ UMEASURE_PREFIX_YOTTA = UMEASURE_PREFIX_ONE + 24,
+
+ /**
+ * ICU use only.
+ * Used to determine the set of base-10 SI prefixes.
+ * @internal
*/
- UMEASURE_SI_PREFIX_YOTTA = 24,
+ UMEASURE_PREFIX_INTERNAL_MAX_SI = UMEASURE_PREFIX_YOTTA,
/**
* SI prefix: zetta, 10^21.
*
- * @draft ICU 67
+ * @draft ICU 69
*/
- UMEASURE_SI_PREFIX_ZETTA = 21,
+ UMEASURE_PREFIX_ZETTA = UMEASURE_PREFIX_ONE + 21,
/**
* SI prefix: exa, 10^18.
*
- * @draft ICU 67
+ * @draft ICU 69
*/
- UMEASURE_SI_PREFIX_EXA = 18,
+ UMEASURE_PREFIX_EXA = UMEASURE_PREFIX_ONE + 18,
/**
* SI prefix: peta, 10^15.
*
- * @draft ICU 67
+ * @draft ICU 69
*/
- UMEASURE_SI_PREFIX_PETA = 15,
+ UMEASURE_PREFIX_PETA = UMEASURE_PREFIX_ONE + 15,
/**
* SI prefix: tera, 10^12.
*
- * @draft ICU 67
+ * @draft ICU 69
*/
- UMEASURE_SI_PREFIX_TERA = 12,
+ UMEASURE_PREFIX_TERA = UMEASURE_PREFIX_ONE + 12,
/**
* SI prefix: giga, 10^9.
*
- * @draft ICU 67
+ * @draft ICU 69
*/
- UMEASURE_SI_PREFIX_GIGA = 9,
+ UMEASURE_PREFIX_GIGA = UMEASURE_PREFIX_ONE + 9,
/**
* SI prefix: mega, 10^6.
*
- * @draft ICU 67
+ * @draft ICU 69
*/
- UMEASURE_SI_PREFIX_MEGA = 6,
+ UMEASURE_PREFIX_MEGA = UMEASURE_PREFIX_ONE + 6,
/**
* SI prefix: kilo, 10^3.
*
- * @draft ICU 67
+ * @draft ICU 69
*/
- UMEASURE_SI_PREFIX_KILO = 3,
+ UMEASURE_PREFIX_KILO = UMEASURE_PREFIX_ONE + 3,
/**
* SI prefix: hecto, 10^2.
*
- * @draft ICU 67
+ * @draft ICU 69
*/
- UMEASURE_SI_PREFIX_HECTO = 2,
+ UMEASURE_PREFIX_HECTO = UMEASURE_PREFIX_ONE + 2,
/**
* SI prefix: deka, 10^1.
*
- * @draft ICU 67
+ * @draft ICU 69
*/
- UMEASURE_SI_PREFIX_DEKA = 1,
-
- /**
- * The absence of an SI prefix.
- *
- * @draft ICU 67
- */
- UMEASURE_SI_PREFIX_ONE = 0,
+ UMEASURE_PREFIX_DEKA = UMEASURE_PREFIX_ONE + 1,
/**
* SI prefix: deci, 10^-1.
*
- * @draft ICU 67
+ * @draft ICU 69
*/
- UMEASURE_SI_PREFIX_DECI = -1,
+ UMEASURE_PREFIX_DECI = UMEASURE_PREFIX_ONE + -1,
/**
* SI prefix: centi, 10^-2.
*
- * @draft ICU 67
+ * @draft ICU 69
*/
- UMEASURE_SI_PREFIX_CENTI = -2,
+ UMEASURE_PREFIX_CENTI = UMEASURE_PREFIX_ONE + -2,
/**
* SI prefix: milli, 10^-3.
*
- * @draft ICU 67
+ * @draft ICU 69
*/
- UMEASURE_SI_PREFIX_MILLI = -3,
+ UMEASURE_PREFIX_MILLI = UMEASURE_PREFIX_ONE + -3,
/**
* SI prefix: micro, 10^-6.
*
- * @draft ICU 67
+ * @draft ICU 69
*/
- UMEASURE_SI_PREFIX_MICRO = -6,
+ UMEASURE_PREFIX_MICRO = UMEASURE_PREFIX_ONE + -6,
/**
* SI prefix: nano, 10^-9.
*
- * @draft ICU 67
+ * @draft ICU 69
*/
- UMEASURE_SI_PREFIX_NANO = -9,
+ UMEASURE_PREFIX_NANO = UMEASURE_PREFIX_ONE + -9,
/**
* SI prefix: pico, 10^-12.
*
- * @draft ICU 67
+ * @draft ICU 69
*/
- UMEASURE_SI_PREFIX_PICO = -12,
+ UMEASURE_PREFIX_PICO = UMEASURE_PREFIX_ONE + -12,
/**
* SI prefix: femto, 10^-15.
*
- * @draft ICU 67
+ * @draft ICU 69
*/
- UMEASURE_SI_PREFIX_FEMTO = -15,
+ UMEASURE_PREFIX_FEMTO = UMEASURE_PREFIX_ONE + -15,
/**
* SI prefix: atto, 10^-18.
*
- * @draft ICU 67
+ * @draft ICU 69
*/
- UMEASURE_SI_PREFIX_ATTO = -18,
+ UMEASURE_PREFIX_ATTO = UMEASURE_PREFIX_ONE + -18,
/**
* SI prefix: zepto, 10^-21.
*
- * @draft ICU 67
+ * @draft ICU 69
*/
- UMEASURE_SI_PREFIX_ZEPTO = -21,
+ UMEASURE_PREFIX_ZEPTO = UMEASURE_PREFIX_ONE + -21,
/**
* SI prefix: yocto, 10^-24.
*
- * @draft ICU 67
+ * @draft ICU 69
+ */
+ UMEASURE_PREFIX_YOCTO = UMEASURE_PREFIX_ONE + -24,
+
+#ifndef U_HIDE_INTERNAL_API
+ /**
+ * ICU use only.
+ * Used to determine the set of base-10 SI prefixes.
+ * @internal
+ */
+ UMEASURE_PREFIX_INTERNAL_MIN_SI = UMEASURE_PREFIX_YOCTO,
+#endif // U_HIDE_INTERNAL_API
+
+ // Cannot conditionalize the following with #ifndef U_HIDE_INTERNAL_API,
+ // used in definitions of non-internal enum values
+ /**
+ * ICU use only.
+ * Sets the arbitrary offset of the base-1024 binary prefixes' enum values.
+ * @internal
+ */
+ UMEASURE_PREFIX_INTERNAL_ONE_BIN = -60,
+
+ /**
+ * Binary prefix: kibi, 1024^1.
+ *
+ * @draft ICU 69
+ */
+ UMEASURE_PREFIX_KIBI = UMEASURE_PREFIX_INTERNAL_ONE_BIN + 1,
+
+#ifndef U_HIDE_INTERNAL_API
+ /**
+ * ICU use only.
+ * Used to determine the set of base-1024 binary prefixes.
+ * @internal
+ */
+ UMEASURE_PREFIX_INTERNAL_MIN_BIN = UMEASURE_PREFIX_KIBI,
+#endif // U_HIDE_INTERNAL_API
+
+ /**
+ * Binary prefix: mebi, 1024^2.
+ *
+ * @draft ICU 69
+ */
+ UMEASURE_PREFIX_MEBI = UMEASURE_PREFIX_INTERNAL_ONE_BIN + 2,
+
+ /**
+ * Binary prefix: gibi, 1024^3.
+ *
+ * @draft ICU 69
+ */
+ UMEASURE_PREFIX_GIBI = UMEASURE_PREFIX_INTERNAL_ONE_BIN + 3,
+
+ /**
+ * Binary prefix: tebi, 1024^4.
+ *
+ * @draft ICU 69
*/
- UMEASURE_SI_PREFIX_YOCTO = -24
-} UMeasureSIPrefix;
+ UMEASURE_PREFIX_TEBI = UMEASURE_PREFIX_INTERNAL_ONE_BIN + 4,
+
+ /**
+ * Binary prefix: pebi, 1024^5.
+ *
+ * @draft ICU 69
+ */
+ UMEASURE_PREFIX_PEBI = UMEASURE_PREFIX_INTERNAL_ONE_BIN + 5,
+
+ /**
+ * Binary prefix: exbi, 1024^6.
+ *
+ * @draft ICU 69
+ */
+ UMEASURE_PREFIX_EXBI = UMEASURE_PREFIX_INTERNAL_ONE_BIN + 6,
+
+ /**
+ * Binary prefix: zebi, 1024^7.
+ *
+ * @draft ICU 69
+ */
+ UMEASURE_PREFIX_ZEBI = UMEASURE_PREFIX_INTERNAL_ONE_BIN + 7,
+
+ /**
+ * Binary prefix: yobi, 1024^8.
+ *
+ * @draft ICU 69
+ */
+ UMEASURE_PREFIX_YOBI = UMEASURE_PREFIX_INTERNAL_ONE_BIN + 8,
+
+#ifndef U_HIDE_INTERNAL_API
+ /**
+ * ICU use only.
+ * Used to determine the set of base-1024 binary prefixes.
+ * @internal
+ */
+ UMEASURE_PREFIX_INTERNAL_MAX_BIN = UMEASURE_PREFIX_YOBI,
+#endif // U_HIDE_INTERNAL_API
+} UMeasurePrefix;
+
+/**
+ * Returns the base of the factor associated with the given unit prefix: the
+ * base is 10 for SI prefixes (kilo, micro) and 1024 for binary prefixes (kibi,
+ * mebi).
+ *
+ * @draft ICU 69
+ */
+U_CAPI int32_t U_EXPORT2 umeas_getPrefixBase(UMeasurePrefix unitPrefix);
+
+/**
+ * Returns the exponent of the factor associated with the given unit prefix, for
+ * example 3 for kilo, -6 for micro, 1 for kibi, 2 for mebi, 3 for gibi.
+ *
+ * @draft ICU 69
+ */
+U_CAPI int32_t U_EXPORT2 umeas_getPrefixPower(UMeasurePrefix unitPrefix);
+
#endif // U_HIDE_DRAFT_API
/**
@@ -250,27 +382,26 @@ class U_I18N_API MeasureUnit: public UObject {
*/
MeasureUnit(const MeasureUnit &other);
-#ifndef U_HIDE_DRAFT_API
/**
* Move constructor.
- * @draft ICU 67
+ * @stable ICU 67
*/
MeasureUnit(MeasureUnit &&other) noexcept;
/**
- * Construct a MeasureUnit from a CLDR Unit Identifier, defined in UTS 35.
- * Validates and canonicalizes the identifier.
+ * Construct a MeasureUnit from a CLDR Core Unit Identifier, defined in UTS
+ * 35. (Core unit identifiers and mixed unit identifiers are supported, long
+ * unit identifiers are not.) Validates and canonicalizes the identifier.
*
*
* MeasureUnit example = MeasureUnit::forIdentifier("furlong-per-nanosecond")
*
*
- * @param identifier The CLDR Unit Identifier
+ * @param identifier The CLDR Unit Identifier.
* @param status Set if the identifier is invalid.
- * @draft ICU 67
+ * @stable ICU 67
*/
static MeasureUnit forIdentifier(StringPiece identifier, UErrorCode& status);
-#endif // U_HIDE_DRAFT_API
/**
* Copy assignment operator.
@@ -278,13 +409,11 @@ class U_I18N_API MeasureUnit: public UObject {
*/
MeasureUnit &operator=(const MeasureUnit &other);
-#ifndef U_HIDE_DRAFT_API
/**
* Move assignment operator.
- * @draft ICU 67
+ * @stable ICU 67
*/
MeasureUnit &operator=(MeasureUnit &&other) noexcept;
-#endif // U_HIDE_DRAFT_API
/**
* Returns a polymorphic clone of this object. The result will
@@ -333,12 +462,11 @@ class U_I18N_API MeasureUnit: public UObject {
*/
const char *getSubtype() const;
-#ifndef U_HIDE_DRAFT_API
/**
- * Get the CLDR Unit Identifier for this MeasureUnit, as defined in UTS 35.
+ * Get CLDR Unit Identifier for this MeasureUnit, as defined in UTS 35.
*
* @return The string form of this unit, owned by this MeasureUnit.
- * @draft ICU 67
+ * @stable ICU 67
*/
const char* getIdentifier() const;
@@ -347,38 +475,43 @@ class U_I18N_API MeasureUnit: public UObject {
*
* @param status Set if an error occurs.
* @return The unit complexity.
- * @draft ICU 67
+ * @stable ICU 67
*/
UMeasureUnitComplexity getComplexity(UErrorCode& status) const;
+#ifndef U_HIDE_DRAFT_API
/**
- * Creates a MeasureUnit which is this SINGLE unit augmented with the specified SI prefix.
- * For example, UMEASURE_SI_PREFIX_KILO for "kilo".
+ * Creates a MeasureUnit which is this SINGLE unit augmented with the specified prefix.
+ * For example, UMEASURE_PREFIX_KILO for "kilo", or UMEASURE_PREFIX_KIBI for "kibi".
*
- * There is sufficient locale data to format all standard SI prefixes.
+ * There is sufficient locale data to format all standard prefixes.
*
* NOTE: Only works on SINGLE units. If this is a COMPOUND or MIXED unit, an error will
* occur. For more information, see UMeasureUnitComplexity.
*
- * @param prefix The SI prefix, from UMeasureSIPrefix.
+ * @param prefix The prefix, from UMeasurePrefix.
* @param status Set if this is not a SINGLE unit or if another error occurs.
* @return A new SINGLE unit.
- * @draft ICU 67
+ * @draft ICU 69
*/
- MeasureUnit withSIPrefix(UMeasureSIPrefix prefix, UErrorCode& status) const;
+ MeasureUnit withPrefix(UMeasurePrefix prefix, UErrorCode& status) const;
/**
- * Gets the current SI prefix of this SINGLE unit. For example, if the unit has the SI prefix
- * "kilo", then UMEASURE_SI_PREFIX_KILO is returned.
+ * Returns the current SI or binary prefix of this SINGLE unit. For example,
+ * if the unit has the prefix "kilo", then UMEASURE_PREFIX_KILO is
+ * returned.
*
* NOTE: Only works on SINGLE units. If this is a COMPOUND or MIXED unit, an error will
* occur. For more information, see UMeasureUnitComplexity.
*
* @param status Set if this is not a SINGLE unit or if another error occurs.
- * @return The SI prefix of this SINGLE unit, from UMeasureSIPrefix.
- * @draft ICU 67
+ * @return The prefix of this SINGLE unit, from UMeasurePrefix.
+ * @see umeas_getPrefixBase
+ * @see umeas_getPrefixPower
+ * @draft ICU 69
*/
- UMeasureSIPrefix getSIPrefix(UErrorCode& status) const;
+ UMeasurePrefix getPrefix(UErrorCode& status) const;
+#endif // U_HIDE_DRAFT_API
/**
* Creates a MeasureUnit which is this SINGLE unit augmented with the specified dimensionality
@@ -392,7 +525,7 @@ class U_I18N_API MeasureUnit: public UObject {
* @param dimensionality The dimensionality (power).
* @param status Set if this is not a SINGLE unit or if another error occurs.
* @return A new SINGLE unit.
- * @draft ICU 67
+ * @stable ICU 67
*/
MeasureUnit withDimensionality(int32_t dimensionality, UErrorCode& status) const;
@@ -407,7 +540,7 @@ class U_I18N_API MeasureUnit: public UObject {
*
* @param status Set if this is not a SINGLE unit or if another error occurs.
* @return The dimensionality (power) of this simple unit.
- * @draft ICU 67
+ * @stable ICU 67
*/
int32_t getDimensionality(UErrorCode& status) const;
@@ -421,7 +554,7 @@ class U_I18N_API MeasureUnit: public UObject {
*
* @param status Set if this is a MIXED unit or if another error occurs.
* @return The reciprocal of the target unit.
- * @draft ICU 67
+ * @stable ICU 67
*/
MeasureUnit reciprocal(UErrorCode& status) const;
@@ -440,10 +573,9 @@ class U_I18N_API MeasureUnit: public UObject {
* @param other The MeasureUnit to multiply with the target.
* @param status Set if this or other is a MIXED unit or if another error occurs.
* @return The product of the target unit with the provided unit.
- * @draft ICU 67
+ * @stable ICU 67
*/
MeasureUnit product(const MeasureUnit& other, UErrorCode& status) const;
-#endif // U_HIDE_DRAFT_API
#ifndef U_HIDE_DRAFT_API
/**
@@ -547,7 +679,7 @@ class U_I18N_API MeasureUnit: public UObject {
// the "End generated createXXX methods" comment is auto generated code
// and must not be edited manually. For instructions on how to correctly
// update this code, refer to:
-// http://site.icu-project.org/design/formatting/measureformat/updating-measure-unit
+// docs/processes/release/tasks/updating-measure-unit.md
//
// Start generated createXXX methods
@@ -839,6 +971,24 @@ class U_I18N_API MeasureUnit: public UObject {
*/
static MeasureUnit getKarat();
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Returns by pointer, unit of concentr: milligram-ofglucose-per-deciliter.
+ * Caller owns returned value and must free it.
+ * Also see {@link #getMilligramOfglucosePerDeciliter()}.
+ * @param status ICU error code.
+ * @draft ICU 69
+ */
+ static MeasureUnit *createMilligramOfglucosePerDeciliter(UErrorCode &status);
+
+ /**
+ * Returns by value, unit of concentr: milligram-ofglucose-per-deciliter.
+ * Also see {@link #createMilligramOfglucosePerDeciliter()}.
+ * @draft ICU 69
+ */
+ static MeasureUnit getMilligramOfglucosePerDeciliter();
+#endif /* U_HIDE_DRAFT_API */
+
/**
* Returns by pointer, unit of concentr: milligram-per-deciliter.
* Caller owns returned value and must free it.
@@ -3519,7 +3669,6 @@ class U_I18N_API MeasureUnit: public UObject {
*/
static MeasureUnit getTeaspoon();
-
// End generated createXXX methods
protected:
@@ -3569,10 +3718,14 @@ class U_I18N_API MeasureUnit: public UObject {
/** Internal version of public API */
LocalArray splitToSingleUnitsImpl(int32_t& outCount, UErrorCode& status) const;
- friend struct MeasureUnitImpl;
+ friend class MeasureUnitImpl;
+
+ // For access to findBySubType
+ friend class number::impl::LongNameHandler;
};
-#ifndef U_HIDE_DRAFT_API // @draft ICU 68
+#ifndef U_HIDE_DRAFT_API
+// inline impl of @draft ICU 68 method
inline std::pair, int32_t>
MeasureUnit::splitToSingleUnits(UErrorCode& status) const {
int32_t length;
diff --git a/deps/icu-small/source/i18n/unicode/msgfmt.h b/deps/icu-small/source/i18n/unicode/msgfmt.h
index 2d9bc8f2e2b0f8..14b57a114dc3a5 100644
--- a/deps/icu-small/source/i18n/unicode/msgfmt.h
+++ b/deps/icu-small/source/i18n/unicode/msgfmt.h
@@ -132,7 +132,7 @@ class NumberFormat;
* messageText can contain quoted literal strings including syntax characters.
* A quoted literal string begins with an ASCII apostrophe and a syntax character
* (usually a {curly brace}) and continues until the next single apostrophe.
- * A double ASCII apostrohpe inside or outside of a quoted string represents
+ * A double ASCII apostrophe inside or outside of a quoted string represents
* one literal apostrophe.
* Quotable syntax characters are the {curly braces} in all messageText parts,
* plus the '#' sign in a messageText immediately inside a pluralStyle,
diff --git a/deps/icu-small/source/i18n/unicode/numberformatter.h b/deps/icu-small/source/i18n/unicode/numberformatter.h
index 06329b8e7aa024..b987e64b937455 100644
--- a/deps/icu-small/source/i18n/unicode/numberformatter.h
+++ b/deps/icu-small/source/i18n/unicode/numberformatter.h
@@ -28,10 +28,9 @@
/**
* \file
- * \brief C++ API: Library for localized number formatting introduced in ICU 60.
+ * \brief C++ API: All-in-one formatter for localized numbers, currencies, and units.
*
- * This library was introduced in ICU 60 to simplify the process of formatting localized number strings.
- * Basic usage examples:
+ * For a full list of options, see icu::number::NumberFormatterSettings.
*
*
* // Most basic usage:
@@ -347,15 +346,15 @@ class U_I18N_API Notation : public UMemory {
union NotationUnion {
// For NTN_SCIENTIFIC
- /** @internal */
+ /** @internal (private) */
struct ScientificSettings {
- /** @internal */
+ /** @internal (private) */
int8_t fEngineeringInterval;
- /** @internal */
+ /** @internal (private) */
bool fRequireMinInt;
- /** @internal */
+ /** @internal (private) */
impl::digits_t fMinExponentDigits;
- /** @internal */
+ /** @internal (private) */
UNumberSignDisplay fExponentSignDisplay;
} scientific;
@@ -660,6 +659,17 @@ class U_I18N_API Precision : public UMemory {
*/
static CurrencyPrecision currency(UCurrencyUsage currencyUsage);
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Configure how trailing zeros are displayed on numbers. For example, to hide trailing zeros
+ * when the number is an integer, use UNUM_TRAILING_ZERO_HIDE_IF_WHOLE.
+ *
+ * @param trailingZeroDisplay Option to configure the display of trailing zeros.
+ * @draft ICU 69
+ */
+ Precision trailingZeroDisplay(UNumberTrailingZeroDisplay trailingZeroDisplay) const;
+#endif // U_HIDE_DRAFT_API
+
private:
enum PrecisionType {
RND_BOGUS,
@@ -684,32 +694,36 @@ class U_I18N_API Precision : public UMemory {
} fType;
union PrecisionUnion {
- /** @internal */
+ /** @internal (private) */
struct FractionSignificantSettings {
// For RND_FRACTION, RND_SIGNIFICANT, and RND_FRACTION_SIGNIFICANT
- /** @internal */
+ /** @internal (private) */
impl::digits_t fMinFrac;
- /** @internal */
+ /** @internal (private) */
impl::digits_t fMaxFrac;
- /** @internal */
+ /** @internal (private) */
impl::digits_t fMinSig;
- /** @internal */
+ /** @internal (private) */
impl::digits_t fMaxSig;
+ /** @internal (private) */
+ UNumberRoundingPriority fPriority;
} fracSig;
- /** @internal */
+ /** @internal (private) */
struct IncrementSettings {
// For RND_INCREMENT, RND_INCREMENT_ONE, and RND_INCREMENT_FIVE
- /** @internal */
+ /** @internal (private) */
double fIncrement;
- /** @internal */
+ /** @internal (private) */
impl::digits_t fMinFrac;
- /** @internal */
+ /** @internal (private) */
impl::digits_t fMaxFrac;
} increment;
UCurrencyUsage currencyUsage; // For RND_CURRENCY
UErrorCode errorCode; // For RND_ERROR
} fUnion;
+ UNumberTrailingZeroDisplay fTrailingZeroDisplay = UNUM_TRAILING_ZERO_AUTO;
+
typedef PrecisionUnion::FractionSignificantSettings FractionSignificantSettings;
typedef PrecisionUnion::IncrementSettings IncrementSettings;
@@ -741,8 +755,11 @@ class U_I18N_API Precision : public UMemory {
static Precision constructSignificant(int32_t minSig, int32_t maxSig);
- static Precision
- constructFractionSignificant(const FractionPrecision &base, int32_t minSig, int32_t maxSig);
+ static Precision constructFractionSignificant(
+ const FractionPrecision &base,
+ int32_t minSig,
+ int32_t maxSig,
+ UNumberRoundingPriority priority);
static IncrementPrecision constructIncrement(double increment, int32_t minFrac);
@@ -784,16 +801,38 @@ class U_I18N_API Precision : public UMemory {
*/
class U_I18N_API FractionPrecision : public Precision {
public:
+#ifndef U_HIDE_DRAFT_API
/**
- * Ensure that no less than this number of significant digits are retained when rounding according to fraction
- * rules.
+ * Override maximum fraction digits with maximum significant digits depending on the magnitude
+ * of the number. See UNumberRoundingPriority.
*
- *
- * For example, with integer rounding, the number 3.141 becomes "3". However, with minimum figures set to 2, 3.141
- * becomes "3.1" instead.
+ * @param minSignificantDigits
+ * Pad trailing zeros to achieve this minimum number of significant digits.
+ * @param maxSignificantDigits
+ * Round the number to achieve this maximum number of significant digits.
+ * @param priority
+ * How to disambiguate between fraction digits and significant digits.
+ * @return A precision for chaining or passing to the NumberFormatter precision() setter.
*
- *
- * This setting does not affect the number of trailing zeros. For example, 3.01 would print as "3", not "3.0".
+ * @draft ICU 69
+ */
+ Precision withSignificantDigits(
+ int32_t minSignificantDigits,
+ int32_t maxSignificantDigits,
+ UNumberRoundingPriority priority) const;
+#endif // U_HIDE_DRAFT_API
+
+ /**
+ * Ensure that no less than this number of significant digits are retained when rounding
+ * according to fraction rules.
+ *
+ * For example, with integer rounding, the number 3.141 becomes "3". However, with minimum
+ * figures set to 2, 3.141 becomes "3.1" instead.
+ *
+ * This setting does not affect the number of trailing zeros. For example, 3.01 would print as
+ * "3", not "3.0".
+ *
+ * This is equivalent to `withSignificantDigits(1, minSignificantDigits, RELAXED)`.
*
* @param minSignificantDigits
* The number of significant figures to guarantee.
@@ -803,16 +842,16 @@ class U_I18N_API FractionPrecision : public Precision {
Precision withMinDigits(int32_t minSignificantDigits) const;
/**
- * Ensure that no more than this number of significant digits are retained when rounding according to fraction
- * rules.
+ * Ensure that no more than this number of significant digits are retained when rounding
+ * according to fraction rules.
*
- *
- * For example, with integer rounding, the number 123.4 becomes "123". However, with maximum figures set to 2, 123.4
- * becomes "120" instead.
+ * For example, with integer rounding, the number 123.4 becomes "123". However, with maximum
+ * figures set to 2, 123.4 becomes "120" instead.
*
- *
- * This setting does not affect the number of trailing zeros. For example, with fixed fraction of 2, 123.4 would
- * become "120.00".
+ * This setting does not affect the number of trailing zeros. For example, with fixed fraction
+ * of 2, 123.4 would become "120.00".
+ *
+ * This is equivalent to `withSignificantDigits(1, maxSignificantDigits, STRICT)`.
*
* @param maxSignificantDigits
* Round the number to no more than this number of significant figures.
@@ -1131,33 +1170,35 @@ class U_I18N_API Scale : public UMemory {
namespace impl {
-// Do not enclose entire Usage with #ifndef U_HIDE_INTERNAL_API, needed for a protected field
+// Do not enclose entire StringProp with #ifndef U_HIDE_INTERNAL_API, needed for a protected field
/**
* Manages NumberFormatterSettings::usage()'s char* instance on the heap.
* @internal
*/
-class U_I18N_API Usage : public UMemory {
+class U_I18N_API StringProp : public UMemory {
#ifndef U_HIDE_INTERNAL_API
public:
/** @internal */
- Usage(const Usage& other);
+ StringProp(const StringProp &other);
/** @internal */
- Usage& operator=(const Usage& other);
+ StringProp &operator=(const StringProp &other);
/** @internal */
- Usage(Usage &&src) U_NOEXCEPT;
+ StringProp(StringProp &&src) U_NOEXCEPT;
/** @internal */
- Usage& operator=(Usage&& src) U_NOEXCEPT;
+ StringProp &operator=(StringProp &&src) U_NOEXCEPT;
/** @internal */
- ~Usage();
+ ~StringProp();
/** @internal */
- int16_t length() const { return fLength; }
+ int16_t length() const {
+ return fLength;
+ }
/** @internal
* Makes a copy of value. Set to "" to unset.
@@ -1165,18 +1206,21 @@ class U_I18N_API Usage : public UMemory {
void set(StringPiece value);
/** @internal */
- bool isSet() const { return fLength > 0; }
+ bool isSet() const {
+ return fLength > 0;
+ }
#endif // U_HIDE_INTERNAL_API
private:
- char *fUsage;
+ char *fValue;
int16_t fLength;
UErrorCode fError;
- Usage() : fUsage(nullptr), fLength(0), fError(U_ZERO_ERROR) {}
+ StringProp() : fValue(nullptr), fLength(0), fError(U_ZERO_ERROR) {
+ }
- /** @internal */
+ /** @internal (private) */
UBool copyErrorTo(UErrorCode &status) const {
if (U_FAILURE(fError)) {
status = fError;
@@ -1185,7 +1229,7 @@ class U_I18N_API Usage : public UMemory {
return false;
}
- // Allow NumberFormatterImpl to access fUsage.
+ // Allow NumberFormatterImpl to access fValue.
friend class impl::NumberFormatterImpl;
// Allow skeleton generation code to access private members.
@@ -1480,7 +1524,10 @@ struct U_I18N_API MacroProps : public UMemory {
Scale scale; // = Scale(); (benign value)
/** @internal */
- Usage usage; // = Usage(); (no usage)
+ StringProp usage; // = StringProp(); (no usage)
+
+ /** @internal */
+ StringProp unitDisplayCase; // = StringProp(); (nominative)
/** @internal */
const AffixPatternProvider* affixProvider = nullptr; // no ownership
@@ -1503,7 +1550,8 @@ struct U_I18N_API MacroProps : public UMemory {
bool copyErrorTo(UErrorCode &status) const {
return notation.copyErrorTo(status) || precision.copyErrorTo(status) ||
padder.copyErrorTo(status) || integerWidth.copyErrorTo(status) ||
- symbols.copyErrorTo(status) || scale.copyErrorTo(status) || usage.copyErrorTo(status);
+ symbols.copyErrorTo(status) || scale.copyErrorTo(status) || usage.copyErrorTo(status) ||
+ unitDisplayCase.copyErrorTo(status);
}
};
@@ -2171,6 +2219,25 @@ class U_I18N_API NumberFormatterSettings {
Derived usage(StringPiece usage) &&;
#endif // U_HIDE_DRAFT_API
+#ifndef U_HIDE_DRAFT_API
+#ifndef U_HIDE_INTERNAL_API
+ /**
+ * Specifies the desired case for a unit formatter's output (e.g.
+ * accusative, dative, genitive).
+ *
+ * @internal ICU 69 technology preview
+ */
+ Derived unitDisplayCase(StringPiece unitDisplayCase) const &;
+
+ /**
+ * Overload of unitDisplayCase() for use on an rvalue reference.
+ *
+ * @internal ICU 69 technology preview
+ */
+ Derived unitDisplayCase(StringPiece unitDisplayCase) &&;
+#endif // U_HIDE_INTERNAL_API
+#endif // U_HIDE_DRAFT_API
+
#ifndef U_HIDE_INTERNAL_API
/**
@@ -2223,6 +2290,9 @@ class U_I18N_API NumberFormatterSettings {
* The returned skeleton is in normalized form, such that two number formatters with equivalent
* behavior should produce the same skeleton.
*
+ * For more information on number skeleton strings, see:
+ * https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html
+ *
* @return A number skeleton string with behavior corresponding to this number formatter.
* @stable ICU 62
*/
@@ -2658,6 +2728,14 @@ class U_I18N_API FormattedNumber : public UMemory, public FormattedValue {
* @draft ICU 68
*/
MeasureUnit getOutputUnit(UErrorCode& status) const;
+
+ /**
+ * Gets the gender of the formatted output. Returns "" when the gender is
+ * unknown, or for ungendered languages.
+ *
+ * @internal ICU 69 technology preview.
+ */
+ const char *getGender(UErrorCode& status) const;
#endif // U_HIDE_DRAFT_API
#ifndef U_HIDE_INTERNAL_API
@@ -2685,7 +2763,7 @@ class U_I18N_API FormattedNumber : public UMemory, public FormattedValue {
/**
* Internal constructor from data type. Adopts the data pointer.
- * @internal
+ * @internal (private)
*/
explicit FormattedNumber(impl::UFormattedNumberData *results)
: fData(results), fErrorCode(U_ZERO_ERROR) {}
@@ -2702,8 +2780,6 @@ class U_I18N_API FormattedNumber : public UMemory, public FormattedValue {
friend struct impl::UFormattedNumberImpl;
};
-#ifndef U_HIDE_DRAFT_API
-// Note: This is draft ICU 65
template
StringClass FormattedNumber::toDecimalNumber(UErrorCode& status) const {
StringClass result;
@@ -2711,7 +2787,6 @@ StringClass FormattedNumber::toDecimalNumber(UErrorCode& status) const {
toDecimalNumber(sink, status);
return result;
}
-#endif // U_HIDE_DRAFT_API
/**
* See the main description in numberformatter.h for documentation and examples.
@@ -2747,6 +2822,9 @@ class U_I18N_API NumberFormatter final {
* It is possible for an error to occur while parsing. See the overload of this method if you are
* interested in the location of a possible parse error.
*
+ * For more information on number skeleton strings, see:
+ * https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html
+ *
* @param skeleton
* The skeleton string off of which to base this NumberFormatter.
* @param status
@@ -2763,6 +2841,9 @@ class U_I18N_API NumberFormatter final {
* If an error occurs while parsing the skeleton string, the offset into the skeleton string at
* which the error occurred will be saved into the UParseError, if provided.
*
+ * For more information on number skeleton strings, see:
+ * https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html
+ *
* @param skeleton
* The skeleton string off of which to base this NumberFormatter.
* @param perror
diff --git a/deps/icu-small/source/i18n/unicode/numberrangeformatter.h b/deps/icu-small/source/i18n/unicode/numberrangeformatter.h
index 67339bb6e68da8..432f2f6095dedf 100644
--- a/deps/icu-small/source/i18n/unicode/numberrangeformatter.h
+++ b/deps/icu-small/source/i18n/unicode/numberrangeformatter.h
@@ -73,7 +73,7 @@ struct UFormattedNumberRangeImpl;
* Export an explicit template instantiation. See datefmt.h
* (When building DLLs for Windows this is required.)
*/
-#if U_PLATFORM == U_PF_WINDOWS && !defined(U_IN_DOXYGEN)
+#if U_PLATFORM == U_PF_WINDOWS && !defined(U_IN_DOXYGEN) && !defined(U_STATIC_IMPLEMENTATION)
} // namespace icu::number
U_NAMESPACE_END
@@ -608,49 +608,6 @@ class U_I18N_API FormattedNumberRange : public UMemory, public FormattedValue {
/** @copydoc FormattedValue::nextPosition() */
UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE;
-#ifndef U_HIDE_DEPRECATED_API
- /**
- * Export the first formatted number as a decimal number. This endpoint
- * is useful for obtaining the exact number being printed after scaling
- * and rounding have been applied by the number range formatting pipeline.
- *
- * The syntax of the unformatted number is a "numeric string"
- * as defined in the Decimal Arithmetic Specification, available at
- * http://speleotrove.com/decimal
- *
- * TODO(ICU-21275): This function will be removed in ICU 69.
- * Use getDecimalNumbers() instead.
- *
- * @param status Set if an error occurs.
- * @return A decimal representation of the first formatted number.
- * @deprecated ICU 68 Use getDecimalNumbers instead.
- * @see NumberRangeFormatter
- * @see #getSecondDecimal
- */
- UnicodeString getFirstDecimal(UErrorCode& status) const;
-
- /**
- * Export the second formatted number as a decimal number. This endpoint
- * is useful for obtaining the exact number being printed after scaling
- * and rounding have been applied by the number range formatting pipeline.
- *
- * The syntax of the unformatted number is a "numeric string"
- * as defined in the Decimal Arithmetic Specification, available at
- * http://speleotrove.com/decimal
- *
- * TODO(ICU-21275): This function will be removed in ICU 69.
- * Use getDecimalNumbers() instead.
- *
- * @param status Set if an error occurs.
- * @return A decimal representation of the second formatted number.
- * @deprecated ICU 68 Use getDecimalNumbers instead.
- * @see NumberRangeFormatter
- * @see #getFirstDecimal
- */
- UnicodeString getSecondDecimal(UErrorCode& status) const;
-#endif // U_HIDE_DEPRECATED_API
-
-
#ifndef U_HIDE_DRAFT_API
/**
* Extracts the formatted range as a pair of decimal numbers. This endpoint
@@ -749,7 +706,7 @@ class U_I18N_API FormattedNumberRange : public UMemory, public FormattedValue {
};
#ifndef U_HIDE_DRAFT_API
-// Note: This is draft ICU 68
+// inline impl of @draft ICU 68 method
template
std::pair FormattedNumberRange::getDecimalNumbers(UErrorCode& status) const {
StringClass str1;
diff --git a/deps/icu-small/source/i18n/unicode/rbnf.h b/deps/icu-small/source/i18n/unicode/rbnf.h
index 13bb7385b19921..ce60b9bec6853a 100644
--- a/deps/icu-small/source/i18n/unicode/rbnf.h
+++ b/deps/icu-small/source/i18n/unicode/rbnf.h
@@ -543,7 +543,7 @@ enum URBNFRuleSetTag {
* names in this array will be treated as public rule set names by the API. Each subsequent
* element is an array of localizations of these names. The first element of one of these
* subarrays is the locale name, and the remaining elements are localizations of the
- * public rule set names, in the same order as they were listed in the first arrray.
+ * public rule set names, in the same order as they were listed in the first array.
* In the syntax, angle brackets '<', '>' are used to delimit the arrays, and comma ',' is used
* to separate elements of an array. Whitespace is ignored, unless quoted.
* For example:
@@ -653,7 +653,7 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat {
/**
* Creates a RuleBasedNumberFormat from a predefined ruleset. The selector
- * code choosed among three possible predefined formats: spellout, ordinal,
+ * code chose among three possible predefined formats: spellout, ordinal,
* and duration.
* @param tag A selector code specifying which kind of formatter to create for that
* locale. There are four legal values: URBNF_SPELLOUT, which creates a formatter that
diff --git a/deps/icu-small/source/i18n/unicode/rbtz.h b/deps/icu-small/source/i18n/unicode/rbtz.h
index f7b45fb8ed540d..9fc0fd4657e7b8 100644
--- a/deps/icu-small/source/i18n/unicode/rbtz.h
+++ b/deps/icu-small/source/i18n/unicode/rbtz.h
@@ -107,7 +107,7 @@ class U_I18N_API RuleBasedTimeZone : public BasicTimeZone {
/**
* Makes the TimeZoneRule
ready to handle actual timezone
- * calcuation APIs. This method collects time zone rules specified
+ * calculation APIs. This method collects time zone rules specified
* by the caller via the constructor and addTransitionRule() and
* builds internal structure for making the object ready to support
* time zone APIs such as getOffset(), getNextTransition() and others.
@@ -302,12 +302,16 @@ class U_I18N_API RuleBasedTimeZone : public BasicTimeZone {
virtual void getTimeZoneRules(const InitialTimeZoneRule*& initial,
const TimeZoneRule* trsrules[], int32_t& trscount, UErrorCode& status) const;
+#ifndef U_FORCE_HIDE_DRAFT_API
/**
* Get time zone offsets from local wall time.
- * @internal
+ * @draft ICU 69
*/
- virtual void getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
+ virtual void getOffsetFromLocal(
+ UDate date, UTimeZoneLocalOption nonExistingTimeOpt,
+ UTimeZoneLocalOption duplicatedTimeOpt,
int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) const;
+#endif /* U_FORCE_HIDE_DRAFT_API */
private:
void deleteRules(void);
diff --git a/deps/icu-small/source/i18n/unicode/simpletz.h b/deps/icu-small/source/i18n/unicode/simpletz.h
index 8e5a877dabaddb..eb888cea675ea0 100644
--- a/deps/icu-small/source/i18n/unicode/simpletz.h
+++ b/deps/icu-small/source/i18n/unicode/simpletz.h
@@ -620,12 +620,16 @@ class U_I18N_API SimpleTimeZone: public BasicTimeZone {
virtual void getOffset(UDate date, UBool local, int32_t& rawOffset,
int32_t& dstOffset, UErrorCode& ec) const;
+#ifndef U_FORCE_HIDE_DRAFT_API
/**
* Get time zone offsets from local wall time.
- * @internal
+ * @draft ICU 69
*/
- virtual void getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
+ virtual void getOffsetFromLocal(
+ UDate date, UTimeZoneLocalOption nonExistingTimeOpt,
+ UTimeZoneLocalOption duplicatedTimeOpt,
int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) const;
+#endif /* U_FORCE_HIDE_DRAFT_API */
/**
* Returns the TimeZone's raw GMT offset (i.e., the number of milliseconds to add
diff --git a/deps/icu-small/source/i18n/unicode/tblcoll.h b/deps/icu-small/source/i18n/unicode/tblcoll.h
index a004dd6644c394..1709e836dd4e98 100644
--- a/deps/icu-small/source/i18n/unicode/tblcoll.h
+++ b/deps/icu-small/source/i18n/unicode/tblcoll.h
@@ -112,7 +112,7 @@ class UVector64;
* Note, RuleBasedCollator is not to be subclassed.
* @see Collator
*/
-class U_I18N_API RuleBasedCollator : public Collator {
+class U_I18N_API RuleBasedCollator U_FINAL : public Collator {
public:
/**
* RuleBasedCollator constructor. This takes the table rules and builds a
diff --git a/deps/icu-small/source/i18n/unicode/translit.h b/deps/icu-small/source/i18n/unicode/translit.h
index 2aa02c39f13446..0556b740fab792 100644
--- a/deps/icu-small/source/i18n/unicode/translit.h
+++ b/deps/icu-small/source/i18n/unicode/translit.h
@@ -375,7 +375,7 @@ class TransliteratorIDParser;
*
* It is also possible to match the beginning or the end of the text using a UnicodeSet
.
* This is done by including a virtual anchor character '$
' at the end of the
- * set pattern. Although this is usually the match chafacter for the end anchor, the set will
+ * set pattern. Although this is usually the match character for the end anchor, the set will
* match either the beginning or the end of the text, depending on its placement. For
* example:
*
@@ -683,8 +683,8 @@ class U_I18N_API Transliterator : public UObject {
* unambiguous transliterations. After the last call to this
* method, there may be untransliterated text that is waiting for
* more input to resolve an ambiguity. In order to perform these
- * pending transliterations, clients should call {@link
- * #finishTransliteration } after the last call to this
+ * pending transliterations, clients should call
+ * {@link #finishTransliteration } after the last call to this
* method has been made.
*
* @param text the buffer holding transliterated and untransliterated text
@@ -741,8 +741,7 @@ class U_I18N_API Transliterator : public UObject {
/**
* Transliterates the portion of the text buffer that can be
* transliterated unambiguosly. This is a convenience method; see
- * {@link
- * #transliterate(Replaceable&, UTransPosition&, const UnicodeString&, UErrorCode&) const }
+ * {@link #transliterate(Replaceable&, UTransPosition&, const UnicodeString&, UErrorCode&) const }
* for details.
* @param text the buffer holding transliterated and
* untransliterated text
@@ -761,8 +760,7 @@ class U_I18N_API Transliterator : public UObject {
* transliterate()
.
* @param text the buffer holding transliterated and
* untransliterated text.
- * @param index the array of indices previously passed to {@link
- * #transliterate }
+ * @param index the array of indices previously passed to {@link #transliterate }
* @stable ICU 2.0
*/
virtual void finishTransliteration(Replaceable& text,
@@ -883,7 +881,7 @@ class U_I18N_API Transliterator : public UObject {
* @param text the text to be transliterated
* @param index the position indices
* @param incremental if true, then assume more characters may be inserted
- * at index.limit, and postpone processing to accomodate future incoming
+ * at index.limit, and postpone processing to accommodate future incoming
* characters
* @stable ICU 2.4
*/
@@ -913,7 +911,7 @@ class U_I18N_API Transliterator : public UObject {
* @param text the text to be transliterated
* @param index the position indices
* @param incremental if true, then assume more characters may be inserted
- * at index.limit, and postpone processing to accomodate future incoming
+ * at index.limit, and postpone processing to accommodate future incoming
* characters
* @param rollback if true and if incremental is true, then perform special
* incremental processing, as described above, and undo partial
@@ -968,8 +966,8 @@ class U_I18N_API Transliterator : public UObject {
/**
* Returns a name for this transliterator that is appropriate for
- * display to the user in the default locale. See {@link
- * #getDisplayName } for details.
+ * display to the user in the default locale. See {@link #getDisplayName }
+ * for details.
* @param ID the string identifier for this transliterator
* @param result Output param to receive the display name
* @return A reference to 'result'.
@@ -1168,8 +1166,8 @@ class U_I18N_API Transliterator : public UObject {
* input text by this Transliterator. This incorporates this
* object's current filter; if the filter is changed, the return
* value of this function will change. The default implementation
- * returns an empty set. Some subclasses may override {@link
- * #handleGetSourceSet } to return a more precise result. The
+ * returns an empty set. Some subclasses may override
+ * {@link #handleGetSourceSet } to return a more precise result. The
* return result is approximate in any case and is intended for
* use by tests, tools, or utilities.
* @param result receives result set; previous contents lost
diff --git a/deps/icu-small/source/i18n/unicode/tznames.h b/deps/icu-small/source/i18n/unicode/tznames.h
index 2e20eff6089302..19858cd7e2cf6d 100644
--- a/deps/icu-small/source/i18n/unicode/tznames.h
+++ b/deps/icu-small/source/i18n/unicode/tznames.h
@@ -193,7 +193,7 @@ class U_I18N_API TimeZoneNames : public UObject {
/**
* Returns an enumeration of all available meta zone IDs used by the given time zone.
- * @param tzID The canoical tiem zone ID.
+ * @param tzID The canonical time zone ID.
* @param status Receives the status.
* @return an enumeration object, owned by the caller.
* @stable ICU 50
diff --git a/deps/icu-small/source/i18n/unicode/tzrule.h b/deps/icu-small/source/i18n/unicode/tzrule.h
index c6d6b9631fcd69..2a983ef58ac448 100644
--- a/deps/icu-small/source/i18n/unicode/tzrule.h
+++ b/deps/icu-small/source/i18n/unicode/tzrule.h
@@ -372,7 +372,7 @@ class U_I18N_API InitialTimeZoneRule : public TimeZoneRule {
/**
* AnnualTimeZoneRule
is a class used for representing a time zone
- * rule which takes effect annually. The calenday system used for the rule is
+ * rule which takes effect annually. The calendar system used for the rule is
* is based on Gregorian calendar
*
* @stable ICU 3.8
diff --git a/deps/icu-small/source/i18n/unicode/ucal.h b/deps/icu-small/source/i18n/unicode/ucal.h
index d491f5d610f95a..04c4a25de99951 100644
--- a/deps/icu-small/source/i18n/unicode/ucal.h
+++ b/deps/icu-small/source/i18n/unicode/ucal.h
@@ -1617,6 +1617,109 @@ U_CAPI int32_t U_EXPORT2
ucal_getTimeZoneIDForWindowsID(const UChar* winid, int32_t len, const char* region,
UChar* id, int32_t idCapacity, UErrorCode* status);
+#ifndef U_FORCE_HIDE_DRAFT_API
+/**
+ * Options used by ucal_getTimeZoneOffsetFromLocal and BasicTimeZone::getOffsetFromLocal()
+ * to specify how to interpret an input time when it does not exist, or when it is ambiguous,
+ * around a time zone transition.
+ * @draft ICU 69
+ */
+enum UTimeZoneLocalOption {
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * An input time is always interpreted as local time before
+ * a time zone transition.
+ * @draft ICU 69
+ */
+ UCAL_TZ_LOCAL_FORMER = 0x04,
+ /**
+ * An input time is always interpreted as local time after
+ * a time zone transition.
+ * @draft ICU 69
+ */
+ UCAL_TZ_LOCAL_LATTER = 0x0C,
+ /**
+ * An input time is interpreted as standard time when local
+ * time is switched to/from daylight saving time. When both
+ * sides of a time zone transition are standard time,
+ * or daylight saving time, the local time before the
+ * transition is used.
+ * @draft ICU 69
+ */
+ UCAL_TZ_LOCAL_STANDARD_FORMER = UCAL_TZ_LOCAL_FORMER | 0x01,
+ /**
+ * An input time is interpreted as standard time when local
+ * time is switched to/from daylight saving time. When both
+ * sides of a time zone transition are standard time,
+ * or daylight saving time, the local time after the
+ * transition is used.
+ * @draft ICU 69
+ */
+ UCAL_TZ_LOCAL_STANDARD_LATTER = UCAL_TZ_LOCAL_LATTER | 0x01,
+ /**
+ * An input time is interpreted as daylight saving time when
+ * local time is switched to/from standard time. When both
+ * sides of a time zone transition are standard time,
+ * or daylight saving time, the local time before the
+ * transition is used.
+ * @draft ICU 69
+ */
+ UCAL_TZ_LOCAL_DAYLIGHT_FORMER = UCAL_TZ_LOCAL_FORMER | 0x03,
+ /**
+ * An input time is interpreted as daylight saving time when
+ * local time is switched to/from standard time. When both
+ * sides of a time zone transition are standard time,
+ * or daylight saving time, the local time after the
+ * transition is used.
+ * @draft ICU 69
+ */
+ UCAL_TZ_LOCAL_DAYLIGHT_LATTER = UCAL_TZ_LOCAL_LATTER | 0x03,
+#else /* U_HIDE_DRAFT_API */
+ /**
+ * Dummy value to prevent empty enum if U_HIDE_DRAFT_API.
+ * This will go away when draft conditionals are removed.
+ * @internal
+ */
+ UCAL_TZ_LOCAL_NONE = 0,
+#endif /* U_HIDE_DRAFT_API */
+};
+typedef enum UTimeZoneLocalOption UTimeZoneLocalOption; /**< @draft ICU 69 */
+
+/**
+* Returns the time zone raw and GMT offset for the given moment
+* in time. Upon return, local-millis = GMT-millis + rawOffset +
+* dstOffset. All computations are performed in the proleptic
+* Gregorian calendar.
+*
+* @param cal The UCalendar which specify the local date and time value to query.
+* @param nonExistingTimeOpt The option to indicate how to interpret the date and
+* time in the calendar represent a local time that skipped at a positive time
+* zone transitions (e.g. when the daylight saving time starts or the time zone
+* offset is increased due to a time zone rule change).
+* @param duplicatedTimeOpt The option to indicate how to interpret the date and
+* time in the calendar represent a local time that repeating multiple times at a
+* negative time zone transition (e.g. when the daylight saving time ends or the
+* time zone offset is decreased due to a time zone rule change)
+* @param rawOffset output parameter to receive the raw offset, that
+* is, the offset not including DST adjustments.
+* If the status is set to one of the error code, the value set is unspecified.
+* @param dstOffset output parameter to receive the DST offset,
+* that is, the offset to be added to `rawOffset' to obtain the
+* total offset between local and GMT time. If DST is not in
+* effect, this value is zero; otherwise it is a positive value,
+* typically one hour.
+* If the status is set to one of the error code, the value set is unspecified.
+* @param status A pointer to a UErrorCode to receive any errors.
+* @draft ICU 69
+*/
+U_CAPI void U_EXPORT2
+ucal_getTimeZoneOffsetFromLocal(
+ const UCalendar* cal,
+ UTimeZoneLocalOption nonExistingTimeOpt,
+ UTimeZoneLocalOption duplicatedTimeOpt,
+ int32_t* rawOffset, int32_t* dstOffset, UErrorCode* status);
+#endif /* U_FORCE_HIDE_DRAFT_API */
+
#endif /* #if !UCONFIG_NO_FORMATTING */
#endif
diff --git a/deps/icu-small/source/i18n/unicode/ucol.h b/deps/icu-small/source/i18n/unicode/ucol.h
index 83774bc8ec6769..6122cc1d59cbf3 100644
--- a/deps/icu-small/source/i18n/unicode/ucol.h
+++ b/deps/icu-small/source/i18n/unicode/ucol.h
@@ -83,7 +83,7 @@ typedef enum {
} UCollationResult ;
-/** Enum containing attribute values for controling collation behavior.
+/** Enum containing attribute values for controlling collation behavior.
* Here are all the allowable values. Not every attribute can take every value. The only
* universal value is UCOL_DEFAULT, which resets the attribute value to the predefined
* value for that locale
diff --git a/deps/icu-small/source/i18n/unicode/udat.h b/deps/icu-small/source/i18n/unicode/udat.h
index ec25eba8085223..2963e5506c821d 100644
--- a/deps/icu-small/source/i18n/unicode/udat.h
+++ b/deps/icu-small/source/i18n/unicode/udat.h
@@ -976,37 +976,35 @@ udat_getBooleanAttribute(const UDateFormat* fmt, UDateFormatBooleanAttribute att
U_CAPI void U_EXPORT2
udat_setBooleanAttribute(UDateFormat *fmt, UDateFormatBooleanAttribute attr, UBool newValue, UErrorCode* status);
-#ifndef U_HIDE_DRAFT_API
/**
* Hour Cycle.
- * @draft ICU 67
+ * @stable ICU 67
*/
typedef enum UDateFormatHourCycle {
/**
* Hour in am/pm (0~11)
- * @draft ICU 67
+ * @stable ICU 67
*/
UDAT_HOUR_CYCLE_11,
/**
* Hour in am/pm (1~12)
- * @draft ICU 67
+ * @stable ICU 67
*/
UDAT_HOUR_CYCLE_12,
/**
* Hour in day (0~23)
- * @draft ICU 67
+ * @stable ICU 67
*/
UDAT_HOUR_CYCLE_23,
/**
* Hour in day (1~24)
- * @draft ICU 67
+ * @stable ICU 67
*/
UDAT_HOUR_CYCLE_24
} UDateFormatHourCycle;
-#endif /* U_HIDE_DRAFT_API */
#if U_SHOW_CPLUSPLUS_API
diff --git a/deps/icu-small/source/i18n/unicode/udateintervalformat.h b/deps/icu-small/source/i18n/unicode/udateintervalformat.h
index a840ed595b45cb..9ed53a87d68904 100644
--- a/deps/icu-small/source/i18n/unicode/udateintervalformat.h
+++ b/deps/icu-small/source/i18n/unicode/udateintervalformat.h
@@ -252,7 +252,6 @@ udtitvfmt_format(const UDateIntervalFormat* formatter,
UErrorCode* status);
-#ifndef U_HIDE_DRAFT_API
/**
* Formats a date/time range using the conventions established for the
* UDateIntervalFormat object.
@@ -267,7 +266,7 @@ udtitvfmt_format(const UDateIntervalFormat* formatter,
* formatting operation.
* @param status
* A pointer to a UErrorCode to receive any errors.
- * @draft ICU 67
+ * @stable ICU 67
*/
U_CAPI void U_EXPORT2
udtitvfmt_formatToResult(
@@ -291,7 +290,7 @@ udtitvfmt_formatToResult(
* formatting operation.
* @param status
* A pointer to a UErrorCode to receive any errors.
- * @draft ICU 67
+ * @stable ICU 67
*/
U_CAPI void U_EXPORT2
@@ -301,7 +300,6 @@ udtitvfmt_formatCalendarToResult(
UCalendar* toCalendar,
UFormattedDateInterval* result,
UErrorCode* status);
-#endif /* U_HIDE_DRAFT_API */
#ifndef U_HIDE_DRAFT_API
/**
diff --git a/deps/icu-small/source/i18n/unicode/udatpg.h b/deps/icu-small/source/i18n/unicode/udatpg.h
index 9fe267a3f488f4..893e1e6831ae34 100644
--- a/deps/icu-small/source/i18n/unicode/udatpg.h
+++ b/deps/icu-small/source/i18n/unicode/udatpg.h
@@ -657,7 +657,6 @@ udatpg_getPatternForSkeleton(const UDateTimePatternGenerator *dtpg,
#if !UCONFIG_NO_FORMATTING
-#ifndef U_HIDE_DRAFT_API
/**
* Return the default hour cycle for a locale. Uses the locale that the
* UDateTimePatternGenerator was initially created with.
@@ -669,11 +668,10 @@ udatpg_getPatternForSkeleton(const UDateTimePatternGenerator *dtpg,
* failure before the function call. Set to U_UNSUPPORTED_ERROR
* if used on an empty instance.
* @return the default hour cycle.
- * @draft ICU 67
+ * @stable ICU 67
*/
U_CAPI UDateFormatHourCycle U_EXPORT2
udatpg_getDefaultHourCycle(const UDateTimePatternGenerator *dtpg, UErrorCode* pErrorCode);
-#endif /* U_HIDE_DRAFT_API */
#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/deps/icu-small/source/i18n/unicode/uformattedvalue.h b/deps/icu-small/source/i18n/unicode/uformattedvalue.h
index 3017372d8b3c58..c964b3a74dd3a1 100644
--- a/deps/icu-small/source/i18n/unicode/uformattedvalue.h
+++ b/deps/icu-small/source/i18n/unicode/uformattedvalue.h
@@ -93,6 +93,15 @@ typedef enum UFieldCategory {
*/
UFIELD_CATEGORY_DATE_INTERVAL_SPAN = 0x1000 + UFIELD_CATEGORY_DATE_INTERVAL,
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Category for spans in a number range.
+ *
+ * @draft ICU 69
+ */
+ UFIELD_CATEGORY_NUMBER_RANGE_SPAN = 0x1000 + UFIELD_CATEGORY_NUMBER,
+#endif // U_HIDE_DRAFT_API
+
} UFieldCategory;
diff --git a/deps/icu-small/source/i18n/unicode/unum.h b/deps/icu-small/source/i18n/unicode/unum.h
index ce1685f129060a..76c7d151357875 100644
--- a/deps/icu-small/source/i18n/unicode/unum.h
+++ b/deps/icu-small/source/i18n/unicode/unum.h
@@ -302,7 +302,24 @@ typedef enum UNumberFormatRoundingMode {
* ROUND_UNNECESSARY reports an error if formatted result is not exact.
* @stable ICU 4.8
*/
- UNUM_ROUND_UNNECESSARY
+ UNUM_ROUND_UNNECESSARY,
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Rounds ties toward the odd number.
+ * @draft ICU 69
+ */
+ UNUM_ROUND_HALF_ODD,
+ /**
+ * Rounds ties toward +∞.
+ * @draft ICU 69
+ */
+ UNUM_ROUND_HALF_CEILING,
+ /**
+ * Rounds ties toward -∞.
+ * @draft ICU 69
+ */
+ UNUM_ROUND_HALF_FLOOR,
+#endif // U_HIDE_DRAFT_API
} UNumberFormatRoundingMode;
/** The possible number format pad positions.
@@ -692,6 +709,12 @@ unum_formatDecimal( const UNumberFormat* fmt,
/**
* Format a double currency amount using a UNumberFormat.
* The double will be formatted according to the UNumberFormat's locale.
+ *
+ * To format an exact decimal value with a currency, use
+ * `unum_setTextAttribute(UNUM_CURRENCY_CODE, ...)` followed by unum_formatDecimal.
+ * Your UNumberFormat must be created with the UNUM_CURRENCY style. Alternatively,
+ * consider using unumf_openForSkeletonAndLocale.
+ *
* @param fmt the formatter to use
* @param number the number to format
* @param currency the 3-letter null-terminated ISO 4217 currency code
diff --git a/deps/icu-small/source/i18n/unicode/unumberformatter.h b/deps/icu-small/source/i18n/unicode/unumberformatter.h
index 754987aea0923b..341d9e4ad9c628 100644
--- a/deps/icu-small/source/i18n/unicode/unumberformatter.h
+++ b/deps/icu-small/source/i18n/unicode/unumberformatter.h
@@ -78,6 +78,62 @@
*
*/
+#ifndef U_FORCE_HIDE_DRAFT_API
+/**
+ * An enum declaring how to resolve conflicts between maximum fraction digits and maximum
+ * significant digits.
+ *
+ * There are two modes, RELAXED and STRICT:
+ *
+ * - RELAXED: Relax one of the two constraints (fraction digits or significant digits) in order
+ * to round the number to a higher level of precision.
+ * - STRICT: Enforce both constraints, resulting in the number being rounded to a lower
+ * level of precision.
+ *
+ * The default settings for compact notation rounding are Max-Fraction = 0 (round to the nearest
+ * integer), Max-Significant = 2 (round to 2 significant digits), and priority RELAXED (choose
+ * the constraint that results in more digits being displayed).
+ *
+ * Conflicting *minimum* fraction and significant digits are always resolved in the direction that
+ * results in more trailing zeros.
+ *
+ * Example 1: Consider the number 3.141, with various different settings:
+ *
+ * - Max-Fraction = 1: "3.1"
+ * - Max-Significant = 3: "3.14"
+ *
+ * The rounding priority determines how to resolve the conflict when both Max-Fraction and
+ * Max-Significant are set. With RELAXED, the less-strict setting (the one that causes more digits
+ * to be displayed) will be used; Max-Significant wins. With STRICT, the more-strict setting (the
+ * one that causes fewer digits to be displayed) will be used; Max-Fraction wins.
+ *
+ * Example 2: Consider the number 8317, with various different settings:
+ *
+ * - Max-Fraction = 1: "8317"
+ * - Max-Significant = 3: "8320"
+ *
+ * Here, RELAXED favors Max-Fraction and STRICT favors Max-Significant. Note that this larger
+ * number caused the two modes to favor the opposite result.
+ *
+ * @draft ICU 69
+ */
+typedef enum UNumberRoundingPriority {
+ /**
+ * Favor greater precision by relaxing one of the rounding constraints.
+ *
+ * @draft ICU 69
+ */
+ UNUM_ROUNDING_PRIORITY_RELAXED,
+
+ /**
+ * Favor adherence to all rounding constraints by producing lower precision.
+ *
+ * @draft ICU 69
+ */
+ UNUM_ROUNDING_PRIORITY_STRICT,
+} UNumberRoundingPriority;
+#endif // U_FORCE_HIDE_DRAFT_API
+
/**
* An enum declaring how to render units, including currencies. Example outputs when formatting 123 USD and 123
* meters in en-CA:
@@ -108,7 +164,7 @@ typedef enum UNumberUnitWidth {
*
* @stable ICU 60
*/
- UNUM_UNIT_WIDTH_NARROW,
+ UNUM_UNIT_WIDTH_NARROW = 0,
/**
* Print an abbreviated version of the unit name. Similar to NARROW, but use a slightly wider abbreviation or
@@ -124,7 +180,7 @@ typedef enum UNumberUnitWidth {
*
* @stable ICU 60
*/
- UNUM_UNIT_WIDTH_SHORT,
+ UNUM_UNIT_WIDTH_SHORT = 1,
/**
* Print the full name of the unit, without any abbreviations.
@@ -135,7 +191,7 @@ typedef enum UNumberUnitWidth {
*
* @stable ICU 60
*/
- UNUM_UNIT_WIDTH_FULL_NAME,
+ UNUM_UNIT_WIDTH_FULL_NAME = 2,
/**
* Use the three-digit ISO XXX code in place of the symbol for displaying currencies. The behavior of this
@@ -146,7 +202,7 @@ typedef enum UNumberUnitWidth {
*
* @stable ICU 60
*/
- UNUM_UNIT_WIDTH_ISO_CODE,
+ UNUM_UNIT_WIDTH_ISO_CODE = 3,
#ifndef U_HIDE_DRAFT_API
/**
@@ -158,7 +214,7 @@ typedef enum UNumberUnitWidth {
*
* @draft ICU 68
*/
- UNUM_UNIT_WIDTH_FORMAL,
+ UNUM_UNIT_WIDTH_FORMAL = 4,
/**
* Use the alternate variant of the currency symbol; for example, "TL" for the Turkish
@@ -169,7 +225,7 @@ typedef enum UNumberUnitWidth {
*
* @draft ICU 68
*/
- UNUM_UNIT_WIDTH_VARIANT,
+ UNUM_UNIT_WIDTH_VARIANT = 5,
#endif // U_HIDE_DRAFT_API
/**
@@ -179,14 +235,16 @@ typedef enum UNumberUnitWidth {
*
* @stable ICU 60
*/
- UNUM_UNIT_WIDTH_HIDDEN,
+ UNUM_UNIT_WIDTH_HIDDEN = 6,
+ // Do not conditionalize the following with #ifndef U_HIDE_INTERNAL_API,
+ // needed for unconditionalized struct MacroProps
/**
* One more than the highest UNumberUnitWidth value.
*
* @internal ICU 60: The numeric value may change over time; see ICU ticket #12420.
*/
- UNUM_UNIT_WIDTH_COUNT
+ UNUM_UNIT_WIDTH_COUNT = 7
} UNumberUnitWidth;
/**
@@ -314,9 +372,12 @@ typedef enum UNumberSignDisplay {
* Show the minus sign on negative numbers, and do not show the sign on positive numbers. This is the default
* behavior.
*
+ * If using this option, a sign will be displayed on negative zero, including negative numbers
+ * that round to zero. To hide the sign on negative zero, use the NEGATIVE option.
+ *
* @stable ICU 60
*/
- UNUM_SIGN_AUTO,
+ UNUM_SIGN_AUTO,
/**
* Show the minus sign on negative numbers and the plus sign on positive numbers, including zero.
@@ -324,14 +385,14 @@ typedef enum UNumberSignDisplay {
*
* @stable ICU 60
*/
- UNUM_SIGN_ALWAYS,
+ UNUM_SIGN_ALWAYS,
/**
* Do not show the sign on positive or negative numbers.
*
* @stable ICU 60
*/
- UNUM_SIGN_NEVER,
+ UNUM_SIGN_NEVER,
/**
* Use the locale-dependent accounting format on negative numbers, and do not show the sign on positive numbers.
@@ -347,7 +408,7 @@ typedef enum UNumberSignDisplay {
*
* @stable ICU 60
*/
- UNUM_SIGN_ACCOUNTING,
+ UNUM_SIGN_ACCOUNTING,
/**
* Use the locale-dependent accounting format on negative numbers, and show the plus sign on
@@ -357,7 +418,7 @@ typedef enum UNumberSignDisplay {
*
* @stable ICU 60
*/
- UNUM_SIGN_ACCOUNTING_ALWAYS,
+ UNUM_SIGN_ACCOUNTING_ALWAYS,
/**
* Show the minus sign on negative numbers and the plus sign on positive numbers. Do not show a
@@ -365,7 +426,7 @@ typedef enum UNumberSignDisplay {
*
* @stable ICU 61
*/
- UNUM_SIGN_EXCEPT_ZERO,
+ UNUM_SIGN_EXCEPT_ZERO,
/**
* Use the locale-dependent accounting format on negative numbers, and show the plus sign on
@@ -374,14 +435,32 @@ typedef enum UNumberSignDisplay {
*
* @stable ICU 61
*/
- UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO,
+ UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO,
+
+#ifndef U_HIDE_DRAFT_API
+ /**
+ * Same as AUTO, but do not show the sign on negative zero.
+ *
+ * @draft ICU 69
+ */
+ UNUM_SIGN_NEGATIVE,
+
+ /**
+ * Same as ACCOUNTING, but do not show the sign on negative zero.
+ *
+ * @draft ICU 69
+ */
+ UNUM_SIGN_ACCOUNTING_NEGATIVE,
+#endif // U_HIDE_DRAFT_API
+ // Do not conditionalize the following with #ifndef U_HIDE_INTERNAL_API,
+ // needed for unconditionalized struct MacroProps
/**
* One more than the highest UNumberSignDisplay value.
*
* @internal ICU 60: The numeric value may change over time; see ICU ticket #12420.
*/
- UNUM_SIGN_COUNT
+ UNUM_SIGN_COUNT = 9,
} UNumberSignDisplay;
/**
@@ -411,6 +490,8 @@ typedef enum UNumberDecimalSeparatorDisplay {
*/
UNUM_DECIMAL_SEPARATOR_ALWAYS,
+ // Do not conditionalize the following with #ifndef U_HIDE_INTERNAL_API,
+ // needed for unconditionalized struct MacroProps
/**
* One more than the highest UNumberDecimalSeparatorDisplay value.
*
@@ -419,6 +500,32 @@ typedef enum UNumberDecimalSeparatorDisplay {
UNUM_DECIMAL_SEPARATOR_COUNT
} UNumberDecimalSeparatorDisplay;
+#ifndef U_FORCE_HIDE_DRAFT_API
+/**
+ * An enum declaring how to render trailing zeros.
+ *
+ * - UNUM_TRAILING_ZERO_AUTO: 0.90, 1.00, 1.10
+ * - UNUM_TRAILING_ZERO_HIDE_IF_WHOLE: 0.90, 1, 1.10
+ *
+ * @draft ICU 69
+ */
+typedef enum UNumberTrailingZeroDisplay {
+ /**
+ * Display trailing zeros according to the settings for minimum fraction and significant digits.
+ *
+ * @draft ICU 69
+ */
+ UNUM_TRAILING_ZERO_AUTO,
+
+ /**
+ * Same as AUTO, but hide trailing zeros after the decimal separator if they are all zero.
+ *
+ * @draft ICU 69
+ */
+ UNUM_TRAILING_ZERO_HIDE_IF_WHOLE,
+} UNumberTrailingZeroDisplay;
+#endif // U_FORCE_HIDE_DRAFT_API
+
struct UNumberFormatter;
/**
* C-compatible version of icu::number::LocalizedNumberFormatter.
@@ -449,6 +556,9 @@ typedef struct UFormattedNumber UFormattedNumber;
* For more details on skeleton strings, see the documentation in numberformatter.h. For more details on
* the usage of this API, see the documentation at the top of unumberformatter.h.
*
+ * For more information on number skeleton strings, see:
+ * https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html
+ *
* NOTE: This is a C-compatible API; C++ users should build against numberformatter.h instead.
*
* @param skeleton The skeleton string, like u"percent precision-integer"
@@ -466,6 +576,9 @@ unumf_openForSkeletonAndLocale(const UChar* skeleton, int32_t skeletonLen, const
* Like unumf_openForSkeletonAndLocale, but accepts a UParseError, which will be populated with the
* location of a skeleton syntax error if such a syntax error exists.
*
+ * For more information on number skeleton strings, see:
+ * https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html
+ *
* @param skeleton The skeleton string, like u"percent precision-integer"
* @param skeletonLen The number of UChars in the skeleton string, or -1 if it is NUL-terminated.
* @param locale The NUL-terminated locale ID.
diff --git a/deps/icu-small/source/i18n/unicode/unumberrangeformatter.h b/deps/icu-small/source/i18n/unicode/unumberrangeformatter.h
index 738bfb9f70acfd..e1c5a5760fd55a 100644
--- a/deps/icu-small/source/i18n/unicode/unumberrangeformatter.h
+++ b/deps/icu-small/source/i18n/unicode/unumberrangeformatter.h
@@ -354,7 +354,6 @@ unumrf_resultGetIdentityResult(
UErrorCode* ec);
-#ifndef U_HIDE_DRAFT_API
/**
* Extracts the first formatted number as a decimal number. This endpoint
* is useful for obtaining the exact number being printed after scaling
@@ -407,7 +406,6 @@ unumrf_resultGetSecondDecimalNumber(
char* dest,
int32_t destCapacity,
UErrorCode* ec);
-#endif // U_HIDE_DRAFT_API
/**
diff --git a/deps/icu-small/source/i18n/unicode/uspoof.h b/deps/icu-small/source/i18n/unicode/uspoof.h
index 7680c687ce4daf..bf675bef51b51c 100644
--- a/deps/icu-small/source/i18n/unicode/uspoof.h
+++ b/deps/icu-small/source/i18n/unicode/uspoof.h
@@ -502,7 +502,7 @@ typedef enum USpoofChecks {
USPOOF_ALL_CHECKS = 0xFFFF,
/**
- * Enable the return of auxillary (non-error) information in the
+ * Enable the return of auxiliary (non-error) information in the
* upper bits of the check results value.
*
* If this "check" is not enabled, the results of {@link uspoof_check} will be
diff --git a/deps/icu-small/source/i18n/unicode/vtzone.h b/deps/icu-small/source/i18n/unicode/vtzone.h
index 89a79c07b3215f..c0a2a14c897077 100644
--- a/deps/icu-small/source/i18n/unicode/vtzone.h
+++ b/deps/icu-small/source/i18n/unicode/vtzone.h
@@ -157,7 +157,7 @@ class U_I18N_API VTimeZone : public BasicTimeZone {
void write(UnicodeString& result, UErrorCode& status) const;
/**
- * Writes RFC2445 VTIMEZONE data for this time zone applicalbe
+ * Writes RFC2445 VTIMEZONE data for this time zone applicable
* for dates after the specified start time.
* @param start The start date.
* @param result Output param to filled in with the VTIMEZONE data.
@@ -167,7 +167,7 @@ class U_I18N_API VTimeZone : public BasicTimeZone {
void write(UDate start, UnicodeString& result, UErrorCode& status) const;
/**
- * Writes RFC2445 VTIMEZONE data applicalbe for the specified date.
+ * Writes RFC2445 VTIMEZONE data applicable for the specified date.
* Some common iCalendar implementations can only handle a single time
* zone property or a pair of standard and daylight time properties using
* BYDAY rule with day of week (such as BYDAY=1SUN). This method produce
@@ -264,6 +264,17 @@ class U_I18N_API VTimeZone : public BasicTimeZone {
virtual void getOffset(UDate date, UBool local, int32_t& rawOffset,
int32_t& dstOffset, UErrorCode& ec) const;
+#ifndef U_FORCE_HIDE_DRAFT_API
+ /**
+ * Get time zone offsets from local wall time.
+ * @draft ICU 69
+ */
+ virtual void getOffsetFromLocal(
+ UDate date, UTimeZoneLocalOption nonExistingTimeOpt,
+ UTimeZoneLocalOption duplicatedTimeOpt,
+ int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) const;
+#endif /* U_FORCE_HIDE_DRAFT_API */
+
/**
* Sets the TimeZone's raw GMT offset (i.e., the number of milliseconds to add
* to GMT to get local time, before taking daylight savings time into account).
diff --git a/deps/icu-small/source/i18n/units_complexconverter.cpp b/deps/icu-small/source/i18n/units_complexconverter.cpp
index 27f835e6dd4a29..db56f5ded9cf98 100644
--- a/deps/icu-small/source/i18n/units_complexconverter.cpp
+++ b/deps/icu-small/source/i18n/units_complexconverter.cpp
@@ -10,6 +10,7 @@
#include "cmemory.h"
#include "number_decimalquantity.h"
#include "number_roundingutils.h"
+#include "putilimp.h"
#include "uarrsort.h"
#include "uassert.h"
#include "unicode/fmtable.h"
@@ -21,44 +22,73 @@
U_NAMESPACE_BEGIN
namespace units {
+ComplexUnitsConverter::ComplexUnitsConverter(const MeasureUnitImpl &targetUnit,
+ const ConversionRates &ratesInfo, UErrorCode &status)
+ : units_(targetUnit.extractIndividualUnitsWithIndices(status)) {
+ if (U_FAILURE(status)) {
+ return;
+ }
+ U_ASSERT(units_.length() != 0);
+
+ // Just borrowing a pointer to the instance
+ MeasureUnitImpl *biggestUnit = &units_[0]->unitImpl;
+ for (int32_t i = 1; i < units_.length(); i++) {
+ if (UnitsConverter::compareTwoUnits(units_[i]->unitImpl, *biggestUnit, ratesInfo, status) > 0 &&
+ U_SUCCESS(status)) {
+ biggestUnit = &units_[i]->unitImpl;
+ }
+
+ if (U_FAILURE(status)) {
+ return;
+ }
+ }
+
+ this->init(*biggestUnit, ratesInfo, status);
+}
+
+ComplexUnitsConverter::ComplexUnitsConverter(StringPiece inputUnitIdentifier,
+ StringPiece outputUnitsIdentifier, UErrorCode &status) {
+ if (U_FAILURE(status)) {
+ return;
+ }
+ MeasureUnitImpl inputUnit = MeasureUnitImpl::forIdentifier(inputUnitIdentifier, status);
+ MeasureUnitImpl outputUnits = MeasureUnitImpl::forIdentifier(outputUnitsIdentifier, status);
+
+ this->units_ = outputUnits.extractIndividualUnitsWithIndices(status);
+ U_ASSERT(units_.length() != 0);
+
+ this->init(inputUnit, ConversionRates(status), status);
+}
ComplexUnitsConverter::ComplexUnitsConverter(const MeasureUnitImpl &inputUnit,
const MeasureUnitImpl &outputUnits,
const ConversionRates &ratesInfo, UErrorCode &status)
- : units_(outputUnits.extractIndividualUnits(status)) {
+ : units_(outputUnits.extractIndividualUnitsWithIndices(status)) {
if (U_FAILURE(status)) {
return;
}
U_ASSERT(units_.length() != 0);
- // Save the desired order of output units before we sort units_
- for (int32_t i = 0; i < units_.length(); i++) {
- outputUnits_.emplaceBackAndCheckErrorCode(status, units_[i]->copy(status).build(status));
- }
+ this->init(inputUnit, ratesInfo, status);
+}
- // NOTE:
- // This comparator is used to sort the units in a descending order. Therefore, we return -1 if
- // the left is bigger than right and so on.
+void ComplexUnitsConverter::init(const MeasureUnitImpl &inputUnit,
+ const ConversionRates &ratesInfo,
+ UErrorCode &status) {
+ // Sorts units in descending order. Therefore, we return -1 if
+ // the left is bigger than right and so on.
auto descendingCompareUnits = [](const void *context, const void *left, const void *right) {
UErrorCode status = U_ZERO_ERROR;
- const auto *leftPointer = static_cast(left);
- const auto *rightPointer = static_cast(right);
+ const auto *leftPointer = static_cast(left);
+ const auto *rightPointer = static_cast(right);
- UnitConverter fromLeftToRight(**leftPointer, //
- **rightPointer, //
- *static_cast(context), //
- status);
-
- double rightFromOneLeft = fromLeftToRight.convert(1.0);
- if (std::abs(rightFromOneLeft - 1.0) < 0.0000000001) { // Equals To
- return 0;
- } else if (rightFromOneLeft > 1.0) { // Greater Than
- return -1;
- }
-
- return 1; // Less Than
+ // Multiply by -1 to sort in descending order
+ return (-1) * UnitsConverter::compareTwoUnits((**leftPointer).unitImpl, //
+ (**rightPointer).unitImpl, //
+ *static_cast(context), //
+ status);
};
uprv_sortArray(units_.getAlias(), //
@@ -86,11 +116,11 @@ ComplexUnitsConverter::ComplexUnitsConverter(const MeasureUnitImpl &inputUnit,
// 3. then, the final result will be (6 feet and 6.74016 inches)
for (int i = 0, n = units_.length(); i < n; i++) {
if (i == 0) { // first element
- unitConverters_.emplaceBackAndCheckErrorCode(status, inputUnit, *units_[i], ratesInfo,
- status);
+ unitsConverters_.emplaceBackAndCheckErrorCode(status, inputUnit, units_[i]->unitImpl,
+ ratesInfo, status);
} else {
- unitConverters_.emplaceBackAndCheckErrorCode(status, *units_[i - 1], *units_[i], ratesInfo,
- status);
+ unitsConverters_.emplaceBackAndCheckErrorCode(status, units_[i - 1]->unitImpl,
+ units_[i]->unitImpl, ratesInfo, status);
}
if (U_FAILURE(status)) {
@@ -100,17 +130,17 @@ ComplexUnitsConverter::ComplexUnitsConverter(const MeasureUnitImpl &inputUnit,
}
UBool ComplexUnitsConverter::greaterThanOrEqual(double quantity, double limit) const {
- U_ASSERT(unitConverters_.length() > 0);
+ U_ASSERT(unitsConverters_.length() > 0);
// First converter converts to the biggest quantity.
- double newQuantity = unitConverters_[0]->convert(quantity);
+ double newQuantity = unitsConverters_[0]->convert(quantity);
return newQuantity >= limit;
}
MaybeStackVector ComplexUnitsConverter::convert(double quantity,
icu::number::impl::RoundingImpl *rounder,
UErrorCode &status) const {
- // TODO(hugovdm): return an error for "foot-and-foot"?
+ // TODO: return an error for "foot-and-foot"?
MaybeStackVector result;
int sign = 1;
if (quantity < 0) {
@@ -120,133 +150,118 @@ MaybeStackVector ComplexUnitsConverter::convert(double quantity,
// For N converters:
// - the first converter converts from the input unit to the largest unit,
- // - N-1 converters convert to bigger units for which we want integers,
+ // - the following N-2 converters convert to bigger units for which we want integers,
// - the Nth converter (index N-1) converts to the smallest unit, for which
// we keep a double.
- MaybeStackArray intValues(unitConverters_.length() - 1, status);
+ MaybeStackArray intValues(unitsConverters_.length() - 1, status);
if (U_FAILURE(status)) {
return result;
}
- uprv_memset(intValues.getAlias(), 0, (unitConverters_.length() - 1) * sizeof(int64_t));
+ uprv_memset(intValues.getAlias(), 0, (unitsConverters_.length() - 1) * sizeof(int64_t));
- for (int i = 0, n = unitConverters_.length(); i < n; ++i) {
- quantity = (*unitConverters_[i]).convert(quantity);
+ for (int i = 0, n = unitsConverters_.length(); i < n; ++i) {
+ quantity = (*unitsConverters_[i]).convert(quantity);
if (i < n - 1) {
- // The double type has 15 decimal digits of precision. For choosing
- // whether to use the current unit or the next smaller unit, we
- // therefore nudge up the number with which the thresholding
- // decision is made. However after the thresholding, we use the
- // original values to ensure unbiased accuracy (to the extent of
- // double's capabilities).
- int64_t roundedQuantity = floor(quantity * (1 + DBL_EPSILON));
- intValues[i] = roundedQuantity;
+ // If quantity is at the limits of double's precision from an
+ // integer value, we take that integer value.
+ int64_t flooredQuantity = floor(quantity * (1 + DBL_EPSILON));
+ if (uprv_isNaN(quantity)) {
+ // With clang on Linux: floor does not support NaN, resulting in
+ // a giant negative number. For now, we produce "0 feet, NaN
+ // inches". TODO(icu-units#131): revisit desired output.
+ flooredQuantity = 0;
+ }
+ intValues[i] = flooredQuantity;
// Keep the residual of the quantity.
// For example: `3.6 feet`, keep only `0.6 feet`
- //
- // When the calculation is near enough +/- DBL_EPSILON, we round to
- // zero. (We also ensure no negative values here.)
- if ((quantity - roundedQuantity) / quantity < DBL_EPSILON) {
+ double remainder = quantity - flooredQuantity;
+ if (remainder < 0) {
+ // Because we nudged flooredQuantity up by eps, remainder may be
+ // negative: we must treat such a remainder as zero.
quantity = 0;
} else {
- quantity -= roundedQuantity;
- }
- } else { // LAST ELEMENT
- if (rounder == nullptr) {
- // Nothing to do for the last element.
- break;
+ quantity = remainder;
}
+ }
+ }
- // Round the last value
- // TODO(ICU-21288): get smarter about precision for mixed units.
- number::impl::DecimalQuantity quant;
- quant.setToDouble(quantity);
- rounder->apply(quant, status);
- if (U_FAILURE(status)) {
- return result;
- }
- quantity = quant.toDouble();
- if (i == 0) {
- // Last element is also the first element, so we're done
- break;
- }
+ applyRounder(intValues, quantity, rounder, status);
- // Check if there's a carry, and bubble it back up the resulting intValues.
- int64_t carry = floor(unitConverters_[i]->convertInverse(quantity) * (1 + DBL_EPSILON));
- if (carry <= 0) {
- break;
- }
- quantity -= unitConverters_[i]->convert(carry);
- intValues[i - 1] += carry;
-
- // We don't use the first converter: that one is for the input unit
- for (int32_t j = i - 1; j > 0; j--) {
- carry = floor(unitConverters_[j]->convertInverse(intValues[j]) * (1 + DBL_EPSILON));
- if (carry <= 0) {
- break;
- }
- intValues[j] -= round(unitConverters_[j]->convert(carry));
- intValues[j - 1] += carry;
- }
- }
+ // Initialize empty result. We use a MaybeStackArray directly so we can
+ // assign pointers - for this privilege we have to take care of cleanup.
+ MaybeStackArray tmpResult(unitsConverters_.length(), status);
+ if (U_FAILURE(status)) {
+ return result;
}
- // Package values into Measure instances in result:
- for (int i = 0, n = unitConverters_.length(); i < n; ++i) {
+ // Package values into temporary Measure instances in tmpResult:
+ for (int i = 0, n = unitsConverters_.length(); i < n; ++i) {
if (i < n - 1) {
Formattable formattableQuantity(intValues[i] * sign);
// Measure takes ownership of the MeasureUnit*
- MeasureUnit *type = new MeasureUnit(units_[i]->copy(status).build(status));
- if (result.emplaceBackAndCheckErrorCode(status, formattableQuantity, type, status) ==
- nullptr) {
- // Ownership wasn't taken
- U_ASSERT(U_FAILURE(status));
- delete type;
- }
- if (U_FAILURE(status)) {
- return result;
- }
+ MeasureUnit *type = new MeasureUnit(units_[i]->unitImpl.copy(status).build(status));
+ tmpResult[units_[i]->index] = new Measure(formattableQuantity, type, status);
} else { // LAST ELEMENT
- // Add the last element, not an integer:
Formattable formattableQuantity(quantity * sign);
// Measure takes ownership of the MeasureUnit*
- MeasureUnit *type = new MeasureUnit(units_[i]->copy(status).build(status));
- if (result.emplaceBackAndCheckErrorCode(status, formattableQuantity, type, status) ==
- nullptr) {
- // Ownership wasn't taken
- U_ASSERT(U_FAILURE(status));
- delete type;
- }
- if (U_FAILURE(status)) {
- return result;
- }
- U_ASSERT(result.length() == i + 1);
- U_ASSERT(result[i] != nullptr);
+ MeasureUnit *type = new MeasureUnit(units_[i]->unitImpl.copy(status).build(status));
+ tmpResult[units_[i]->index] = new Measure(formattableQuantity, type, status);
}
}
- MaybeStackVector orderedResult;
- int32_t unitsCount = outputUnits_.length();
- U_ASSERT(unitsCount == units_.length());
- Measure **arr = result.getAlias();
- // O(N^2) is fine: mixed units' unitsCount is usually 2 or 3.
- for (int32_t i = 0; i < unitsCount; i++) {
- for (int32_t j = i; j < unitsCount; j++) {
- // Find the next expected unit, and swap it into place.
- U_ASSERT(result[j] != nullptr);
- if (result[j]->getUnit() == *outputUnits_[i]) {
- if (j != i) {
- Measure *tmp = arr[j];
- arr[j] = arr[i];
- arr[i] = tmp;
- }
- }
- }
+
+ // Transfer values into result and return:
+ for(int32_t i = 0, n = unitsConverters_.length(); i < n; ++i) {
+ U_ASSERT(tmpResult[i] != nullptr);
+ result.emplaceBackAndCheckErrorCode(status, *tmpResult[i]);
+ delete tmpResult[i];
}
return result;
}
+void ComplexUnitsConverter::applyRounder(MaybeStackArray &intValues, double &quantity,
+ icu::number::impl::RoundingImpl *rounder,
+ UErrorCode &status) const {
+ if (rounder == nullptr) {
+ // Nothing to do for the quantity.
+ return;
+ }
+
+ number::impl::DecimalQuantity decimalQuantity;
+ decimalQuantity.setToDouble(quantity);
+ rounder->apply(decimalQuantity, status);
+ if (U_FAILURE(status)) {
+ return;
+ }
+ quantity = decimalQuantity.toDouble();
+
+ int32_t lastIndex = unitsConverters_.length() - 1;
+ if (lastIndex == 0) {
+ // Only one element, no need to bubble up the carry
+ return;
+ }
+
+ // Check if there's a carry, and bubble it back up the resulting intValues.
+ int64_t carry = floor(unitsConverters_[lastIndex]->convertInverse(quantity) * (1 + DBL_EPSILON));
+ if (carry <= 0) {
+ return;
+ }
+ quantity -= unitsConverters_[lastIndex]->convert(carry);
+ intValues[lastIndex - 1] += carry;
+
+ // We don't use the first converter: that one is for the input unit
+ for (int32_t j = lastIndex - 1; j > 0; j--) {
+ carry = floor(unitsConverters_[j]->convertInverse(intValues[j]) * (1 + DBL_EPSILON));
+ if (carry <= 0) {
+ return;
+ }
+ intValues[j] -= round(unitsConverters_[j]->convert(carry));
+ intValues[j - 1] += carry;
+ }
+}
+
} // namespace units
U_NAMESPACE_END
diff --git a/deps/icu-small/source/i18n/units_complexconverter.h b/deps/icu-small/source/i18n/units_complexconverter.h
index 83c5b94342f373..5c669b45ddd7df 100644
--- a/deps/icu-small/source/i18n/units_complexconverter.h
+++ b/deps/icu-small/source/i18n/units_complexconverter.h
@@ -24,9 +24,9 @@ U_NAMESPACE_BEGIN
// Note: These need to be outside of the units namespace, or Clang will generate
// a compile error.
#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN
-template class U_I18N_API MaybeStackArray;
-template class U_I18N_API MemoryPool;
-template class U_I18N_API MaybeStackVector;
+template class U_I18N_API MaybeStackArray;
+template class U_I18N_API MemoryPool;
+template class U_I18N_API MaybeStackVector;
template class U_I18N_API MaybeStackArray;
template class U_I18N_API MemoryPool;
template class U_I18N_API MaybeStackVector;
@@ -42,12 +42,42 @@ namespace units {
* For example, from `meter` to `foot+inch`.
*
* DESIGN:
- * This class uses `UnitConverter` in order to perform the single converter (i.e. converters from a
+ * This class uses `UnitsConverter` in order to perform the single converter (i.e. converters from a
* single unit to another single unit). Therefore, `ComplexUnitsConverter` class contains multiple
- * instances of the `UnitConverter` to perform the conversion.
+ * instances of the `UnitsConverter` to perform the conversion.
*/
class U_I18N_API ComplexUnitsConverter : public UMemory {
public:
+ /**
+ * Constructs `ComplexUnitsConverter` for an `targetUnit` that could be Single, Compound or Mixed.
+ * In case of:
+ * 1- Single and Compound units,
+ * the conversion will not perform anything, the input will be equal to the output.
+ * 2- Mixed Unit
+ * the conversion will consider the input is the biggest unit. And will convert it to be spread
+ * through the target units. For example: if target unit is "inch-and-foot", and the input is 2.5.
+ * The converter will consider the input value in "foot", because foot is the biggest unit.
+ * Then, it will convert 2.5 feet to "inch-and-foot".
+ *
+ * @param targetUnit could be any units type (single, compound or mixed).
+ * @param ratesInfo
+ * @param status
+ */
+ ComplexUnitsConverter(const MeasureUnitImpl &targetUnit, const ConversionRates &ratesInfo,
+ UErrorCode &status);
+ /**
+ * Constructor of `ComplexUnitsConverter`.
+ * NOTE:
+ * - inputUnit and outputUnits must be under the same category
+ * - e.g. meter to feet and inches --> all of them are length units.
+ *
+ * @param inputUnit represents the source unit. (should be single or compound unit).
+ * @param outputUnits represents the output unit. could be any type. (single, compound or mixed).
+ * @param status
+ */
+ ComplexUnitsConverter(StringPiece inputUnitIdentifier, StringPiece outputUnitsIdentifier,
+ UErrorCode &status);
+
/**
* Constructor of `ComplexUnitsConverter`.
* NOTE:
@@ -56,6 +86,7 @@ class U_I18N_API ComplexUnitsConverter : public UMemory {
*
* @param inputUnit represents the source unit. (should be single or compound unit).
* @param outputUnits represents the output unit. could be any type. (single, compound or mixed).
+ * @param ratesInfo a ConversionRates instance containing the unit conversion rates.
* @param status
*/
ComplexUnitsConverter(const MeasureUnitImpl &inputUnit, const MeasureUnitImpl &outputUnits,
@@ -78,11 +109,21 @@ class U_I18N_API ComplexUnitsConverter : public UMemory {
convert(double quantity, icu::number::impl::RoundingImpl *rounder, UErrorCode &status) const;
private:
- MaybeStackVector unitConverters_;
- // Individual units of mixed units, sorted big to small
- MaybeStackVector units_;
- // Individual units of mixed units, sorted in desired output order
- MaybeStackVector outputUnits_;
+ MaybeStackVector unitsConverters_;
+
+ // Individual units of mixed units, sorted big to small, with indices
+ // indicating the requested output mixed unit order.
+ MaybeStackVector units_;
+
+ // Sorts units_, which must be populated before calling this, and populates
+ // unitsConverters_.
+ void init(const MeasureUnitImpl &inputUnit, const ConversionRates &ratesInfo, UErrorCode &status);
+
+ // Applies the rounder to the quantity (last element) and bubble up any carried value to all the
+ // intValues.
+ // TODO(ICU-21288): get smarter about precision for mixed units.
+ void applyRounder(MaybeStackArray &intValues, double &quantity,
+ icu::number::impl::RoundingImpl *rounder, UErrorCode &status) const;
};
} // namespace units
diff --git a/deps/icu-small/source/i18n/units_converter.cpp b/deps/icu-small/source/i18n/units_converter.cpp
index a777d026b98756..2854ad30b3288f 100644
--- a/deps/icu-small/source/i18n/units_converter.cpp
+++ b/deps/icu-small/source/i18n/units_converter.cpp
@@ -26,7 +26,7 @@ void U_I18N_API Factor::multiplyBy(const Factor &rhs) {
factorNum *= rhs.factorNum;
factorDen *= rhs.factorDen;
for (int i = 0; i < CONSTANTS_COUNT; i++) {
- constants[i] += rhs.constants[i];
+ constantExponents[i] += rhs.constantExponents[i];
}
// NOTE
@@ -39,7 +39,7 @@ void U_I18N_API Factor::divideBy(const Factor &rhs) {
factorNum *= rhs.factorDen;
factorDen *= rhs.factorNum;
for (int i = 0; i < CONSTANTS_COUNT; i++) {
- constants[i] -= rhs.constants[i];
+ constantExponents[i] -= rhs.constantExponents[i];
}
// NOTE
@@ -51,7 +51,7 @@ void U_I18N_API Factor::divideBy(const Factor &rhs) {
void U_I18N_API Factor::power(int32_t power) {
// multiply all the constant by the power.
for (int i = 0; i < CONSTANTS_COUNT; i++) {
- constants[i] *= power;
+ constantExponents[i] *= power;
}
bool shouldFlip = power < 0; // This means that after applying the absolute power, we should flip
@@ -66,35 +66,29 @@ void U_I18N_API Factor::power(int32_t power) {
}
}
-void U_I18N_API Factor::flip() {
- std::swap(factorNum, factorDen);
-
- for (int i = 0; i < CONSTANTS_COUNT; i++) {
- constants[i] *= -1;
- }
-}
-
-void U_I18N_API Factor::applySiPrefix(UMeasureSIPrefix siPrefix) {
- if (siPrefix == UMeasureSIPrefix::UMEASURE_SI_PREFIX_ONE) return; // No need to do anything
-
- double siApplied = std::pow(10.0, std::abs(siPrefix));
-
- if (siPrefix < 0) {
- factorDen *= siApplied;
+void U_I18N_API Factor::applyPrefix(UMeasurePrefix unitPrefix) {
+ if (unitPrefix == UMeasurePrefix::UMEASURE_PREFIX_ONE) {
+ // No need to do anything
return;
}
- factorNum *= siApplied;
+ int32_t prefixPower = umeas_getPrefixPower(unitPrefix);
+ double prefixFactor = std::pow((double)umeas_getPrefixBase(unitPrefix), (double)std::abs(prefixPower));
+ if (prefixPower >= 0) {
+ factorNum *= prefixFactor;
+ } else {
+ factorDen *= prefixFactor;
+ }
}
void U_I18N_API Factor::substituteConstants() {
for (int i = 0; i < CONSTANTS_COUNT; i++) {
- if (this->constants[i] == 0) {
+ if (this->constantExponents[i] == 0) {
continue;
}
- auto absPower = std::abs(this->constants[i]);
- Signum powerSig = this->constants[i] < 0 ? Signum::NEGATIVE : Signum::POSITIVE;
+ auto absPower = std::abs(this->constantExponents[i]);
+ Signum powerSig = this->constantExponents[i] < 0 ? Signum::NEGATIVE : Signum::POSITIVE;
double absConstantValue = std::pow(constantsValues[i], absPower);
if (powerSig == Signum::NEGATIVE) {
@@ -103,7 +97,7 @@ void U_I18N_API Factor::substituteConstants() {
this->factorNum *= absConstantValue;
}
- this->constants[i] = 0;
+ this->constantExponents[i] = 0;
}
}
@@ -221,18 +215,21 @@ Factor loadSingleFactor(StringPiece source, const ConversionRates &ratesInfo, UE
}
// Load Factor of a compound source unit.
+// In ICU4J, this is a pair of ConversionRates.getFactorToBase() functions.
Factor loadCompoundFactor(const MeasureUnitImpl &source, const ConversionRates &ratesInfo,
UErrorCode &status) {
Factor result;
- for (int32_t i = 0, n = source.units.length(); i < n; i++) {
- SingleUnitImpl singleUnit = *source.units[i];
+ for (int32_t i = 0, n = source.singleUnits.length(); i < n; i++) {
+ SingleUnitImpl singleUnit = *source.singleUnits[i];
Factor singleFactor = loadSingleFactor(singleUnit.getSimpleUnitID(), ratesInfo, status);
if (U_FAILURE(status)) return result;
- // Apply SiPrefix before the power, because the power may be will flip the factor.
- singleFactor.applySiPrefix(singleUnit.siPrefix);
+ // Prefix before power, because:
+ // - square-kilometer to square-meter: (1000)^2
+ // - square-kilometer to square-foot (approximate): (3.28*1000)^2
+ singleFactor.applyPrefix(singleUnit.unitPrefix);
// Apply the power of the `dimensionality`
singleFactor.power(singleUnit.dimensionality);
@@ -249,6 +246,8 @@ Factor loadCompoundFactor(const MeasureUnitImpl &source, const ConversionRates &
*
* NOTE:
* Empty unit means simple unit.
+ *
+ * In ICU4J, this is ConversionRates.checkSimpleUnit().
*/
UBool checkSimpleUnit(const MeasureUnitImpl &unit, UErrorCode &status) {
if (U_FAILURE(status)) return false;
@@ -256,14 +255,14 @@ UBool checkSimpleUnit(const MeasureUnitImpl &unit, UErrorCode &status) {
if (unit.complexity != UMEASURE_UNIT_SINGLE) {
return false;
}
- if (unit.units.length() == 0) {
+ if (unit.singleUnits.length() == 0) {
// Empty units means simple unit.
return true;
}
- auto singleUnit = *(unit.units[0]);
+ auto singleUnit = *(unit.singleUnits[0]);
- if (singleUnit.dimensionality != 1 || singleUnit.siPrefix != UMEASURE_SI_PREFIX_ONE) {
+ if (singleUnit.dimensionality != 1 || singleUnit.unitPrefix != UMEASURE_PREFIX_ONE) {
return false;
}
@@ -273,6 +272,7 @@ UBool checkSimpleUnit(const MeasureUnitImpl &unit, UErrorCode &status) {
/**
* Extract conversion rate from `source` to `target`
*/
+// In ICU4J, this function is partially inlined in the UnitsConverter constructor.
void loadConversionRate(ConversionRate &conversionRate, const MeasureUnitImpl &source,
const MeasureUnitImpl &target, Convertibility unitsState,
const ConversionRates &ratesInfo, UErrorCode &status) {
@@ -300,6 +300,7 @@ void loadConversionRate(ConversionRate &conversionRate, const MeasureUnitImpl &s
conversionRate.factorNum = finalFactor.factorNum;
conversionRate.factorDen = finalFactor.factorDen;
+ // This code corresponds to ICU4J's ConversionRates.getOffset().
// In case of simple units (such as: celsius or fahrenheit), offsets are considered.
if (checkSimpleUnit(source, status) && checkSimpleUnit(target, status)) {
conversionRate.sourceOffset =
@@ -307,6 +308,8 @@ void loadConversionRate(ConversionRate &conversionRate, const MeasureUnitImpl &s
conversionRate.targetOffset =
targetToBase.offset * targetToBase.factorDen / targetToBase.factorNum;
}
+ // TODO(icu-units#127): should we consider failure if there's an offset for
+ // a not-simple-unit? What about kilokelvin / kilocelsius?
conversionRate.reciprocal = unitsState == Convertibility::RECIPROCAL;
}
@@ -336,8 +339,8 @@ void mergeSingleUnitWithDimension(MaybeStackVector &unitI
void mergeUnitsAndDimensions(MaybeStackVector &unitIndicesWithDimension,
const MeasureUnitImpl &shouldBeMerged, int32_t multiplier) {
- for (int32_t unit_i = 0; unit_i < shouldBeMerged.units.length(); unit_i++) {
- auto singleUnit = *shouldBeMerged.units[unit_i];
+ for (int32_t unit_i = 0; unit_i < shouldBeMerged.singleUnits.length(); unit_i++) {
+ auto singleUnit = *shouldBeMerged.singleUnits[unit_i];
mergeSingleUnitWithDimension(unitIndicesWithDimension, singleUnit, multiplier);
}
}
@@ -361,28 +364,32 @@ UBool checkAllDimensionsAreZeros(const MaybeStackVector &
void U_I18N_API addSingleFactorConstant(StringPiece baseStr, int32_t power, Signum signum,
Factor &factor, UErrorCode &status) {
if (baseStr == "ft_to_m") {
- factor.constants[CONSTANT_FT2M] += power * signum;
+ factor.constantExponents[CONSTANT_FT2M] += power * signum;
} else if (baseStr == "ft2_to_m2") {
- factor.constants[CONSTANT_FT2M] += 2 * power * signum;
+ factor.constantExponents[CONSTANT_FT2M] += 2 * power * signum;
} else if (baseStr == "ft3_to_m3") {
- factor.constants[CONSTANT_FT2M] += 3 * power * signum;
+ factor.constantExponents[CONSTANT_FT2M] += 3 * power * signum;
} else if (baseStr == "in3_to_m3") {
- factor.constants[CONSTANT_FT2M] += 3 * power * signum;
+ factor.constantExponents[CONSTANT_FT2M] += 3 * power * signum;
factor.factorDen *= 12 * 12 * 12;
} else if (baseStr == "gal_to_m3") {
factor.factorNum *= 231;
- factor.constants[CONSTANT_FT2M] += 3 * power * signum;
+ factor.constantExponents[CONSTANT_FT2M] += 3 * power * signum;
factor.factorDen *= 12 * 12 * 12;
} else if (baseStr == "gal_imp_to_m3") {
- factor.constants[CONSTANT_GAL_IMP2M3] += power * signum;
+ factor.constantExponents[CONSTANT_GAL_IMP2M3] += power * signum;
} else if (baseStr == "G") {
- factor.constants[CONSTANT_G] += power * signum;
+ factor.constantExponents[CONSTANT_G] += power * signum;
} else if (baseStr == "gravity") {
- factor.constants[CONSTANT_GRAVITY] += power * signum;
+ factor.constantExponents[CONSTANT_GRAVITY] += power * signum;
} else if (baseStr == "lb_to_kg") {
- factor.constants[CONSTANT_LB2KG] += power * signum;
+ factor.constantExponents[CONSTANT_LB2KG] += power * signum;
+ } else if (baseStr == "glucose_molar_mass") {
+ factor.constantExponents[CONSTANT_GLUCOSE_MOLAR_MASS] += power * signum;
+ } else if (baseStr == "item_per_mole") {
+ factor.constantExponents[CONSTANT_ITEM_PER_MOLE] += power * signum;
} else if (baseStr == "PI") {
- factor.constants[CONSTANT_PI] += power * signum;
+ factor.constantExponents[CONSTANT_PI] += power * signum;
} else {
if (signum == Signum::NEGATIVE) {
factor.factorDen *= std::pow(strToDouble(baseStr, status), power);
@@ -403,7 +410,7 @@ MeasureUnitImpl U_I18N_API extractCompoundBaseUnit(const MeasureUnitImpl &source
MeasureUnitImpl result;
if (U_FAILURE(status)) return result;
- const auto &singleUnits = source.units;
+ const auto &singleUnits = source.singleUnits;
for (int i = 0, count = singleUnits.length(); i < count; ++i) {
const auto &singleUnit = *singleUnits[i];
// Extract `ConversionRateInfo` using the absolute unit. For example: in case of `square-meter`,
@@ -421,11 +428,11 @@ MeasureUnitImpl U_I18N_API extractCompoundBaseUnit(const MeasureUnitImpl &source
// Multiply the power of the singleUnit by the power of the baseUnit. For example, square-hectare
// must be pow4-meter. (NOTE: hectare --> square-meter)
auto baseUnits =
- MeasureUnitImpl::forIdentifier(rateInfo->baseUnit.toStringPiece(), status).units;
+ MeasureUnitImpl::forIdentifier(rateInfo->baseUnit.toStringPiece(), status).singleUnits;
for (int32_t i = 0, baseUnitsCount = baseUnits.length(); i < baseUnitsCount; i++) {
baseUnits[i]->dimensionality *= singleUnit.dimensionality;
// TODO: Deal with SI-prefix
- result.append(*baseUnits[i], status);
+ result.appendSingleUnit(*baseUnits[i], status);
if (U_FAILURE(status)) {
return result;
@@ -482,16 +489,37 @@ Convertibility U_I18N_API extractConvertibility(const MeasureUnitImpl &source,
return UNCONVERTIBLE;
}
-UnitConverter::UnitConverter(const MeasureUnitImpl &source, const MeasureUnitImpl &target,
- const ConversionRates &ratesInfo, UErrorCode &status)
+UnitsConverter::UnitsConverter(const MeasureUnitImpl &source, const MeasureUnitImpl &target,
+ const ConversionRates &ratesInfo, UErrorCode &status)
: conversionRate_(source.copy(status), target.copy(status)) {
- if (source.complexity == UMeasureUnitComplexity::UMEASURE_UNIT_MIXED ||
- target.complexity == UMeasureUnitComplexity::UMEASURE_UNIT_MIXED) {
+ this->init(ratesInfo, status);
+}
+
+UnitsConverter::UnitsConverter(StringPiece sourceIdentifier, StringPiece targetIdentifier,
+ UErrorCode &status)
+ : conversionRate_(MeasureUnitImpl::forIdentifier(sourceIdentifier, status),
+ MeasureUnitImpl::forIdentifier(targetIdentifier, status)) {
+ if (U_FAILURE(status)) {
+ return;
+ }
+
+ ConversionRates ratesInfo(status);
+ this->init(ratesInfo, status);
+}
+
+void UnitsConverter::init(const ConversionRates &ratesInfo, UErrorCode &status) {
+ if (U_FAILURE(status)) {
+ return;
+ }
+
+ if (this->conversionRate_.source.complexity == UMeasureUnitComplexity::UMEASURE_UNIT_MIXED ||
+ this->conversionRate_.target.complexity == UMeasureUnitComplexity::UMEASURE_UNIT_MIXED) {
status = U_INTERNAL_PROGRAM_ERROR;
return;
}
- Convertibility unitsState = extractConvertibility(source, target, ratesInfo, status);
+ Convertibility unitsState = extractConvertibility(this->conversionRate_.source,
+ this->conversionRate_.target, ratesInfo, status);
if (U_FAILURE(status)) return;
if (unitsState == Convertibility::UNCONVERTIBLE) {
status = U_INTERNAL_PROGRAM_ERROR;
@@ -500,9 +528,57 @@ UnitConverter::UnitConverter(const MeasureUnitImpl &source, const MeasureUnitImp
loadConversionRate(conversionRate_, conversionRate_.source, conversionRate_.target, unitsState,
ratesInfo, status);
+
}
-double UnitConverter::convert(double inputValue) const {
+int32_t UnitsConverter::compareTwoUnits(const MeasureUnitImpl &firstUnit,
+ const MeasureUnitImpl &secondUnit,
+ const ConversionRates &ratesInfo, UErrorCode &status) {
+ if (U_FAILURE(status)) {
+ return 0;
+ }
+
+ if (firstUnit.complexity == UMeasureUnitComplexity::UMEASURE_UNIT_MIXED ||
+ secondUnit.complexity == UMeasureUnitComplexity::UMEASURE_UNIT_MIXED) {
+ status = U_INTERNAL_PROGRAM_ERROR;
+ return 0;
+ }
+
+ Convertibility unitsState = extractConvertibility(firstUnit, secondUnit, ratesInfo, status);
+ if (U_FAILURE(status)) {
+ return 0;
+ }
+
+ if (unitsState == Convertibility::UNCONVERTIBLE || unitsState == Convertibility::RECIPROCAL) {
+ status = U_INTERNAL_PROGRAM_ERROR;
+ return 0;
+ }
+
+ // Represents the conversion factor from the firstUnit to the base
+ // unit that specified in the conversion data which is considered as
+ // the root of the firstUnit and the secondUnit.
+ Factor firstUnitToBase = loadCompoundFactor(firstUnit, ratesInfo, status);
+ Factor secondUnitToBase = loadCompoundFactor(secondUnit, ratesInfo, status);
+
+ firstUnitToBase.substituteConstants();
+ secondUnitToBase.substituteConstants();
+
+ double firstUnitToBaseConversionRate = firstUnitToBase.factorNum / firstUnitToBase.factorDen;
+ double secondUnitToBaseConversionRate = secondUnitToBase.factorNum / secondUnitToBase.factorDen;
+
+ double diff = firstUnitToBaseConversionRate - secondUnitToBaseConversionRate;
+ if (diff > 0) {
+ return 1;
+ }
+
+ if (diff < 0) {
+ return -1;
+ }
+
+ return 0;
+}
+
+double UnitsConverter::convert(double inputValue) const {
double result =
inputValue + conversionRate_.sourceOffset; // Reset the input to the target zero index.
// Convert the quantity to from the source scale to the target scale.
@@ -523,7 +599,7 @@ double UnitConverter::convert(double inputValue) const {
return result;
}
-double UnitConverter::convertInverse(double inputValue) const {
+double UnitsConverter::convertInverse(double inputValue) const {
double result = inputValue;
if (conversionRate_.reciprocal) {
if (result == 0) {
@@ -540,6 +616,17 @@ double UnitConverter::convertInverse(double inputValue) const {
return result;
}
+ConversionInfo UnitsConverter::getConversionInfo() const {
+ ConversionInfo result;
+ result.conversionRate = conversionRate_.factorNum / conversionRate_.factorDen;
+ result.offset =
+ (conversionRate_.sourceOffset * (conversionRate_.factorNum / conversionRate_.factorDen)) -
+ conversionRate_.targetOffset;
+ result.reciprocal = conversionRate_.reciprocal;
+
+ return result;
+}
+
} // namespace units
U_NAMESPACE_END
diff --git a/deps/icu-small/source/i18n/units_converter.h b/deps/icu-small/source/i18n/units_converter.h
index 7650131b1f6975..1b83155a17b571 100644
--- a/deps/icu-small/source/i18n/units_converter.h
+++ b/deps/icu-small/source/i18n/units_converter.h
@@ -20,13 +20,16 @@ namespace units {
/* Internal Structure */
+// Constants corresponding to unitConstants in CLDR's units.xml.
enum Constants {
- CONSTANT_FT2M, // ft2m stands for foot to meter.
- CONSTANT_PI, // PI
- CONSTANT_GRAVITY, // Gravity
- CONSTANT_G,
+ CONSTANT_FT2M, // ft_to_m
+ CONSTANT_PI, // PI
+ CONSTANT_GRAVITY, // Gravity of earth (9.80665 m/s^2), "g".
+ CONSTANT_G, // Newtonian constant of gravitation, "G".
CONSTANT_GAL_IMP2M3, // Gallon imp to m3
CONSTANT_LB2KG, // Pound to Kilogram
+ CONSTANT_GLUCOSE_MOLAR_MASS,
+ CONSTANT_ITEM_PER_MOLE,
// Must be the last element.
CONSTANTS_COUNT
@@ -36,6 +39,7 @@ enum Constants {
// resources file. A unit test checks that all constants in the resource
// file are at least recognised by the code. Derived constants' values or
// hard-coded derivations are not checked.
+// In ICU4J, these constants live in UnitConverter.Factor.getConversionRate().
static const double constantsValues[CONSTANTS_COUNT] = {
0.3048, // CONSTANT_FT2M
411557987.0 / 131002976.0, // CONSTANT_PI
@@ -43,6 +47,8 @@ static const double constantsValues[CONSTANTS_COUNT] = {
6.67408E-11, // CONSTANT_G
0.00454609, // CONSTANT_GAL_IMP2M3
0.45359237, // CONSTANT_LB2KG
+ 180.1557, // CONSTANT_GLUCOSE_MOLAR_MASS
+ 6.02214076E+23, // CONSTANT_ITEM_PER_MOLE
};
typedef enum Signum {
@@ -56,7 +62,9 @@ struct U_I18N_API Factor {
double factorDen = 1;
double offset = 0;
bool reciprocal = false;
- int32_t constants[CONSTANTS_COUNT] = {};
+
+ // Exponents for the symbolic constants
+ int32_t constantExponents[CONSTANTS_COUNT] = {};
void multiplyBy(const Factor &rhs);
void divideBy(const Factor &rhs);
@@ -64,14 +72,22 @@ struct U_I18N_API Factor {
// Apply the power to the factor.
void power(int32_t power);
- // Flip the `Factor`, for example, factor= 2/3, flippedFactor = 3/2
- void flip();
+ // Apply SI or binary prefix to the Factor.
+ void applyPrefix(UMeasurePrefix unitPrefix);
- // Apply SI prefix to the `Factor`
- void applySiPrefix(UMeasureSIPrefix siPrefix);
+ // Does an in-place substition of the "symbolic constants" based on
+ // constantExponents (resetting the exponents).
+ //
+ // In ICU4J, see UnitConverter.Factor.getConversionRate().
void substituteConstants();
};
+struct U_I18N_API ConversionInfo {
+ double conversionRate;
+ double offset;
+ bool reciprocal;
+};
+
/*
* Adds a single factor element to the `Factor`. e.g "ft3m", "2.333" or "cup2m3". But not "cup2m3^3".
*/
@@ -127,8 +143,22 @@ Convertibility U_I18N_API extractConvertibility(const MeasureUnitImpl &source,
* Only works with SINGLE and COMPOUND units. If one of the units is a
* MIXED unit, an error will occur. For more information, see UMeasureUnitComplexity.
*/
-class U_I18N_API UnitConverter : public UMemory {
+class U_I18N_API UnitsConverter : public UMemory {
public:
+ /**
+ * Constructor of `UnitConverter`.
+ * NOTE:
+ * - source and target must be under the same category
+ * - e.g. meter to mile --> both of them are length units.
+ * NOTE:
+ * This constructor creates an instance of `ConversionRates` internally.
+ *
+ * @param sourceIdentifier represents the source unit identifier.
+ * @param targetIdentifier represents the target unit identifier.
+ * @param status
+ */
+ UnitsConverter(StringPiece sourceIdentifier, StringPiece targetIdentifier, UErrorCode &status);
+
/**
* Constructor of `UnitConverter`.
* NOTE:
@@ -140,9 +170,19 @@ class U_I18N_API UnitConverter : public UMemory {
* @param ratesInfo Contains all the needed conversion rates.
* @param status
*/
- UnitConverter(const MeasureUnitImpl &source, const MeasureUnitImpl &target,
+ UnitsConverter(const MeasureUnitImpl &source, const MeasureUnitImpl &target,
const ConversionRates &ratesInfo, UErrorCode &status);
+ /**
+ * Compares two single units and returns 1 if the first one is greater, -1 if the second
+ * one is greater and 0 if they are equal.
+ *
+ * NOTE:
+ * Compares only single units that are convertible.
+ */
+ static int32_t compareTwoUnits(const MeasureUnitImpl &firstUnit, const MeasureUnitImpl &SecondUnit,
+ const ConversionRates &ratesInfo, UErrorCode &status);
+
/**
* Convert a measurement expressed in the source unit to a measurement
* expressed in the target unit.
@@ -161,8 +201,15 @@ class U_I18N_API UnitConverter : public UMemory {
*/
double convertInverse(double inputValue) const;
+ ConversionInfo getConversionInfo() const;
+
private:
ConversionRate conversionRate_;
+
+ /**
+ * Initialises the object.
+ */
+ void init(const ConversionRates &ratesInfo, UErrorCode &status);
};
} // namespace units
diff --git a/deps/icu-small/source/i18n/units_data.cpp b/deps/icu-small/source/i18n/units_data.cpp
index 42bd6248b0b26d..61f537479fa908 100644
--- a/deps/icu-small/source/i18n/units_data.cpp
+++ b/deps/icu-small/source/i18n/units_data.cpp
@@ -282,6 +282,10 @@ int32_t getPreferenceMetadataIndex(const MaybeStackVector= 0) { return idx; }
if (!foundCategory) {
+ // TODO: failures can happen if units::getUnitCategory returns a category
+ // that does not appear in unitPreferenceData. Do we want a unit test that
+ // checks unitPreferenceData has full coverage of categories? Or just trust
+ // CLDR?
status = U_ILLEGAL_ARGUMENT_ERROR;
return -1;
}
@@ -360,29 +364,6 @@ int32_t UnitPreferenceMetadata::compareTo(const UnitPreferenceMetadata &other, b
return cmp;
}
-CharString U_I18N_API getUnitCategory(const char *baseUnitIdentifier, UErrorCode &status) {
- CharString result;
- LocalUResourceBundlePointer unitsBundle(ures_openDirect(NULL, "units", &status));
- LocalUResourceBundlePointer unitQuantities(
- ures_getByKey(unitsBundle.getAlias(), "unitQuantities", NULL, &status));
- int32_t categoryLength;
- if (U_FAILURE(status)) { return result; }
- const UChar *uCategory =
- ures_getStringByKey(unitQuantities.getAlias(), baseUnitIdentifier, &categoryLength, &status);
- if (U_FAILURE(status)) {
- // TODO(CLDR-13787,hugovdm): special-casing the consumption-inverse
- // case. Once CLDR-13787 is clarified, this should be generalised (or
- // possibly removed):
- if (uprv_strcmp(baseUnitIdentifier, "meter-per-cubic-meter") == 0) {
- status = U_ZERO_ERROR;
- result.append("consumption-inverse", status);
- return result;
- }
- }
- result.appendInvariantChars(uCategory, categoryLength, status);
- return result;
-}
-
// TODO: this may be unnecessary. Fold into ConversionRates class? Or move to anonymous namespace?
void U_I18N_API getAllConversionRates(MaybeStackVector &result, UErrorCode &status) {
LocalUResourceBundlePointer unitsBundle(ures_openDirect(NULL, "units", &status));
@@ -415,7 +396,11 @@ void U_I18N_API UnitPreferences::getPreferencesFor(StringPiece category, StringP
const UnitPreference *const *&outPreferences,
int32_t &preferenceCount, UErrorCode &status) const {
int32_t idx = getPreferenceMetadataIndex(&metadata_, category, usage, region, status);
- if (U_FAILURE(status)) { return; }
+ if (U_FAILURE(status)) {
+ outPreferences = nullptr;
+ preferenceCount = 0;
+ return;
+ }
U_ASSERT(idx >= 0); // Failures should have been taken care of by `status`.
const UnitPreferenceMetadata *m = metadata_[idx];
outPreferences = unitPrefs_.getAlias() + m->prefsOffset;
diff --git a/deps/icu-small/source/i18n/units_data.h b/deps/icu-small/source/i18n/units_data.h
index b6fe8e88de3c2e..2c19b9434bd02b 100644
--- a/deps/icu-small/source/i18n/units_data.h
+++ b/deps/icu-small/source/i18n/units_data.h
@@ -17,22 +17,6 @@
U_NAMESPACE_BEGIN
namespace units {
-/**
- * Looks up the unit category of a base unit identifier.
- *
- * Only supports base units, other units must be resolved to base units before
- * passing to this function.
- *
- * Categories are found in `unitQuantities` in the `units` resource (see
- * `units.txt`).
- *
- * TODO(hugovdm): if we give units_data.cpp access to the functionality of
- * `extractCompoundBaseUnit` which is currently in units_converter.cpp, we could
- * support all units for which there is a category. Does it make sense to move
- * that function to units_data.cpp?
- */
-CharString U_I18N_API getUnitCategory(const char *baseUnitIdentifier, UErrorCode &status);
-
/**
* Encapsulates "convertUnits" information from units resources, specifying how
* to convert from one unit to another.
diff --git a/deps/icu-small/source/i18n/units_router.cpp b/deps/icu-small/source/i18n/units_router.cpp
index 3158718fd22fba..51f66bfa892be7 100644
--- a/deps/icu-small/source/i18n/units_router.cpp
+++ b/deps/icu-small/source/i18n/units_router.cpp
@@ -43,8 +43,23 @@ Precision UnitsRouter::parseSkeletonToPrecision(icu::UnicodeString precisionSkel
return result;
}
-UnitsRouter::UnitsRouter(MeasureUnit inputUnit, StringPiece region, StringPiece usage,
+UnitsRouter::UnitsRouter(StringPiece inputUnitIdentifier, StringPiece region, StringPiece usage,
UErrorCode &status) {
+ this->init(MeasureUnit::forIdentifier(inputUnitIdentifier, status), region, usage, status);
+}
+
+UnitsRouter::UnitsRouter(const MeasureUnit &inputUnit, StringPiece region, StringPiece usage,
+ UErrorCode &status) {
+ this->init(std::move(inputUnit), region, usage, status);
+}
+
+void UnitsRouter::init(const MeasureUnit &inputUnit, StringPiece region, StringPiece usage,
+ UErrorCode &status) {
+
+ if (U_FAILURE(status)) {
+ return;
+ }
+
// TODO: do we want to pass in ConversionRates and UnitPreferences instead
// of loading in each UnitsRouter instance? (Or make global?)
ConversionRates conversionRates(status);
@@ -53,13 +68,18 @@ UnitsRouter::UnitsRouter(MeasureUnit inputUnit, StringPiece region, StringPiece
MeasureUnitImpl inputUnitImpl = MeasureUnitImpl::forMeasureUnitMaybeCopy(inputUnit, status);
MeasureUnit baseUnit =
(extractCompoundBaseUnit(inputUnitImpl, conversionRates, status)).build(status);
- CharString category = getUnitCategory(baseUnit.getIdentifier(), status);
+ CharString category = getUnitQuantity(baseUnit.getIdentifier(), status);
+ if (U_FAILURE(status)) {
+ return;
+ }
const UnitPreference *const *unitPreferences;
- int32_t preferencesCount;
- prefs.getPreferencesFor(category.data(), usage, region, unitPreferences, preferencesCount, status);
+ int32_t preferencesCount = 0;
+ prefs.getPreferencesFor(category.toStringPiece(), usage, region, unitPreferences, preferencesCount,
+ status);
for (int i = 0; i < preferencesCount; ++i) {
+ U_ASSERT(unitPreferences[i] != nullptr);
const auto &preference = *unitPreferences[i];
MeasureUnitImpl complexTargetUnitImpl =
diff --git a/deps/icu-small/source/i18n/units_router.h b/deps/icu-small/source/i18n/units_router.h
index bd7a93d2d8c531..c6e4e4f5288363 100644
--- a/deps/icu-small/source/i18n/units_router.h
+++ b/deps/icu-small/source/i18n/units_router.h
@@ -120,7 +120,9 @@ namespace units {
*/
class U_I18N_API UnitsRouter {
public:
- UnitsRouter(MeasureUnit inputUnit, StringPiece locale, StringPiece usage, UErrorCode &status);
+ UnitsRouter(StringPiece inputUnitIdentifier, StringPiece locale, StringPiece usage,
+ UErrorCode &status);
+ UnitsRouter(const MeasureUnit &inputUnit, StringPiece locale, StringPiece usage, UErrorCode &status);
/**
* Performs locale and usage sensitive unit conversion.
@@ -152,6 +154,8 @@ class U_I18N_API UnitsRouter {
static number::Precision parseSkeletonToPrecision(icu::UnicodeString precisionSkeleton,
UErrorCode &status);
+
+ void init(const MeasureUnit &inputUnit, StringPiece locale, StringPiece usage, UErrorCode &status);
};
} // namespace units
diff --git a/deps/icu-small/source/i18n/usearch.cpp b/deps/icu-small/source/i18n/usearch.cpp
index 1b22e201e53294..47da3d7364de3f 100644
--- a/deps/icu-small/source/i18n/usearch.cpp
+++ b/deps/icu-small/source/i18n/usearch.cpp
@@ -4061,7 +4061,7 @@ U_CAPI UBool U_EXPORT2 usearch_search(UStringSearch *strsrch,
// * do NOT require that match limit be on a breakIter boundary
// Advance the match end position to the first acceptable match boundary.
- // This advances the index over any combining charcters.
+ // This advances the index over any combining characters.
mLimit = maxLimit;
if (minLimit < maxLimit) {
// When the last CE's low index is same with its high index, the CE is likely
diff --git a/deps/icu-small/source/i18n/uspoof_conf.cpp b/deps/icu-small/source/i18n/uspoof_conf.cpp
index 672b3e0a6c8023..f3f649d5d2c259 100644
--- a/deps/icu-small/source/i18n/uspoof_conf.cpp
+++ b/deps/icu-small/source/i18n/uspoof_conf.cpp
@@ -15,7 +15,7 @@
* created on: 2009Jan05 (refactoring earlier files)
* created by: Andy Heninger
*
-* Internal classes for compililing confusable data into its binary (runtime) form.
+* Internal classes for compiling confusable data into its binary (runtime) form.
*/
#include "unicode/utypes.h"
diff --git a/deps/icu-small/source/i18n/uspoof_impl.h b/deps/icu-small/source/i18n/uspoof_impl.h
index b0bd8cefc82ddc..e825f343da1915 100644
--- a/deps/icu-small/source/i18n/uspoof_impl.h
+++ b/deps/icu-small/source/i18n/uspoof_impl.h
@@ -157,7 +157,7 @@ class CheckResult : public UObject,
//
// String Table:
// The strings table contains all of the value strings (those of length two or greater)
-// concatentated together into one long UChar (UTF-16) array.
+// concatenated together into one long UChar (UTF-16) array.
//
// There is no nul character or other mark between adjacent strings.
//
diff --git a/deps/icu-small/source/i18n/vtzone.cpp b/deps/icu-small/source/i18n/vtzone.cpp
index aa2e1763966710..94fa6a4158ae1d 100644
--- a/deps/icu-small/source/i18n/vtzone.cpp
+++ b/deps/icu-small/source/i18n/vtzone.cpp
@@ -376,7 +376,7 @@ static void getDefaultTZName(const UnicodeString &tzid, UBool isDST, UnicodeStri
* dow day of week in BYDAY, or 0 when not found
* wim day of week ordinal number in BYDAY, or 0 when not found
* dom an array of day of month
- * domCount number of availble days in dom (domCount is specifying the size of dom on input)
+ * domCount number of available days in dom (domCount is specifying the size of dom on input)
* until time defined by UNTIL attribute or MIN_MILLIS if not available
*/
static void parseRRULE(const UnicodeString& rrule, int32_t& month, int32_t& dow, int32_t& wim,
@@ -1217,6 +1217,12 @@ VTimeZone::getOffset(UDate date, UBool local, int32_t& rawOffset,
return tz->getOffset(date, local, rawOffset, dstOffset, status);
}
+void VTimeZone::getOffsetFromLocal(UDate date, UTimeZoneLocalOption nonExistingTimeOpt,
+ UTimeZoneLocalOption duplicatedTimeOpt,
+ int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) const {
+ tz->getOffsetFromLocal(date, nonExistingTimeOpt, duplicatedTimeOpt, rawOffset, dstOffset, status);
+}
+
void
VTimeZone::setRawOffset(int32_t offsetMillis) {
tz->setRawOffset(offsetMillis);
@@ -2649,7 +2655,7 @@ VTimeZone::endZoneProps(VTZWriter& writer, UBool isDst, UErrorCode& status) cons
}
/*
- * Write the beggining part of RRULE line
+ * Write the beginning part of RRULE line
*/
void
VTimeZone::beginRRULE(VTZWriter& writer, int32_t month, UErrorCode& status) const {
diff --git a/deps/icu-small/source/i18n/vzone.h b/deps/icu-small/source/i18n/vzone.h
index 9c83c1b7e660cb..2e8433908c0330 100644
--- a/deps/icu-small/source/i18n/vzone.h
+++ b/deps/icu-small/source/i18n/vzone.h
@@ -136,7 +136,7 @@ U_CAPI void U_EXPORT2
vzone_write(VZone* zone, UChar* & result, int32_t & resultLength, UErrorCode& status);
/**
- * Writes RFC2445 VTIMEZONE data for this time zone applicalbe
+ * Writes RFC2445 VTIMEZONE data for this time zone applicable
* for dates after the specified start time.
* @param zone, the vzone to use
* @param start The start date.
@@ -148,7 +148,7 @@ U_CAPI void U_EXPORT2
vzone_writeFromStart(VZone* zone, UDate start, UChar* & result, int32_t & resultLength, UErrorCode& status);
/**
- * Writes RFC2445 VTIMEZONE data applicalbe for the specified date.
+ * Writes RFC2445 VTIMEZONE data applicable for the specified date.
* Some common iCalendar implementations can only handle a single time
* zone property or a pair of standard and daylight time properties using
* BYDAY rule with day of week (such as BYDAY=1SUN). This method produce
diff --git a/deps/icu-small/source/i18n/windtfmt.cpp b/deps/icu-small/source/i18n/windtfmt.cpp
index c35adc09875724..b5cb8f367b662c 100644
--- a/deps/icu-small/source/i18n/windtfmt.cpp
+++ b/deps/icu-small/source/i18n/windtfmt.cpp
@@ -193,6 +193,7 @@ Win32DateFormat::~Win32DateFormat()
Win32DateFormat &Win32DateFormat::operator=(const Win32DateFormat &other)
{
+ if (this == &other) { return *this; } // self-assignment: no-op
// The following handles fCalendar
DateFormat::operator=(other);
diff --git a/deps/icu-small/source/i18n/winnmfmt.cpp b/deps/icu-small/source/i18n/winnmfmt.cpp
index 1ae2310123a252..2e44631c85074e 100644
--- a/deps/icu-small/source/i18n/winnmfmt.cpp
+++ b/deps/icu-small/source/i18n/winnmfmt.cpp
@@ -268,6 +268,7 @@ Win32NumberFormat::~Win32NumberFormat()
Win32NumberFormat &Win32NumberFormat::operator=(const Win32NumberFormat &other)
{
+ if (this == &other) { return *this; } // self-assignment: no-op
NumberFormat::operator=(other);
this->fCurrency = other.fCurrency;
diff --git a/deps/icu-small/source/i18n/wintzimpl.cpp b/deps/icu-small/source/i18n/wintzimpl.cpp
index c55ed95fa8aea2..211d3564029db8 100644
--- a/deps/icu-small/source/i18n/wintzimpl.cpp
+++ b/deps/icu-small/source/i18n/wintzimpl.cpp
@@ -145,7 +145,7 @@ static UBool getWindowsTimeZoneInfo(TIME_ZONE_INFORMATION *zoneInfo, const UChar
}
/*
- * Given the timezone icuid, fill in zoneInfo by calling auxillary functions that creates a timezone and extract the
+ * Given the timezone icuid, fill in zoneInfo by calling auxiliary functions that creates a timezone and extract the
* information to put into zoneInfo. This includes bias and standard time date and daylight saving date.
*/
U_CAPI UBool U_EXPORT2
diff --git a/deps/icu-small/source/i18n/zonemeta.h b/deps/icu-small/source/i18n/zonemeta.h
index 58724ea3b7d2e4..a5a446d8ccdad9 100644
--- a/deps/icu-small/source/i18n/zonemeta.h
+++ b/deps/icu-small/source/i18n/zonemeta.h
@@ -50,7 +50,7 @@ class U_I18N_API ZoneMeta {
static const UChar* U_EXPORT2 getCanonicalCLDRID(const UnicodeString &tzid, UErrorCode& status);
/*
- * Conveninent method returning CLDR canonical ID for the given time zone
+ * Convenient method returning CLDR canonical ID for the given time zone
*/
static const UChar* U_EXPORT2 getCanonicalCLDRID(const TimeZone& tz);
diff --git a/deps/icu-small/source/tools/genrb/parse.cpp b/deps/icu-small/source/tools/genrb/parse.cpp
index 18a8c76dbc5df1..5abe5d656733f9 100644
--- a/deps/icu-small/source/tools/genrb/parse.cpp
+++ b/deps/icu-small/source/tools/genrb/parse.cpp
@@ -1191,7 +1191,7 @@ realParseTable(ParseState* state, TableResource *table, char *tag, uint32_t star
if (token == TOK_CLOSE_BRACE)
{
- if (!readToken) {
+ if (!readToken && isVerbose()) {
warning(startline, "Encountered empty table");
}
return table;
diff --git a/deps/icu-small/source/tools/genrb/prscmnts.cpp b/deps/icu-small/source/tools/genrb/prscmnts.cpp
index 5d494cd9ad3f2b..d79d59e3916bc5 100644
--- a/deps/icu-small/source/tools/genrb/prscmnts.cpp
+++ b/deps/icu-small/source/tools/genrb/prscmnts.cpp
@@ -78,7 +78,7 @@ trim(UChar *src, int32_t srcLen, UErrorCode *status){
U_CFUNC int32_t
removeCmtText(UChar* source, int32_t srcLen, UErrorCode* status){
srcLen = trim(source, srcLen, status);
- UnicodeString patString("^\\s*?\\*\\s*?"); // remove pattern like " * " at the begining of the line
+ UnicodeString patString("^\\s*?\\*\\s*?"); // remove pattern like " * " at the beginning of the line
srcLen = removeText(source, srcLen, patString, UREGEX_MULTILINE, UnicodeString(), status);
return removeText(source, srcLen, UnicodeString("[ \\r\\n]+"), 0, UnicodeString(" "), status);// remove new lines;
}
diff --git a/deps/icu-small/source/tools/genrb/reslist.cpp b/deps/icu-small/source/tools/genrb/reslist.cpp
index 4bc6adc128ecc3..389ad19b38b88f 100644
--- a/deps/icu-small/source/tools/genrb/reslist.cpp
+++ b/deps/icu-small/source/tools/genrb/reslist.cpp
@@ -340,7 +340,8 @@ IntResource::~IntResource() {}
IntVectorResource::IntVectorResource(SRBRoot *bundle, const char *tag,
const UString* comment, UErrorCode &errorCode)
: SResource(bundle, tag, URES_INT_VECTOR, comment, errorCode),
- fCount(0), fArray(new uint32_t[RESLIST_MAX_INT_VECTOR]) {
+ fCount(0), fSize(RESLIST_INT_VECTOR_INIT_SIZE),
+ fArray(new uint32_t[fSize]) {
if (fArray == NULL) {
errorCode = U_MEMORY_ALLOCATION_ERROR;
return;
@@ -352,6 +353,17 @@ IntVectorResource::~IntVectorResource() {
}
void IntVectorResource::add(int32_t value, UErrorCode &errorCode) {
+ if (fCount == fSize) {
+ uint32_t* tmp = new uint32_t[2 * fSize];
+ if (tmp == nullptr) {
+ errorCode = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ uprv_memcpy(tmp, fArray, fSize * sizeof(uint32_t));
+ delete[] fArray;
+ fArray = tmp;
+ fSize *= 2;
+ }
if (U_SUCCESS(errorCode)) {
fArray[fCount++] = value;
}
diff --git a/deps/icu-small/source/tools/genrb/reslist.h b/deps/icu-small/source/tools/genrb/reslist.h
index e7b10fa0961d18..400f0a97debea4 100644
--- a/deps/icu-small/source/tools/genrb/reslist.h
+++ b/deps/icu-small/source/tools/genrb/reslist.h
@@ -21,7 +21,7 @@
#define RESLIST_H
#define KEY_SPACE_SIZE 65536
-#define RESLIST_MAX_INT_VECTOR 2048
+#define RESLIST_INT_VECTOR_INIT_SIZE 2048
#include
@@ -405,7 +405,8 @@ class IntVectorResource : public SResource {
virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset);
// TODO: UVector32
- uint32_t fCount;
+ size_t fCount;
+ size_t fSize;
uint32_t *fArray;
};
diff --git a/deps/icu-small/source/tools/toolutil/ucbuf.cpp b/deps/icu-small/source/tools/toolutil/ucbuf.cpp
index 9b5e615d258c92..195963c78c5af9 100644
--- a/deps/icu-small/source/tools/toolutil/ucbuf.cpp
+++ b/deps/icu-small/source/tools/toolutil/ucbuf.cpp
@@ -531,14 +531,14 @@ ucbuf_open(const char* fileName,const char** cp,UBool showWarning, UBool buffere
/* TODO: this method will fail if at the
- * begining of buffer and the uchar to unget
+ * beginning of buffer and the uchar to unget
* is from the previous buffer. Need to implement
* system to take care of that situation.
*/
U_CAPI void U_EXPORT2
ucbuf_ungetc(int32_t c,UCHARBUF* buf){
/* decrement currentPos pointer
- * if not at the begining of buffer
+ * if not at the beginning of buffer
*/
if(buf->currentPos!=buf->buffer){
if(*(buf->currentPos-1)==c){
@@ -736,7 +736,7 @@ ucbuf_readline(UCHARBUF* buf,int32_t* len,UErrorCode* err){
}
}
/*
- * Accoding to TR 13 readLine functions must interpret
+ * According to TR 13 readLine functions must interpret
* CR, CR+LF, LF, NEL, PS, LS or FF as line seperators
*/
/* Windows CR LF */
diff --git a/deps/icu-small/source/tools/toolutil/ucbuf.h b/deps/icu-small/source/tools/toolutil/ucbuf.h
index 7a9b7af5cc71ac..a854150bfba95b 100644
--- a/deps/icu-small/source/tools/toolutil/ucbuf.h
+++ b/deps/icu-small/source/tools/toolutil/ucbuf.h
@@ -49,7 +49,7 @@ struct ULine {
* Opens the UCHARBUF with the given file stream and code page for conversion
* @param fileName Name of the file to open.
* @param codepage The encoding of the file stream to convert to Unicode.
- * If *codepoge is NULL on input the API will try to autodetect
+ * If *codepage is NULL on input the API will try to autodetect
* popular Unicode encodings
* @param showWarning Flag to print out warnings to STDOUT
* @param buffered If TRUE performs a buffered read of the input file. If FALSE reads
diff --git a/deps/icu-small/source/tools/toolutil/xmlparser.cpp b/deps/icu-small/source/tools/toolutil/xmlparser.cpp
index e3d5b42ef47a73..d421a79ead6f2b 100644
--- a/deps/icu-small/source/tools/toolutil/xmlparser.cpp
+++ b/deps/icu-small/source/tools/toolutil/xmlparser.cpp
@@ -79,7 +79,7 @@ UXMLParser::UXMLParser(UErrorCode &status) :
// or "
// TODO: we don't actually parse the DOCTYPE or internal subsets.
// Some internal dtd subsets could confuse this simple-minded
- // attempt at skipping over them, specifically, occcurences
+ // attempt at skipping over them, specifically, occurrences
// of closeing square brackets. These could appear in comments,
// or in parameter entity declarations, for example.
mXMLDoctype(UnicodeString(
@@ -243,7 +243,7 @@ UXMLParser::parseFile(const char *filename, UErrorCode &errorCode) {
UnicodeString attValue = mAttrValue.group(2, errorCode);
// Trim the quotes from the att value. These are left over from the original regex
- // that parsed the attribue, which couldn't conveniently strip them.
+ // that parsed the attribute, which couldn't conveniently strip them.
attValue.remove(0,1); // one char from the beginning
attValue.truncate(attValue.length()-1); // and one from the end.
@@ -498,7 +498,7 @@ UXMLParser::createElement(RegexMatcher &mEl, UErrorCode &status) {
UnicodeString attValue = mAttrValue.group(2, status);
// Trim the quotes from the att value. These are left over from the original regex
- // that parsed the attribue, which couldn't conveniently strip them.
+ // that parsed the attribute, which couldn't conveniently strip them.
attValue.remove(0,1); // one char from the beginning
attValue.truncate(attValue.length()-1); // and one from the end.
@@ -658,7 +658,7 @@ UXMLParser::intern(const UnicodeString &s, UErrorCode &errorCode) {
return (const UnicodeString *)he->key.pointer;
} else {
// add this new name and return its hashed key pointer
- fNames.puti(s, 0, errorCode);
+ fNames.puti(s, 1, errorCode);
he=fNames.find(s);
return (const UnicodeString *)he->key.pointer;
}
diff --git a/deps/v8/src/base/cpu.cc b/deps/v8/src/base/cpu.cc
index bbdae525e30b39..776fdaf8be6cdd 100644
--- a/deps/v8/src/base/cpu.cc
+++ b/deps/v8/src/base/cpu.cc
@@ -27,6 +27,9 @@
#ifndef POWER_9
#define POWER_9 0x20000
#endif
+#ifndef POWER_10
+#define POWER_10 0x40000
+#endif
#endif
#if V8_OS_POSIX
#include // sysconf()
@@ -646,7 +649,10 @@ CPU::CPU()
part_ = -1;
if (auxv_cpu_type) {
- if (strcmp(auxv_cpu_type, "power9") == 0) {
+ if (strcmp(auxv_cpu_type, "power10") == 0) {
+ part_ = PPC_POWER10;
+ }
+ else if (strcmp(auxv_cpu_type, "power9") == 0) {
part_ = PPC_POWER9;
} else if (strcmp(auxv_cpu_type, "power8") == 0) {
part_ = PPC_POWER8;
@@ -667,6 +673,9 @@ CPU::CPU()
#elif V8_OS_AIX
switch (_system_configuration.implementation) {
+ case POWER_10:
+ part_ = PPC_POWER10;
+ break;
case POWER_9:
part_ = PPC_POWER9;
break;
diff --git a/deps/v8/src/base/cpu.h b/deps/v8/src/base/cpu.h
index 4b4becfa204937..98688a3cd38d6d 100644
--- a/deps/v8/src/base/cpu.h
+++ b/deps/v8/src/base/cpu.h
@@ -70,6 +70,7 @@ class V8_BASE_EXPORT CPU final {
PPC_POWER7,
PPC_POWER8,
PPC_POWER9,
+ PPC_POWER10,
PPC_G4,
PPC_G5,
PPC_PA6T
diff --git a/deps/v8/src/builtins/builtins-callsite.cc b/deps/v8/src/builtins/builtins-callsite.cc
index 5b7807ed4a9e50..63e4d7a572e53b 100644
--- a/deps/v8/src/builtins/builtins-callsite.cc
+++ b/deps/v8/src/builtins/builtins-callsite.cc
@@ -53,6 +53,22 @@ BUILTIN(CallSitePrototypeGetColumnNumber) {
return PositiveNumberOrNull(it.Frame()->GetColumnNumber(), isolate);
}
+BUILTIN(CallSitePrototypeGetEnclosingColumnNumber) {
+ HandleScope scope(isolate);
+ CHECK_CALLSITE(recv, "getEnclosingColumnNumber");
+ FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
+ GetFrameIndex(isolate, recv));
+ return PositiveNumberOrNull(it.Frame()->GetEnclosingColumnNumber(), isolate);
+}
+
+BUILTIN(CallSitePrototypeGetEnclosingLineNumber) {
+ HandleScope scope(isolate);
+ CHECK_CALLSITE(recv, "getEnclosingLineNumber");
+ FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
+ GetFrameIndex(isolate, recv));
+ return PositiveNumberOrNull(it.Frame()->GetEnclosingLineNumber(), isolate);
+}
+
BUILTIN(CallSitePrototypeGetEvalOrigin) {
HandleScope scope(isolate);
CHECK_CALLSITE(recv, "getEvalOrigin");
diff --git a/deps/v8/src/builtins/builtins-definitions.h b/deps/v8/src/builtins/builtins-definitions.h
index 84ddf55f6f47d3..ff730cc4b28944 100644
--- a/deps/v8/src/builtins/builtins-definitions.h
+++ b/deps/v8/src/builtins/builtins-definitions.h
@@ -376,6 +376,8 @@ namespace internal {
\
/* CallSite */ \
CPP(CallSitePrototypeGetColumnNumber) \
+ CPP(CallSitePrototypeGetEnclosingColumnNumber) \
+ CPP(CallSitePrototypeGetEnclosingLineNumber) \
CPP(CallSitePrototypeGetEvalOrigin) \
CPP(CallSitePrototypeGetFileName) \
CPP(CallSitePrototypeGetFunction) \
diff --git a/deps/v8/src/codegen/ppc/assembler-ppc.cc b/deps/v8/src/codegen/ppc/assembler-ppc.cc
index b9f09e23f23c5c..0431baf993e62f 100644
--- a/deps/v8/src/codegen/ppc/assembler-ppc.cc
+++ b/deps/v8/src/codegen/ppc/assembler-ppc.cc
@@ -67,21 +67,28 @@ void CpuFeatures::ProbeImpl(bool cross_compile) {
#ifndef USE_SIMULATOR
// Probe for additional features at runtime.
base::CPU cpu;
- if (cpu.part() == base::CPU::PPC_POWER9) {
+ if (cpu.part() == base::CPU::PPC_POWER9 ||
+ cpu.part() == base::CPU::PPC_POWER10) {
supported_ |= (1u << MODULO);
}
#if V8_TARGET_ARCH_PPC64
- if (cpu.part() == base::CPU::PPC_POWER8) {
+ if (cpu.part() == base::CPU::PPC_POWER8 ||
+ cpu.part() == base::CPU::PPC_POWER9 ||
+ cpu.part() == base::CPU::PPC_POWER10) {
supported_ |= (1u << FPR_GPR_MOV);
}
#endif
if (cpu.part() == base::CPU::PPC_POWER6 ||
cpu.part() == base::CPU::PPC_POWER7 ||
- cpu.part() == base::CPU::PPC_POWER8) {
+ cpu.part() == base::CPU::PPC_POWER8 ||
+ cpu.part() == base::CPU::PPC_POWER9 ||
+ cpu.part() == base::CPU::PPC_POWER10) {
supported_ |= (1u << LWSYNC);
}
if (cpu.part() == base::CPU::PPC_POWER7 ||
- cpu.part() == base::CPU::PPC_POWER8) {
+ cpu.part() == base::CPU::PPC_POWER8 ||
+ cpu.part() == base::CPU::PPC_POWER9 ||
+ cpu.part() == base::CPU::PPC_POWER10) {
supported_ |= (1u << ISELECT);
supported_ |= (1u << VSX);
}
diff --git a/deps/v8/src/execution/messages.cc b/deps/v8/src/execution/messages.cc
index 33a2fa99ba64ab..4f9ee68baede5b 100644
--- a/deps/v8/src/execution/messages.cc
+++ b/deps/v8/src/execution/messages.cc
@@ -513,6 +513,26 @@ int JSStackFrame::GetColumnNumber() {
return kNone;
}
+int JSStackFrame::GetEnclosingLineNumber() {
+ if (HasScript()) {
+ Handle shared = handle(function_->shared(), isolate_);
+ return Script::GetLineNumber(GetScript(),
+ shared->function_token_position()) + 1;
+ } else {
+ return kNone;
+ }
+}
+
+int JSStackFrame::GetEnclosingColumnNumber() {
+ if (HasScript()) {
+ Handle shared = handle(function_->shared(), isolate_);
+ return Script::GetColumnNumber(GetScript(),
+ shared->function_token_position()) + 1;
+ } else {
+ return kNone;
+ }
+}
+
int JSStackFrame::GetPromiseIndex() const {
return is_promise_all_ ? offset_ : kNone;
}
@@ -601,6 +621,12 @@ int WasmStackFrame::GetPosition() const {
int WasmStackFrame::GetColumnNumber() { return GetModuleOffset(); }
+int WasmStackFrame::GetEnclosingColumnNumber() {
+ const int function_offset =
+ GetWasmFunctionOffset(wasm_instance_->module(), wasm_func_index_);
+ return function_offset;
+}
+
int WasmStackFrame::GetModuleOffset() const {
const int function_offset =
GetWasmFunctionOffset(wasm_instance_->module(), wasm_func_index_);
@@ -669,6 +695,26 @@ int AsmJsWasmStackFrame::GetColumnNumber() {
return Script::GetColumnNumber(script, GetPosition()) + 1;
}
+int AsmJsWasmStackFrame::GetEnclosingLineNumber() {
+ DCHECK_LE(0, GetPosition());
+ Handle
-