@opentdf/sdk 0.4.1-rc.37 → 0.5.0-beta.42

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 (221) hide show
  1. package/dist/cjs/src/access/access-fetch.js +2 -1
  2. package/dist/cjs/src/access/access-rpc.js +11 -5
  3. package/dist/cjs/src/access/constants.js +6 -0
  4. package/dist/cjs/src/access.js +39 -4
  5. package/dist/cjs/src/auth/oidc-clientcredentials-provider.js +4 -2
  6. package/dist/cjs/src/auth/oidc-externaljwt-provider.js +5 -3
  7. package/dist/cjs/src/auth/oidc-refreshtoken-provider.js +19 -3
  8. package/dist/cjs/src/auth/oidc.js +9 -8
  9. package/dist/cjs/src/auth/providers.js +7 -1
  10. package/dist/cjs/src/index.js +4 -2
  11. package/dist/cjs/src/nanoclients.js +4 -4
  12. package/dist/cjs/src/nanotdf/Client.js +10 -6
  13. package/dist/cjs/src/opentdf.js +102 -13
  14. package/dist/cjs/src/platform/authorization/v2/authorization_pb.js +112 -0
  15. package/dist/cjs/src/platform/buf/validate/validate_pb.js +114 -170
  16. package/dist/cjs/src/platform/common/common_pb.js +16 -5
  17. package/dist/cjs/src/platform/entity/entity_pb.js +51 -0
  18. package/dist/cjs/src/platform/entityresolution/entity_resolution_pb.js +1 -1
  19. package/dist/cjs/src/platform/entityresolution/v2/entity_resolution_pb.js +49 -0
  20. package/dist/cjs/src/platform/google/api/annotations_pb.js +1 -1
  21. package/dist/cjs/src/platform/google/api/http_pb.js +3 -3
  22. package/dist/cjs/src/platform/kas/kas_pb.js +2 -2
  23. package/dist/cjs/src/platform/policy/attributes/attributes_pb.js +12 -2
  24. package/dist/cjs/src/platform/policy/kasregistry/key_access_server_registry_pb.js +57 -4
  25. package/dist/cjs/src/platform/policy/keymanagement/key_management_pb.js +2 -2
  26. package/dist/cjs/src/platform/policy/namespaces/namespaces_pb.js +31 -4
  27. package/dist/cjs/src/platform/policy/objects_pb.js +116 -42
  28. package/dist/cjs/src/platform/policy/obligations/obligations_pb.js +159 -0
  29. package/dist/cjs/src/platform/policy/registeredresources/registered_resources_pb.js +20 -15
  30. package/dist/cjs/src/platform/policy/resourcemapping/resource_mapping_pb.js +2 -3
  31. package/dist/cjs/src/platform/policy/selectors_pb.js +1 -1
  32. package/dist/cjs/src/platform/policy/subjectmapping/subject_mapping_pb.js +2 -3
  33. package/dist/cjs/src/platform/policy/unsafe/unsafe_pb.js +2 -4
  34. package/dist/cjs/src/platform.js +20 -3
  35. package/dist/cjs/src/policy/api.js +27 -7
  36. package/dist/cjs/src/policy/granter.js +75 -48
  37. package/dist/cjs/src/seekable.js +32 -1
  38. package/dist/cjs/src/utils.js +85 -3
  39. package/dist/cjs/src/version.js +1 -1
  40. package/dist/cjs/tdf3/src/assertions.js +39 -2
  41. package/dist/cjs/tdf3/src/client/DecoratedReadableStream.js +8 -1
  42. package/dist/cjs/tdf3/src/client/builders.js +13 -1
  43. package/dist/cjs/tdf3/src/client/index.js +213 -54
  44. package/dist/cjs/tdf3/src/client/validation.js +3 -3
  45. package/dist/cjs/tdf3/src/tdf.js +42 -9
  46. package/dist/cjs/tdf3/src/utils/unwrap.js +2 -2
  47. package/dist/types/src/access/access-fetch.d.ts +1 -0
  48. package/dist/types/src/access/access-fetch.d.ts.map +1 -1
  49. package/dist/types/src/access/access-rpc.d.ts +2 -1
  50. package/dist/types/src/access/access-rpc.d.ts.map +1 -1
  51. package/dist/types/src/access/constants.d.ts +3 -0
  52. package/dist/types/src/access/constants.d.ts.map +1 -0
  53. package/dist/types/src/access.d.ts +30 -1
  54. package/dist/types/src/access.d.ts.map +1 -1
  55. package/dist/types/src/auth/oidc-clientcredentials-provider.d.ts +1 -1
  56. package/dist/types/src/auth/oidc-clientcredentials-provider.d.ts.map +1 -1
  57. package/dist/types/src/auth/oidc-externaljwt-provider.d.ts +1 -1
  58. package/dist/types/src/auth/oidc-externaljwt-provider.d.ts.map +1 -1
  59. package/dist/types/src/auth/oidc-refreshtoken-provider.d.ts +15 -1
  60. package/dist/types/src/auth/oidc-refreshtoken-provider.d.ts.map +1 -1
  61. package/dist/types/src/auth/oidc.d.ts +4 -0
  62. package/dist/types/src/auth/oidc.d.ts.map +1 -1
  63. package/dist/types/src/auth/providers.d.ts.map +1 -1
  64. package/dist/types/src/index.d.ts +1 -0
  65. package/dist/types/src/index.d.ts.map +1 -1
  66. package/dist/types/src/nanotdf/Client.d.ts +8 -1
  67. package/dist/types/src/nanotdf/Client.d.ts.map +1 -1
  68. package/dist/types/src/opentdf.d.ts +137 -6
  69. package/dist/types/src/opentdf.d.ts.map +1 -1
  70. package/dist/types/src/platform/authorization/v2/authorization_pb.d.ts +439 -0
  71. package/dist/types/src/platform/authorization/v2/authorization_pb.d.ts.map +1 -0
  72. package/dist/types/src/platform/buf/validate/validate_pb.d.ts +495 -370
  73. package/dist/types/src/platform/buf/validate/validate_pb.d.ts.map +1 -1
  74. package/dist/types/src/platform/common/common_pb.d.ts +36 -0
  75. package/dist/types/src/platform/common/common_pb.d.ts.map +1 -1
  76. package/dist/types/src/platform/entity/entity_pb.d.ts +130 -0
  77. package/dist/types/src/platform/entity/entity_pb.d.ts.map +1 -0
  78. package/dist/types/src/platform/entityresolution/entity_resolution_pb.d.ts +4 -0
  79. package/dist/types/src/platform/entityresolution/entity_resolution_pb.d.ts.map +1 -1
  80. package/dist/types/src/platform/entityresolution/v2/entity_resolution_pb.d.ts +136 -0
  81. package/dist/types/src/platform/entityresolution/v2/entity_resolution_pb.d.ts.map +1 -0
  82. package/dist/types/src/platform/google/api/http_pb.d.ts.map +1 -1
  83. package/dist/types/src/platform/kas/kas_pb.d.ts +5 -0
  84. package/dist/types/src/platform/kas/kas_pb.d.ts.map +1 -1
  85. package/dist/types/src/platform/policy/attributes/attributes_pb.d.ts +44 -13
  86. package/dist/types/src/platform/policy/attributes/attributes_pb.d.ts.map +1 -1
  87. package/dist/types/src/platform/policy/kasregistry/key_access_server_registry_pb.d.ts +329 -24
  88. package/dist/types/src/platform/policy/kasregistry/key_access_server_registry_pb.d.ts.map +1 -1
  89. package/dist/types/src/platform/policy/keymanagement/key_management_pb.d.ts +20 -1
  90. package/dist/types/src/platform/policy/keymanagement/key_management_pb.d.ts.map +1 -1
  91. package/dist/types/src/platform/policy/namespaces/namespaces_pb.d.ts +143 -5
  92. package/dist/types/src/platform/policy/namespaces/namespaces_pb.d.ts.map +1 -1
  93. package/dist/types/src/platform/policy/objects_pb.d.ts +382 -33
  94. package/dist/types/src/platform/policy/objects_pb.d.ts.map +1 -1
  95. package/dist/types/src/platform/policy/obligations/obligations_pb.d.ts +670 -0
  96. package/dist/types/src/platform/policy/obligations/obligations_pb.d.ts.map +1 -0
  97. package/dist/types/src/platform/policy/registeredresources/registered_resources_pb.d.ts +67 -0
  98. package/dist/types/src/platform/policy/registeredresources/registered_resources_pb.d.ts.map +1 -1
  99. package/dist/types/src/platform/policy/resourcemapping/resource_mapping_pb.d.ts.map +1 -1
  100. package/dist/types/src/platform/policy/selectors_pb.d.ts +18 -0
  101. package/dist/types/src/platform/policy/selectors_pb.d.ts.map +1 -1
  102. package/dist/types/src/platform/policy/subjectmapping/subject_mapping_pb.d.ts.map +1 -1
  103. package/dist/types/src/platform/policy/unsafe/unsafe_pb.d.ts +18 -4
  104. package/dist/types/src/platform/policy/unsafe/unsafe_pb.d.ts.map +1 -1
  105. package/dist/types/src/platform.d.ts +21 -0
  106. package/dist/types/src/platform.d.ts.map +1 -1
  107. package/dist/types/src/policy/api.d.ts +2 -0
  108. package/dist/types/src/policy/api.d.ts.map +1 -1
  109. package/dist/types/src/policy/granter.d.ts +11 -6
  110. package/dist/types/src/policy/granter.d.ts.map +1 -1
  111. package/dist/types/src/seekable.d.ts +31 -0
  112. package/dist/types/src/seekable.d.ts.map +1 -1
  113. package/dist/types/src/utils.d.ts +61 -2
  114. package/dist/types/src/utils.d.ts.map +1 -1
  115. package/dist/types/src/version.d.ts +1 -1
  116. package/dist/types/tdf3/src/assertions.d.ts +4 -0
  117. package/dist/types/tdf3/src/assertions.d.ts.map +1 -1
  118. package/dist/types/tdf3/src/client/DecoratedReadableStream.d.ts +6 -0
  119. package/dist/types/tdf3/src/client/DecoratedReadableStream.d.ts.map +1 -1
  120. package/dist/types/tdf3/src/client/builders.d.ts +14 -0
  121. package/dist/types/tdf3/src/client/builders.d.ts.map +1 -1
  122. package/dist/types/tdf3/src/client/index.d.ts +25 -4
  123. package/dist/types/tdf3/src/client/index.d.ts.map +1 -1
  124. package/dist/types/tdf3/src/client/validation.d.ts +3 -3
  125. package/dist/types/tdf3/src/client/validation.d.ts.map +1 -1
  126. package/dist/types/tdf3/src/tdf.d.ts +3 -1
  127. package/dist/types/tdf3/src/tdf.d.ts.map +1 -1
  128. package/dist/types/tdf3/src/utils/unwrap.d.ts.map +1 -1
  129. package/dist/web/src/access/access-fetch.js +2 -1
  130. package/dist/web/src/access/access-rpc.js +11 -5
  131. package/dist/web/src/access/constants.js +3 -0
  132. package/dist/web/src/access.js +37 -3
  133. package/dist/web/src/auth/oidc-clientcredentials-provider.js +4 -2
  134. package/dist/web/src/auth/oidc-externaljwt-provider.js +5 -3
  135. package/dist/web/src/auth/oidc-refreshtoken-provider.js +19 -3
  136. package/dist/web/src/auth/oidc.js +9 -8
  137. package/dist/web/src/auth/providers.js +7 -1
  138. package/dist/web/src/index.js +2 -1
  139. package/dist/web/src/nanoclients.js +4 -4
  140. package/dist/web/src/nanotdf/Client.js +11 -7
  141. package/dist/web/src/opentdf.js +102 -13
  142. package/dist/web/src/platform/authorization/v2/authorization_pb.js +109 -0
  143. package/dist/web/src/platform/buf/validate/validate_pb.js +113 -169
  144. package/dist/web/src/platform/common/common_pb.js +15 -4
  145. package/dist/web/src/platform/entity/entity_pb.js +48 -0
  146. package/dist/web/src/platform/entityresolution/entity_resolution_pb.js +1 -1
  147. package/dist/web/src/platform/entityresolution/v2/entity_resolution_pb.js +46 -0
  148. package/dist/web/src/platform/google/api/annotations_pb.js +1 -1
  149. package/dist/web/src/platform/google/api/http_pb.js +3 -3
  150. package/dist/web/src/platform/kas/kas_pb.js +2 -2
  151. package/dist/web/src/platform/policy/attributes/attributes_pb.js +12 -2
  152. package/dist/web/src/platform/policy/kasregistry/key_access_server_registry_pb.js +55 -3
  153. package/dist/web/src/platform/policy/keymanagement/key_management_pb.js +2 -2
  154. package/dist/web/src/platform/policy/namespaces/namespaces_pb.js +30 -3
  155. package/dist/web/src/platform/policy/objects_pb.js +114 -41
  156. package/dist/web/src/platform/policy/obligations/obligations_pb.js +156 -0
  157. package/dist/web/src/platform/policy/registeredresources/registered_resources_pb.js +19 -14
  158. package/dist/web/src/platform/policy/resourcemapping/resource_mapping_pb.js +2 -3
  159. package/dist/web/src/platform/policy/selectors_pb.js +1 -1
  160. package/dist/web/src/platform/policy/subjectmapping/subject_mapping_pb.js +2 -3
  161. package/dist/web/src/platform/policy/unsafe/unsafe_pb.js +2 -4
  162. package/dist/web/src/platform.js +20 -3
  163. package/dist/web/src/policy/api.js +26 -7
  164. package/dist/web/src/policy/granter.js +75 -48
  165. package/dist/web/src/seekable.js +32 -1
  166. package/dist/web/src/utils.js +84 -3
  167. package/dist/web/src/version.js +1 -1
  168. package/dist/web/tdf3/src/assertions.js +38 -2
  169. package/dist/web/tdf3/src/client/DecoratedReadableStream.js +8 -1
  170. package/dist/web/tdf3/src/client/builders.js +13 -1
  171. package/dist/web/tdf3/src/client/index.js +215 -57
  172. package/dist/web/tdf3/src/client/validation.js +3 -3
  173. package/dist/web/tdf3/src/tdf.js +42 -9
  174. package/dist/web/tdf3/src/utils/unwrap.js +2 -2
  175. package/package.json +7 -5
  176. package/src/access/access-fetch.ts +1 -0
  177. package/src/access/access-rpc.ts +13 -4
  178. package/src/access/constants.ts +2 -0
  179. package/src/access.ts +54 -2
  180. package/src/auth/oidc-clientcredentials-provider.ts +4 -0
  181. package/src/auth/oidc-externaljwt-provider.ts +5 -1
  182. package/src/auth/oidc-refreshtoken-provider.ts +19 -1
  183. package/src/auth/oidc.ts +12 -7
  184. package/src/auth/providers.ts +6 -0
  185. package/src/index.ts +1 -0
  186. package/src/nanoclients.ts +3 -3
  187. package/src/nanotdf/Client.ts +28 -6
  188. package/src/opentdf.ts +205 -73
  189. package/src/platform/authorization/v2/authorization_pb.ts +503 -0
  190. package/src/platform/buf/validate/validate_pb.ts +529 -401
  191. package/src/platform/common/common_pb.ts +48 -3
  192. package/src/platform/entity/entity_pb.ts +154 -0
  193. package/src/platform/entityresolution/entity_resolution_pb.ts +4 -0
  194. package/src/platform/entityresolution/v2/entity_resolution_pb.ts +170 -0
  195. package/src/platform/google/api/annotations_pb.ts +1 -1
  196. package/src/platform/google/api/http_pb.ts +2 -2
  197. package/src/platform/kas/kas_pb.ts +6 -1
  198. package/src/platform/policy/attributes/attributes_pb.ts +46 -16
  199. package/src/platform/policy/kasregistry/key_access_server_registry_pb.ts +371 -27
  200. package/src/platform/policy/keymanagement/key_management_pb.ts +24 -2
  201. package/src/platform/policy/namespaces/namespaces_pb.ts +163 -7
  202. package/src/platform/policy/objects_pb.ts +474 -59
  203. package/src/platform/policy/obligations/obligations_pb.ts +788 -0
  204. package/src/platform/policy/registeredresources/registered_resources_pb.ts +80 -13
  205. package/src/platform/policy/resourcemapping/resource_mapping_pb.ts +1 -2
  206. package/src/platform/policy/selectors_pb.ts +18 -0
  207. package/src/platform/policy/subjectmapping/subject_mapping_pb.ts +1 -2
  208. package/src/platform/policy/unsafe/unsafe_pb.ts +21 -6
  209. package/src/platform.ts +29 -5
  210. package/src/policy/api.ts +37 -6
  211. package/src/policy/granter.ts +82 -56
  212. package/src/seekable.ts +31 -0
  213. package/src/utils.ts +88 -2
  214. package/src/version.ts +1 -1
  215. package/tdf3/src/assertions.ts +52 -1
  216. package/tdf3/src/client/DecoratedReadableStream.ts +9 -0
  217. package/tdf3/src/client/builders.ts +16 -0
  218. package/tdf3/src/client/index.ts +309 -73
  219. package/tdf3/src/client/validation.ts +2 -2
  220. package/tdf3/src/tdf.ts +53 -9
  221. package/tdf3/src/utils/unwrap.ts +2 -1
