@fgv/ts-bcp47 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +141 -0
  3. package/bcp47/bcp47Subtags/converters.d.ts +9 -0
  4. package/bcp47/bcp47Subtags/converters.d.ts.map +1 -0
  5. package/bcp47/bcp47Subtags/converters.js +57 -0
  6. package/bcp47/bcp47Subtags/index.d.ts +5 -0
  7. package/bcp47/bcp47Subtags/index.d.ts.map +1 -0
  8. package/bcp47/bcp47Subtags/index.js +54 -0
  9. package/bcp47/bcp47Subtags/model.d.ts +18 -0
  10. package/bcp47/bcp47Subtags/model.d.ts.map +1 -0
  11. package/bcp47/bcp47Subtags/model.js +24 -0
  12. package/bcp47/bcp47Subtags/validate.d.ts +16 -0
  13. package/bcp47/bcp47Subtags/validate.d.ts.map +1 -0
  14. package/bcp47/bcp47Subtags/validate.js +74 -0
  15. package/bcp47/common.d.ts +38 -0
  16. package/bcp47/common.d.ts.map +1 -0
  17. package/bcp47/common.js +59 -0
  18. package/bcp47/helpers.d.ts +66 -0
  19. package/bcp47/helpers.d.ts.map +1 -0
  20. package/bcp47/helpers.js +103 -0
  21. package/bcp47/index.d.ts +7 -0
  22. package/bcp47/index.d.ts.map +1 -0
  23. package/bcp47/index.js +27 -0
  24. package/bcp47/languageTag.d.ts +208 -0
  25. package/bcp47/languageTag.d.ts.map +1 -0
  26. package/bcp47/languageTag.js +342 -0
  27. package/bcp47/languageTagParser.d.ts +123 -0
  28. package/bcp47/languageTagParser.d.ts.map +1 -0
  29. package/bcp47/languageTagParser.js +310 -0
  30. package/bcp47/match/chooser.d.ts +70 -0
  31. package/bcp47/match/chooser.d.ts.map +1 -0
  32. package/bcp47/match/chooser.js +92 -0
  33. package/bcp47/match/common.d.ts +24 -0
  34. package/bcp47/match/common.d.ts.map +1 -0
  35. package/bcp47/match/common.js +42 -0
  36. package/bcp47/match/index.d.ts +4 -0
  37. package/bcp47/match/index.d.ts.map +1 -0
  38. package/bcp47/match/index.js +45 -0
  39. package/bcp47/match/similarity.d.ts +24 -0
  40. package/bcp47/match/similarity.d.ts.map +1 -0
  41. package/bcp47/match/similarity.js +230 -0
  42. package/bcp47/normalization/baseNormalizer.d.ts +36 -0
  43. package/bcp47/normalization/baseNormalizer.d.ts.map +1 -0
  44. package/bcp47/normalization/baseNormalizer.js +114 -0
  45. package/bcp47/normalization/canonicalNormalizer.d.ts +22 -0
  46. package/bcp47/normalization/canonicalNormalizer.d.ts.map +1 -0
  47. package/bcp47/normalization/canonicalNormalizer.js +110 -0
  48. package/bcp47/normalization/common.d.ts +23 -0
  49. package/bcp47/normalization/common.d.ts.map +1 -0
  50. package/bcp47/normalization/common.js +82 -0
  51. package/bcp47/normalization/index.d.ts +5 -0
  52. package/bcp47/normalization/index.d.ts.map +1 -0
  53. package/bcp47/normalization/index.js +47 -0
  54. package/bcp47/normalization/normalizeTag.d.ts +59 -0
  55. package/bcp47/normalization/normalizeTag.d.ts.map +1 -0
  56. package/bcp47/normalization/normalizeTag.js +105 -0
  57. package/bcp47/normalization/preferredTagNormalizer.d.ts +26 -0
  58. package/bcp47/normalization/preferredTagNormalizer.d.ts.map +1 -0
  59. package/bcp47/normalization/preferredTagNormalizer.js +178 -0
  60. package/bcp47/overrides/converters.d.ts +19 -0
  61. package/bcp47/overrides/converters.d.ts.map +1 -0
  62. package/bcp47/overrides/converters.js +75 -0
  63. package/bcp47/overrides/defaultRegistries.d.ts +12 -0
  64. package/bcp47/overrides/defaultRegistries.d.ts.map +1 -0
  65. package/bcp47/overrides/defaultRegistries.js +42 -0
  66. package/bcp47/overrides/index.d.ts +3 -0
  67. package/bcp47/overrides/index.d.ts.map +1 -0
  68. package/bcp47/overrides/index.js +30 -0
  69. package/bcp47/overrides/model.d.ts +11 -0
  70. package/bcp47/overrides/model.d.ts.map +1 -0
  71. package/bcp47/overrides/model.js +24 -0
  72. package/bcp47/overrides/overridesRegistry.d.ts +32 -0
  73. package/bcp47/overrides/overridesRegistry.d.ts.map +1 -0
  74. package/bcp47/overrides/overridesRegistry.js +101 -0
  75. package/bcp47/validation/baseValidator.d.ts +35 -0
  76. package/bcp47/validation/baseValidator.d.ts.map +1 -0
  77. package/bcp47/validation/baseValidator.js +111 -0
  78. package/bcp47/validation/common.d.ts +23 -0
  79. package/bcp47/validation/common.d.ts.map +1 -0
  80. package/bcp47/validation/common.js +84 -0
  81. package/bcp47/validation/index.d.ts +7 -0
  82. package/bcp47/validation/index.d.ts.map +1 -0
  83. package/bcp47/validation/index.js +51 -0
  84. package/bcp47/validation/isCanonical.d.ts +22 -0
  85. package/bcp47/validation/isCanonical.d.ts.map +1 -0
  86. package/bcp47/validation/isCanonical.js +101 -0
  87. package/bcp47/validation/isInPreferredForm.d.ts +15 -0
  88. package/bcp47/validation/isInPreferredForm.d.ts.map +1 -0
  89. package/bcp47/validation/isInPreferredForm.js +73 -0
  90. package/bcp47/validation/isStrictlyValid.d.ts +18 -0
  91. package/bcp47/validation/isStrictlyValid.d.ts.map +1 -0
  92. package/bcp47/validation/isStrictlyValid.js +98 -0
  93. package/bcp47/validation/isValid.d.ts +24 -0
  94. package/bcp47/validation/isValid.d.ts.map +1 -0
  95. package/bcp47/validation/isValid.js +115 -0
  96. package/bcp47/validation/isWellFormed.d.ts +22 -0
  97. package/bcp47/validation/isWellFormed.d.ts.map +1 -0
  98. package/bcp47/validation/isWellFormed.js +98 -0
  99. package/bcp47/validation/validateTag.d.ts +97 -0
  100. package/bcp47/validation/validateTag.d.ts.map +1 -0
  101. package/bcp47/validation/validateTag.js +159 -0
  102. package/data/bcp/overrides.json +21 -0
  103. package/data/iana/language-subtags.json +77295 -0
  104. package/data/iana/language-tag-extensions.json +42 -0
  105. package/data/unsd/m49.csv +250 -0
  106. package/iana/common/converters.d.ts +31 -0
  107. package/iana/common/converters.d.ts.map +1 -0
  108. package/iana/common/converters.js +84 -0
  109. package/iana/common/model.d.ts +30 -0
  110. package/iana/common/model.d.ts.map +1 -0
  111. package/iana/common/model.js +24 -0
  112. package/iana/common/registeredItems.d.ts +30 -0
  113. package/iana/common/registeredItems.d.ts.map +1 -0
  114. package/iana/common/registeredItems.js +124 -0
  115. package/iana/common/utils.d.ts +7 -0
  116. package/iana/common/utils.d.ts.map +1 -0
  117. package/iana/common/utils.js +34 -0
  118. package/iana/common/validate.d.ts +19 -0
  119. package/iana/common/validate.d.ts.map +1 -0
  120. package/iana/common/validate.js +61 -0
  121. package/iana/converters.d.ts +4 -0
  122. package/iana/converters.d.ts.map +1 -0
  123. package/iana/converters.js +54 -0
  124. package/iana/defaultRegistries.d.ts +12 -0
  125. package/iana/defaultRegistries.d.ts.map +1 -0
  126. package/iana/defaultRegistries.js +42 -0
  127. package/iana/index.d.ts +9 -0
  128. package/iana/index.d.ts.map +1 -0
  129. package/iana/index.js +64 -0
  130. package/iana/jar/converters.d.ts +4 -0
  131. package/iana/jar/converters.d.ts.map +1 -0
  132. package/iana/jar/converters.js +54 -0
  133. package/iana/jar/index.d.ts +4 -0
  134. package/iana/jar/index.d.ts.map +1 -0
  135. package/iana/jar/index.js +52 -0
  136. package/iana/jar/jarConverters.d.ts +17 -0
  137. package/iana/jar/jarConverters.d.ts.map +1 -0
  138. package/iana/jar/jarConverters.js +85 -0
  139. package/iana/jar/jarModel.d.ts +11 -0
  140. package/iana/jar/jarModel.d.ts.map +1 -0
  141. package/iana/jar/jarModel.js +24 -0
  142. package/iana/jar/language-subtags/converters.d.ts +4 -0
  143. package/iana/jar/language-subtags/converters.d.ts.map +1 -0
  144. package/iana/jar/language-subtags/converters.js +52 -0
  145. package/iana/jar/language-subtags/index.d.ts +4 -0
  146. package/iana/jar/language-subtags/index.d.ts.map +1 -0
  147. package/iana/jar/language-subtags/index.js +54 -0
  148. package/iana/jar/language-subtags/model.d.ts +4 -0
  149. package/iana/jar/language-subtags/model.d.ts.map +1 -0
  150. package/iana/jar/language-subtags/model.js +52 -0
  151. package/iana/jar/language-subtags/registry/converters.d.ts +10 -0
  152. package/iana/jar/language-subtags/registry/converters.d.ts.map +1 -0
  153. package/iana/jar/language-subtags/registry/converters.js +58 -0
  154. package/iana/jar/language-subtags/registry/index.d.ts +4 -0
  155. package/iana/jar/language-subtags/registry/index.d.ts.map +1 -0
  156. package/iana/jar/language-subtags/registry/index.js +55 -0
  157. package/iana/jar/language-subtags/registry/model.d.ts +88 -0
  158. package/iana/jar/language-subtags/registry/model.d.ts.map +1 -0
  159. package/iana/jar/language-subtags/registry/model.js +41 -0
  160. package/iana/jar/language-subtags/tags/converters.d.ts +55 -0
  161. package/iana/jar/language-subtags/tags/converters.d.ts.map +1 -0
  162. package/iana/jar/language-subtags/tags/converters.js +128 -0
  163. package/iana/jar/language-subtags/tags/index.d.ts +5 -0
  164. package/iana/jar/language-subtags/tags/index.d.ts.map +1 -0
  165. package/iana/jar/language-subtags/tags/index.js +56 -0
  166. package/iana/jar/language-subtags/tags/model.d.ts +42 -0
  167. package/iana/jar/language-subtags/tags/model.d.ts.map +1 -0
  168. package/iana/jar/language-subtags/tags/model.js +24 -0
  169. package/iana/jar/language-subtags/tags/tagValidation.d.ts +11 -0
  170. package/iana/jar/language-subtags/tags/tagValidation.d.ts.map +1 -0
  171. package/iana/jar/language-subtags/tags/tagValidation.js +70 -0
  172. package/iana/jar/language-subtags/tags/validate.d.ts +36 -0
  173. package/iana/jar/language-subtags/tags/validate.d.ts.map +1 -0
  174. package/iana/jar/language-subtags/tags/validate.js +87 -0
  175. package/iana/jar/model.d.ts +4 -0
  176. package/iana/jar/model.d.ts.map +1 -0
  177. package/iana/jar/model.js +54 -0
  178. package/iana/language-subtags/common.d.ts +5 -0
  179. package/iana/language-subtags/common.d.ts.map +1 -0
  180. package/iana/language-subtags/common.js +24 -0
  181. package/iana/language-subtags/converters.d.ts +52 -0
  182. package/iana/language-subtags/converters.d.ts.map +1 -0
  183. package/iana/language-subtags/converters.js +200 -0
  184. package/iana/language-subtags/index.d.ts +7 -0
  185. package/iana/language-subtags/index.d.ts.map +1 -0
  186. package/iana/language-subtags/index.js +60 -0
  187. package/iana/language-subtags/jarConverters.d.ts +55 -0
  188. package/iana/language-subtags/jarConverters.d.ts.map +1 -0
  189. package/iana/language-subtags/jarConverters.js +213 -0
  190. package/iana/language-subtags/model.d.ts +144 -0
  191. package/iana/language-subtags/model.d.ts.map +1 -0
  192. package/iana/language-subtags/model.js +24 -0
  193. package/iana/language-subtags/scope.d.ts +77 -0
  194. package/iana/language-subtags/scope.d.ts.map +1 -0
  195. package/iana/language-subtags/scope.js +179 -0
  196. package/iana/language-subtags/subtagRegistry.d.ts +36 -0
  197. package/iana/language-subtags/subtagRegistry.d.ts.map +1 -0
  198. package/iana/language-subtags/subtagRegistry.js +139 -0
  199. package/iana/language-subtags/validate.d.ts +2 -0
  200. package/iana/language-subtags/validate.d.ts.map +1 -0
  201. package/iana/language-subtags/validate.js +39 -0
  202. package/iana/language-tag-extensions/converters.d.ts +23 -0
  203. package/iana/language-tag-extensions/converters.d.ts.map +1 -0
  204. package/iana/language-tag-extensions/converters.js +87 -0
  205. package/iana/language-tag-extensions/extensionsRegistry.d.ts +26 -0
  206. package/iana/language-tag-extensions/extensionsRegistry.d.ts.map +1 -0
  207. package/iana/language-tag-extensions/extensionsRegistry.js +94 -0
  208. package/iana/language-tag-extensions/extensionsScope.d.ts +20 -0
  209. package/iana/language-tag-extensions/extensionsScope.d.ts.map +1 -0
  210. package/iana/language-tag-extensions/extensionsScope.js +77 -0
  211. package/iana/language-tag-extensions/index.d.ts +6 -0
  212. package/iana/language-tag-extensions/index.d.ts.map +1 -0
  213. package/iana/language-tag-extensions/index.js +56 -0
  214. package/iana/language-tag-extensions/jarConverters.d.ts +28 -0
  215. package/iana/language-tag-extensions/jarConverters.d.ts.map +1 -0
  216. package/iana/language-tag-extensions/jarConverters.js +102 -0
  217. package/iana/language-tag-extensions/model.d.ts +40 -0
  218. package/iana/language-tag-extensions/model.d.ts.map +1 -0
  219. package/iana/language-tag-extensions/model.js +24 -0
  220. package/iana/language-tag-extensions/validate.d.ts +7 -0
  221. package/iana/language-tag-extensions/validate.d.ts.map +1 -0
  222. package/iana/language-tag-extensions/validate.js +36 -0
  223. package/iana/languageRegistries.d.ts +13 -0
  224. package/iana/languageRegistries.d.ts.map +1 -0
  225. package/iana/languageRegistries.js +49 -0
  226. package/iana/model.d.ts +4 -0
  227. package/iana/model.d.ts.map +1 -0
  228. package/iana/model.js +54 -0
  229. package/iana/validate.d.ts +2 -0
  230. package/iana/validate.d.ts.map +1 -0
  231. package/iana/validate.js +39 -0
  232. package/index.d.ts +5 -0
  233. package/index.d.ts.map +1 -0
  234. package/index.js +54 -0
  235. package/package.json +64 -0
  236. package/unsd/areas.d.ts +29 -0
  237. package/unsd/areas.d.ts.map +1 -0
  238. package/unsd/areas.js +96 -0
  239. package/unsd/common.d.ts +49 -0
  240. package/unsd/common.d.ts.map +1 -0
  241. package/unsd/common.js +24 -0
  242. package/unsd/csv/converters.d.ts +21 -0
  243. package/unsd/csv/converters.d.ts.map +1 -0
  244. package/unsd/csv/converters.js +70 -0
  245. package/unsd/csv/index.d.ts +4 -0
  246. package/unsd/csv/index.d.ts.map +1 -0
  247. package/unsd/csv/index.js +52 -0
  248. package/unsd/csv/model.d.ts +22 -0
  249. package/unsd/csv/model.d.ts.map +1 -0
  250. package/unsd/csv/model.js +24 -0
  251. package/unsd/defaultRegistries.d.ts +12 -0
  252. package/unsd/defaultRegistries.d.ts.map +1 -0
  253. package/unsd/defaultRegistries.js +42 -0
  254. package/unsd/index.d.ts +4 -0
  255. package/unsd/index.d.ts.map +1 -0
  256. package/unsd/index.js +44 -0
  257. package/unsd/regionCodes.d.ts +38 -0
  258. package/unsd/regionCodes.d.ts.map +1 -0
  259. package/unsd/regionCodes.js +111 -0
  260. package/unsd/regions.d.ts +21 -0
  261. package/unsd/regions.d.ts.map +1 -0
  262. package/unsd/regions.js +77 -0
  263. package/utils/index.d.ts +3 -0
  264. package/utils/index.d.ts.map +1 -0
  265. package/utils/index.js +40 -0
  266. package/utils/jsonHelpers.d.ts +2 -0
  267. package/utils/jsonHelpers.d.ts.map +1 -0
  268. package/utils/jsonHelpers.js +29 -0
  269. package/utils/validationHelpers.d.ts +47 -0
  270. package/utils/validationHelpers.d.ts.map +1 -0
  271. package/utils/validationHelpers.js +88 -0
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2022 Erik Fortune
4
+ *
5
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ * of this software and associated documentation files (the "Software"), to deal
7
+ * in the Software without restriction, including without limitation the rights
8
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ * copies of the Software, and to permit persons to whom the Software is
10
+ * furnished to do so, subject to the following conditions:
11
+ *
12
+ * The above copyright notice and this permission notice shall be included in all
13
+ * copies or substantial portions of the Software.
14
+ *
15
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ * SOFTWARE.
22
+ */
23
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ var desc = Object.getOwnPropertyDescriptor(m, k);
26
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
27
+ desc = { enumerable: true, get: function() { return m[k]; } };
28
+ }
29
+ Object.defineProperty(o, k2, desc);
30
+ }) : (function(o, m, k, k2) {
31
+ if (k2 === undefined) k2 = k;
32
+ o[k2] = m[k];
33
+ }));
34
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
35
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
36
+ }) : function(o, v) {
37
+ o["default"] = v;
38
+ });
39
+ var __importStar = (this && this.__importStar) || function (mod) {
40
+ if (mod && mod.__esModule) return mod;
41
+ var result = {};
42
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.LanguageTagParser = void 0;
48
+ const Iana = __importStar(require("../iana"));
49
+ const ts_utils_1 = require("@fgv/ts-utils");
50
+ const bcp47Subtags_1 = require("./bcp47Subtags");
51
+ /**
52
+ * @public
53
+ */
54
+ class LanguageTagParser {
55
+ // istanbul ignore next
56
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
57
+ constructor() { }
58
+ /**
59
+ * Parses a string representation of a BCP-47 ({@link https://www.rfc-editor.org/rfc/rfc5646.html | RFC 5646})
60
+ * language tag, to produce a {@link Bcp47.Subtags | Subtags} object which
61
+ * breaks out each of the subtags.
62
+ * @param tag - The `string` language tag to be parsed.
63
+ * @param iana - Optional {@link Iana.LanguageRegistries | IANA language registries}
64
+ * to be used.
65
+ * @returns `Success` with the resulting {@link Bcp47.Subtags | subtags}
66
+ * or `Failure` with details if an error occurs.
67
+ * @public
68
+ */
69
+ static parse(tag, iana) {
70
+ // istanbul ignore next
71
+ iana = iana !== null && iana !== void 0 ? iana : Iana.DefaultRegistries.languageRegistries;
72
+ const status = {
73
+ tag,
74
+ iana,
75
+ subtags: tag.split('-'),
76
+ parsedSubtags: {},
77
+ };
78
+ status.next = status.subtags.shift();
79
+ return (0, ts_utils_1.allSucceed)([
80
+ this._parseGrandfatheredTag(status),
81
+ this._parsePrimaryLanguage(status),
82
+ this._parseExtlang(status),
83
+ this._parseScript(status),
84
+ this._parseRegion(status),
85
+ this._parseVariants(status),
86
+ this._parseExtensions(status),
87
+ this._parsePrivateSubtags(status),
88
+ this._parseTagEnd(status),
89
+ ], status).onSuccess(() => {
90
+ return (0, ts_utils_1.succeed)(status.parsedSubtags);
91
+ });
92
+ }
93
+ /**
94
+ * Determines if the entire tag matches a registered grandfathered tag.
95
+ * @param state - The {@link Bcp47.ParserState | current state} of the
96
+ * parse operation.
97
+ * @returns `Success` with the updated {@link Bcp47.Subtags | subtags}
98
+ * if a grandfathered tag is found, or `Success` with the supplied subtags
99
+ * if no matching grandfathered tag is found.
100
+ * @
101
+ * @internal
102
+ */
103
+ static _parseGrandfatheredTag(state) {
104
+ const grandfathered = state.iana.subtags.grandfathered.tryGet(state.tag);
105
+ if (grandfathered) {
106
+ state.parsedSubtags.grandfathered = state.tag;
107
+ // we consumed the whole thing
108
+ state.subtags.splice(0, state.subtags.length);
109
+ state.next = undefined;
110
+ }
111
+ return (0, ts_utils_1.succeed)(state.parsedSubtags);
112
+ }
113
+ /**
114
+ * Parses the primary language subtag of a supplied language tag.
115
+ * @param state - The {@link Bcp47.ParserState | current state} of the
116
+ * parse operation.
117
+ * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}
118
+ * updated to include the primary language subtag, or `Failure` with details if an error
119
+ * occurs.
120
+ * @internal
121
+ */
122
+ static _parsePrimaryLanguage(state) {
123
+ // primary language subtag is required unless the entire tag is grandfathered or consists
124
+ // of only private tags
125
+ if (state.iana.subtags.languages.isWellFormed(state.next)) {
126
+ state.parsedSubtags.primaryLanguage = state.next;
127
+ state.next = state.subtags.shift();
128
+ return (0, ts_utils_1.succeed)(state.parsedSubtags);
129
+ }
130
+ else if (state.parsedSubtags.grandfathered !== undefined) {
131
+ return (0, ts_utils_1.succeed)(state.parsedSubtags);
132
+ }
133
+ else if (bcp47Subtags_1.Validate.privateUsePrefix.isWellFormed(state.next)) {
134
+ // just return with no primary language and the private tag
135
+ // parser will be invoked by the parent flow.
136
+ return (0, ts_utils_1.succeed)(state.parsedSubtags);
137
+ }
138
+ return (0, ts_utils_1.fail)(`${state.tag}: no primary language subtag`);
139
+ }
140
+ /**
141
+ * Parses the extlang subtag(s) of a supplied language tag.
142
+ * @param state - The {@link Bcp47.ParserState | current state} of the
143
+ * parse operation.
144
+ * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}
145
+ * updated to include extlang subtags if present, or `Failure` with details if an error
146
+ * occurs.
147
+ * @internal
148
+ */
149
+ static _parseExtlang(state) {
150
+ // optional extlangs subtags
151
+ while (state.iana.subtags.extlangs.isWellFormed(state.next)) {
152
+ if (state.parsedSubtags.extlangs === undefined) {
153
+ state.parsedSubtags.extlangs = [state.next];
154
+ }
155
+ else if (state.parsedSubtags.extlangs.length < 3) {
156
+ state.parsedSubtags.extlangs.push(state.next);
157
+ }
158
+ else {
159
+ return (0, ts_utils_1.fail)(`${state.next}: too many extlang subtags`);
160
+ }
161
+ state.next = state.subtags.shift();
162
+ }
163
+ return (0, ts_utils_1.succeed)(state.parsedSubtags);
164
+ }
165
+ /**
166
+ * Parses the script subtag of a supplied language tag.
167
+ * @param state - The {@link Bcp47.ParserState | current state} of the
168
+ * parse operation.
169
+ * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}
170
+ * updated to include the script subtag if present, or `Failure` with details if an error
171
+ * occurs.
172
+ * @internal
173
+ */
174
+ static _parseScript(state) {
175
+ // optional script subtag
176
+ if (state.iana.subtags.scripts.isWellFormed(state.next)) {
177
+ state.parsedSubtags.script = state.next;
178
+ state.next = state.subtags.shift();
179
+ }
180
+ return (0, ts_utils_1.succeed)(state.parsedSubtags);
181
+ }
182
+ /**
183
+ * Parses the region subtag of a supplied language tag.
184
+ * @param state - The {@link Bcp47.ParserState | current state} of the
185
+ * parse operation.
186
+ * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}
187
+ * updated to include the region subtag if present, or `Failure` with details if an error
188
+ * occurs.
189
+ * @internal
190
+ */
191
+ static _parseRegion(state) {
192
+ // optional region subtag
193
+ if (state.iana.subtags.regions.isWellFormed(state.next)) {
194
+ state.parsedSubtags.region = state.next;
195
+ state.next = state.subtags.shift();
196
+ }
197
+ return (0, ts_utils_1.succeed)(state.parsedSubtags);
198
+ }
199
+ /**
200
+ * Parses the variant subtag(s) of a supplied language tag.
201
+ * @param state - The {@link Bcp47.ParserState | current state} of the
202
+ * parse operation.
203
+ * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}
204
+ * updated to include the variant subtags if present, or `Failure` with details if an error
205
+ * occurs.
206
+ * @internal
207
+ */
208
+ static _parseVariants(state) {
209
+ // optional variant subtags
210
+ while (state.iana.subtags.variants.isWellFormed(state.next)) {
211
+ if (state.parsedSubtags.variants === undefined) {
212
+ state.parsedSubtags.variants = [state.next];
213
+ }
214
+ else {
215
+ state.parsedSubtags.variants.push(state.next);
216
+ }
217
+ state.next = state.subtags.shift();
218
+ }
219
+ return (0, ts_utils_1.succeed)(state.parsedSubtags);
220
+ }
221
+ /**
222
+ * Parses the extension subtag(s) of a supplied language tag.
223
+ * @param state - The {@link Bcp47.ParserState | current state} of the
224
+ * parse operation.
225
+ * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}
226
+ * updated to include the extension subtags if present, or `Failure` with details if an error
227
+ * occurs.
228
+ * @internal
229
+ */
230
+ static _parseExtensions(state) {
231
+ // optional extension subtags
232
+ while (state.next !== undefined && bcp47Subtags_1.Validate.extensionSingleton.isWellFormed(state.next)) {
233
+ const singleton = state.next;
234
+ const values = [];
235
+ state.next = state.subtags.shift();
236
+ while (bcp47Subtags_1.Validate.extensionSubtag.isWellFormed(state.next)) {
237
+ values.push(state.next);
238
+ state.next = state.subtags.shift();
239
+ }
240
+ if (state.next !== undefined &&
241
+ !bcp47Subtags_1.Validate.extensionSingleton.isWellFormed(state.next) &&
242
+ !bcp47Subtags_1.Validate.extensionSingleton.isWellFormed(state.next)) {
243
+ return (0, ts_utils_1.fail)(`${state.next}: malformed extension subtag`);
244
+ }
245
+ else if (values.length < 1) {
246
+ return (0, ts_utils_1.fail)(`${state.tag}: extension '${singleton}' must have at least one subtag.`);
247
+ }
248
+ const value = values.join('-');
249
+ if (state.parsedSubtags.extensions === undefined) {
250
+ state.parsedSubtags.extensions = [{ singleton, value }];
251
+ }
252
+ else {
253
+ state.parsedSubtags.extensions.push({ singleton, value });
254
+ }
255
+ }
256
+ return (0, ts_utils_1.succeed)(state.parsedSubtags);
257
+ }
258
+ /**
259
+ * Parses the private use subtags of a supplied language tag.
260
+ * @param state - The {@link Bcp47.ParserState | current state} of the
261
+ * parse operation.
262
+ * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}
263
+ * updated to include the private-use subtags if present, or `Failure` with details if an error
264
+ * occurs.
265
+ * @internal
266
+ */
267
+ static _parsePrivateSubtags(state) {
268
+ // optional private use subtags
269
+ while (state.next != undefined && bcp47Subtags_1.Validate.privateUsePrefix.isWellFormed(state.next)) {
270
+ const values = [];
271
+ state.next = state.subtags.shift();
272
+ while (state.next &&
273
+ !bcp47Subtags_1.Validate.privateUsePrefix.isWellFormed(state.next) &&
274
+ Iana.LanguageSubtags.Validate.extendedLanguageRange.isWellFormed(state.next)) {
275
+ values.push(state.next);
276
+ state.next = state.subtags.shift();
277
+ }
278
+ if (state.next !== undefined && !bcp47Subtags_1.Validate.privateUsePrefix.isWellFormed(state.next)) {
279
+ return (0, ts_utils_1.fail)(`${state.next}: malformed private-use subtag`);
280
+ }
281
+ else if (values.length < 1) {
282
+ return (0, ts_utils_1.fail)(`${state.tag}: private-use tag must have at least one subtag.`);
283
+ }
284
+ const value = values.join('-');
285
+ if (state.parsedSubtags.privateUse === undefined) {
286
+ state.parsedSubtags.privateUse = [value];
287
+ }
288
+ else {
289
+ state.parsedSubtags.privateUse.push(value);
290
+ }
291
+ }
292
+ return (0, ts_utils_1.succeed)(state.parsedSubtags);
293
+ }
294
+ /**
295
+ * Verifies {@link Bcp47.ParserState | parser state} at the end of a parse operation.
296
+ * @param state - The {@link Bcp47.ParserState | current state} of the
297
+ * parse operation.
298
+ * @returns `Success` if the tag was fully consumed, or `Failure` with details
299
+ * if unexpected subtags remain to be parsed.
300
+ * @internal
301
+ */
302
+ static _parseTagEnd(state) {
303
+ if (state.next !== undefined) {
304
+ return (0, ts_utils_1.fail)(`${state.next}: unexpected subtag`);
305
+ }
306
+ return (0, ts_utils_1.succeed)(state.parsedSubtags);
307
+ }
308
+ }
309
+ exports.LanguageTagParser = LanguageTagParser;
310
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZ3VhZ2VUYWdQYXJzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmNwNDcvbGFuZ3VhZ2VUYWdQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCw4Q0FBZ0M7QUFFaEMsNENBQTJFO0FBSTNFLGlEQUEwQztBQWExQzs7R0FFRztBQUNILE1BQWEsaUJBQWlCO0lBQzFCLHVCQUF1QjtJQUN2QixnRUFBZ0U7SUFDaEUsZ0JBQXVCLENBQUM7SUFFeEI7Ozs7Ozs7Ozs7T0FVRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBVyxFQUFFLElBQThCO1FBQzNELHVCQUF1QjtRQUN2QixJQUFJLEdBQUcsSUFBSSxhQUFKLElBQUksY0FBSixJQUFJLEdBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDO1FBQ3pELE1BQU0sTUFBTSxHQUFnQjtZQUN4QixHQUFHO1lBQ0gsSUFBSTtZQUNKLE9BQU8sRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztZQUN2QixhQUFhLEVBQUUsRUFBRTtTQUNwQixDQUFDO1FBQ0YsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXJDLE9BQU8sSUFBQSxxQkFBVSxFQUNiO1lBQ0ksSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQztZQUNuQyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQzFCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO1lBQzNCLElBQUksQ0FBQyxnQkFB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Q3hDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ08sTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFrQjtRQUM1QyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQzFCLE9BQU8sSUFBQSxlQUFJLEVBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxDQUFDO1NBQ25EO1FBQ0QsT0FBTyxJQUFBLGtCQUFPLEVBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7Q0FDSjtBQTVRRCw4Q0E0UUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0ICogYXMgSWFuYSBmcm9tICcuLi9pYW5hJztcblxuaW1wb3J0IHsgUmVzdWx0LCBTdWNjZXNzLCBhbGxTdWNjZWVkLCBmYWlsLCBzdWNjZWVkIH0gZnJvbSAnQGZndi90cy11dGlscyc7XG5cbmltcG9ydCB7IEV4dGVuc2lvblN1YnRhZyB9IGZyb20gJy4vYmNwNDdTdWJ0YWdzL21vZGVsJztcbmltcG9ydCB7IFN1YnRhZ3MgfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgeyBWYWxpZGF0ZSB9IGZyb20gJy4vYmNwNDdTdWJ0YWdzJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuaW50ZXJmYWNlIFBhcnNlclN0YXRlIHtcbiAgICByZWFkb25seSBpYW5hOiBJYW5hLkxhbmd1YWdlUmVnaXN0cmllcztcbiAgICByZWFkb25seSB0YWc6IHN0cmluZztcbiAgICByZWFkb25seSBzdWJ0YWdzOiBzdHJpbmdbXTtcbiAgICByZWFkb25seSBwYXJzZWRTdWJ0YWdzOiBTdWJ0YWdzO1xuICAgIG5leHQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgTGFuZ3VhZ2VUYWdQYXJzZXIge1xuICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgQkNQLTQ3ICh7QGxpbmsgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzU2NDYuaHRtbCB8IFJGQyA1NjQ2fSlcbiAgICAgKiBsYW5ndWFnZSB0YWcsIHRvIHByb2R1Y2UgYSB7QGxpbmsgQmNwNDcuU3VidGFncyB8IFN1YnRhZ3N9IG9iamVjdCB3aGljaFxuICAgICAqIGJyZWFrcyBvdXQgZWFjaCBvZiB0aGUgc3VidGFncy5cbiAgICAgKiBAcGFyYW0gdGFnIC0gVGhlIGBzdHJpbmdgIGxhbmd1YWdlIHRhZyB0byBiZSBwYXJzZWQuXG4gICAgICogQHBhcmFtIGlhbmEgLSBPcHRpb25hbCB7QGxpbmsgSWFuYS5MYW5ndWFnZVJlZ2lzdHJpZXMgfCBJQU5BIGxhbmd1YWdlIHJlZ2lzdHJpZXN9XG4gICAgICogdG8gYmUgdXNlZC5cbiAgICAgKiBAcmV0dXJucyBgU3VjY2Vzc2Agd2l0aCB0aGUgcmVzdWx0aW5nIHtAbGluayBCY3A0Ny5TdWJ0YWdzIHwgc3VidGFnc31cbiAgICAgKiBvciBgRmFpbHVyZWAgd2l0aCBkZXRhaWxzIGlmIGFuIGVycm9yIG9jY3Vycy5cbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBwYXJzZSh0YWc6IHN0cmluZywgaWFuYT86IElhbmEuTGFuZ3VhZ2VSZWdpc3RyaWVzKTogUmVzdWx0PFN1YnRhZ3M+IHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgaWFuYSA9IGlhbmEgPz8gSWFuYS5EZWZhdWx0UmVnaXN0cmllcy5sYW5ndWFnZVJlZ2lzdHJpZXM7XG4gICAgICAgIGNvbnN0IHN0YXR1czogUGFyc2VyU3RhdGUgPSB7XG4gICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICBpYW5hLFxuICAgICAgICAgICAgc3VidGFnczogdGFnLnNwbGl0KCctJyksXG4gICAgICAgICAgICBwYXJzZWRTdWJ0YWdzOiB7fSxcbiAgICAgICAgfTtcbiAgICAgICAgc3RhdHVzLm5leHQgPSBzdGF0dXMuc3VidGFncy5zaGlmdCgpO1xuXG4gICAgICAgIHJldHVybiBhbGxTdWNjZWVkKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhcnNlR3JhbmRmYXRoZXJlZFRhZyhzdGF0dXMpLFxuICAgICAgICAgICAgICAgIHRoaXMuX3BhcnNlUHJpbWFyeUxhbmd1YWdlKHN0YXR1cyksXG4gICAgICAgICAgICAgICAgdGhpcy5fcGFyc2VFeHRsYW5nKHN0YXR1cyksXG4gICAgICAgICAgICAgICAgdGhpcy5fcGFyc2VTY3JpcHQoc3RhdHVzKSxcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXJzZVJlZ2lvbihzdGF0dXMpLFxuICAgICAgICAgICAgICAgIHRoaXMuX3BhcnNlVmFyaWFudHMoc3RhdHVzKSxcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXJzZUV4dGVuc2lvbnMoc3RhdHVzKSxcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXJzZVByaXZhdGVTdWJ0YWdzKHN0YXR1cyksXG4gICAgICAgICAgICAgICAgdGhpcy5fcGFyc2VUYWdFbmQoc3RhdHVzKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBzdGF0dXNcbiAgICAgICAgKS5vblN1Y2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQoc3RhdHVzLnBhcnNlZFN1YnRhZ3MpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBlbnRpcmUgdGFnIG1hdGNoZXMgYSByZWdpc3RlcmVkIGdyYW5kZmF0aGVyZWQgdGFnLlxuICAgICAqIEBwYXJhbSBzdGF0ZSAtIFRoZSB7QGxpbmsgQmNwNDcuUGFyc2VyU3RhdGUgfCBjdXJyZW50IHN0YXRlfSBvZiB0aGVcbiAgICAgKiBwYXJzZSBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgYFN1Y2Nlc3NgIHdpdGggdGhlIHVwZGF0ZWQge0BsaW5rIEJjcDQ3LlN1YnRhZ3MgfCBzdWJ0YWdzfVxuICAgICAqIGlmIGEgZ3JhbmRmYXRoZXJlZCB0YWcgaXMgZm91bmQsIG9yIGBTdWNjZXNzYCB3aXRoIHRoZSBzdXBwbGllZCBzdWJ0YWdzXG4gICAgICogaWYgbm8gbWF0Y2hpbmcgZ3JhbmRmYXRoZXJlZCB0YWcgaXMgZm91bmQuXG4gICAgICogQFxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzdGF0aWMgX3BhcnNlR3JhbmRmYXRoZXJlZFRhZyhzdGF0ZTogUGFyc2VyU3RhdGUpOiBTdWNjZXNzPFN1YnRhZ3M+IHtcbiAgICAgICAgY29uc3QgZ3JhbmRmYXRoZXJlZCA9IHN0YXRlLmlhbmEuc3VidGFncy5ncmFuZGZhdGhlcmVkLnRyeUdldChzdGF0ZS50YWcpO1xuICAgICAgICBpZiAoZ3JhbmRmYXRoZXJlZCkge1xuICAgICAgICAgICAgc3RhdGUucGFyc2VkU3VidGFncy5ncmFuZGZhdGhlcmVkID0gc3RhdGUudGFnIGFzIElhbmEuTGFuZ3VhZ2VTdWJ0YWdzLkdyYW5kZmF0aGVyZWRUYWc7XG4gICAgICAgICAgICAvLyB3ZSBjb25zdW1lZCB0aGUgd2hvbGUgdGhpbmdcbiAgICAgICAgICAgIHN0YXRlLnN1YnRhZ3Muc3BsaWNlKDAsIHN0YXRlLnN1YnRhZ3MubGVuZ3RoKTtcbiAgICAgICAgICAgIHN0YXRlLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQoc3RhdGUucGFyc2VkU3VidGFncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHRoZSBwcmltYXJ5IGxhbmd1YWdlIHN1YnRhZyBvZiBhIHN1cHBsaWVkIGxhbmd1YWdlIHRhZy5cbiAgICAgKiBAcGFyYW0gc3RhdGUgLSBUaGUge0BsaW5rIEJjcDQ3LlBhcnNlclN0YXRlIHwgY3VycmVudCBzdGF0ZX0gb2YgdGhlXG4gICAgICogcGFyc2Ugb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIGBTdWNjZXNzYCB3aXRoIHN1cHBsaWVkIHtAbGluayBCY3A0Ny5TdWJ0YWdzIHwgc3VidGFnc31cbiAgICAgKiB1cGRhdGVkIHRvIGluY2x1ZGUgdGhlIHByaW1hcnkgbGFuZ3VhZ2Ugc3VidGFnLCBvciBgRmFpbHVyZWAgd2l0aCBkZXRhaWxzIGlmIGFuIGVycm9yXG4gICAgICogb2NjdXJzLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzdGF0aWMgX3BhcnNlUHJpbWFyeUxhbmd1YWdlKHN0YXRlOiBQYXJzZXJTdGF0ZSk6IFJlc3VsdDxTdWJ0YWdzPiB7XG4gICAgICAgIC8vIHByaW1hcnkgbGFuZ3VhZ2Ugc3VidGFnIGlzIHJlcXVpcmVkIHVubGVzcyB0aGUgZW50aXJlIHRhZyBpcyBncmFuZGZhdGhlcmVkIG9yIGNvbnNpc3RzXG4gICAgICAgIC8vIG9mIG9ubHkgcHJpdmF0ZSB0YWdzXG4gICAgICAgIGlmIChzdGF0ZS5pYW5hLnN1YnRhZ3MubGFuZ3VhZ2VzLmlzV2VsbEZvcm1lZChzdGF0ZS5uZXh0KSkge1xuICAgICAgICAgICAgc3RhdGUucGFyc2VkU3VidGFncy5wcmltYXJ5TGFuZ3VhZ2UgPSBzdGF0ZS5uZXh0O1xuICAgICAgICAgICAgc3RhdGUubmV4dCA9IHN0YXRlLnN1YnRhZ3Muc2hpZnQoKTtcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKHN0YXRlLnBhcnNlZFN1YnRhZ3MpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLnBhcnNlZFN1YnRhZ3MuZ3JhbmRmYXRoZXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZChzdGF0ZS5wYXJzZWRTdWJ0YWdzKTtcbiAgICAgICAgfSBlbHNlIGlmIChWYWxpZGF0ZS5wcml2YXRlVXNlUHJlZml4LmlzV2VsbEZvcm1lZChzdGF0ZS5uZXh0KSkge1xuICAgICAgICAgICAgLy8ganVzdCByZXR1cm4gd2l0aCBubyBwcmltYXJ5IGxhbmd1YWdlIGFuZCB0aGUgcHJpdmF0ZSB0YWdcbiAgICAgICAgICAgIC8vIHBhcnNlciB3aWxsIGJlIGludm9rZWQgYnkgdGhlIHBhcmVudCBmbG93LlxuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQoc3RhdGUucGFyc2VkU3VidGFncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwoYCR7c3RhdGUudGFnfTogbm8gcHJpbWFyeSBsYW5ndWFnZSBzdWJ0YWdgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgdGhlIGV4dGxhbmcgc3VidGFnKHMpIG9mIGEgc3VwcGxpZWQgbGFuZ3VhZ2UgdGFnLlxuICAgICAqIEBwYXJhbSBzdGF0ZSAtIFRoZSB7QGxpbmsgQmNwNDcuUGFyc2VyU3RhdGUgfCBjdXJyZW50IHN0YXRlfSBvZiB0aGVcbiAgICAgKiBwYXJzZSBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgYFN1Y2Nlc3NgIHdpdGggc3VwcGxpZWQge0BsaW5rIEJjcDQ3LlN1YnRhZ3MgfCBzdWJ0YWdzfVxuICAgICAqIHVwZGF0ZWQgdG8gaW5jbHVkZSBleHRsYW5nIHN1YnRhZ3MgaWYgcHJlc2VudCwgb3IgYEZhaWx1cmVgIHdpdGggZGV0YWlscyBpZiBhbiBlcnJvclxuICAgICAqIG9jY3Vycy5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9wYXJzZUV4dGxhbmcoc3RhdGU6IFBhcnNlclN0YXRlKTogUmVzdWx0PFN1YnRhZ3M+IHtcbiAgICAgICAgLy8gb3B0aW9uYWwgZXh0bGFuZ3Mgc3VidGFnc1xuICAgICAgICB3aGlsZSAoc3RhdGUuaWFuYS5zdWJ0YWdzLmV4dGxhbmdzLmlzV2VsbEZvcm1lZChzdGF0ZS5uZXh0KSkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLnBhcnNlZFN1YnRhZ3MuZXh0bGFuZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHN0YXRlLnBhcnNlZFN1YnRhZ3MuZXh0bGFuZ3MgPSBbc3RhdGUubmV4dF07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLnBhcnNlZFN1YnRhZ3MuZXh0bGFuZ3MubGVuZ3RoIDwgMykge1xuICAgICAgICAgICAgICAgIHN0YXRlLnBhcnNlZFN1YnRhZ3MuZXh0bGFuZ3MucHVzaChzdGF0ZS5uZXh0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7c3RhdGUubmV4dH06IHRvbyBtYW55IGV4dGxhbmcgc3VidGFnc2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGUubmV4dCA9IHN0YXRlLnN1YnRhZ3Muc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VjY2VlZChzdGF0ZS5wYXJzZWRTdWJ0YWdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgdGhlIHNjcmlwdCBzdWJ0YWcgb2YgYSBzdXBwbGllZCBsYW5ndWFnZSB0YWcuXG4gICAgICogQHBhcmFtIHN0YXRlIC0gVGhlIHtAbGluayBCY3A0Ny5QYXJzZXJTdGF0ZSB8IGN1cnJlbnQgc3RhdGV9IG9mIHRoZVxuICAgICAqIHBhcnNlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBgU3VjY2Vzc2Agd2l0aCBzdXBwbGllZCB7QGxpbmsgQmNwNDcuU3VidGFncyB8IHN1YnRhZ3N9XG4gICAgICogdXBkYXRlZCB0byBpbmNsdWRlIHRoZSBzY3JpcHQgc3VidGFnIGlmIHByZXNlbnQsIG9yIGBGYWlsdXJlYCB3aXRoIGRldGFpbHMgaWYgYW4gZXJyb3JcbiAgICAgKiBvY2N1cnMuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfcGFyc2VTY3JpcHQoc3RhdGU6IFBhcnNlclN0YXRlKTogUmVzdWx0PFN1YnRhZ3M+IHtcbiAgICAgICAgLy8gb3B0aW9uYWwgc2NyaXB0IHN1YnRhZ1xuICAgICAgICBpZiAoc3RhdGUuaWFuYS5zdWJ0YWdzLnNjcmlwdHMuaXNXZWxsRm9ybWVkKHN0YXRlLm5leHQpKSB7XG4gICAgICAgICAgICBzdGF0ZS5wYXJzZWRTdWJ0YWdzLnNjcmlwdCA9IHN0YXRlLm5leHQ7XG4gICAgICAgICAgICBzdGF0ZS5uZXh0ID0gc3RhdGUuc3VidGFncy5zaGlmdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZWVkKHN0YXRlLnBhcnNlZFN1YnRhZ3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyB0aGUgcmVnaW9uIHN1YnRhZyBvZiBhIHN1cHBsaWVkIGxhbmd1YWdlIHRhZy5cbiAgICAgKiBAcGFyYW0gc3RhdGUgLSBUaGUge0BsaW5rIEJjcDQ3LlBhcnNlclN0YXRlIHwgY3VycmVudCBzdGF0ZX0gb2YgdGhlXG4gICAgICogcGFyc2Ugb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIGBTdWNjZXNzYCB3aXRoIHN1cHBsaWVkIHtAbGluayBCY3A0Ny5TdWJ0YWdzIHwgc3VidGFnc31cbiAgICAgKiB1cGRhdGVkIHRvIGluY2x1ZGUgdGhlIHJlZ2lvbiBzdWJ0YWcgaWYgcHJlc2VudCwgb3IgYEZhaWx1cmVgIHdpdGggZGV0YWlscyBpZiBhbiBlcnJvclxuICAgICAqIG9jY3Vycy5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9wYXJzZVJlZ2lvbihzdGF0ZTogUGFyc2VyU3RhdGUpOiBSZXN1bHQ8U3VidGFncz4ge1xuICAgICAgICAvLyBvcHRpb25hbCByZWdpb24gc3VidGFnXG4gICAgICAgIGlmIChzdGF0ZS5pYW5hLnN1YnRhZ3MucmVnaW9ucy5pc1dlbGxGb3JtZWQoc3RhdGUubmV4dCkpIHtcbiAgICAgICAgICAgIHN0YXRlLnBhcnNlZFN1YnRhZ3MucmVnaW9uID0gc3RhdGUubmV4dDtcbiAgICAgICAgICAgIHN0YXRlLm5leHQgPSBzdGF0ZS5zdWJ0YWdzLnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQoc3RhdGUucGFyc2VkU3VidGFncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHRoZSB2YXJpYW50IHN1YnRhZyhzKSBvZiBhIHN1cHBsaWVkIGxhbmd1YWdlIHRhZy5cbiAgICAgKiBAcGFyYW0gc3RhdGUgLSBUaGUge0BsaW5rIEJjcDQ3LlBhcnNlclN0YXRlIHwgY3VycmVudCBzdGF0ZX0gb2YgdGhlXG4gICAgICogcGFyc2Ugb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIGBTdWNjZXNzYCB3aXRoIHN1cHBsaWVkIHtAbGluayBCY3A0Ny5TdWJ0YWdzIHwgc3VidGFnc31cbiAgICAgKiB1cGRhdGVkIHRvIGluY2x1ZGUgdGhlIHZhcmlhbnQgc3VidGFncyBpZiBwcmVzZW50LCBvciBgRmFpbHVyZWAgd2l0aCBkZXRhaWxzIGlmIGFuIGVycm9yXG4gICAgICogb2NjdXJzLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzdGF0aWMgX3BhcnNlVmFyaWFudHMoc3RhdGU6IFBhcnNlclN0YXRlKTogUmVzdWx0PFN1YnRhZ3M+IHtcbiAgICAgICAgLy8gb3B0aW9uYWwgdmFyaWFudCBzdWJ0YWdzXG4gICAgICAgIHdoaWxlIChzdGF0ZS5pYW5hLnN1YnRhZ3MudmFyaWFudHMuaXNXZWxsRm9ybWVkKHN0YXRlLm5leHQpKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUucGFyc2VkU3VidGFncy52YXJpYW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUucGFyc2VkU3VidGFncy52YXJpYW50cyA9IFtzdGF0ZS5uZXh0XTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RhdGUucGFyc2VkU3VidGFncy52YXJpYW50cy5wdXNoKHN0YXRlLm5leHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGUubmV4dCA9IHN0YXRlLnN1YnRhZ3Muc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VjY2VlZChzdGF0ZS5wYXJzZWRTdWJ0YWdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgdGhlIGV4dGVuc2lvbiBzdWJ0YWcocykgb2YgYSBzdXBwbGllZCBsYW5ndWFnZSB0YWcuXG4gICAgICogQHBhcmFtIHN0YXRlIC0gVGhlIHtAbGluayBCY3A0Ny5QYXJzZXJTdGF0ZSB8IGN1cnJlbnQgc3RhdGV9IG9mIHRoZVxuICAgICAqIHBhcnNlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBgU3VjY2Vzc2Agd2l0aCBzdXBwbGllZCB7QGxpbmsgQmNwNDcuU3VidGFncyB8IHN1YnRhZ3N9XG4gICAgICogdXBkYXRlZCB0byBpbmNsdWRlIHRoZSBleHRlbnNpb24gc3VidGFncyBpZiBwcmVzZW50LCBvciBgRmFpbHVyZWAgd2l0aCBkZXRhaWxzIGlmIGFuIGVycm9yXG4gICAgICogb2NjdXJzLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzdGF0aWMgX3BhcnNlRXh0ZW5zaW9ucyhzdGF0ZTogUGFyc2VyU3RhdGUpOiBSZXN1bHQ8U3VidGFncz4ge1xuICAgICAgICAvLyBvcHRpb25hbCBleHRlbnNpb24gc3VidGFnc1xuICAgICAgICB3aGlsZSAoc3RhdGUubmV4dCAhPT0gdW5kZWZpbmVkICYmIFZhbGlkYXRlLmV4dGVuc2lvblNpbmdsZXRvbi5pc1dlbGxGb3JtZWQoc3RhdGUubmV4dCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNpbmdsZXRvbiA9IHN0YXRlLm5leHQ7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXM6IEV4dGVuc2lvblN1YnRhZ1tdID0gW107XG4gICAgICAgICAgICBzdGF0ZS5uZXh0ID0gc3RhdGUuc3VidGFncy5zaGlmdCgpO1xuXG4gICAgICAgICAgICB3aGlsZSAoVmFsaWRhdGUuZXh0ZW5zaW9uU3VidGFnLmlzV2VsbEZvcm1lZChzdGF0ZS5uZXh0KSkge1xuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHN0YXRlLm5leHQpO1xuICAgICAgICAgICAgICAgIHN0YXRlLm5leHQgPSBzdGF0ZS5zdWJ0YWdzLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgc3RhdGUubmV4dCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgIVZhbGlkYXRlLmV4dGVuc2lvblNpbmdsZXRvbi5pc1dlbGxGb3JtZWQoc3RhdGUubmV4dCkgJiZcbiAgICAgICAgICAgICAgICAhVmFsaWRhdGUuZXh0ZW5zaW9uU2luZ2xldG9uLmlzV2VsbEZvcm1lZChzdGF0ZS5uZXh0KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7c3RhdGUubmV4dH06IG1hbGZvcm1lZCBleHRlbnNpb24gc3VidGFnYCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlcy5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7c3RhdGUudGFnfTogZXh0ZW5zaW9uICcke3NpbmdsZXRvbn0nIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc3VidGFnLmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlcy5qb2luKCctJykgYXMgRXh0ZW5zaW9uU3VidGFnO1xuICAgICAgICAgICAgaWYgKHN0YXRlLnBhcnNlZFN1YnRhZ3MuZXh0ZW5zaW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUucGFyc2VkU3VidGFncy5leHRlbnNpb25zID0gW3sgc2luZ2xldG9uLCB2YWx1ZSB9XTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RhdGUucGFyc2VkU3VidGFncy5leHRlbnNpb25zLnB1c2goeyBzaW5nbGV0b24sIHZhbHVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZWVkKHN0YXRlLnBhcnNlZFN1YnRhZ3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyB0aGUgcHJpdmF0ZSB1c2Ugc3VidGFncyBvZiBhIHN1cHBsaWVkIGxhbmd1YWdlIHRhZy5cbiAgICAgKiBAcGFyYW0gc3RhdGUgLSBUaGUge0BsaW5rIEJjcDQ3LlBhcnNlclN0YXRlIHwgY3VycmVudCBzdGF0ZX0gb2YgdGhlXG4gICAgICogcGFyc2Ugb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIGBTdWNjZXNzYCB3aXRoIHN1cHBsaWVkIHtAbGluayBCY3A0Ny5TdWJ0YWdzIHwgc3VidGFnc31cbiAgICAgKiB1cGRhdGVkIHRvIGluY2x1ZGUgdGhlIHByaXZhdGUtdXNlIHN1YnRhZ3MgaWYgcHJlc2VudCwgb3IgYEZhaWx1cmVgIHdpdGggZGV0YWlscyBpZiBhbiBlcnJvclxuICAgICAqIG9jY3Vycy5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9wYXJzZVByaXZhdGVTdWJ0YWdzKHN0YXRlOiBQYXJzZXJTdGF0ZSk6IFJlc3VsdDxTdWJ0YWdzPiB7XG4gICAgICAgIC8vIG9wdGlvbmFsIHByaXZhdGUgdXNlIHN1YnRhZ3NcbiAgICAgICAgd2hpbGUgKHN0YXRlLm5leHQgIT0gdW5kZWZpbmVkICYmIFZhbGlkYXRlLnByaXZhdGVVc2VQcmVmaXguaXNXZWxsRm9ybWVkKHN0YXRlLm5leHQpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBzdGF0ZS5uZXh0ID0gc3RhdGUuc3VidGFncy5zaGlmdCgpO1xuXG4gICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgICAgc3RhdGUubmV4dCAmJlxuICAgICAgICAgICAgICAgICFWYWxpZGF0ZS5wcml2YXRlVXNlUHJlZml4LmlzV2VsbEZvcm1lZChzdGF0ZS5uZXh0KSAmJlxuICAgICAgICAgICAgICAgIElhbmEuTGFuZ3VhZ2VTdWJ0YWdzLlZhbGlkYXRlLmV4dGVuZGVkTGFuZ3VhZ2VSYW5nZS5pc1dlbGxGb3JtZWQoc3RhdGUubmV4dClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHN0YXRlLm5leHQpO1xuICAgICAgICAgICAgICAgIHN0YXRlLm5leHQgPSBzdGF0ZS5zdWJ0YWdzLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdGF0ZS5uZXh0ICE9PSB1bmRlZmluZWQgJiYgIVZhbGlkYXRlLnByaXZhdGVVc2VQcmVmaXguaXNXZWxsRm9ybWVkKHN0YXRlLm5leHQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7c3RhdGUubmV4dH06IG1hbGZvcm1lZCBwcml2YXRlLXVzZSBzdWJ0YWdgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVzLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtzdGF0ZS50YWd9OiBwcml2YXRlLXVzZSB0YWcgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzdWJ0YWcuYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzLmpvaW4oJy0nKSBhcyBJYW5hLkxhbmd1YWdlU3VidGFncy5FeHRlbmRlZExhbmd1YWdlUmFuZ2U7XG4gICAgICAgICAgICBpZiAoc3RhdGUucGFyc2VkU3VidGFncy5wcml2YXRlVXNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5wYXJzZWRTdWJ0YWdzLnByaXZhdGVVc2UgPSBbdmFsdWVdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5wYXJzZWRTdWJ0YWdzLnByaXZhdGVVc2UucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQoc3RhdGUucGFyc2VkU3VidGFncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmVyaWZpZXMge0BsaW5rIEJjcDQ3LlBhcnNlclN0YXRlIHwgcGFyc2VyIHN0YXRlfSBhdCB0aGUgZW5kIG9mIGEgcGFyc2Ugb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSBzdGF0ZSAtIFRoZSB7QGxpbmsgQmNwNDcuUGFyc2VyU3RhdGUgfCBjdXJyZW50IHN0YXRlfSBvZiB0aGVcbiAgICAgKiBwYXJzZSBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgYFN1Y2Nlc3NgIGlmIHRoZSB0YWcgd2FzIGZ1bGx5IGNvbnN1bWVkLCBvciBgRmFpbHVyZWAgd2l0aCBkZXRhaWxzXG4gICAgICogaWYgdW5leHBlY3RlZCBzdWJ0YWdzIHJlbWFpbiB0byBiZSBwYXJzZWQuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfcGFyc2VUYWdFbmQoc3RhdGU6IFBhcnNlclN0YXRlKTogUmVzdWx0PFN1YnRhZ3M+IHtcbiAgICAgICAgaWYgKHN0YXRlLm5leHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7c3RhdGUubmV4dH06IHVuZXhwZWN0ZWQgc3VidGFnYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQoc3RhdGUucGFyc2VkU3VidGFncyk7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,70 @@
1
+ import * as Iana from '../../iana';
2
+ import { LanguageSimilarityMatcher } from './similarity';
3
+ import { LanguageTag } from '../languageTag';
4
+ import { Subtags } from '../common';
5
+ /**
6
+ * Represents a single matching filtered language.
7
+ * @public
8
+ */
9
+ export interface MatchingLanguage {
10
+ /**
11
+ * Numeric indication of how well the language matches,
12
+ * from perfect (`1.0`) to not at all (`0.0`). When
13
+ * matching an ordered list, languages at the front of
14
+ * the desired language list are always higher quality.
15
+ */
16
+ quality: number;
17
+ /**
18
+ * The `string` tag of the matched language.
19
+ */
20
+ tag: string;
21
+ /**
22
+ * The matched {@link Bcp47.LanguageTag | language tag}.
23
+ */
24
+ languageTag: LanguageTag;
25
+ }
26
+ /**
27
+ * Options for {@link Bcp47.filter | language tag list filter} functions.
28
+ * @public
29
+ */
30
+ export interface LanguageChooserOptions {
31
+ /**
32
+ * Indicates whether to return the matching language from the
33
+ * desired list or the available list. Default is `'availableLanguage'`.
34
+ */
35
+ use?: 'desiredLanguage' | 'availableLanguage';
36
+ /**
37
+ * Indicates how to filter the language list - `'primaryLanguage'`
38
+ * indicates the each primary language should appear only once in
39
+ * the list in its most similar form. A filter value of `'none'`
40
+ * reports all matching variants of any primary language in order
41
+ * of similarity. Default is `'primaryLanguage'`
42
+ */
43
+ filter?: 'primaryLanguage' | 'none';
44
+ /**
45
+ * An optional {@link Bcp47.LanguageSpec | language specification}
46
+ * indicating a language to be returned if the filter call would
47
+ * otherwise return an empty list (i.e. no languages match).
48
+ */
49
+ ultimateFallback?: string | Subtags | LanguageTag;
50
+ }
51
+ /**
52
+ * Default values for a{@link Bcp47.LanguageFilterOptions}.
53
+ * @public
54
+ */
55
+ export declare const defaultLanguageChooserOptions: LanguageChooserOptions;
56
+ /**
57
+ * Helper to compare a list of 'desired' languages to a list of 'available' language
58
+ * and return the intersection in order of preference, taking tag semantics into account.
59
+ * @public
60
+ */
61
+ export declare class LanguageChooser {
62
+ /**
63
+ * @internal
64
+ */
65
+ protected readonly _matcher: LanguageSimilarityMatcher;
66
+ constructor(iana?: Iana.LanguageRegistries);
67
+ chooseLanguageTagsWithDetails(desiredLanguages: LanguageTag[], availableLanguages: LanguageTag[], options?: LanguageChooserOptions): MatchingLanguage[];
68
+ filterLanguageTags(desiredLanguages: LanguageTag[], availableLanguages: LanguageTag[], options?: LanguageChooserOptions): LanguageTag[];
69
+ }
70
+ //# sourceMappingURL=chooser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chooser.d.ts","sourceRoot":"","sources":["../../../src/bcp47/match/chooser.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC7B;;;;;OAKG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;OAEG;IACH,WAAW,EAAE,WAAW,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACnC;;;OAGG;IACH,GAAG,CAAC,EAAE,iBAAiB,GAAG,mBAAmB,CAAC;IAE9C;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAAC;IAEpC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,WAAW,CAAC;CACrD;AAED;;;GAGG;AACH,eAAO,MAAM,6BAA6B,EAAE,sBAG1C,CAAC;AAEH;;;;GAIG;AACH,qBAAa,eAAe;IACxB;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;gBAEpC,IAAI,CAAC,EAAE,IAAI,CAAC,kBAAkB;IAI1C,6BAA6B,CAChC,gBAAgB,EAAE,WAAW,EAAE,EAC/B,kBAAkB,EAAE,WAAW,EAAE,EACjC,OAAO,CAAC,EAAE,sBAAsB,GACjC,gBAAgB,EAAE;IAgDd,kBAAkB,CACrB,gBAAgB,EAAE,WAAW,EAAE,EAC/B,kBAAkB,EAAE,WAAW,EAAE,EACjC,OAAO,CAAC,EAAE,sBAAsB,GACjC,WAAW,EAAE;CAGnB"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2022 Erik Fortune
4
+ *
5
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ * of this software and associated documentation files (the "Software"), to deal
7
+ * in the Software without restriction, including without limitation the rights
8
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ * copies of the Software, and to permit persons to whom the Software is
10
+ * furnished to do so, subject to the following conditions:
11
+ *
12
+ * The above copyright notice and this permission notice shall be included in all
13
+ * copies or substantial portions of the Software.
14
+ *
15
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ * SOFTWARE.
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.LanguageChooser = exports.defaultLanguageChooserOptions = void 0;
25
+ const similarity_1 = require("./similarity");
26
+ const languageTag_1 = require("../languageTag");
27
+ /**
28
+ * Default values for a{@link Bcp47.LanguageFilterOptions}.
29
+ * @public
30
+ */
31
+ exports.defaultLanguageChooserOptions = Object.freeze({
32
+ use: 'availableLanguage',
33
+ filter: 'primaryLanguage',
34
+ });
35
+ /**
36
+ * Helper to compare a list of 'desired' languages to a list of 'available' language
37
+ * and return the intersection in order of preference, taking tag semantics into account.
38
+ * @public
39
+ */
40
+ class LanguageChooser {
41
+ constructor(iana) {
42
+ this._matcher = new similarity_1.LanguageSimilarityMatcher(iana);
43
+ }
44
+ chooseLanguageTagsWithDetails(desiredLanguages, availableLanguages, options) {
45
+ var _a;
46
+ const matched = new Map();
47
+ const decrement = desiredLanguages.length < 10 ? 0.1 : 1.0 / desiredLanguages.length;
48
+ let base = 1.0;
49
+ // fill any missing fields from the default
50
+ options = { ...exports.defaultLanguageChooserOptions, ...options };
51
+ for (const want of desiredLanguages) {
52
+ base -= decrement;
53
+ for (const have of availableLanguages) {
54
+ const similarity = this._matcher.matchLanguageTags(want, have);
55
+ if (similarity > 0.0) {
56
+ const quality = base + similarity * decrement;
57
+ const languageTag = options.use === 'availableLanguage' ? have : want;
58
+ const tag = languageTag.tag;
59
+ const key = options.filter === 'primaryLanguage' ? (_a = languageTag.subtags.primaryLanguage) !== null && _a !== void 0 ? _a : tag : tag;
60
+ const match = {
61
+ quality,
62
+ tag,
63
+ languageTag,
64
+ };
65
+ const existing = matched.get(key);
66
+ if (!existing || existing.quality < quality) {
67
+ matched.set(key, match);
68
+ }
69
+ }
70
+ }
71
+ }
72
+ const values = Array.from(matched.values());
73
+ if (values.length > 1) {
74
+ // want descending order
75
+ values.sort((m1, m2) => m2.quality - m1.quality);
76
+ }
77
+ else if (values.length === 0 && options.ultimateFallback) {
78
+ const languageTag = options.ultimateFallback instanceof languageTag_1.LanguageTag
79
+ ? options.ultimateFallback
80
+ : languageTag_1.LanguageTag.create(options.ultimateFallback).orDefault();
81
+ if (languageTag) {
82
+ return [{ languageTag, tag: languageTag.tag, quality: 0 }];
83
+ }
84
+ }
85
+ return values;
86
+ }
87
+ filterLanguageTags(desiredLanguages, availableLanguages, options) {
88
+ return this.chooseLanguageTagsWithDetails(desiredLanguages, availableLanguages, options).map((t) => t.languageTag);
89
+ }
90
+ }
91
+ exports.LanguageChooser = LanguageChooser;
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hvb3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iY3A0Ny9tYXRjaC9jaG9vc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7OztBQUlILDZDQUF5RDtBQUN6RCxnREFBNkM7QUFxRDdDOzs7R0FHRztBQUNVLFFBQUEsNkJBQTZCLEdBQTJCLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDL0UsR0FBRyxFQUFFLG1CQUFtQjtJQUN4QixNQUFNLEVBQUUsaUJBQWlCO0NBQzVCLENBQUMsQ0FBQztBQUVIOzs7O0dBSUc7QUFDSCxNQUFhLGVBQWU7SUFNeEIsWUFBbUIsSUFBOEI7UUFDN0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHNDQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFTSw2QkFBNkIsQ0FDaEMsZ0JBQStCLEVBQy9CLGtCQUFpQyxFQUNqQyxPQUFnQzs7UUFFaEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7UUFDcEQsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO1FBQ3JGLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUVmLDJDQUEyQztRQUMzQyxPQUFPLEdBQUcsRUFBRSxHQUFHLHFDQUE2QixFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7UUFFM0QsS0FBSyxNQUFNLElBQUksSUFBSSxnQkFBZ0IsRUFBRTtZQUNqQyxJQUFJLElBQUksU0FBUyxDQUFDO1lBQ2xCLEtBQUssTUFBTSxJQUFJLElBQUksa0JBQWtCLEVBQUU7Z0JBQ25DLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLFVBQVUsR0FBRyxHQUFHLEVBQUU7b0JBQ2xCLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxVQUFVLEdBQUcsU0FBUyxDQUFDO29CQUM5QyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxLQUFLLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztvQkFDdEUsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQztvQkFDNUIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BQU0sS0FBSyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsTUFBQSxXQUFXLENBQUMsT0FBTyxDQUFDLGVBQWUsbUNBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7b0JBRXBHLE1BQU0sS0FBSyxHQUFxQjt3QkFDNUIsT0FBTzt3QkFDUCxHQUFHO3dCQUNILFdBQVc7cUJBQ2QsQ0FBQztvQkFFRixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNsQyxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxPQUFPLEdBQUcsT0FBTyxFQUFFO3dCQUN6QyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztxQkFDM0I7aUJBQ0o7YUFDSjtTQUNKO1FBRUQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUM1QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25CLHdCQUF3QjtZQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDcEQ7YUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtZQUN4RCxNQUFNLFdBQVcsR0FDYixPQUFPLENBQUMsZ0JBQWdCLFlBQVkseUJBQVc7Z0JBQzNDLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCO2dCQUMxQixDQUFDLENBQUMseUJBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkUsSUFBSSxXQUFXLEVBQUU7Z0JBQ2IsT0FBTyxDQUFDLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzlEO1NBQ0o7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRU0sa0JBQWtCLENBQ3JCLGdCQUErQixFQUMvQixrQkFBaUMsRUFDakMsT0FBZ0M7UUFFaEMsT0FBTyxJQUFJLENBQUMsNkJBQTZCLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkgsQ0FBQztDQUNKO0FBckVELDBDQXFFQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgRXJpayBGb3J0dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBJYW5hIGZyb20gJy4uLy4uL2lhbmEnO1xuXG5pbXBvcnQgeyBMYW5ndWFnZVNpbWlsYXJpdHlNYXRjaGVyIH0gZnJvbSAnLi9zaW1pbGFyaXR5JztcbmltcG9ydCB7IExhbmd1YWdlVGFnIH0gZnJvbSAnLi4vbGFuZ3VhZ2VUYWcnO1xuaW1wb3J0IHsgU3VidGFncyB9IGZyb20gJy4uL2NvbW1vbic7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHNpbmdsZSBtYXRjaGluZyBmaWx0ZXJlZCBsYW5ndWFnZS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXRjaGluZ0xhbmd1YWdlIHtcbiAgICAvKipcbiAgICAgKiBOdW1lcmljIGluZGljYXRpb24gb2YgaG93IHdlbGwgdGhlIGxhbmd1YWdlIG1hdGNoZXMsXG4gICAgICogZnJvbSBwZXJmZWN0IChgMS4wYCkgdG8gbm90IGF0IGFsbCAoYDAuMGApLiAgV2hlblxuICAgICAqIG1hdGNoaW5nIGFuIG9yZGVyZWQgbGlzdCwgbGFuZ3VhZ2VzIGF0IHRoZSBmcm9udCBvZlxuICAgICAqIHRoZSBkZXNpcmVkIGxhbmd1YWdlIGxpc3QgYXJlIGFsd2F5cyBoaWdoZXIgcXVhbGl0eS5cbiAgICAgKi9cbiAgICBxdWFsaXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGBzdHJpbmdgIHRhZyBvZiB0aGUgbWF0Y2hlZCBsYW5ndWFnZS5cbiAgICAgKi9cbiAgICB0YWc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF0Y2hlZCB7QGxpbmsgQmNwNDcuTGFuZ3VhZ2VUYWcgfCBsYW5ndWFnZSB0YWd9LlxuICAgICAqL1xuICAgIGxhbmd1YWdlVGFnOiBMYW5ndWFnZVRhZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgQmNwNDcuZmlsdGVyIHwgbGFuZ3VhZ2UgdGFnIGxpc3QgZmlsdGVyfSBmdW5jdGlvbnMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFuZ3VhZ2VDaG9vc2VyT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZSBtYXRjaGluZyBsYW5ndWFnZSBmcm9tIHRoZVxuICAgICAqIGRlc2lyZWQgbGlzdCBvciB0aGUgYXZhaWxhYmxlIGxpc3QuIERlZmF1bHQgaXMgYCdhdmFpbGFibGVMYW5ndWFnZSdgLlxuICAgICAqL1xuICAgIHVzZT86ICdkZXNpcmVkTGFuZ3VhZ2UnIHwgJ2F2YWlsYWJsZUxhbmd1YWdlJztcblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBob3cgdG8gZmlsdGVyIHRoZSBsYW5ndWFnZSBsaXN0IC0gYCdwcmltYXJ5TGFuZ3VhZ2UnYFxuICAgICAqIGluZGljYXRlcyB0aGUgZWFjaCBwcmltYXJ5IGxhbmd1YWdlIHNob3VsZCBhcHBlYXIgb25seSBvbmNlIGluXG4gICAgICogdGhlIGxpc3QgaW4gaXRzIG1vc3Qgc2ltaWxhciBmb3JtLiAgQSBmaWx0ZXIgdmFsdWUgb2YgYCdub25lJ2BcbiAgICAgKiByZXBvcnRzIGFsbCBtYXRjaGluZyB2YXJpYW50cyBvZiBhbnkgcHJpbWFyeSBsYW5ndWFnZSBpbiBvcmRlclxuICAgICAqIG9mIHNpbWlsYXJpdHkuICBEZWZhdWx0IGlzIGAncHJpbWFyeUxhbmd1YWdlJ2BcbiAgICAgKi9cbiAgICBmaWx0ZXI/OiAncHJpbWFyeUxhbmd1YWdlJyB8ICdub25lJztcblxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIHtAbGluayBCY3A0Ny5MYW5ndWFnZVNwZWMgfCBsYW5ndWFnZSBzcGVjaWZpY2F0aW9ufVxuICAgICAqIGluZGljYXRpbmcgYSBsYW5ndWFnZSB0byBiZSByZXR1cm5lZCBpZiB0aGUgZmlsdGVyIGNhbGwgd291bGRcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJuIGFuIGVtcHR5IGxpc3QgKGkuZS4gbm8gbGFuZ3VhZ2VzIG1hdGNoKS5cbiAgICAgKi9cbiAgICB1bHRpbWF0ZUZhbGxiYWNrPzogc3RyaW5nIHwgU3VidGFncyB8IExhbmd1YWdlVGFnO1xufVxuXG4vKipcbiAqIERlZmF1bHQgdmFsdWVzIGZvciBhe0BsaW5rIEJjcDQ3Lkxhbmd1YWdlRmlsdGVyT3B0aW9uc30uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0TGFuZ3VhZ2VDaG9vc2VyT3B0aW9uczogTGFuZ3VhZ2VDaG9vc2VyT3B0aW9ucyA9IE9iamVjdC5mcmVlemUoe1xuICAgIHVzZTogJ2F2YWlsYWJsZUxhbmd1YWdlJyxcbiAgICBmaWx0ZXI6ICdwcmltYXJ5TGFuZ3VhZ2UnLFxufSk7XG5cbi8qKlxuICogSGVscGVyIHRvIGNvbXBhcmUgYSBsaXN0IG9mICdkZXNpcmVkJyBsYW5ndWFnZXMgdG8gYSBsaXN0IG9mICdhdmFpbGFibGUnIGxhbmd1YWdlXG4gKiBhbmQgcmV0dXJuIHRoZSBpbnRlcnNlY3Rpb24gaW4gb3JkZXIgb2YgcHJlZmVyZW5jZSwgdGFraW5nIHRhZyBzZW1hbnRpY3MgaW50byBhY2NvdW50LlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgTGFuZ3VhZ2VDaG9vc2VyIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX21hdGNoZXI6IExhbmd1YWdlU2ltaWxhcml0eU1hdGNoZXI7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoaWFuYT86IElhbmEuTGFuZ3VhZ2VSZWdpc3RyaWVzKSB7XG4gICAgICAgIHRoaXMuX21hdGNoZXIgPSBuZXcgTGFuZ3VhZ2VTaW1pbGFyaXR5TWF0Y2hlcihpYW5hKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hvb3NlTGFuZ3VhZ2VUYWdzV2l0aERldGFpbHMoXG4gICAgICAgIGRlc2lyZWRMYW5ndWFnZXM6IExhbmd1YWdlVGFnW10sXG4gICAgICAgIGF2YWlsYWJsZUxhbmd1YWdlczogTGFuZ3VhZ2VUYWdbXSxcbiAgICAgICAgb3B0aW9ucz86IExhbmd1YWdlQ2hvb3Nlck9wdGlvbnNcbiAgICApOiBNYXRjaGluZ0xhbmd1YWdlW10ge1xuICAgICAgICBjb25zdCBtYXRjaGVkID0gbmV3IE1hcDxzdHJpbmcsIE1hdGNoaW5nTGFuZ3VhZ2U+KCk7XG4gICAgICAgIGNvbnN0IGRlY3JlbWVudCA9IGRlc2lyZWRMYW5ndWFnZXMubGVuZ3RoIDwgMTAgPyAwLjEgOiAxLjAgLyBkZXNpcmVkTGFuZ3VhZ2VzLmxlbmd0aDtcbiAgICAgICAgbGV0IGJhc2UgPSAxLjA7XG5cbiAgICAgICAgLy8gZmlsbCBhbnkgbWlzc2luZyBmaWVsZHMgZnJvbSB0aGUgZGVmYXVsdFxuICAgICAgICBvcHRpb25zID0geyAuLi5kZWZhdWx0TGFuZ3VhZ2VDaG9vc2VyT3B0aW9ucywgLi4ub3B0aW9ucyB9O1xuXG4gICAgICAgIGZvciAoY29uc3Qgd2FudCBvZiBkZXNpcmVkTGFuZ3VhZ2VzKSB7XG4gICAgICAgICAgICBiYXNlIC09IGRlY3JlbWVudDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGF2ZSBvZiBhdmFpbGFibGVMYW5ndWFnZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzaW1pbGFyaXR5ID0gdGhpcy5fbWF0Y2hlci5tYXRjaExhbmd1YWdlVGFncyh3YW50LCBoYXZlKTtcbiAgICAgICAgICAgICAgICBpZiAoc2ltaWxhcml0eSA+IDAuMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWFsaXR5ID0gYmFzZSArIHNpbWlsYXJpdHkgKiBkZWNyZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhbmd1YWdlVGFnID0gb3B0aW9ucy51c2UgPT09ICdhdmFpbGFibGVMYW5ndWFnZScgPyBoYXZlIDogd2FudDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFnID0gbGFuZ3VhZ2VUYWcudGFnO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBvcHRpb25zLmZpbHRlciA9PT0gJ3ByaW1hcnlMYW5ndWFnZScgPyBsYW5ndWFnZVRhZy5zdWJ0YWdzLnByaW1hcnlMYW5ndWFnZSA/PyB0YWcgOiB0YWc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2g6IE1hdGNoaW5nTGFuZ3VhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VUYWcsXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBtYXRjaGVkLmdldChrZXkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nIHx8IGV4aXN0aW5nLnF1YWxpdHkgPCBxdWFsaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkLnNldChrZXksIG1hdGNoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IEFycmF5LmZyb20obWF0Y2hlZC52YWx1ZXMoKSk7XG4gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgLy8gd2FudCBkZXNjZW5kaW5nIG9yZGVyXG4gICAgICAgICAgICB2YWx1ZXMuc29ydCgobTEsIG0yKSA9PiBtMi5xdWFsaXR5IC0gbTEucXVhbGl0eSk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCAmJiBvcHRpb25zLnVsdGltYXRlRmFsbGJhY2spIHtcbiAgICAgICAgICAgIGNvbnN0IGxhbmd1YWdlVGFnID1cbiAgICAgICAgICAgICAgICBvcHRpb25zLnVsdGltYXRlRmFsbGJhY2sgaW5zdGFuY2VvZiBMYW5ndWFnZVRhZ1xuICAgICAgICAgICAgICAgICAgICA/IG9wdGlvbnMudWx0aW1hdGVGYWxsYmFja1xuICAgICAgICAgICAgICAgICAgICA6IExhbmd1YWdlVGFnLmNyZWF0ZShvcHRpb25zLnVsdGltYXRlRmFsbGJhY2spLm9yRGVmYXVsdCgpO1xuICAgICAgICAgICAgaWYgKGxhbmd1YWdlVGFnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFt7IGxhbmd1YWdlVGFnLCB0YWc6IGxhbmd1YWdlVGFnLnRhZywgcXVhbGl0eTogMCB9XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaWx0ZXJMYW5ndWFnZVRhZ3MoXG4gICAgICAgIGRlc2lyZWRMYW5ndWFnZXM6IExhbmd1YWdlVGFnW10sXG4gICAgICAgIGF2YWlsYWJsZUxhbmd1YWdlczogTGFuZ3VhZ2VUYWdbXSxcbiAgICAgICAgb3B0aW9ucz86IExhbmd1YWdlQ2hvb3Nlck9wdGlvbnNcbiAgICApOiBMYW5ndWFnZVRhZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hvb3NlTGFuZ3VhZ2VUYWdzV2l0aERldGFpbHMoZGVzaXJlZExhbmd1YWdlcywgYXZhaWxhYmxlTGFuZ3VhZ2VzLCBvcHRpb25zKS5tYXAoKHQpID0+IHQubGFuZ3VhZ2VUYWcpO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Common levels of match quality for a single language match.
3
+ * @public
4
+ */
5
+ export declare const tagSimilarity: {
6
+ exact: number;
7
+ variant: number;
8
+ region: number;
9
+ macroRegion: number;
10
+ neutralRegion: number;
11
+ preferredAffinity: number;
12
+ affinity: number;
13
+ preferredRegion: number;
14
+ sibling: number;
15
+ undetermined: number;
16
+ none: number;
17
+ };
18
+ /**
19
+ * Numeric representation of the quality of a language match.
20
+ * Range is 0 (no match) to 1 (exact match).
21
+ * @public
22
+ */
23
+ export type TagSimilarity = keyof typeof tagSimilarity;
24
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/bcp47/match/common.ts"],"names":[],"mappings":"AAsBA;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;CAYzB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,aAAa,CAAC"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2022 Erik Fortune
4
+ *
5
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ * of this software and associated documentation files (the "Software"), to deal
7
+ * in the Software without restriction, including without limitation the rights
8
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ * copies of the Software, and to permit persons to whom the Software is
10
+ * furnished to do so, subject to the following conditions:
11
+ *
12
+ * The above copyright notice and this permission notice shall be included in all
13
+ * copies or substantial portions of the Software.
14
+ *
15
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ * SOFTWARE.
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.tagSimilarity = void 0;
25
+ /**
26
+ * Common levels of match quality for a single language match.
27
+ * @public
28
+ */
29
+ exports.tagSimilarity = {
30
+ exact: 1.0,
31
+ variant: 0.9,
32
+ region: 0.8,
33
+ macroRegion: 0.7,
34
+ neutralRegion: 0.6,
35
+ preferredAffinity: 0.55,
36
+ affinity: 0.5,
37
+ preferredRegion: 0.4,
38
+ sibling: 0.3,
39
+ undetermined: 0.2,
40
+ none: 0,
41
+ };
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JjcDQ3L21hdGNoL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHOzs7QUFFSDs7O0dBR0c7QUFDVSxRQUFBLGFBQWEsR0FBRztJQUN6QixLQUFLLEVBQUUsR0FBRztJQUNWLE9BQU8sRUFBRSxHQUFHO0lBQ1osTUFBTSxFQUFFLEdBQUc7SUFDWCxXQUFXLEVBQUUsR0FBRztJQUNoQixhQUFhLEVBQUUsR0FBRztJQUNsQixpQkFBaUIsRUFBRSxJQUFJO0lBQ3ZCLFFBQVEsRUFBRSxHQUFHO0lBQ2IsZUFBZSxFQUFFLEdBQUc7SUFDcEIsT0FBTyxFQUFFLEdBQUc7SUFDWixZQUFZLEVBQUUsR0FBRztJQUNqQixJQUFJLEVBQUUsQ0FBQztDQUNWLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuLyoqXG4gKiBDb21tb24gbGV2ZWxzIG9mIG1hdGNoIHF1YWxpdHkgZm9yIGEgc2luZ2xlIGxhbmd1YWdlIG1hdGNoLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdGFnU2ltaWxhcml0eSA9IHtcbiAgICBleGFjdDogMS4wLFxuICAgIHZhcmlhbnQ6IDAuOSxcbiAgICByZWdpb246IDAuOCxcbiAgICBtYWNyb1JlZ2lvbjogMC43LFxuICAgIG5ldXRyYWxSZWdpb246IDAuNixcbiAgICBwcmVmZXJyZWRBZmZpbml0eTogMC41NSxcbiAgICBhZmZpbml0eTogMC41LFxuICAgIHByZWZlcnJlZFJlZ2lvbjogMC40LFxuICAgIHNpYmxpbmc6IDAuMyxcbiAgICB1bmRldGVybWluZWQ6IDAuMixcbiAgICBub25lOiAwLFxufTtcblxuLyoqXG4gKiBOdW1lcmljIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBxdWFsaXR5IG9mIGEgbGFuZ3VhZ2UgbWF0Y2guXG4gKiBSYW5nZSBpcyAwIChubyBtYXRjaCkgdG8gMSAoZXhhY3QgbWF0Y2gpLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBUYWdTaW1pbGFyaXR5ID0ga2V5b2YgdHlwZW9mIHRhZ1NpbWlsYXJpdHk7XG4iXX0=
@@ -0,0 +1,4 @@
1
+ export * from './common';
2
+ export { LanguageSimilarityMatcher } from './similarity';
3
+ export { MatchingLanguage, LanguageChooser as LanguageFilter, LanguageChooserOptions as LanguageFilterOptions } from './chooser';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/bcp47/match/index.ts"],"names":[],"mappings":"AAuBA,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,eAAe,IAAI,cAAc,EAAE,sBAAsB,IAAI,qBAAqB,EAAE,MAAM,WAAW,CAAC"}