@@ -1,13 +1,13 @@
1
1
  import { v4 } from 'uuid';
2
- import { ZipReader, streamToBuffer, keyMiddleware as defaultKeyMiddleware, } from '../utils/index.js';
2
+ import { keyMiddleware as defaultKeyMiddleware, streamToBuffer, ZipReader, } from '../utils/index.js';
3
3
  import { base64 } from '../../../src/encodings/index.js';
4
- import { buildKeyAccess, fetchKasPublicKey, loadTDFStream, validatePolicyObject, readStream, writeStream, } from '../tdf.js';
4
+ import { buildKeyAccess, fetchKasPublicKey, loadTDFStream, readStream, validatePolicyObject, writeStream, } from '../tdf.js';
5
5
  import { unwrapHtml } from '../utils/unwrap.js';
6
6
  import { OIDCRefreshTokenProvider } from '../../../src/auth/oidc-refreshtoken-provider.js';
7
7
  import { OIDCExternalJwtProvider } from '../../../src/auth/oidc-externaljwt-provider.js';
8
8
  import { HttpRequest, withHeaders } from '../../../src/auth/auth.js';
9
9
  import { getPlatformUrlFromKasEndpoint, pemToCryptoPublicKey, rstrip, validateSecureUrl, } from '../../../src/utils.js';
10
- import { DEFAULT_SEGMENT_SIZE, DecryptParamsBuilder, EncryptParamsBuilder, } from './builders.js';
10
+ import { DecryptParamsBuilder, DEFAULT_SEGMENT_SIZE, EncryptParamsBuilder, } from './builders.js';
11
11
  import { fetchKeyAccessServers, keyAlgorithmToPublicKeyAlgorithm, OriginAllowList, } from '../../../src/access.js';
12
12
  import { ConfigurationError } from '../../../src/errors.js';
13
13
  import { AesGcmCipher } from '../ciphers/aes-gcm-cipher.js';
@@ -17,10 +17,15 @@ import { SplitKey, } from '../models/index.js';
17
17
  import { plan } from '../../../src/policy/granter.js';
18
18
  import { attributeFQNsAsValues } from '../../../src/policy/api.js';
19
19
  import { fromBuffer, fromSource } from '../../../src/seekable.js';
20
+ import { Algorithm } from '../../../src/platform/policy/objects_pb.js';
20
21
  const GLOBAL_BYTE_LIMIT = 64 * 1000 * 1000 * 1000; // 64 GB, see WS-9363.
21
22
  // No default config for now. Delegate to Virtru wrapper for endpoints.
22
23
  const defaultClientConfig = { oidcOrigin: '', cryptoService: defaultCryptoService };
23
24
  const getFirstTwoBytes = async (chunker) => new TextDecoder().decode(await chunker(0, 2));
25
+ async function algorithmFromPEM(pem) {
26
+ const k = await pemToCryptoPublicKey(pem);
27
+ return keyAlgorithmToPublicKeyAlgorithm(k);
28
+ }
24
29
  // Convert a PEM string to a CryptoKey
25
30
  export const resolveKasInfo = async (pem, uri, kid) => {
26
31
  const k = await pemToCryptoPublicKey(pem);
@@ -123,6 +128,75 @@ function asPolicy(scope) {
123
128
  },
124
129
  };
125
130
  }
131
+ export function findEntryInCache(cache, ...params) {
132
+ const [wantedKas, wantedAlgorithm, wantedKid] = params;
133
+ for (const item of cache) {
134
+ const [itemKas, itemAlgorithm, itemKid, itemKeyInfoPromise] = item;
135
+ if (itemKas !== wantedKas) {
136
+ continue;
137
+ }
138
+ // This makes undefined only match with undefined (base key).
139
+ // We could potentially consider any key a match if undefined algorithm?
140
+ if (itemAlgorithm !== wantedAlgorithm) {
141
+ continue;
142
+ }
143
+ if (wantedKid && itemKid !== wantedKid) {
144
+ continue;
145
+ }
146
+ return itemKeyInfoPromise;
147
+ }
148
+ return null;
149
+ }
150
+ const fetchKasKeyWithCache = (cache, ...params) => {
151
+ const cachedEntry = findEntryInCache(cache, ...params);
152
+ if (cachedEntry !== null) {
153
+ return cachedEntry;
154
+ }
155
+ const keyInfoPromise = fetchKasPublicKey(...params);
156
+ cache.push([...params, keyInfoPromise]);
157
+ return keyInfoPromise;
158
+ };
159
+ function algorithmEnumValueToString(algorithmEnumValue) {
160
+ switch (algorithmEnumValue) {
161
+ case Algorithm.RSA_2048:
162
+ return 'rsa:2048';
163
+ case Algorithm.RSA_4096:
164
+ return 'rsa:4096';
165
+ case Algorithm.EC_P256:
166
+ return 'ec:secp256r1';
167
+ case Algorithm.EC_P384:
168
+ return 'ec:secp384r1';
169
+ case Algorithm.EC_P521:
170
+ return 'ec:secp521r1';
171
+ case Algorithm.UNSPECIFIED:
172
+ // Not entirely sure undefined is correct here, but since we need to generate a key for our cache
173
+ // synchonously, it seems to be the best approach for now.
174
+ return undefined;
175
+ default:
176
+ return undefined;
177
+ }
178
+ }
179
+ const putKasKeyIntoCache = (cache, kasKey) => {
180
+ const algorithmString = algorithmEnumValueToString(kasKey.publicKey.algorithm);
181
+ const cachedEntry = findEntryInCache(cache, kasKey.kasUri, algorithmString, kasKey.publicKey.kid);
182
+ if (cachedEntry) {
183
+ return cachedEntry;
184
+ }
185
+ const keyInfoPromise = (async function () {
186
+ const keyPromise = pemToCryptoPublicKey(kasKey.publicKey.pem);
187
+ const key = await keyPromise;
188
+ const algorithm = keyAlgorithmToPublicKeyAlgorithm(key);
189
+ return {
190
+ algorithm: algorithm,
191
+ key: keyPromise,
192
+ kid: kasKey.publicKey.kid,
193
+ publicKey: kasKey.publicKey.pem,
194
+ url: kasKey.kasUri,
195
+ };
196
+ })();
197
+ cache.push([kasKey.kasUri, algorithmString, kasKey.publicKey.kid, keyInfoPromise]);
198
+ return keyInfoPromise;
199
+ };
126
200
  export class Client {
127
201
  /**
128
202
  * An abstraction for protecting and accessing data using TDF3 services.
@@ -135,7 +209,7 @@ export class Client {
135
209
  * @param {String} [config.oidcOrigin] - Endpoint of authentication service
136
210
  */
137
211
  constructor(config) {
138
- this.kasKeys = {};
212
+ this.kasKeyInfoCache = [];
139
213
  const clientConfig = { ...defaultClientConfig, ...config };
140
214
  this.cryptoService = clientConfig.cryptoService;
141
215
  this.dpopEnabled = !!(clientConfig.dpopEnabled || clientConfig.dpopKeys);
@@ -168,6 +242,12 @@ export class Client {
168
242
  throw new ConfigurationError(`Invalid KAS endpoint [${this.kasEndpoint}]. When allowedKases is set, defaultKASEndpoint needs to be in the allow list`);
169
243
  }
170
244
  }
245
+ this.fulfillableObligationFQNs = config.fulfillableObligationFQNs?.length
246
+ ? config.fulfillableObligationFQNs
247
+ : [];
248
+ if (clientConfig.easEndpoint) {
249
+ this.easEndpoint = clientConfig.easEndpoint;
250
+ }
171
251
  this.authProvider = config.authProvider;
172
252
  this.clientConfig = clientConfig;
173
253
  this.clientId = clientConfig.clientId;
@@ -200,11 +280,10 @@ export class Client {
200
280
  cryptoService: this.cryptoService,
201
281
  dpopKeys: clientConfig.dpopKeys,
202
282
  });
203
- if (clientConfig.kasPublicKey) {
204
- this.kasKeys[this.kasEndpoint] = [
205
- resolveKasInfo(clientConfig.kasPublicKey, this.kasEndpoint),
206
- ];
207
- }
283
+ }
284
+ /** Necessary only for testing. A dependency-injection approach should be preferred, but that is difficult currently */
285
+ _doFetchKasKeyWithCache(...params) {
286
+ return fetchKasKeyWithCache(...params);
208
287
  }
209
288
  /**
210
289
  * Encrypt plaintext into TDF ciphertext. One of the core operations of the Virtru SDK.
@@ -229,45 +308,112 @@ export class Client {
229
308
  throw new ConfigurationError('html mode not supported');
230
309
  }
231
310
  const dpopKeys = await this.dpopKeys;
232
- const { autoconfigure, metadata, mimeType = 'unknown', windowSize = DEFAULT_SEGMENT_SIZE, keyMiddleware = defaultKeyMiddleware, streamMiddleware = async (stream) => stream, tdfSpecVersion, wrappingKeyAlgorithm, } = opts;
311
+ const { autoconfigure, metadata, mimeType = 'unknown', windowSize = DEFAULT_SEGMENT_SIZE, keyMiddleware = defaultKeyMiddleware, splitPlan: preconfiguredSplitPlan, streamMiddleware = async (stream) => stream, tdfSpecVersion, wrappingKeyAlgorithm, } = opts;
233
312
  const scope = opts.scope ?? { attributes: [], dissem: [] };
313
+ for (const attributeValue of scope.attributeValues || []) {
314
+ for (const kasKey of attributeValue.kasKeys) {
315
+ if (kasKey.publicKey !== undefined) {
316
+ await putKasKeyIntoCache(this.kasKeyInfoCache, {
317
+ // TypeScript is silly and cannot infer that publicKey is not undefined, without re-referencing it like this, even though we checked already.
318
+ ...kasKey,
319
+ publicKey: kasKey.publicKey,
320
+ });
321
+ }
322
+ }
323
+ }
234
324
  const policyObject = asPolicy(scope);
235
325
  validatePolicyObject(policyObject);
236
- let splitPlan = opts.splitPlan;
237
- if (!splitPlan && autoconfigure) {
238
- let avs = scope.attributeValues ?? [];
239
- const fqns = scope.attributes
240
- ? scope.attributes.map((attribute) => typeof attribute === 'string' ? attribute : attribute.attribute)
241
- : [];
242
- if (!avs.length && fqns.length) {
243
- // Hydrate avs from policy endpoint givnen the fqns
244
- if (!this.policyEndpoint) {
245
- throw new ConfigurationError('policyEndpoint not set in TDF3 Client constructor');
246
- }
247
- avs = await attributeFQNsAsValues(this.policyEndpoint, this.authProvider, ...fqns);
326
+ const splitPlan = [];
327
+ if (preconfiguredSplitPlan) {
328
+ for (const preconfiguredSplit of preconfiguredSplitPlan) {
329
+ const kasPublicKeyInfo = await this._doFetchKasKeyWithCache(this.kasKeyInfoCache, preconfiguredSplit.kas, wrappingKeyAlgorithm, preconfiguredSplit.kid);
330
+ splitPlan.push({
331
+ kas: kasPublicKeyInfo.url,
332
+ kid: kasPublicKeyInfo.kid,
333
+ pem: kasPublicKeyInfo.publicKey,
334
+ sid: preconfiguredSplit.sid,
335
+ });
248
336
  }
249
- else if (scope.attributeValues) {
250
- avs = scope.attributeValues;
251
- if (!scope.attributes) {
252
- scope.attributes = avs.map(({ fqn }) => fqn);
337
+ }
338
+ else if (autoconfigure) {
339
+ const attributeValues = scope.attributeValues ?? [];
340
+ if (!scope.attributes) {
341
+ scope.attributes = attributeValues.map(({ fqn }) => fqn);
342
+ }
343
+ const attributeFQNs = (scope.attributes ?? []).map((attribute) => typeof attribute === 'string' ? attribute : attribute.attribute);
344
+ const fqnsWithoutValues = attributeFQNs.filter((fqn) => attributeValues.every((av) => av.fqn !== fqn));
345
+ if (fqnsWithoutValues.length) {
346
+ // Hydrate missing avs from policy endpoint given the fqns
347
+ if (!this.platformUrl) {
348
+ throw new ConfigurationError('platformUrl not set in TDF3 Client constructor');
253
349
  }
350
+ const fetchedFQNValues = await attributeFQNsAsValues(this.platformUrl, this.authProvider, ...fqnsWithoutValues);
351
+ fetchedFQNValues.forEach((fetchedValue) => {
352
+ attributeValues.push(fetchedValue);
353
+ });
254
354
  }
255
- if (avs.length != (scope.attributes?.length || 0) ||
256
- !avs.map(({ fqn }) => fqn).every((a) => fqns.indexOf(a) >= 0)) {
257
- throw new ConfigurationError(`Attribute mismatch between [${fqns}] and explicit values ${JSON.stringify(avs.map(({ fqn }) => fqn))}`);
355
+ const hasAllFQNs = attributeFQNs.every((fqn) => attributeValues.some((attributeValue) => attributeValue.fqn === fqn));
356
+ if (attributeFQNs.length != attributeValues.length || !hasAllFQNs) {
357
+ throw new ConfigurationError(`Attribute mismatch between [${attributeFQNs}] and explicit values ${JSON.stringify(attributeValues.map(({ fqn }) => fqn))}`);
258
358
  }
259
- const detailedPlan = plan(avs);
260
- splitPlan = detailedPlan.map((kat) => {
261
- const { kas, sid } = kat;
262
- const pubKey = kas.publicKey?.publicKey;
263
- if (pubKey?.case === 'cached' && pubKey.value.keys && !(kas.uri in this.kasKeys)) {
264
- const keys = pubKey.value.keys;
265
- if (keys?.length) {
266
- this.kasKeys[kas.uri] = keys.map((key) => resolveKasInfo(key.pem, kas.uri, key.kid));
359
+ for (const attributeValue of attributeValues) {
360
+ for (const kasKey of attributeValue.kasKeys) {
361
+ if (kasKey.publicKey !== undefined) {
362
+ await putKasKeyIntoCache(this.kasKeyInfoCache, {
363
+ // TypeScript is silly and cannot infer that publicKey is not undefined, without re-referencing it like this, even though we checked already.
364
+ ...kasKey,
365
+ publicKey: kasKey.publicKey,
366
+ });
267
367
  }
268
368
  }
269
- return { kas: kas.uri, sid };
270
- });
369
+ }
370
+ const detailedPlan = plan(attributeValues);
371
+ for (const item of detailedPlan) {
372
+ if ('kid' in item.kas) {
373
+ const pemAlgorithm = await algorithmFromPEM(item.kas.pem);
374
+ const kasPublicKeyInfo = await this._doFetchKasKeyWithCache(this.kasKeyInfoCache, item.kas.kasUri, pemAlgorithm, item.kas.kid);
375
+ splitPlan.push({
376
+ kas: kasPublicKeyInfo.url,
377
+ kid: kasPublicKeyInfo.kid,
378
+ pem: kasPublicKeyInfo.publicKey,
379
+ sid: item.sid,
380
+ });
381
+ continue;
382
+ }
383
+ if (!item.kas.publicKey) {
384
+ const kasPublicKeyInfo = await this._doFetchKasKeyWithCache(this.kasKeyInfoCache, item.kas.uri, wrappingKeyAlgorithm, undefined);
385
+ splitPlan.push({
386
+ kas: kasPublicKeyInfo.url,
387
+ kid: kasPublicKeyInfo.kid,
388
+ pem: kasPublicKeyInfo.publicKey,
389
+ sid: item.sid,
390
+ });
391
+ continue;
392
+ }
393
+ switch (item.kas.publicKey.publicKey.case) {
394
+ case 'remote':
395
+ const kasPublicKeyInfo = await this._doFetchKasKeyWithCache(this.kasKeyInfoCache, item.kas.publicKey.publicKey.value, wrappingKeyAlgorithm, undefined);
396
+ splitPlan.push({
397
+ kas: kasPublicKeyInfo.url,
398
+ kid: kasPublicKeyInfo.kid,
399
+ pem: kasPublicKeyInfo.publicKey,
400
+ sid: item.sid,
401
+ });
402
+ break;
403
+ case 'cached':
404
+ for (const cachedPublicKey of item.kas.publicKey.publicKey.value.keys) {
405
+ splitPlan.push({
406
+ kas: item.kas.uri,
407
+ kid: cachedPublicKey.kid,
408
+ pem: cachedPublicKey.pem,
409
+ sid: item.sid,
410
+ });
411
+ }
412
+ break;
413
+ default:
414
+ throw new Error(`Unknown public key type: ${item.kas.publicKey.publicKey.case}`);
415
+ }
416
+ }
271
417
  }
272
418
  // TODO: Refactor underlying builder to remove some of this unnecessary config.
273
419
  const maxByteLimit = GLOBAL_BYTE_LIMIT;
@@ -275,34 +421,39 @@ export class Client {
275
421
  ? maxByteLimit
276
422
  : opts.byteLimit;
277
423
  const encryptionInformation = new SplitKey(new AesGcmCipher(this.cryptoService));
278
- const splits = splitPlan?.length
279
- ? splitPlan
280
- : [{ kas: opts.defaultKASEndpoint ?? this.kasEndpoint }];
281
- encryptionInformation.keyAccess = await Promise.all(splits.map(async ({ kas, sid }) => {
282
- if (!(kas in this.kasKeys)) {
283
- this.kasKeys[kas] = [fetchKasPublicKey(kas, wrappingKeyAlgorithm)];
284
- }
285
- const kasPublicKey = await Promise.any(this.kasKeys[kas]);
286
- if (kasPublicKey.algorithm !== wrappingKeyAlgorithm) {
287
- console.warn(`Mismatched wrapping key algorithm: [${kasPublicKey.algorithm}] is not requested type, [${wrappingKeyAlgorithm}]`);
424
+ if (splitPlan.length === 0) {
425
+ const kasPublicKeyInfo = await this._doFetchKasKeyWithCache(this.kasKeyInfoCache, opts.defaultKASEndpoint ?? this.kasEndpoint, wrappingKeyAlgorithm, undefined);
426
+ splitPlan.push({
427
+ kas: kasPublicKeyInfo.url,
428
+ kid: kasPublicKeyInfo.kid,
429
+ pem: kasPublicKeyInfo.publicKey,
430
+ });
431
+ }
432
+ encryptionInformation.keyAccess = await Promise.all(splitPlan.map(async ({ kas, kid, pem, sid }) => {
433
+ const algorithm = await algorithmFromPEM(pem);
434
+ if (algorithm !== wrappingKeyAlgorithm) {
435
+ console.warn(`Mismatched wrapping key algorithm: [${algorithm}] is not requested type, [${wrappingKeyAlgorithm}]`);
288
436
  }
289
437
  let type;
290
- switch (kasPublicKey.algorithm) {
438
+ switch (algorithm) {
291
439
  case 'rsa:2048':
440
+ case 'rsa:4096':
292
441
  type = 'wrapped';
293
442
  break;
443
+ case 'ec:secp384r1':
444
+ case 'ec:secp521r1':
294
445
  case 'ec:secp256r1':
295
446
  type = 'ec-wrapped';
296
447
  break;
297
448
  default:
298
- throw new ConfigurationError(`Unsupported algorithm ${kasPublicKey.algorithm}`);
449
+ throw new ConfigurationError(`Unsupported algorithm ${algorithm}`);
299
450
  }
300
451
  return buildKeyAccess({
301
- alg: kasPublicKey.algorithm,
452
+ alg: algorithm,
302
453
  type,
303
- url: kasPublicKey.url,
304
- kid: kasPublicKey.kid,
305
- publicKey: kasPublicKey.publicKey,
454
+ url: kas,
455
+ kid: kid,
456
+ publicKey: pem,
306
457
  metadata,
307
458
  sid,
308
459
  });
@@ -325,6 +476,7 @@ export class Client {
325
476
  keyForEncryption,
326
477
  keyForManifest,
327
478
  assertionConfigs: opts.assertionConfigs,
479
+ systemMetadataAssertion: opts.systemMetadataAssertion,
328
480
  tdfSpecVersion,
329
481
  };
330
482
  return streamMiddleware(await writeStream(ecfg));
@@ -337,10 +489,11 @@ export class Client {
337
489
  * @param params.source A data stream object, one of remote, stream, buffer, etc. types.
338
490
  * @param params.eo Optional entity object (legacy AuthZ)
339
491
  * @param params.assertionVerificationKeys Optional verification keys for assertions.
492
+ * @param params.fulfillableObligationFQNs Optional fulfillable obligation value FQNs (overrides those on the Client)
340
493
  * @return a {@link https://nodejs.org/api/stream.html#stream_class_stream_readable|Readable} stream containing the decrypted plaintext.
341
494
  * @see DecryptParamsBuilder
342
495
  */
343
- async decrypt({ source, allowList, keyMiddleware = async (key) => key, streamMiddleware = async (stream) => stream, assertionVerificationKeys, noVerifyAssertions, concurrencyLimit = 1, wrappingKeyAlgorithm, }) {
496
+ async decrypt({ source, allowList, keyMiddleware = async (key) => key, streamMiddleware = async (stream) => stream, assertionVerificationKeys, noVerifyAssertions, concurrencyLimit = 1, wrappingKeyAlgorithm, fulfillableObligationFQNs = [], }) {
344
497
  const dpopKeys = await this.dpopKeys;
345
498
  if (!this.authProvider) {
346
499
  throw new ConfigurationError('AuthProvider missing');
@@ -355,6 +508,10 @@ export class Client {
355
508
  else {
356
509
  throw new ConfigurationError('platformUrl is required when allowedKases is empty');
357
510
  }
511
+ const hasEmptyDecryptParamObligationsButGlobal = !fulfillableObligationFQNs.length && this.fulfillableObligationFQNs.length;
512
+ if (hasEmptyDecryptParamObligationsButGlobal) {
513
+ fulfillableObligationFQNs = this.fulfillableObligationFQNs;
514
+ }
358
515
  // Await in order to catch any errors from this call.
359
516
  // TODO: Write error event to stream and don't await.
360
517
  return await streamMiddleware(await readStream({
@@ -370,6 +527,7 @@ export class Client {
370
527
  assertionVerificationKeys,
371
528
  noVerifyAssertions,
372
529
  wrappingKeyAlgorithm,
530
+ fulfillableObligations: fulfillableObligationFQNs,
373
531
  }));
374
532
  }
375
533
  /**
@@ -396,4 +554,4 @@ export class Client {
396
554
  }
397
555
  }
398
556
  export { DecryptParamsBuilder, EncryptParamsBuilder, HttpRequest, withHeaders };
399
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZGYzL3NyYy9jbGllbnQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQixPQUFPLEVBQ0wsU0FBUyxFQUNULGNBQWMsRUFDZCxhQUFhLElBQUksb0JBQW9CLEdBQ3RDLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pELE9BQU8sRUFDTCxjQUFjLEVBRWQsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsVUFBVSxFQUNWLFdBQVcsR0FDWixNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDM0YsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFekYsT0FBTyxFQUFxQixXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEYsT0FBTyxFQUNMLDZCQUE2QixFQUM3QixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLHVCQUF1QixDQUFDO0FBYS9CLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsb0JBQW9CLEVBRXBCLG9CQUFvQixHQUNyQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wscUJBQXFCLEVBRXJCLGdDQUFnQyxFQUNoQyxlQUFlLEdBQ2hCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVB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
557
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZGYzL3NyYy9jbGllbnQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQixPQUFPLEVBQ0wsYUFBYSxJQUFJLG9CQUFvQixFQUNyQyxjQUFjLEVBQ2QsU0FBUyxHQUNWLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pELE9BQU8sRUFDTCxjQUFjLEVBRWQsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixVQUFVLEVBQ1Ysb0JBQW9CLEVBQ3BCLFdBQVcsR0FDWixNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDM0YsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFekYsT0FBTyxFQUFxQixXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEYsT0FBTyxFQUNMLDZCQUE2QixFQUM3QixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLHVCQUF1QixDQUFDO0FBRS9CLE9BQU8sRUFFTCxvQkFBb0IsRUFHcEIsb0JBQW9CLEVBR3BCLG9CQUFvQixHQUdyQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wscUJBQXFCLEVBRXJCLGdDQUFnQyxFQUNoQyxlQUFlLEdBQ2hCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVB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
@@ -13,9 +13,9 @@ const IP_HOST_PORT = '([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}:[0-9]{1
13
13
  // validate host is one of those above
14
14
  const HOST = `(${HOST_PORT}|${WWW_HOST}|${IP_HOST_PORT})`;
15
15
  // validate attr name be like `/attr/<attr_name>`
16
- export const ATTR_NAME = `(/${ATTR_NAME_PROP_NAME}/[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]?)`;
16
+ export const ATTR_NAME = `(/${ATTR_NAME_PROP_NAME}/(%[0-9a-fA-F][0-9a-fA-F]|[a-zA-Z0-9])+((%[0-9a-fA-F][0-9a-fA-F]|[a-zA-Z0-9-])+[a-zA-Z0-9])?)`;
17
17
  // validate value pattern
18
- export const ATTR_VALUE = `(/${ATTR_VALUE_PROP_NAME}/[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]?)`;
18
+ export const ATTR_VALUE = `(/${ATTR_VALUE_PROP_NAME}/(%[0-9a-fA-F][0-9a-fA-F]|[a-zA-Z0-9])+((%[0-9a-fA-F][0-9a-fA-F]|[a-zA-Z0-9-])+[a-zA-Z0-9])?)`;
19
19
  // validate attribute authority e.g. https://example.com
20
20
  const ATTR_AUTHORITY_PATTERN = `(${SCHEME}${HOST})`;
21
21
  // validate attribute namespace e.g. https://example.com/attr/someattribute
@@ -55,4 +55,4 @@ export function validateAttribute(attribute) {
55
55
  }
56
56
  return true;
57
57
  }
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RkZjMvc3JjL2NsaWVudC92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWxFLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBOEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFbkYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDO0FBQzFDLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLE9BQU8sQ0FBQztBQUU1QyxzRUFBc0U7QUFDdEUsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDO0FBRTdCLDZDQUE2QztBQUM3QyxNQUFNLFNBQVMsR0FBRyxtQ0FBbUMsQ0FBQztBQUV0RCw4Q0FBOEM7QUFDOUMsTUFBTSxRQUFRLEdBQUcsZ0RBQWdELENBQUM7QUFFbEUsNkNBQTZDO0FBQzdDLE1BQU0sWUFBWSxHQUFHLGdFQUFnRSxDQUFDO0FBRXRGLHNDQUFzQztBQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLFNBQVMsSUFBSSxRQUFRLElBQUksWUFBWSxHQUFHLENBQUM7QUFFMUQsa0RBQWtEO0FBQ2xELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxLQUFLLG1CQUFtQix3Q0FBd0MsQ0FBQztBQUUxRix5QkFBeUI7QUFDekIsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEtBQUssb0JBQW9CLHdDQUF3QyxDQUFDO0FBRTVGLHlEQUF5RDtBQUN6RCxNQUFNLHNCQUFzQixHQUFHLElBQUksTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDO0FBRXBELDJFQUEyRTtBQUMzRSxNQUFNLHNCQUFzQixHQUFHLElBQUksc0JBQXNCLEdBQUcsU0FBUyxHQUFHLENBQUM7QUFFekUsdUZBQXVGO0FBQ3ZGLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEtBQUssc0JBQXNCLEdBQUcsVUFBVSxJQUFJLENBQUM7QUFFbkYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxJQUFhLEVBQWdCLEVBQUU7SUFDckUsTUFBTSxRQUFRLEdBQUcsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDO0lBQzFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE1BQU0sSUFBSSx3QkFBd0IsQ0FBQywrQkFBK0IsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQStCLENBQUM7SUFDdEQsTUFBTSxRQUFRLEdBQUcsT0FBTyxTQUFTLEtBQUssUUFBUSxDQUFDO0lBQy9DLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE1BQU0sSUFBSSx3QkFBd0IsQ0FBQyxtQ0FBbUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsT0FBTyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN0QyxDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUsaUJBQWlCLENBQUMsU0FBaUI7SUFDakQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDO1FBQzdDLE1BQU0sSUFBSSx3QkFBd0IsQ0FBQyxtQ0FBbUMsU0FBUyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxtQkFBbUIsR0FBRyxDQUFDO0lBQ3BELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxvQkFBb0IsR0FBRyxDQUFDO0lBQ3RELE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDL0QsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUVqRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkIsTUFBTSxJQUFJLHdCQUF3QixDQUFDLCtCQUErQixFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEIsTUFBTSxJQUFJLHdCQUF3QixDQUFDLGdDQUFnQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25FLE1BQU0sY0FBYyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFdEUsSUFBSSxhQUFhLEtBQUssY0FBYyxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLHdCQUF3QixDQUFDLGdEQUFnRCxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMifQ==
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RkZjMvc3JjL2NsaWVudC92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWxFLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBOEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFbkYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDO0FBQzFDLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLE9BQU8sQ0FBQztBQUU1QyxzRUFBc0U7QUFDdEUsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDO0FBRTdCLDZDQUE2QztBQUM3QyxNQUFNLFNBQVMsR0FBRyxtQ0FBbUMsQ0FBQztBQUV0RCw4Q0FBOEM7QUFDOUMsTUFBTSxRQUFRLEdBQUcsZ0RBQWdELENBQUM7QUFFbEUsNkNBQTZDO0FBQzdDLE1BQU0sWUFBWSxHQUFHLGdFQUFnRSxDQUFDO0FBRXRGLHNDQUFzQztBQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLFNBQVMsSUFBSSxRQUFRLElBQUksWUFBWSxHQUFHLENBQUM7QUFFMUQsa0RBQWtEO0FBQ2xELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxLQUFLLG1CQUFtQiwrRkFBK0YsQ0FBQztBQUVqSix5QkFBeUI7QUFDekIsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEtBQUssb0JBQW9CLCtGQUErRixDQUFDO0FBRW5KLHlEQUF5RDtBQUN6RCxNQUFNLHNCQUFzQixHQUFHLElBQUksTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDO0FBRXBELDJFQUEyRTtBQUMzRSxNQUFNLHNCQUFzQixHQUFHLElBQUksc0JBQXNCLEdBQUcsU0FBUyxHQUFHLENBQUM7QUFFekUsdUZBQXVGO0FBQ3ZGLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEtBQUssc0JBQXNCLEdBQUcsVUFBVSxJQUFJLENBQUM7QUFFbkYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxJQUFhLEVBQWdCLEVBQUU7SUFDckUsTUFBTSxRQUFRLEdBQUcsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDO0lBQzFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE1BQU0sSUFBSSx3QkFBd0IsQ0FBQywrQkFBK0IsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQStCLENBQUM7SUFDdEQsTUFBTSxRQUFRLEdBQUcsT0FBTyxTQUFTLEtBQUssUUFBUSxDQUFDO0lBQy9DLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE1BQU0sSUFBSSx3QkFBd0IsQ0FBQyxtQ0FBbUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsT0FBTyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN0QyxDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUsaUJBQWlCLENBQUMsU0FBaUI7SUFDakQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDO1FBQzdDLE1BQU0sSUFBSSx3QkFBd0IsQ0FBQyxtQ0FBbUMsU0FBUyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxtQkFBbUIsR0FBRyxDQUFDO0lBQ3BELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxvQkFBb0IsR0FBRyxDQUFDO0lBQ3RELE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDL0QsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUVqRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkIsTUFBTSxJQUFJLHdCQUF3QixDQUFDLCtCQUErQixFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEIsTUFBTSxJQUFJLHdCQUF3QixDQUFDLGdDQUFnQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25FLE1BQU0sY0FBYyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFdEUsSUFBSSxhQUFhLEtBQUssY0FBYyxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLHdCQUF3QixDQUFDLGdEQUFnRCxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMifQ==