@dbx-tools/model 0.9.118 → 0.9.119

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.
@@ -4,9 +4,10 @@
4
4
  * docs and error-learned reasoning ladders.
5
5
  *
6
6
  * Committed snapshots seed every process. {@link refreshModelMetadata} pulls
7
- * documentation through {@link createMetadataCache} (cacache memoize + disk) and
7
+ * documentation through the shared memory-first {@link createMetadataCache} and
8
8
  * rebuilds the in-memory index. Error-learned efforts use the same store via
9
- * {@link rememberReasoningLevels}. Disk writes are skipped in Databricks Apps.
9
+ * {@link rememberReasoningLevels}. Known-good values are written behind to the
10
+ * shared model project cache.
10
11
  *
11
12
  * @module
12
13
  */
@@ -148,7 +149,7 @@ export async function refreshModelMetadata() {
148
149
  });
149
150
  return refreshInflight;
150
151
  }
151
- /** Load cacache / memory entries without forcing a network refresh. */
152
+ /** Load shared cache entries without forcing a network refresh. */
152
153
  export async function hydrateModelMetadata() {
153
154
  const [retiredNames, capabilities, rateLimits, reasoning, learnedReasoning] = await Promise.all([
154
155
  peekOrFallback(retiredCache, COMMITTED_RETIRED_MODELS),
@@ -172,16 +173,12 @@ async function peekOrFallback(cache, fallback) {
172
173
  return peeked;
173
174
  return cache.get().catch(() => fallback);
174
175
  }
175
- /** Absolute cacache root used by the documentation / learned caches. */
176
- export function modelMetadataCachePath() {
177
- return retiredCache.path;
178
- }
179
176
  export { modelStatusFor, retiredModelNames } from "./_retirement.js";
180
177
  /** Return the committed reasoning-effort catalogue. Cached per process. */
181
178
  export function reasoningModelCatalogue() {
182
179
  return metadataIndex().reasoning;
183
180
  }
184
- /** Return error-learned reasoning ladders persisted in the metadata cache. */
181
+ /** Return error-learned reasoning ladders from the shared model cache. */
185
182
  export function learnedReasoningCatalogue() {
186
183
  return metadataIndex().learnedReasoning;
187
184
  }
@@ -214,7 +211,7 @@ export async function rememberReasoningLevels(model, levels) {
214
211
  *
215
212
  * Accepts the same nested Databricks envelopes as {@link parseReasoningLevels}.
216
213
  * Returns the levels that were stored (or the current lookup when parse yields
217
- * nothing). The raw error body is never written to disk.
214
+ * nothing). The raw error body is never cached.
218
215
  */
219
216
  export async function learnReasoningLevelsFromError(model, body) {
220
217
  return rememberReasoningLevels(model, parseReasoningLevels(body));
@@ -313,4 +310,4 @@ async function loadPage(url) {
313
310
  function nowSeconds() {
314
311
  return Math.floor(Date.now() / 1000);
315
312
  }
316
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0YWRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxPQUFPLEtBQUssYUFBYSxNQUFNLHVDQUF1QyxDQUFDO0FBUXZFLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLDJCQUEyQixFQUMzQix1QkFBdUIsRUFDdkIsa0JBQWtCLEVBQ2xCLHFCQUFxQixHQUt0QixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixrQkFBa0IsR0FDbkIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLGNBQWMsRUFDZCx3QkFBd0IsRUFDeEIsMkJBQTJCLEdBQzVCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyx3QkFBd0IsTUFBTSxxQ0FBcUMsQ0FBQyxPQUFPLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNqRyxPQUFPLHNCQUFzQixNQUFNLG9DQUFvQyxDQUFDLE9BQU8sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzlGLE9BQU8scUJBQXFCLE1BQU0sa0NBQWtDLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDM0YsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixvQkFBb0IsRUFDcEIsc0JBQXNCLEdBRXZCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLHVCQUF1QixFQUFFLHlCQUF5QixFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ25HLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIseUJBQXlCLEVBQ3pCLGNBQWMsRUFDZCxvQkFBb0IsRUFHcEIscUJBQXFCLEdBQ3RCLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsT0FBTyxFQUNMLHFCQUFxQixFQUNy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Q3BDLENBQUMsQ0FBQztJQUNILElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsUUFBUSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUN6QixDQUFDO0FBRUQsU0FBUyxVQUFVO0lBQ2pCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnVpbGQtZ2VuZXJhdGVkIERhdGFicmlja3MgbW9kZWwgcmV0aXJlbWVudCwgY2FwYWJpbGl0eSwgcmF0ZS1saW1pdCwgYW5kXG4gKiByZWFzb25pbmctZWZmb3J0IG1ldGFkYXRhLCBwbHVzIGEgZGFpbHkgd3JpdGUtdGhyb3VnaCBjYWNoZSBmb3IgcmVmcmVzaGVkXG4gKiBkb2NzIGFuZCBlcnJvci1sZWFybmVkIHJlYXNvbmluZyBsYWRkZXJzLlxuICpcbiAqIENvbW1pdHRlZCBzbmFwc2hvdHMgc2VlZCBldmVyeSBwcm9jZXNzLiB7QGxpbmsgcmVmcmVzaE1vZGVsTWV0YWRhdGF9IHB1bGxzXG4gKiBkb2N1bWVudGF0aW9uIHRocm91Z2gge0BsaW5rIGNyZWF0ZU1ldGFkYXRhQ2FjaGV9IChjYWNhY2hlIG1lbW9pemUgKyBkaXNrKSBhbmRcbiAqIHJlYnVpbGRzIHRoZSBpbi1tZW1vcnkgaW5kZXguIEVycm9yLWxlYXJuZWQgZWZmb3J0cyB1c2UgdGhlIHNhbWUgc3RvcmUgdmlhXG4gKiB7QGxpbmsgcmVtZW1iZXJSZWFzb25pbmdMZXZlbHN9LiBEaXNrIHdyaXRlcyBhcmUgc2tpcHBlZCBpbiBEYXRhYnJpY2tzIEFwcHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgKiBhcyBmdW5jdGlvblV0aWxzIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL2Z1bmN0aW9uLXV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIE1vZGVsQ2FwYWJpbGl0aWVzLFxuICBNb2RlbE1ldGFkYXRhLFxuICBNb2RlbFJhdGVMaW1pdHMsXG4gIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC9jb250cmFjdHNcIjtcblxuaW1wb3J0IHtcbiAgTU9ERUxfTUVUQURBVEFfVFRMX01TLFxuICBNT0RFTF9SQVRFX0xJTUlUU19VUkwsXG4gIE9QRU5BSV9SRVNQT05TRVNfTU9ERUxTX1VSTCxcbiAgUVVFUllfUkVBU09OX01PREVMU19VUkwsXG4gIFJFVElSRURfTU9ERUxTX1VSTCxcbiAgV0VCX1NFQVJDSF9NT0RFTFNfVVJMLFxuICB0eXBlIE1vZGVsQ2FwYWJpbGl0aWVzU25hcHNob3QsXG4gIHR5cGUgTW9kZWxDYXBhYmlsaXR5Q2F0YWxvZ3VlLFxuICB0eXBlIE1vZGVsUmF0ZUxpbWl0c1NuYXBzaG90LFxuICB0eXBlIFJlYXNvbmluZ01vZGVsc1NuYXBzaG90LFxufSBmcm9tIFwiLi9fbWV0YWRhdGEtY29udHJhY3QudHNcIjtcbmltcG9ydCB7XG4gIHBhcnNlTW9kZWxDYXBhYmlsaXRpZXMsXG4gIHBhcnNlTW9kZWxSYXRlTGltaXRzLFxuICBwYXJzZVJlYXNvbmluZ01vZGVscyxcbiAgcGFyc2VSZXRpcmVkTW9kZWxzLFxufSBmcm9tIFwiLi9fbWV0YWRhdGEtZ2VuZXJhdG9yLnRzXCI7XG5pbXBvcnQge1xuICBDT01NSVRURURfUkVUSVJFRF9NT0RFTFMsXG4gIG1vZGVsU3RhdHVzRm9yLFxuICByZXBsYWNlUmV0aXJlZE1vZGVsTmFtZXMsXG4gIFJFVElSRURfTU9ERUxTX0dFTkVSQVRFRF9BVCxcbn0gZnJvbSBcIi4vX3JldGlyZW1lbnQudHNcIjtcbmltcG9ydCBjYXBhYmlsaXRpZXNTbmFwc2hvdEpzb24gZnJvbSBcIi4vZ2VuZXJhdGVkL21vZGVsLWNhcGFiaWxpdGllcy5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQgcmF0ZUxpbWl0c1NuYXBzaG90SnNvbiBmcm9tIFwiLi9nZW5lcmF0ZWQvbW9kZWwtcmF0ZS1saW1pdHMuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9O1xuaW1wb3J0IHJlYXNvbmluZ1NuYXBzaG90SnNvbiBmcm9tIFwiLi9nZW5lcmF0ZWQvbW9kZWwtcmVhc29uaW5nLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfTtcbmltcG9ydCB7XG4gIGNyZWF0ZU1ldGFkYXRhQ2FjaGUsXG4gIG1lcmdlUHJlZmVyRnJlc2hMaXN0LFxuICBtZXJnZVByZWZlckZyZXNoUmVjb3JkLFxuICB0eXBlIE1ldGFkYXRhQ2FjaGUsXG59IGZyb20gXCIuL21ldGFkYXRhLWNhY2hlLnRzXCI7XG5pbXBvcnQgeyBpbmhlcml0c05hdGl2ZVdlYlNlYXJjaCwgaXNGb3VuZGF0aW9uTW9kZWxJZGVudGl0eSwgbW9kZWxTZWFyY2hRdWVyeSB9IGZyb20gXCIuL3BvbGljeS50c1wiO1xuaW1wb3J0IHtcbiAgZGVmYXVsdFJlYXNvbmluZ0xldmVscyxcbiAgZG9jdW1lbnRlZFJlYXNvbmluZ0xldmVscyxcbiAgcGFyc2VSZWFzb25pbmcsXG4gIHBhcnNlUmVhc29uaW5nTGV2ZWxzLFxuICB0eXBlIFJlYXNvbmluZ0xldmVsLFxuICB0eXBlIFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlLFxuICB1bmlxdWVSZWFzb25pbmdMZXZlbHMsXG59IGZyb20gXCIuL3JlYXNvbmluZy10cmFuc2xhdGlvbi50c1wiO1xuXG5leHBvcnQge1xuICBNT0RFTF9NRVRBREFUQV9UVExfTVMsXG4gIE1PREVMX1JBVEVfTElNSVRTX1VSTCxcbiAgT1BFTkFJX1JFU1BPTlNFU19NT0RFTFNfVVJMLFxuICBRVUVSWV9SRUFTT05fTU9ERUxTX1VSTCxcbiAgUkVUSVJFRF9NT0RFTFNfVVJMLFxuICBXRUJfU0VBUkNIX01PREVMU19VUkwsXG59O1xuXG5jb25zdCBjYXBhYmlsaXRpZXNTbmFwc2hvdCA9IGNhcGFiaWxpdGllc1NuYXBzaG90SnNvbiBhcyBNb2RlbENhcGFiaWxpdGllc1NuYXBzaG90O1xuY29uc3QgcmF0ZUxpbWl0c1NuYXBzaG90ID0gcmF0ZUxpbWl0c1NuYXBzaG90SnNvbiBhcyBNb2RlbFJhdGVMaW1pdHNTbmFwc2hvdDtcbmNvbnN0IHJlYXNvbmluZ1NuYXBzaG90ID0gcmVhc29uaW5nU25hcHNob3RKc29uIGFzIFJlYXNvbmluZ01vZGVsc1NuYXBzaG90O1xuXG5pbnRlcmZhY2UgTWV0YWRhdGFJbmRleCB7XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczoge1xuICAgIHJlYWRvbmx5IFtLZXkgaW4ga2V5b2YgTW9kZWxDYXBhYmlsaXR5Q2F0YWxvZ3VlXTogUmVhZG9ubHlTZXQ8c3RyaW5nPjtcbiAgfTtcbiAgcmVhZG9ubHkgcmF0ZUxpbWl0czogUmVhZG9ubHlNYXA8c3RyaW5nLCBNb2RlbFJhdGVMaW1pdHM+O1xuICByZWFkb25seSByZWFzb25pbmc6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlO1xuICByZWFkb25seSBsZWFybmVkUmVhc29uaW5nOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZTtcbn1cblxudHlwZSBDYXBhYmlsaXR5U2V0cyA9IE1vZGVsQ2FwYWJpbGl0eUNhdGFsb2d1ZTtcblxuY29uc3QgVVNFUl9BR0VOVCA9IFwiZGJ4LXRvb2xzLW1vZGVsLW1ldGFkYXRhLzFcIjtcblxuY29uc3QgcmV0aXJlZENhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxyZWFkb25seSBzdHJpbmdbXT4oe1xuICBrZXk6IFwicmV0aXJlZC1tb2RlbHNcIixcbiAgZmFsbGJhY2s6IENPTU1JVFRFRF9SRVRJUkVEX01PREVMUyxcbiAgbG9hZDogYXN5bmMgKCkgPT4gcGFyc2VSZXRpcmVkTW9kZWxzKGF3YWl0IGxvYWRQYWdlKFJFVElSRURfTU9ERUxTX1VSTCksIG5vd1NlY29uZHMoKSkubW9kZWxzLFxuICBtZXJnZTogbWVyZ2VQcmVmZXJGcmVzaExpc3QsXG59KTtcblxuY29uc3QgY2FwYWJpbGl0aWVzQ2FjaGUgPSBjcmVhdGVNZXRhZGF0YUNhY2hlPENhcGFiaWxpdHlTZXRzPih7XG4gIGtleTogXCJtb2RlbC1jYXBhYmlsaXRpZXNcIixcbiAgZmFsbGJhY2s6IGNhcGFiaWxpdGllc1NuYXBzaG90LmNhcGFiaWxpdGllcyxcbiAgbG9hZDogYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtyZXNwb25zZXNIdG1sLCB3ZWJTZWFyY2hIdG1sXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGxvYWRQYWdlKE9QRU5BSV9SRVNQT05TRVNfTU9ERUxTX1VSTCksXG4gICAgICBsb2FkUGFnZShXRUJfU0VBUkNIX01PREVMU19VUkwpLFxuICAgIF0pO1xuICAgIHJldHVybiBwYXJzZU1vZGVsQ2FwYWJpbGl0aWVzKHJlc3BvbnNlc0h0bWwsIHdlYlNlYXJjaEh0bWwsIG5vd1NlY29uZHMoKSkuY2FwYWJpbGl0aWVzO1xuICB9LFxuICBtZXJnZTogKGlucHV0KSA9PiAoe1xuICAgIHJlc3BvbnNlczogbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5yZXNwb25zZXMsXG4gICAgICBwcmV2aW91czogaW5wdXQucHJldmlvdXM/LnJlc3BvbnNlcyxcbiAgICAgIGZhbGxiYWNrOiBpbnB1dC5mYWxsYmFjay5yZXNwb25zZXMsXG4gICAgfSksXG4gICAgaW1hZ2VJbnB1dDogbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5pbWFnZUlucHV0LFxuICAgICAgcHJldmlvdXM6IGlucHV0LnByZXZpb3VzPy5pbWFnZUlucHV0LFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLmltYWdlSW5wdXQsXG4gICAgfSksXG4gICAgYXBwbHlQYXRjaDogbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5hcHBseVBhdGNoLFxuICAgICAgcHJldmlvdXM6IGlucHV0LnByZXZpb3VzPy5hcHBseVBhdGNoLFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLmFwcGx5UGF0Y2gsXG4gICAgfSksXG4gICAgd2ViU2VhcmNoOiBtZXJnZVByZWZlckZyZXNoTGlzdCh7XG4gICAgICBmcmVzaDogaW5wdXQuZnJlc2g/LndlYlNlYXJjaCxcbiAgICAgIHByZXZpb3VzOiBpbnB1dC5wcmV2aW91cz8ud2ViU2VhcmNoLFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLndlYlNlYXJjaCxcbiAgICB9KSxcbiAgfSksXG59KTtcblxuY29uc3QgcmF0ZUxpbWl0c0NhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBNb2RlbFJhdGVMaW1pdHM+Pj4oe1xuICBrZXk6IFwibW9kZWwtcmF0ZS1saW1pdHNcIixcbiAgZmFsbGJhY2s6IHJhdGVMaW1pdHNTbmFwc2hvdC5jYXRhbG9ndWUubW9kZWxzLFxuICBsb2FkOiBhc3luYyAoKSA9PlxuICAgIHBhcnNlTW9kZWxSYXRlTGltaXRzKGF3YWl0IGxvYWRQYWdlKE1PREVMX1JBVEVfTElNSVRTX1VSTCksIG5vd1NlY29uZHMoKSkuY2F0YWxvZ3VlLm1vZGVscyxcbiAgbWVyZ2U6IG1lcmdlUHJlZmVyRnJlc2hSZWNvcmQsXG59KTtcblxuY29uc3QgcmVhc29uaW5nRG9jc0NhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4+Pih7XG4gIGtleTogXCJtb2RlbC1yZWFzb25pbmdcIixcbiAgZmFsbGJhY2s6IHJlYXNvbmluZ1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMsXG4gIGxvYWQ6IGFzeW5jICgpID0+XG4gICAgcGFyc2VSZWFzb25pbmdNb2RlbHMoYXdhaXQgbG9hZFBhZ2UoUVVFUllfUkVBU09OX01PREVMU19VUkwpLCBub3dTZWNvbmRzKCkpLmNhdGFsb2d1ZS5tb2RlbHMsXG4gIG1lcmdlOiBtZXJnZVByZWZlckZyZXNoUmVjb3JkLFxufSk7XG5cbmNvbnN0IGxlYXJuZWRSZWFzb25pbmdDYWNoZSA9IGNyZWF0ZU1ldGFkYXRhQ2FjaGU8XG4gIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+PlxuPih7XG4gIGtleTogXCJsZWFybmVkLXJlYXNvbmluZ1wiLFxuICBmYWxsYmFjazoge30sXG4gIG1lcmdlOiBtZXJnZVByZWZlckZyZXNoUmVjb3JkLFxufSk7XG5cbmxldCBsaXZlSW5kZXg6IE1ldGFkYXRhSW5kZXggfCB1bmRlZmluZWQ7XG5cbmNvbnN0IG1ldGFkYXRhSW5kZXggPSBmdW5jdGlvblV0aWxzLm1lbW9pemU8TWV0YWRhdGFJbmRleD4oXG4gICgpID0+IGxpdmVJbmRleCA/PyBidWlsZEluZGV4RnJvbUNvbW1pdHRlZCgpLFxuKTtcblxuZnVuY3Rpb24gYnVpbGRJbmRleEZyb21Db21taXR0ZWQoKTogTWV0YWRhdGFJbmRleCB7XG4gIHJldHVybiBidWlsZEluZGV4KHtcbiAgICByZXRpcmVkTmFtZXM6IENPTU1JVFRFRF9SRVRJUkVEX01PREVMUyxcbiAgICBjYXBhYmlsaXRpZXM6IGNhcGFiaWxpdGllc1NuYXBzaG90LmNhcGFiaWxpdGllcyxcbiAgICByYXRlTGltaXRzOiByYXRlTGltaXRzU25hcHNob3QuY2F0YWxvZ3VlLm1vZGVscyxcbiAgICByZWFzb25pbmc6IHJlYXNvbmluZ1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMsXG4gICAgbGVhcm5lZFJlYXNvbmluZzoge30sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZEluZGV4KGlucHV0OiB7XG4gIHJlYWRvbmx5IHJldGlyZWROYW1lczogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczogQ2FwYWJpbGl0eVNldHM7XG4gIHJlYWRvbmx5IHJhdGVMaW1pdHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIE1vZGVsUmF0ZUxpbWl0cz4+O1xuICByZWFkb25seSByZWFzb25pbmc6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj47XG4gIHJlYWRvbmx5IGxlYXJuZWRSZWFzb25pbmc6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+Pjtcbn0pOiBNZXRhZGF0YUluZGV4IHtcbiAgcmVwbGFjZVJldGlyZWRNb2RlbE5hbWVzKGlucHV0LnJldGlyZWROYW1lcyk7XG4gIHJldHVybiB7XG4gICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICByZXNwb25zZXM6IG5ldyBTZXQoaW5wdXQuY2FwYWJpbGl0aWVzLnJlc3BvbnNlcyksXG4gICAgICBpbWFnZUlucHV0OiBuZXcgU2V0KGlucHV0LmNhcGFiaWxpdGllcy5pbWFnZUlucHV0KSxcbiAgICAgIGFwcGx5UGF0Y2g6IG5ldyBTZXQoaW5wdXQuY2FwYWJpbGl0aWVzLmFwcGx5UGF0Y2gpLFxuICAgICAgd2ViU2VhcmNoOiBuZXcgU2V0KGlucHV0LmNhcGFiaWxpdGllcy53ZWJTZWFyY2gpLFxuICAgIH0sXG4gICAgcmF0ZUxpbWl0czogbmV3IE1hcChPYmplY3QuZW50cmllcyhpbnB1dC5yYXRlTGltaXRzKSksXG4gICAgcmVhc29uaW5nOiBmcmVlemVSZWFzb25pbmdDYXRhbG9ndWUoaW5wdXQucmVhc29uaW5nKSxcbiAgICBsZWFybmVkUmVhc29uaW5nOiBmcmVlemVMZWFybmVkQ2F0YWxvZ3VlKGlucHV0LmxlYXJuZWRSZWFzb25pbmcpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBmcmVlemVSZWFzb25pbmdDYXRhbG9ndWUoXG4gIG1vZGVsczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+Pixcbik6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMobW9kZWxzKS5tYXAoKFtrZXksIGxldmVsc10pID0+IFtcbiAgICAgICAga2V5LFxuICAgICAgICBPYmplY3QuZnJlZXplKFxuICAgICAgICAgIHVuaXF1ZVJlYXNvbmluZ0xldmVscyhsZXZlbHMuZmxhdE1hcCgobGV2ZWwpID0+IHBhcnNlUmVhc29uaW5nKGxldmVsKSA/PyBbXSkpLFxuICAgICAgICApLFxuICAgICAgXSksXG4gICAgKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gZnJlZXplTGVhcm5lZENhdGFsb2d1ZShcbiAgbW9kZWxzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdPj4sXG4pOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKG1vZGVscykubWFwKChba2V5LCBsZXZlbHNdKSA9PiBbXG4gICAgICAgIGtleSxcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh1bmlxdWVSZWFzb25pbmdMZXZlbHMobGV2ZWxzKSksXG4gICAgICBdKSxcbiAgICApLFxuICApO1xufVxuXG5sZXQgcmVmcmVzaEluZmxpZ2h0OiBQcm9taXNlPE1ldGFkYXRhSW5kZXg+IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEh5ZHJhdGUgb3IgcmVmcmVzaCBkb2N1bWVudGF0aW9uICsgbGVhcm5lZCBjYWNoZXMgaW50byB0aGUgcHJvY2VzcyBpbmRleC5cbiAqXG4gKiBTYWZlIHRvIGNhbGwgb24gZ2F0ZXdheSBzdGFydHVwLiBDb25jdXJyZW50IGNhbGxlcnMgc2hhcmUgb25lIHJlZnJlc2guXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWZyZXNoTW9kZWxNZXRhZGF0YSgpOiBQcm9taXNlPE1ldGFkYXRhSW5kZXg+IHtcbiAgaWYgKHJlZnJlc2hJbmZsaWdodCkgcmV0dXJuIHJlZnJlc2hJbmZsaWdodDtcbiAgcmVmcmVzaEluZmxpZ2h0ID0gKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbcmV0aXJlZE5hbWVzLCBjYXBhYmlsaXRpZXMsIHJhdGVMaW1pdHMsIHJlYXNvbmluZywgbGVhcm5lZFJlYXNvbmluZ10gPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFtcbiAgICAgICAgcmV0aXJlZENhY2hlLmdldCgpLFxuICAgICAgICBjYXBhYmlsaXRpZXNDYWNoZS5nZXQoKSxcbiAgICAgICAgcmF0ZUxpbWl0c0NhY2hlLmdldCgpLFxuICAgICAgICByZWFzb25pbmdEb2NzQ2FjaGUuZ2V0KCksXG4gICAgICAgIGxlYXJuZWRSZWFzb25pbmdDYWNoZS5nZXQoKSxcbiAgICAgIF0sXG4gICAgKTtcbiAgICBsaXZlSW5kZXggPSBidWlsZEluZGV4KHtcbiAgICAgIHJldGlyZWROYW1lcyxcbiAgICAgIGNhcGFiaWxpdGllcyxcbiAgICAgIHJhdGVMaW1pdHMsXG4gICAgICByZWFzb25pbmcsXG4gICAgICBsZWFybmVkUmVhc29uaW5nLFxuICAgIH0pO1xuICAgIHJldHVybiBsaXZlSW5kZXg7XG4gIH0pKCkuZmluYWxseSgoKSA9PiB7XG4gICAgcmVmcmVzaEluZmxpZ2h0ID0gdW5kZWZpbmVkO1xuICB9KTtcbiAgcmV0dXJuIHJlZnJlc2hJbmZsaWdodDtcbn1cblxuLyoqIExvYWQgY2FjYWNoZSAvIG1lbW9yeSBlbnRyaWVzIHdpdGhvdXQgZm9yY2luZyBhIG5ldHdvcmsgcmVmcmVzaC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlTW9kZWxNZXRhZGF0YSgpOiBQcm9taXNlPE1ldGFkYXRhSW5kZXg+IHtcbiAgY29uc3QgW3JldGlyZWROYW1lcywgY2FwYWJpbGl0aWVzLCByYXRlTGltaXRzLCByZWFzb25pbmcsIGxlYXJuZWRSZWFzb25pbmddID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIHBlZWtPckZhbGxiYWNrKHJldGlyZWRDYWNoZSwgQ09NTUlUVEVEX1JFVElSRURfTU9ERUxTKSxcbiAgICBwZWVrT3JGYWxsYmFjayhjYXBhYmlsaXRpZXNDYWNoZSwgY2FwYWJpbGl0aWVzU25hcHNob3QuY2FwYWJpbGl0aWVzKSxcbiAgICBwZWVrT3JGYWxsYmFjayhyYXRlTGltaXRzQ2FjaGUsIHJhdGVMaW1pdHNTbmFwc2hvdC5jYXRhbG9ndWUubW9kZWxzKSxcbiAgICBwZWVrT3JGYWxsYmFjayhyZWFzb25pbmdEb2NzQ2FjaGUsIHJlYXNvbmluZ1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMpLFxuICAgIHBlZWtPckZhbGxiYWNrKGxlYXJuZWRSZWFzb25pbmdDYWNoZSwge30pLFxuICBdKTtcbiAgbGl2ZUluZGV4ID0gYnVpbGRJbmRleCh7XG4gICAgcmV0aXJlZE5hbWVzLFxuICAgIGNhcGFiaWxpdGllcyxcbiAgICByYXRlTGltaXRzLFxuICAgIHJlYXNvbmluZyxcbiAgICBsZWFybmVkUmVhc29uaW5nLFxuICB9KTtcbiAgcmV0dXJuIGxpdmVJbmRleDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGVla09yRmFsbGJhY2s8VD4oY2FjaGU6IE1ldGFkYXRhQ2FjaGU8VD4sIGZhbGxiYWNrOiBUKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHBlZWtlZCA9IGF3YWl0IGNhY2hlLnBlZWsoKTtcbiAgaWYgKHBlZWtlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcGVla2VkO1xuICByZXR1cm4gY2FjaGUuZ2V0KCkuY2F0Y2goKCkgPT4gZmFsbGJhY2spO1xufVxuXG4vKiogQWJzb2x1dGUgY2FjYWNoZSByb290IHVzZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gLyBsZWFybmVkIGNhY2hlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbE1ldGFkYXRhQ2FjaGVQYXRoKCk6IHN0cmluZyB7XG4gIHJldHVybiByZXRpcmVkQ2FjaGUucGF0aDtcbn1cblxuZXhwb3J0IHsgbW9kZWxTdGF0dXNGb3IsIHJldGlyZWRNb2RlbE5hbWVzIH0gZnJvbSBcIi4vX3JldGlyZW1lbnQudHNcIjtcblxuLyoqIFJldHVybiB0aGUgY29tbWl0dGVkIHJlYXNvbmluZy1lZmZvcnQgY2F0YWxvZ3VlLiBDYWNoZWQgcGVyIHByb2Nlc3MuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhc29uaW5nTW9kZWxDYXRhbG9ndWUoKTogUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUge1xuICByZXR1cm4gbWV0YWRhdGFJbmRleCgpLnJlYXNvbmluZztcbn1cblxuLyoqIFJldHVybiBlcnJvci1sZWFybmVkIHJlYXNvbmluZyBsYWRkZXJzIHBlcnNpc3RlZCBpbiB0aGUgbWV0YWRhdGEgY2FjaGUuICovXG5leHBvcnQgZnVuY3Rpb24gbGVhcm5lZFJlYXNvbmluZ0NhdGFsb2d1ZSgpOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSB7XG4gIHJldHVybiBtZXRhZGF0YUluZGV4KCkubGVhcm5lZFJlYXNvbmluZztcbn1cblxuLyoqXG4gKiBTdG9yZSBsZXZlbHMgbGVhcm5lZCBmcm9tIGFuIHVwc3RyZWFtIGVycm9yIGFuZCBwZXJzaXN0IHRoZW0gd3JpdGUtdGhyb3VnaC5cbiAqXG4gKiBFbXB0eSBsaXN0cyBhcmUgaWdub3JlZCBzbyBhIGZhaWxlZCBwYXJzZSBjYW5ub3Qgd2lwZSBkZWZhdWx0cy4gRXJyb3IgYm9kaWVzXG4gKiB0aGVtc2VsdmVzIGFyZSBuZXZlciBzdG9yZWQgLSBvbmx5IHRoZSBwYXJzZWQgbGFkZGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtZW1iZXJSZWFzb25pbmdMZXZlbHMoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIGxldmVsczogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSxcbik6IFByb21pc2U8UmVhc29uaW5nTGV2ZWxbXT4ge1xuICBjb25zdCB1bmlxdWUgPSB1bmlxdWVSZWFzb25pbmdMZXZlbHMobGV2ZWxzKTtcbiAgaWYgKHVuaXF1ZS5sZW5ndGggPT09IDApIHJldHVybiBtb2RlbFJlYXNvbmluZ0xldmVsc0Zvcihtb2RlbCk7XG4gIGNvbnN0IGtleSA9IG1vZGVsS2V5KG1vZGVsKTtcbiAgaWYgKCFrZXkpIHJldHVybiBtb2RlbFJlYXNvbmluZ0xldmVsc0Zvcihtb2RlbCk7XG4gIGNvbnN0IGNhdGFsb2d1ZSA9IGF3YWl0IGxlYXJuZWRSZWFzb25pbmdDYWNoZS51cGRhdGUoKGN1cnJlbnQpID0+ICh7XG4gICAgLi4uY3VycmVudCxcbiAgICBba2V5XTogdW5pcXVlLFxuICB9KSk7XG4gIGNvbnN0IGN1cnJlbnQgPSBtZXRhZGF0YUluZGV4KCk7XG4gIGxpdmVJbmRleCA9IHtcbiAgICAuLi5jdXJyZW50LFxuICAgIGxlYXJuZWRSZWFzb25pbmc6IGZyZWV6ZUxlYXJuZWRDYXRhbG9ndWUoY2F0YWxvZ3VlKSxcbiAgfTtcbiAgcmV0dXJuIFsuLi51bmlxdWVdO1xufVxuXG4vKipcbiAqIFBhcnNlIGFuIHVwc3RyZWFtIGVycm9yIGJvZHkgYW5kIHBlcnNpc3QgdGhlIHN1cHBvcnRlZCBsYWRkZXIgZm9yIGBtb2RlbGAuXG4gKlxuICogQWNjZXB0cyB0aGUgc2FtZSBuZXN0ZWQgRGF0YWJyaWNrcyBlbnZlbG9wZXMgYXMge0BsaW5rIHBhcnNlUmVhc29uaW5nTGV2ZWxzfS5cbiAqIFJldHVybnMgdGhlIGxldmVscyB0aGF0IHdlcmUgc3RvcmVkIChvciB0aGUgY3VycmVudCBsb29rdXAgd2hlbiBwYXJzZSB5aWVsZHNcbiAqIG5vdGhpbmcpLiBUaGUgcmF3IGVycm9yIGJvZHkgaXMgbmV2ZXIgd3JpdHRlbiB0byBkaXNrLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGVhcm5SZWFzb25pbmdMZXZlbHNGcm9tRXJyb3IoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIGJvZHk6IHVua25vd24sXG4pOiBQcm9taXNlPFJlYXNvbmluZ0xldmVsW10+IHtcbiAgcmV0dXJuIHJlbWVtYmVyUmVhc29uaW5nTGV2ZWxzKG1vZGVsLCBwYXJzZVJlYXNvbmluZ0xldmVscyhib2R5KSk7XG59XG5cbi8qKiBSZXNvbHZlIGRvY3VtZW50ZWQgbW9kZWwgY2FwYWJpbGl0aWVzIGZyb20gYSBuYW1lIG9yIGVuZHBvaW50IHN1bW1hcnkuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxDYXBhYmlsaXRpZXNGb3IobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBNb2RlbENhcGFiaWxpdGllcyB7XG4gIGNvbnN0IGNhcGFiaWxpdGllcyA9IG1ldGFkYXRhSW5kZXgoKS5jYXBhYmlsaXRpZXM7XG4gIGNvbnN0IGlkZW50aXRpZXMgPSBtb2RlbElkZW50aXRpZXMobW9kZWwsIGZhbHNlKTtcbiAgY29uc3Qga2V5cyA9IGlkZW50aXRpZXMuZmxhdE1hcCgoaWRlbnRpdHkpID0+IG1vZGVsS2V5KGlkZW50aXR5KSA/PyBbXSk7XG4gIHJldHVybiB7XG4gICAgcmVzcG9uc2VzOiBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLnJlc3BvbnNlcy5oYXMoa2V5KSksXG4gICAgaW1hZ2VJbnB1dDoga2V5cy5zb21lKChrZXkpID0+IGNhcGFiaWxpdGllcy5pbWFnZUlucHV0LmhhcyhrZXkpKSxcbiAgICBhcHBseVBhdGNoOiBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLmFwcGx5UGF0Y2guaGFzKGtleSkpLFxuICAgIC8vIFZlcnNpb24gaW5oZXJpdGFuY2Ugb25seSBhcHBsaWVzIHRvIGhvc3RlZCBmb3VuZGF0aW9uIGlkZW50aXRpZXMuXG4gICAgd2ViU2VhcmNoOlxuICAgICAga2V5cy5zb21lKChrZXkpID0+IGNhcGFiaWxpdGllcy53ZWJTZWFyY2guaGFzKGtleSkpIHx8XG4gICAgICBpZGVudGl0aWVzLnNvbWUoXG4gICAgICAgIChpZGVudGl0eSkgPT5cbiAgICAgICAgICBpc0ZvdW5kYXRpb25Nb2RlbElkZW50aXR5KGlkZW50aXR5KSAmJlxuICAgICAgICAgIGluaGVyaXRzTmF0aXZlV2ViU2VhcmNoKGlkZW50aXR5LCBjYXBhYmlsaXRpZXMud2ViU2VhcmNoKSxcbiAgICAgICksXG4gIH07XG59XG5cbi8qKiBSZXNvbHZlIHB1Ymxpc2hlZCBJVFBNLCBPVFBNLCBhbmQgUVBIIGxpbWl0cyBmcm9tIGEgbW9kZWwgaWRlbnRpdHkuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxSYXRlTGltaXRzRm9yKFxuICBtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbik6IE1vZGVsUmF0ZUxpbWl0cyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxpbWl0cyA9IG1ldGFkYXRhSW5kZXgoKS5yYXRlTGltaXRzO1xuICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIG1vZGVsSWRlbnRpdGllcyhtb2RlbCkpIHtcbiAgICBjb25zdCBrZXkgPSBtb2RlbEtleShpZGVudGl0eSk7XG4gICAgaWYgKCFrZXkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGZvdW5kID0gbGltaXRzLmdldChrZXkpO1xuICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSByZWFzb25pbmcgbGV2ZWxzOiBsZWFybmVkIGZyb20gZXJyb3JzLCB0aGVuIGRvY3VtZW50YXRpb24sIHRoZW5cbiAqIGZhbWlseSBkZWZhdWx0cy5cbiAqXG4gKiBEb2VzIG5vdCBwYXJzZSBlcnJvciBib2RpZXM7IGNhbGxlcnMgc2hvdWxkIHVzZSB7QGxpbmsgcGFyc2VSZWFzb25pbmdMZXZlbHN9XG4gKiBhbmQgdGhlbiB7QGxpbmsgcmVtZW1iZXJSZWFzb25pbmdMZXZlbHN9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxSZWFzb25pbmdMZXZlbHNGb3IobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBSZWFzb25pbmdMZXZlbFtdIHtcbiAgY29uc3QgaW5kZXggPSBtZXRhZGF0YUluZGV4KCk7XG4gIGZvciAoY29uc3QgaWRlbnRpdHkgb2YgbW9kZWxJZGVudGl0aWVzKG1vZGVsKSkge1xuICAgIGNvbnN0IGxlYXJuZWQgPSBkb2N1bWVudGVkUmVhc29uaW5nTGV2ZWxzKGlkZW50aXR5LCBpbmRleC5sZWFybmVkUmVhc29uaW5nKTtcbiAgICBpZiAobGVhcm5lZD8ubGVuZ3RoKSByZXR1cm4gbGVhcm5lZDtcbiAgfVxuICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIG1vZGVsSWRlbnRpdGllcyhtb2RlbCkpIHtcbiAgICBjb25zdCBkb2N1bWVudGVkID0gZG9jdW1lbnRlZFJlYXNvbmluZ0xldmVscyhpZGVudGl0eSwgaW5kZXgucmVhc29uaW5nKTtcbiAgICBpZiAoZG9jdW1lbnRlZD8ubGVuZ3RoKSByZXR1cm4gZG9jdW1lbnRlZDtcbiAgfVxuICBjb25zdCBwcmltYXJ5ID0gdHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiID8gbW9kZWwgOiAobW9kZWwubW9kZWxTZXJ2aWNlTmFtZSA/PyBtb2RlbC5uYW1lKTtcbiAgcmV0dXJuIGRlZmF1bHRSZWFzb25pbmdMZXZlbHMocHJpbWFyeSk7XG59XG5cbi8qKiBSZXNvbHZlIHJldGlyZW1lbnQsIGNhcGFiaWxpdHksIGFuZCByYXRlLWxpbWl0IG1ldGFkYXRhIHRvZ2V0aGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsTWV0YWRhdGFGb3IobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBNb2RlbE1ldGFkYXRhIHtcbiAgY29uc3QgcmF0ZUxpbWl0cyA9IG1vZGVsUmF0ZUxpbWl0c0Zvcihtb2RlbCk7XG4gIHJldHVybiB7XG4gICAgc3RhdHVzOiBtb2RlbFN0YXR1c0Zvcihtb2RlbCksXG4gICAgY2FwYWJpbGl0aWVzOiBtb2RlbENhcGFiaWxpdGllc0Zvcihtb2RlbCksXG4gICAgLi4uKHJhdGVMaW1pdHMgPyB7IHJhdGVMaW1pdHMgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqIFJldHVybiBnZW5lcmF0aW9uIHRpbWVzdGFtcHMgZm9yIHRoZSBjb21taXR0ZWQgbWV0YWRhdGEgc25hcHNob3RzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsTWV0YWRhdGFHZW5lcmF0ZWRBdCgpOiBSZWFkb25seTx7XG4gIHJldGlyZWRNb2RlbHM6IG51bWJlcjtcbiAgY2FwYWJpbGl0aWVzOiBudW1iZXI7XG4gIHJhdGVMaW1pdHM6IG51bWJlcjtcbiAgcmVhc29uaW5nOiBudW1iZXI7XG59PiB7XG4gIHJldHVybiB7XG4gICAgcmV0aXJlZE1vZGVsczogUkVUSVJFRF9NT0RFTFNfR0VORVJBVEVEX0FULFxuICAgIGNhcGFiaWxpdGllczogY2FwYWJpbGl0aWVzU25hcHNob3QuZ2VuZXJhdGVkQXQsXG4gICAgcmF0ZUxpbWl0czogcmF0ZUxpbWl0c1NuYXBzaG90LmdlbmVyYXRlZEF0LFxuICAgIHJlYXNvbmluZzogcmVhc29uaW5nU25hcHNob3QuZ2VuZXJhdGVkQXQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1vZGVsSWRlbnRpdGllcyhcbiAgbW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG4gIGluY2x1ZGVEaXNwbGF5TmFtZSA9IHRydWUsXG4pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIpIHJldHVybiBbbW9kZWxdO1xuICByZXR1cm4gW1xuICAgIG1vZGVsLm5hbWUsXG4gICAgLi4uKGluY2x1ZGVEaXNwbGF5TmFtZSA/IFttb2RlbC5kaXNwbGF5TmFtZV0gOiBbXSksXG4gICAgbW9kZWwubW9kZWxTZXJ2aWNlTmFtZSxcbiAgICAuLi5PYmplY3QudmFsdWVzKG1vZGVsLnNlcnZpY2VOYW1lcyA/PyB7fSksXG4gIF0uZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiBCb29sZWFuKHZhbHVlKSk7XG59XG5cbmZ1bmN0aW9uIG1vZGVsS2V5KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gbW9kZWxTZWFyY2hRdWVyeSh2YWx1ZSk/LnJlcGxhY2VBbGwoXCIgXCIsIFwiLVwiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFBhZ2UodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIGhlYWRlcnM6IHsgXCJ1c2VyLWFnZW50XCI6IFVTRVJfQUdFTlQgfSxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoMTVfMDAwKSxcbiAgfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGFicmlja3MgZG9jdW1lbnRhdGlvbiByZXR1cm5lZCBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHt1cmx9YCk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cblxuZnVuY3Rpb24gbm93U2Vjb25kcygpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG59XG4iXX0=
313
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0YWRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsT0FBTyxLQUFLLGFBQWEsTUFBTSx1Q0FBdUMsQ0FBQztBQVF2RSxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQiwyQkFBMkIsRUFDM0IsdUJBQXVCLEVBQ3ZCLGtCQUFrQixFQUNsQixxQkFBcUIsR0FLdEIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsa0JBQWtCLEdBQ25CLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixjQUFjLEVBQ2Qsd0JBQXdCLEVBQ3hCLDJCQUEyQixHQUM1QixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sd0JBQXdCLE1BQU0scUNBQXFDLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDakcsT0FBTyxzQkFBc0IsTUFBTSxvQ0FBb0MsQ0FBQyxPQUFPLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUM5RixPQUFPLHFCQUFxQixNQUFNLGtDQUFrQyxDQUFDLE9BQU8sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzNGLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLHNCQUFzQixHQUV2QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSx5QkFBeUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNuRyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHlCQUF5QixFQUN6QixjQUFjLEVBQ2Qsb0JBQW9CLEVBR3BCLHFCQUFxQixHQUN0QixNQUFNLDRCQUE0QixDQUFDO0FBRXBDLE9BQU8sRUFDTCxxQkFBcUIsRUFD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QUFDLDBDQUEwQyxRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ3pCLENBQUM7QUFFRCxTQUFTLFVBQVU7SUFDakIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCdWlsZC1nZW5lcmF0ZWQgRGF0YWJyaWNrcyBtb2RlbCByZXRpcmVtZW50LCBjYXBhYmlsaXR5LCByYXRlLWxpbWl0LCBhbmRcbiAqIHJlYXNvbmluZy1lZmZvcnQgbWV0YWRhdGEsIHBsdXMgYSBkYWlseSB3cml0ZS10aHJvdWdoIGNhY2hlIGZvciByZWZyZXNoZWRcbiAqIGRvY3MgYW5kIGVycm9yLWxlYXJuZWQgcmVhc29uaW5nIGxhZGRlcnMuXG4gKlxuICogQ29tbWl0dGVkIHNuYXBzaG90cyBzZWVkIGV2ZXJ5IHByb2Nlc3MuIHtAbGluayByZWZyZXNoTW9kZWxNZXRhZGF0YX0gcHVsbHNcbiAqIGRvY3VtZW50YXRpb24gdGhyb3VnaCB0aGUgc2hhcmVkIG1lbW9yeS1maXJzdCB7QGxpbmsgY3JlYXRlTWV0YWRhdGFDYWNoZX0gYW5kXG4gKiByZWJ1aWxkcyB0aGUgaW4tbWVtb3J5IGluZGV4LiBFcnJvci1sZWFybmVkIGVmZm9ydHMgdXNlIHRoZSBzYW1lIHN0b3JlIHZpYVxuICoge0BsaW5rIHJlbWVtYmVyUmVhc29uaW5nTGV2ZWxzfS4gS25vd24tZ29vZCB2YWx1ZXMgYXJlIHdyaXR0ZW4gYmVoaW5kIHRvIHRoZVxuICogc2hhcmVkIG1vZGVsIHByb2plY3QgY2FjaGUuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgKiBhcyBmdW5jdGlvblV0aWxzIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL2Z1bmN0aW9uLXV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIE1vZGVsQ2FwYWJpbGl0aWVzLFxuICBNb2RlbE1ldGFkYXRhLFxuICBNb2RlbFJhdGVMaW1pdHMsXG4gIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC9jb250cmFjdHNcIjtcblxuaW1wb3J0IHtcbiAgTU9ERUxfTUVUQURBVEFfVFRMX01TLFxuICBNT0RFTF9SQVRFX0xJTUlUU19VUkwsXG4gIE9QRU5BSV9SRVNQT05TRVNfTU9ERUxTX1VSTCxcbiAgUVVFUllfUkVBU09OX01PREVMU19VUkwsXG4gIFJFVElSRURfTU9ERUxTX1VSTCxcbiAgV0VCX1NFQVJDSF9NT0RFTFNfVVJMLFxuICB0eXBlIE1vZGVsQ2FwYWJpbGl0aWVzU25hcHNob3QsXG4gIHR5cGUgTW9kZWxDYXBhYmlsaXR5Q2F0YWxvZ3VlLFxuICB0eXBlIE1vZGVsUmF0ZUxpbWl0c1NuYXBzaG90LFxuICB0eXBlIFJlYXNvbmluZ01vZGVsc1NuYXBzaG90LFxufSBmcm9tIFwiLi9fbWV0YWRhdGEtY29udHJhY3QudHNcIjtcbmltcG9ydCB7XG4gIHBhcnNlTW9kZWxDYXBhYmlsaXRpZXMsXG4gIHBhcnNlTW9kZWxSYXRlTGltaXRzLFxuICBwYXJzZVJlYXNvbmluZ01vZGVscyxcbiAgcGFyc2VSZXRpcmVkTW9kZWxzLFxufSBmcm9tIFwiLi9fbWV0YWRhdGEtZ2VuZXJhdG9yLnRzXCI7XG5pbXBvcnQge1xuICBDT01NSVRURURfUkVUSVJFRF9NT0RFTFMsXG4gIG1vZGVsU3RhdHVzRm9yLFxuICByZXBsYWNlUmV0aXJlZE1vZGVsTmFtZXMsXG4gIFJFVElSRURfTU9ERUxTX0dFTkVSQVRFRF9BVCxcbn0gZnJvbSBcIi4vX3JldGlyZW1lbnQudHNcIjtcbmltcG9ydCBjYXBhYmlsaXRpZXNTbmFwc2hvdEpzb24gZnJvbSBcIi4vZ2VuZXJhdGVkL21vZGVsLWNhcGFiaWxpdGllcy5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQgcmF0ZUxpbWl0c1NuYXBzaG90SnNvbiBmcm9tIFwiLi9nZW5lcmF0ZWQvbW9kZWwtcmF0ZS1saW1pdHMuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9O1xuaW1wb3J0IHJlYXNvbmluZ1NuYXBzaG90SnNvbiBmcm9tIFwiLi9nZW5lcmF0ZWQvbW9kZWwtcmVhc29uaW5nLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfTtcbmltcG9ydCB7XG4gIGNyZWF0ZU1ldGFkYXRhQ2FjaGUsXG4gIG1lcmdlUHJlZmVyRnJlc2hMaXN0LFxuICBtZXJnZVByZWZlckZyZXNoUmVjb3JkLFxuICB0eXBlIE1ldGFkYXRhQ2FjaGUsXG59IGZyb20gXCIuL21ldGFkYXRhLWNhY2hlLnRzXCI7XG5pbXBvcnQgeyBpbmhlcml0c05hdGl2ZVdlYlNlYXJjaCwgaXNGb3VuZGF0aW9uTW9kZWxJZGVudGl0eSwgbW9kZWxTZWFyY2hRdWVyeSB9IGZyb20gXCIuL3BvbGljeS50c1wiO1xuaW1wb3J0IHtcbiAgZGVmYXVsdFJlYXNvbmluZ0xldmVscyxcbiAgZG9jdW1lbnRlZFJlYXNvbmluZ0xldmVscyxcbiAgcGFyc2VSZWFzb25pbmcsXG4gIHBhcnNlUmVhc29uaW5nTGV2ZWxzLFxuICB0eXBlIFJlYXNvbmluZ0xldmVsLFxuICB0eXBlIFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlLFxuICB1bmlxdWVSZWFzb25pbmdMZXZlbHMsXG59IGZyb20gXCIuL3JlYXNvbmluZy10cmFuc2xhdGlvbi50c1wiO1xuXG5leHBvcnQge1xuICBNT0RFTF9NRVRBREFUQV9UVExfTVMsXG4gIE1PREVMX1JBVEVfTElNSVRTX1VSTCxcbiAgT1BFTkFJX1JFU1BPTlNFU19NT0RFTFNfVVJMLFxuICBRVUVSWV9SRUFTT05fTU9ERUxTX1VSTCxcbiAgUkVUSVJFRF9NT0RFTFNfVVJMLFxuICBXRUJfU0VBUkNIX01PREVMU19VUkwsXG59O1xuXG5jb25zdCBjYXBhYmlsaXRpZXNTbmFwc2hvdCA9IGNhcGFiaWxpdGllc1NuYXBzaG90SnNvbiBhcyBNb2RlbENhcGFiaWxpdGllc1NuYXBzaG90O1xuY29uc3QgcmF0ZUxpbWl0c1NuYXBzaG90ID0gcmF0ZUxpbWl0c1NuYXBzaG90SnNvbiBhcyBNb2RlbFJhdGVMaW1pdHNTbmFwc2hvdDtcbmNvbnN0IHJlYXNvbmluZ1NuYXBzaG90ID0gcmVhc29uaW5nU25hcHNob3RKc29uIGFzIFJlYXNvbmluZ01vZGVsc1NuYXBzaG90O1xuXG5pbnRlcmZhY2UgTWV0YWRhdGFJbmRleCB7XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczoge1xuICAgIHJlYWRvbmx5IFtLZXkgaW4ga2V5b2YgTW9kZWxDYXBhYmlsaXR5Q2F0YWxvZ3VlXTogUmVhZG9ubHlTZXQ8c3RyaW5nPjtcbiAgfTtcbiAgcmVhZG9ubHkgcmF0ZUxpbWl0czogUmVhZG9ubHlNYXA8c3RyaW5nLCBNb2RlbFJhdGVMaW1pdHM+O1xuICByZWFkb25seSByZWFzb25pbmc6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlO1xuICByZWFkb25seSBsZWFybmVkUmVhc29uaW5nOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZTtcbn1cblxudHlwZSBDYXBhYmlsaXR5U2V0cyA9IE1vZGVsQ2FwYWJpbGl0eUNhdGFsb2d1ZTtcblxuY29uc3QgVVNFUl9BR0VOVCA9IFwiZGJ4LXRvb2xzLW1vZGVsLW1ldGFkYXRhLzFcIjtcblxuY29uc3QgcmV0aXJlZENhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxyZWFkb25seSBzdHJpbmdbXT4oe1xuICBrZXk6IFwicmV0aXJlZC1tb2RlbHNcIixcbiAgZmFsbGJhY2s6IENPTU1JVFRFRF9SRVRJUkVEX01PREVMUyxcbiAgbG9hZDogYXN5bmMgKCkgPT4gcGFyc2VSZXRpcmVkTW9kZWxzKGF3YWl0IGxvYWRQYWdlKFJFVElSRURfTU9ERUxTX1VSTCksIG5vd1NlY29uZHMoKSkubW9kZWxzLFxuICBtZXJnZTogbWVyZ2VQcmVmZXJGcmVzaExpc3QsXG59KTtcblxuY29uc3QgY2FwYWJpbGl0aWVzQ2FjaGUgPSBjcmVhdGVNZXRhZGF0YUNhY2hlPENhcGFiaWxpdHlTZXRzPih7XG4gIGtleTogXCJtb2RlbC1jYXBhYmlsaXRpZXNcIixcbiAgZmFsbGJhY2s6IGNhcGFiaWxpdGllc1NuYXBzaG90LmNhcGFiaWxpdGllcyxcbiAgbG9hZDogYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtyZXNwb25zZXNIdG1sLCB3ZWJTZWFyY2hIdG1sXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGxvYWRQYWdlKE9QRU5BSV9SRVNQT05TRVNfTU9ERUxTX1VSTCksXG4gICAgICBsb2FkUGFnZShXRUJfU0VBUkNIX01PREVMU19VUkwpLFxuICAgIF0pO1xuICAgIHJldHVybiBwYXJzZU1vZGVsQ2FwYWJpbGl0aWVzKHJlc3BvbnNlc0h0bWwsIHdlYlNlYXJjaEh0bWwsIG5vd1NlY29uZHMoKSkuY2FwYWJpbGl0aWVzO1xuICB9LFxuICBtZXJnZTogKGlucHV0KSA9PiAoe1xuICAgIHJlc3BvbnNlczogbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5yZXNwb25zZXMsXG4gICAgICBwcmV2aW91czogaW5wdXQucHJldmlvdXM/LnJlc3BvbnNlcyxcbiAgICAgIGZhbGxiYWNrOiBpbnB1dC5mYWxsYmFjay5yZXNwb25zZXMsXG4gICAgfSksXG4gICAgaW1hZ2VJbnB1dDogbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5pbWFnZUlucHV0LFxuICAgICAgcHJldmlvdXM6IGlucHV0LnByZXZpb3VzPy5pbWFnZUlucHV0LFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLmltYWdlSW5wdXQsXG4gICAgfSksXG4gICAgYXBwbHlQYXRjaDogbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5hcHBseVBhdGNoLFxuICAgICAgcHJldmlvdXM6IGlucHV0LnByZXZpb3VzPy5hcHBseVBhdGNoLFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLmFwcGx5UGF0Y2gsXG4gICAgfSksXG4gICAgd2ViU2VhcmNoOiBtZXJnZVByZWZlckZyZXNoTGlzdCh7XG4gICAgICBmcmVzaDogaW5wdXQuZnJlc2g/LndlYlNlYXJjaCxcbiAgICAgIHByZXZpb3VzOiBpbnB1dC5wcmV2aW91cz8ud2ViU2VhcmNoLFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLndlYlNlYXJjaCxcbiAgICB9KSxcbiAgfSksXG59KTtcblxuY29uc3QgcmF0ZUxpbWl0c0NhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBNb2RlbFJhdGVMaW1pdHM+Pj4oe1xuICBrZXk6IFwibW9kZWwtcmF0ZS1saW1pdHNcIixcbiAgZmFsbGJhY2s6IHJhdGVMaW1pdHNTbmFwc2hvdC5jYXRhbG9ndWUubW9kZWxzLFxuICBsb2FkOiBhc3luYyAoKSA9PlxuICAgIHBhcnNlTW9kZWxSYXRlTGltaXRzKGF3YWl0IGxvYWRQYWdlKE1PREVMX1JBVEVfTElNSVRTX1VSTCksIG5vd1NlY29uZHMoKSkuY2F0YWxvZ3VlLm1vZGVscyxcbiAgbWVyZ2U6IG1lcmdlUHJlZmVyRnJlc2hSZWNvcmQsXG59KTtcblxuY29uc3QgcmVhc29uaW5nRG9jc0NhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4+Pih7XG4gIGtleTogXCJtb2RlbC1yZWFzb25pbmdcIixcbiAgZmFsbGJhY2s6IHJlYXNvbmluZ1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMsXG4gIGxvYWQ6IGFzeW5jICgpID0+XG4gICAgcGFyc2VSZWFzb25pbmdNb2RlbHMoYXdhaXQgbG9hZFBhZ2UoUVVFUllfUkVBU09OX01PREVMU19VUkwpLCBub3dTZWNvbmRzKCkpLmNhdGFsb2d1ZS5tb2RlbHMsXG4gIG1lcmdlOiBtZXJnZVByZWZlckZyZXNoUmVjb3JkLFxufSk7XG5cbmNvbnN0IGxlYXJuZWRSZWFzb25pbmdDYWNoZSA9IGNyZWF0ZU1ldGFkYXRhQ2FjaGU8XG4gIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+PlxuPih7XG4gIGtleTogXCJsZWFybmVkLXJlYXNvbmluZ1wiLFxuICBmYWxsYmFjazoge30sXG4gIG1lcmdlOiBtZXJnZVByZWZlckZyZXNoUmVjb3JkLFxufSk7XG5cbmxldCBsaXZlSW5kZXg6IE1ldGFkYXRhSW5kZXggfCB1bmRlZmluZWQ7XG5cbmNvbnN0IG1ldGFkYXRhSW5kZXggPSBmdW5jdGlvblV0aWxzLm1lbW9pemU8TWV0YWRhdGFJbmRleD4oXG4gICgpID0+IGxpdmVJbmRleCA/PyBidWlsZEluZGV4RnJvbUNvbW1pdHRlZCgpLFxuKTtcblxuZnVuY3Rpb24gYnVpbGRJbmRleEZyb21Db21taXR0ZWQoKTogTWV0YWRhdGFJbmRleCB7XG4gIHJldHVybiBidWlsZEluZGV4KHtcbiAgICByZXRpcmVkTmFtZXM6IENPTU1JVFRFRF9SRVRJUkVEX01PREVMUyxcbiAgICBjYXBhYmlsaXRpZXM6IGNhcGFiaWxpdGllc1NuYXBzaG90LmNhcGFiaWxpdGllcyxcbiAgICByYXRlTGltaXRzOiByYXRlTGltaXRzU25hcHNob3QuY2F0YWxvZ3VlLm1vZGVscyxcbiAgICByZWFzb25pbmc6IHJlYXNvbmluZ1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMsXG4gICAgbGVhcm5lZFJlYXNvbmluZzoge30sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZEluZGV4KGlucHV0OiB7XG4gIHJlYWRvbmx5IHJldGlyZWROYW1lczogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczogQ2FwYWJpbGl0eVNldHM7XG4gIHJlYWRvbmx5IHJhdGVMaW1pdHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIE1vZGVsUmF0ZUxpbWl0cz4+O1xuICByZWFkb25seSByZWFzb25pbmc6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj47XG4gIHJlYWRvbmx5IGxlYXJuZWRSZWFzb25pbmc6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+Pjtcbn0pOiBNZXRhZGF0YUluZGV4IHtcbiAgcmVwbGFjZVJldGlyZWRNb2RlbE5hbWVzKGlucHV0LnJldGlyZWROYW1lcyk7XG4gIHJldHVybiB7XG4gICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICByZXNwb25zZXM6IG5ldyBTZXQoaW5wdXQuY2FwYWJpbGl0aWVzLnJlc3BvbnNlcyksXG4gICAgICBpbWFnZUlucHV0OiBuZXcgU2V0KGlucHV0LmNhcGFiaWxpdGllcy5pbWFnZUlucHV0KSxcbiAgICAgIGFwcGx5UGF0Y2g6IG5ldyBTZXQoaW5wdXQuY2FwYWJpbGl0aWVzLmFwcGx5UGF0Y2gpLFxuICAgICAgd2ViU2VhcmNoOiBuZXcgU2V0KGlucHV0LmNhcGFiaWxpdGllcy53ZWJTZWFyY2gpLFxuICAgIH0sXG4gICAgcmF0ZUxpbWl0czogbmV3IE1hcChPYmplY3QuZW50cmllcyhpbnB1dC5yYXRlTGltaXRzKSksXG4gICAgcmVhc29uaW5nOiBmcmVlemVSZWFzb25pbmdDYXRhbG9ndWUoaW5wdXQucmVhc29uaW5nKSxcbiAgICBsZWFybmVkUmVhc29uaW5nOiBmcmVlemVMZWFybmVkQ2F0YWxvZ3VlKGlucHV0LmxlYXJuZWRSZWFzb25pbmcpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBmcmVlemVSZWFzb25pbmdDYXRhbG9ndWUoXG4gIG1vZGVsczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+Pixcbik6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMobW9kZWxzKS5tYXAoKFtrZXksIGxldmVsc10pID0+IFtcbiAgICAgICAga2V5LFxuICAgICAgICBPYmplY3QuZnJlZXplKFxuICAgICAgICAgIHVuaXF1ZVJlYXNvbmluZ0xldmVscyhsZXZlbHMuZmxhdE1hcCgobGV2ZWwpID0+IHBhcnNlUmVhc29uaW5nKGxldmVsKSA/PyBbXSkpLFxuICAgICAgICApLFxuICAgICAgXSksXG4gICAgKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gZnJlZXplTGVhcm5lZENhdGFsb2d1ZShcbiAgbW9kZWxzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdPj4sXG4pOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKG1vZGVscykubWFwKChba2V5LCBsZXZlbHNdKSA9PiBbXG4gICAgICAgIGtleSxcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh1bmlxdWVSZWFzb25pbmdMZXZlbHMobGV2ZWxzKSksXG4gICAgICBdKSxcbiAgICApLFxuICApO1xufVxuXG5sZXQgcmVmcmVzaEluZmxpZ2h0OiBQcm9taXNlPE1ldGFkYXRhSW5kZXg+IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEh5ZHJhdGUgb3IgcmVmcmVzaCBkb2N1bWVudGF0aW9uICsgbGVhcm5lZCBjYWNoZXMgaW50byB0aGUgcHJvY2VzcyBpbmRleC5cbiAqXG4gKiBTYWZlIHRvIGNhbGwgb24gZ2F0ZXdheSBzdGFydHVwLiBDb25jdXJyZW50IGNhbGxlcnMgc2hhcmUgb25lIHJlZnJlc2guXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWZyZXNoTW9kZWxNZXRhZGF0YSgpOiBQcm9taXNlPE1ldGFkYXRhSW5kZXg+IHtcbiAgaWYgKHJlZnJlc2hJbmZsaWdodCkgcmV0dXJuIHJlZnJlc2hJbmZsaWdodDtcbiAgcmVmcmVzaEluZmxpZ2h0ID0gKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbcmV0aXJlZE5hbWVzLCBjYXBhYmlsaXRpZXMsIHJhdGVMaW1pdHMsIHJlYXNvbmluZywgbGVhcm5lZFJlYXNvbmluZ10gPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFtcbiAgICAgICAgcmV0aXJlZENhY2hlLmdldCgpLFxuICAgICAgICBjYXBhYmlsaXRpZXNDYWNoZS5nZXQoKSxcbiAgICAgICAgcmF0ZUxpbWl0c0NhY2hlLmdldCgpLFxuICAgICAgICByZWFzb25pbmdEb2NzQ2FjaGUuZ2V0KCksXG4gICAgICAgIGxlYXJuZWRSZWFzb25pbmdDYWNoZS5nZXQoKSxcbiAgICAgIF0sXG4gICAgKTtcbiAgICBsaXZlSW5kZXggPSBidWlsZEluZGV4KHtcbiAgICAgIHJldGlyZWROYW1lcyxcbiAgICAgIGNhcGFiaWxpdGllcyxcbiAgICAgIHJhdGVMaW1pdHMsXG4gICAgICByZWFzb25pbmcsXG4gICAgICBsZWFybmVkUmVhc29uaW5nLFxuICAgIH0pO1xuICAgIHJldHVybiBsaXZlSW5kZXg7XG4gIH0pKCkuZmluYWxseSgoKSA9PiB7XG4gICAgcmVmcmVzaEluZmxpZ2h0ID0gdW5kZWZpbmVkO1xuICB9KTtcbiAgcmV0dXJuIHJlZnJlc2hJbmZsaWdodDtcbn1cblxuLyoqIExvYWQgc2hhcmVkIGNhY2hlIGVudHJpZXMgd2l0aG91dCBmb3JjaW5nIGEgbmV0d29yayByZWZyZXNoLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVNb2RlbE1ldGFkYXRhKCk6IFByb21pc2U8TWV0YWRhdGFJbmRleD4ge1xuICBjb25zdCBbcmV0aXJlZE5hbWVzLCBjYXBhYmlsaXRpZXMsIHJhdGVMaW1pdHMsIHJlYXNvbmluZywgbGVhcm5lZFJlYXNvbmluZ10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgcGVla09yRmFsbGJhY2socmV0aXJlZENhY2hlLCBDT01NSVRURURfUkVUSVJFRF9NT0RFTFMpLFxuICAgIHBlZWtPckZhbGxiYWNrKGNhcGFiaWxpdGllc0NhY2hlLCBjYXBhYmlsaXRpZXNTbmFwc2hvdC5jYXBhYmlsaXRpZXMpLFxuICAgIHBlZWtPckZhbGxiYWNrKHJhdGVMaW1pdHNDYWNoZSwgcmF0ZUxpbWl0c1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMpLFxuICAgIHBlZWtPckZhbGxiYWNrKHJlYXNvbmluZ0RvY3NDYWNoZSwgcmVhc29uaW5nU25hcHNob3QuY2F0YWxvZ3VlLm1vZGVscyksXG4gICAgcGVla09yRmFsbGJhY2sobGVhcm5lZFJlYXNvbmluZ0NhY2hlLCB7fSksXG4gIF0pO1xuICBsaXZlSW5kZXggPSBidWlsZEluZGV4KHtcbiAgICByZXRpcmVkTmFtZXMsXG4gICAgY2FwYWJpbGl0aWVzLFxuICAgIHJhdGVMaW1pdHMsXG4gICAgcmVhc29uaW5nLFxuICAgIGxlYXJuZWRSZWFzb25pbmcsXG4gIH0pO1xuICByZXR1cm4gbGl2ZUluZGV4O1xufVxuXG5hc3luYyBmdW5jdGlvbiBwZWVrT3JGYWxsYmFjazxUPihjYWNoZTogTWV0YWRhdGFDYWNoZTxUPiwgZmFsbGJhY2s6IFQpOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcGVla2VkID0gYXdhaXQgY2FjaGUucGVlaygpO1xuICBpZiAocGVla2VkICE9PSB1bmRlZmluZWQpIHJldHVybiBwZWVrZWQ7XG4gIHJldHVybiBjYWNoZS5nZXQoKS5jYXRjaCgoKSA9PiBmYWxsYmFjayk7XG59XG5cbmV4cG9ydCB7IG1vZGVsU3RhdHVzRm9yLCByZXRpcmVkTW9kZWxOYW1lcyB9IGZyb20gXCIuL19yZXRpcmVtZW50LnRzXCI7XG5cbi8qKiBSZXR1cm4gdGhlIGNvbW1pdHRlZCByZWFzb25pbmctZWZmb3J0IGNhdGFsb2d1ZS4gQ2FjaGVkIHBlciBwcm9jZXNzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlKCk6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlIHtcbiAgcmV0dXJuIG1ldGFkYXRhSW5kZXgoKS5yZWFzb25pbmc7XG59XG5cbi8qKiBSZXR1cm4gZXJyb3ItbGVhcm5lZCByZWFzb25pbmcgbGFkZGVycyBmcm9tIHRoZSBzaGFyZWQgbW9kZWwgY2FjaGUuICovXG5leHBvcnQgZnVuY3Rpb24gbGVhcm5lZFJlYXNvbmluZ0NhdGFsb2d1ZSgpOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSB7XG4gIHJldHVybiBtZXRhZGF0YUluZGV4KCkubGVhcm5lZFJlYXNvbmluZztcbn1cblxuLyoqXG4gKiBTdG9yZSBsZXZlbHMgbGVhcm5lZCBmcm9tIGFuIHVwc3RyZWFtIGVycm9yIGFuZCBwZXJzaXN0IHRoZW0gd3JpdGUtdGhyb3VnaC5cbiAqXG4gKiBFbXB0eSBsaXN0cyBhcmUgaWdub3JlZCBzbyBhIGZhaWxlZCBwYXJzZSBjYW5ub3Qgd2lwZSBkZWZhdWx0cy4gRXJyb3IgYm9kaWVzXG4gKiB0aGVtc2VsdmVzIGFyZSBuZXZlciBzdG9yZWQgLSBvbmx5IHRoZSBwYXJzZWQgbGFkZGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtZW1iZXJSZWFzb25pbmdMZXZlbHMoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIGxldmVsczogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSxcbik6IFByb21pc2U8UmVhc29uaW5nTGV2ZWxbXT4ge1xuICBjb25zdCB1bmlxdWUgPSB1bmlxdWVSZWFzb25pbmdMZXZlbHMobGV2ZWxzKTtcbiAgaWYgKHVuaXF1ZS5sZW5ndGggPT09IDApIHJldHVybiBtb2RlbFJlYXNvbmluZ0xldmVsc0Zvcihtb2RlbCk7XG4gIGNvbnN0IGtleSA9IG1vZGVsS2V5KG1vZGVsKTtcbiAgaWYgKCFrZXkpIHJldHVybiBtb2RlbFJlYXNvbmluZ0xldmVsc0Zvcihtb2RlbCk7XG4gIGNvbnN0IGNhdGFsb2d1ZSA9IGF3YWl0IGxlYXJuZWRSZWFzb25pbmdDYWNoZS51cGRhdGUoKGN1cnJlbnQpID0+ICh7XG4gICAgLi4uY3VycmVudCxcbiAgICBba2V5XTogdW5pcXVlLFxuICB9KSk7XG4gIGNvbnN0IGN1cnJlbnQgPSBtZXRhZGF0YUluZGV4KCk7XG4gIGxpdmVJbmRleCA9IHtcbiAgICAuLi5jdXJyZW50LFxuICAgIGxlYXJuZWRSZWFzb25pbmc6IGZyZWV6ZUxlYXJuZWRDYXRhbG9ndWUoY2F0YWxvZ3VlKSxcbiAgfTtcbiAgcmV0dXJuIFsuLi51bmlxdWVdO1xufVxuXG4vKipcbiAqIFBhcnNlIGFuIHVwc3RyZWFtIGVycm9yIGJvZHkgYW5kIHBlcnNpc3QgdGhlIHN1cHBvcnRlZCBsYWRkZXIgZm9yIGBtb2RlbGAuXG4gKlxuICogQWNjZXB0cyB0aGUgc2FtZSBuZXN0ZWQgRGF0YWJyaWNrcyBlbnZlbG9wZXMgYXMge0BsaW5rIHBhcnNlUmVhc29uaW5nTGV2ZWxzfS5cbiAqIFJldHVybnMgdGhlIGxldmVscyB0aGF0IHdlcmUgc3RvcmVkIChvciB0aGUgY3VycmVudCBsb29rdXAgd2hlbiBwYXJzZSB5aWVsZHNcbiAqIG5vdGhpbmcpLiBUaGUgcmF3IGVycm9yIGJvZHkgaXMgbmV2ZXIgY2FjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGVhcm5SZWFzb25pbmdMZXZlbHNGcm9tRXJyb3IoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIGJvZHk6IHVua25vd24sXG4pOiBQcm9taXNlPFJlYXNvbmluZ0xldmVsW10+IHtcbiAgcmV0dXJuIHJlbWVtYmVyUmVhc29uaW5nTGV2ZWxzKG1vZGVsLCBwYXJzZVJlYXNvbmluZ0xldmVscyhib2R5KSk7XG59XG5cbi8qKiBSZXNvbHZlIGRvY3VtZW50ZWQgbW9kZWwgY2FwYWJpbGl0aWVzIGZyb20gYSBuYW1lIG9yIGVuZHBvaW50IHN1bW1hcnkuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxDYXBhYmlsaXRpZXNGb3IobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBNb2RlbENhcGFiaWxpdGllcyB7XG4gIGNvbnN0IGNhcGFiaWxpdGllcyA9IG1ldGFkYXRhSW5kZXgoKS5jYXBhYmlsaXRpZXM7XG4gIGNvbnN0IGlkZW50aXRpZXMgPSBtb2RlbElkZW50aXRpZXMobW9kZWwsIGZhbHNlKTtcbiAgY29uc3Qga2V5cyA9IGlkZW50aXRpZXMuZmxhdE1hcCgoaWRlbnRpdHkpID0+IG1vZGVsS2V5KGlkZW50aXR5KSA/PyBbXSk7XG4gIHJldHVybiB7XG4gICAgcmVzcG9uc2VzOiBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLnJlc3BvbnNlcy5oYXMoa2V5KSksXG4gICAgaW1hZ2VJbnB1dDoga2V5cy5zb21lKChrZXkpID0+IGNhcGFiaWxpdGllcy5pbWFnZUlucHV0LmhhcyhrZXkpKSxcbiAgICBhcHBseVBhdGNoOiBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLmFwcGx5UGF0Y2guaGFzKGtleSkpLFxuICAgIC8vIFZlcnNpb24gaW5oZXJpdGFuY2Ugb25seSBhcHBsaWVzIHRvIGhvc3RlZCBmb3VuZGF0aW9uIGlkZW50aXRpZXMuXG4gICAgd2ViU2VhcmNoOlxuICAgICAga2V5cy5zb21lKChrZXkpID0+IGNhcGFiaWxpdGllcy53ZWJTZWFyY2guaGFzKGtleSkpIHx8XG4gICAgICBpZGVudGl0aWVzLnNvbWUoXG4gICAgICAgIChpZGVudGl0eSkgPT5cbiAgICAgICAgICBpc0ZvdW5kYXRpb25Nb2RlbElkZW50aXR5KGlkZW50aXR5KSAmJlxuICAgICAgICAgIGluaGVyaXRzTmF0aXZlV2ViU2VhcmNoKGlkZW50aXR5LCBjYXBhYmlsaXRpZXMud2ViU2VhcmNoKSxcbiAgICAgICksXG4gIH07XG59XG5cbi8qKiBSZXNvbHZlIHB1Ymxpc2hlZCBJVFBNLCBPVFBNLCBhbmQgUVBIIGxpbWl0cyBmcm9tIGEgbW9kZWwgaWRlbnRpdHkuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxSYXRlTGltaXRzRm9yKFxuICBtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbik6IE1vZGVsUmF0ZUxpbWl0cyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxpbWl0cyA9IG1ldGFkYXRhSW5kZXgoKS5yYXRlTGltaXRzO1xuICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIG1vZGVsSWRlbnRpdGllcyhtb2RlbCkpIHtcbiAgICBjb25zdCBrZXkgPSBtb2RlbEtleShpZGVudGl0eSk7XG4gICAgaWYgKCFrZXkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGZvdW5kID0gbGltaXRzLmdldChrZXkpO1xuICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSByZWFzb25pbmcgbGV2ZWxzOiBsZWFybmVkIGZyb20gZXJyb3JzLCB0aGVuIGRvY3VtZW50YXRpb24sIHRoZW5cbiAqIGZhbWlseSBkZWZhdWx0cy5cbiAqXG4gKiBEb2VzIG5vdCBwYXJzZSBlcnJvciBib2RpZXM7IGNhbGxlcnMgc2hvdWxkIHVzZSB7QGxpbmsgcGFyc2VSZWFzb25pbmdMZXZlbHN9XG4gKiBhbmQgdGhlbiB7QGxpbmsgcmVtZW1iZXJSZWFzb25pbmdMZXZlbHN9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxSZWFzb25pbmdMZXZlbHNGb3IobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBSZWFzb25pbmdMZXZlbFtdIHtcbiAgY29uc3QgaW5kZXggPSBtZXRhZGF0YUluZGV4KCk7XG4gIGZvciAoY29uc3QgaWRlbnRpdHkgb2YgbW9kZWxJZGVudGl0aWVzKG1vZGVsKSkge1xuICAgIGNvbnN0IGxlYXJuZWQgPSBkb2N1bWVudGVkUmVhc29uaW5nTGV2ZWxzKGlkZW50aXR5LCBpbmRleC5sZWFybmVkUmVhc29uaW5nKTtcbiAgICBpZiAobGVhcm5lZD8ubGVuZ3RoKSByZXR1cm4gbGVhcm5lZDtcbiAgfVxuICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIG1vZGVsSWRlbnRpdGllcyhtb2RlbCkpIHtcbiAgICBjb25zdCBkb2N1bWVudGVkID0gZG9jdW1lbnRlZFJlYXNvbmluZ0xldmVscyhpZGVudGl0eSwgaW5kZXgucmVhc29uaW5nKTtcbiAgICBpZiAoZG9jdW1lbnRlZD8ubGVuZ3RoKSByZXR1cm4gZG9jdW1lbnRlZDtcbiAgfVxuICBjb25zdCBwcmltYXJ5ID0gdHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiID8gbW9kZWwgOiAobW9kZWwubW9kZWxTZXJ2aWNlTmFtZSA/PyBtb2RlbC5uYW1lKTtcbiAgcmV0dXJuIGRlZmF1bHRSZWFzb25pbmdMZXZlbHMocHJpbWFyeSk7XG59XG5cbi8qKiBSZXNvbHZlIHJldGlyZW1lbnQsIGNhcGFiaWxpdHksIGFuZCByYXRlLWxpbWl0IG1ldGFkYXRhIHRvZ2V0aGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsTWV0YWRhdGFGb3IobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBNb2RlbE1ldGFkYXRhIHtcbiAgY29uc3QgcmF0ZUxpbWl0cyA9IG1vZGVsUmF0ZUxpbWl0c0Zvcihtb2RlbCk7XG4gIHJldHVybiB7XG4gICAgc3RhdHVzOiBtb2RlbFN0YXR1c0Zvcihtb2RlbCksXG4gICAgY2FwYWJpbGl0aWVzOiBtb2RlbENhcGFiaWxpdGllc0Zvcihtb2RlbCksXG4gICAgLi4uKHJhdGVMaW1pdHMgPyB7IHJhdGVMaW1pdHMgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqIFJldHVybiBnZW5lcmF0aW9uIHRpbWVzdGFtcHMgZm9yIHRoZSBjb21taXR0ZWQgbWV0YWRhdGEgc25hcHNob3RzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsTWV0YWRhdGFHZW5lcmF0ZWRBdCgpOiBSZWFkb25seTx7XG4gIHJldGlyZWRNb2RlbHM6IG51bWJlcjtcbiAgY2FwYWJpbGl0aWVzOiBudW1iZXI7XG4gIHJhdGVMaW1pdHM6IG51bWJlcjtcbiAgcmVhc29uaW5nOiBudW1iZXI7XG59PiB7XG4gIHJldHVybiB7XG4gICAgcmV0aXJlZE1vZGVsczogUkVUSVJFRF9NT0RFTFNfR0VORVJBVEVEX0FULFxuICAgIGNhcGFiaWxpdGllczogY2FwYWJpbGl0aWVzU25hcHNob3QuZ2VuZXJhdGVkQXQsXG4gICAgcmF0ZUxpbWl0czogcmF0ZUxpbWl0c1NuYXBzaG90LmdlbmVyYXRlZEF0LFxuICAgIHJlYXNvbmluZzogcmVhc29uaW5nU25hcHNob3QuZ2VuZXJhdGVkQXQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1vZGVsSWRlbnRpdGllcyhcbiAgbW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG4gIGluY2x1ZGVEaXNwbGF5TmFtZSA9IHRydWUsXG4pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIpIHJldHVybiBbbW9kZWxdO1xuICByZXR1cm4gW1xuICAgIG1vZGVsLm5hbWUsXG4gICAgLi4uKGluY2x1ZGVEaXNwbGF5TmFtZSA/IFttb2RlbC5kaXNwbGF5TmFtZV0gOiBbXSksXG4gICAgbW9kZWwubW9kZWxTZXJ2aWNlTmFtZSxcbiAgICAuLi5PYmplY3QudmFsdWVzKG1vZGVsLnNlcnZpY2VOYW1lcyA/PyB7fSksXG4gIF0uZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiBCb29sZWFuKHZhbHVlKSk7XG59XG5cbmZ1bmN0aW9uIG1vZGVsS2V5KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gbW9kZWxTZWFyY2hRdWVyeSh2YWx1ZSk/LnJlcGxhY2VBbGwoXCIgXCIsIFwiLVwiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFBhZ2UodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIGhlYWRlcnM6IHsgXCJ1c2VyLWFnZW50XCI6IFVTRVJfQUdFTlQgfSxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoMTVfMDAwKSxcbiAgfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGFicmlja3MgZG9jdW1lbnRhdGlvbiByZXR1cm5lZCBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHt1cmx9YCk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cblxuZnVuY3Rpb24gbm93U2Vjb25kcygpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG59XG4iXX0=
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Lists the workspace's `/serving-endpoints` and, when the caller supplies a
5
5
  * trusted credential identity, caches the result per host and identity with a
6
- * TTL via AppKit's `CacheManager`. Concurrent callers in the same scope share
6
+ * TTL via `@dbx-tools/cache`. Concurrent callers in the same scope share
7
7
  * one in-flight promise. Surfaces each endpoint as a stable
8
8
  * {@link ServingEndpointSummary} - including the Foundation Model API
9
9
  * `quality` / `speed` / `cost` profile when present, the classified
@@ -35,8 +35,7 @@ export declare const DEFAULT_FUZZY_THRESHOLD = 0.4;
35
35
  /** Options for {@link listServingEndpoints}. */
36
36
  export interface ListServingEndpointsOptions {
37
37
  /**
38
- * Override the default cache TTL for this call, in milliseconds. Forwarded to
39
- * `CacheManager` as seconds.
38
+ * Override the default cache TTL for this call, in milliseconds.
40
39
  */
41
40
  ttlMs?: number;
42
41
  /**
@@ -51,23 +50,16 @@ export interface ListServingEndpointsOptions {
51
50
  }
52
51
  /**
53
52
  * List Model Serving endpoints for the workspace owning `client`, routed
54
- * through AppKit's `CacheManager`. The manager gives us everything
55
- * `cachetools.TTLCache` provides plus what `cachetools-async` adds on top:
56
- * per-entry TTL, in-flight request coalescing (concurrent callers share one
57
- * fetch via the manager's internal `inFlightRequests` map), bounded size,
58
- * telemetry spans (`cache.getOrExecute`), and optional Lakebase persistence so
59
- * the catalogue survives restarts when the lakebase plugin is wired up.
53
+ * through the shared memory-first cache, including per-entry TTL, in-flight
54
+ * request coalescing, bounded process memory, and portable persistence.
60
55
  *
61
56
  * Returns plain {@link ServingEndpointSummary} objects (a stable subset of the
62
- * SDK type) so cache hits never expose stale SDK internals. Errors from
63
- * `CacheManager` or the SDK fetch propagate to the caller - we don't swallow
64
- * them so users see the real auth / network issue.
57
+ * SDK type) so cache hits never expose stale SDK internals.
65
58
  *
66
59
  * @param host - Workspace host used as the cache key. Pass the value resolved
67
60
  * from `client.config.getHost()` so multi-host apps share one entry per
68
61
  * workspace.
69
- * @param options.ttlMs - Override the default TTL just for this call. Forwarded
70
- * to `CacheManager` as seconds.
62
+ * @param options.ttlMs - Override the default TTL just for this call.
71
63
  */
72
64
  export declare function listServingEndpoints(client: WorkspaceClientLike, host: string, options?: ListServingEndpointsOptions): Promise<ServingEndpointSummary[]>;
73
65
  /**
@@ -76,16 +68,14 @@ export declare function listServingEndpoints(client: WorkspaceClientLike, host:
76
68
  * none of the cache-load enrichment ({@link listServingEndpoints} adds the
77
69
  * {@link ModelClass} stamp and the embedding-dimension probe). Use this for a
78
70
  * one-shot, dependency-light listing - e.g. a CLI that only needs names/tasks
79
- * for fuzzy resolution and doesn't want AppKit's `CacheManager` or the
71
+ * for fuzzy resolution and doesn't want shared cache persistence or the
80
72
  * per-embedding ping cost. Prefer {@link listServingEndpoints} for the cached,
81
73
  * enriched view.
82
74
  */
83
75
  export declare function listServingEndpointsUncached(client: WorkspaceClientLike): Promise<ServingEndpointSummary[]>;
84
76
  /**
85
- * Force-evict cached endpoint listings via AppKit's `CacheManager`. A host and
86
- * identity delete only that principal's workspace entry. Because CacheManager
87
- * cannot enumerate a namespace, omitting either value clears the complete
88
- * manager and should be reserved for tests or administrative refreshes.
77
+ * Force-evict cached endpoint listings. A host and identity delete only that
78
+ * principal's workspace entry. Omitting either value clears this catalogue.
89
79
  */
90
80
  export declare function clearServingEndpointsCache(host?: string, cacheIdentity?: string): Promise<void>;
91
81
  /**
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Lists the workspace's `/serving-endpoints` and, when the caller supplies a
5
5
  * trusted credential identity, caches the result per host and identity with a
6
- * TTL via AppKit's `CacheManager`. Concurrent callers in the same scope share
6
+ * TTL via `@dbx-tools/cache`. Concurrent callers in the same scope share
7
7
  * one in-flight promise. Surfaces each endpoint as a stable
8
8
  * {@link ServingEndpointSummary} - including the Foundation Model API
9
9
  * `quality` / `speed` / `cost` profile when present, the classified
@@ -21,9 +21,10 @@
21
21
  * @module
22
22
  */
23
23
  import { createHash } from "node:crypto";
24
- import { CacheManager } from "@databricks/appkit";
24
+ import { deleteCachedValue, getOrSet } from "@dbx-tools/cache/cache";
25
25
  import { errorUtils, log } from "@dbx-tools/shared-core";
26
26
  import { model, } from "@dbx-tools/shared-model";
27
+ import { modelCatalogueCache } from "./_cache.js";
27
28
  import { classifyEndpointClasses, normalizeEndpoints, rankEndpoints } from "./_ranking.js";
28
29
  const { ModelClass } = model;
29
30
  const logger = log.logger("model/serving");
@@ -33,35 +34,33 @@ export const DEFAULT_MODEL_CACHE_TTL_MS = 5 * 60 * 1000;
33
34
  export const DEFAULT_FUZZY_THRESHOLD = 0.4;
34
35
  /** Cache key parts under which endpoint listings are stored. */
35
36
  const CACHE_KEY_NAMESPACE = "serving-endpoints";
36
- /** Hash an opaque credential identity before handing it to CacheManager. */
37
+ const catalogueCache = modelCatalogueCache;
38
+ /** Hash an opaque credential identity before handing it to the shared cache. */
37
39
  function cacheUserKey(identity) {
38
40
  return `model-${createHash("sha256").update(identity).digest("hex")}`;
39
41
  }
40
42
  /**
41
43
  * List Model Serving endpoints for the workspace owning `client`, routed
42
- * through AppKit's `CacheManager`. The manager gives us everything
43
- * `cachetools.TTLCache` provides plus what `cachetools-async` adds on top:
44
- * per-entry TTL, in-flight request coalescing (concurrent callers share one
45
- * fetch via the manager's internal `inFlightRequests` map), bounded size,
46
- * telemetry spans (`cache.getOrExecute`), and optional Lakebase persistence so
47
- * the catalogue survives restarts when the lakebase plugin is wired up.
44
+ * through the shared memory-first cache, including per-entry TTL, in-flight
45
+ * request coalescing, bounded process memory, and portable persistence.
48
46
  *
49
47
  * Returns plain {@link ServingEndpointSummary} objects (a stable subset of the
50
- * SDK type) so cache hits never expose stale SDK internals. Errors from
51
- * `CacheManager` or the SDK fetch propagate to the caller - we don't swallow
52
- * them so users see the real auth / network issue.
48
+ * SDK type) so cache hits never expose stale SDK internals.
53
49
  *
54
50
  * @param host - Workspace host used as the cache key. Pass the value resolved
55
51
  * from `client.config.getHost()` so multi-host apps share one entry per
56
52
  * workspace.
57
- * @param options.ttlMs - Override the default TTL just for this call. Forwarded
58
- * to `CacheManager` as seconds.
53
+ * @param options.ttlMs - Override the default TTL just for this call.
59
54
  */
60
55
  export async function listServingEndpoints(client, host, options = {}) {
61
56
  if (!options.cacheIdentity)
62
57
  return fetchEndpoints(client);
63
- const ttlSec = Math.max(1, Math.round((options.ttlMs ?? DEFAULT_MODEL_CACHE_TTL_MS) / 1000));
64
- return CacheManager.getInstanceSync().getOrExecute([CACHE_KEY_NAMESPACE, host], () => fetchEndpoints(client), cacheUserKey(options.cacheIdentity), { ttl: ttlSec });
58
+ return (await getOrSet(catalogueCache, catalogueCacheKey(host, options.cacheIdentity), () => fetchEndpoints(client), {
59
+ ttl: options.ttlMs ?? DEFAULT_MODEL_CACHE_TTL_MS,
60
+ returnCachedOnError: true,
61
+ cachedOnErrorTtl: "7d",
62
+ throwErrors: true,
63
+ }));
65
64
  }
66
65
  /**
67
66
  * List the workspace's serving endpoints as minimal
@@ -69,7 +68,7 @@ export async function listServingEndpoints(client, host, options = {}) {
69
68
  * none of the cache-load enrichment ({@link listServingEndpoints} adds the
70
69
  * {@link ModelClass} stamp and the embedding-dimension probe). Use this for a
71
70
  * one-shot, dependency-light listing - e.g. a CLI that only needs names/tasks
72
- * for fuzzy resolution and doesn't want AppKit's `CacheManager` or the
71
+ * for fuzzy resolution and doesn't want shared cache persistence or the
73
72
  * per-embedding ping cost. Prefer {@link listServingEndpoints} for the cached,
74
73
  * enriched view.
75
74
  */
@@ -135,21 +134,20 @@ async function pingEmbeddingDimension(client, name) {
135
134
  }
136
135
  }
137
136
  /**
138
- * Force-evict cached endpoint listings via AppKit's `CacheManager`. A host and
139
- * identity delete only that principal's workspace entry. Because CacheManager
140
- * cannot enumerate a namespace, omitting either value clears the complete
141
- * manager and should be reserved for tests or administrative refreshes.
137
+ * Force-evict cached endpoint listings. A host and identity delete only that
138
+ * principal's workspace entry. Omitting either value clears this catalogue.
142
139
  */
143
140
  export async function clearServingEndpointsCache(host, cacheIdentity) {
144
- const cache = CacheManager.getInstanceSync();
145
141
  if (host && cacheIdentity) {
146
- const key = cache.generateKey([CACHE_KEY_NAMESPACE, host], cacheUserKey(cacheIdentity));
147
- await cache.delete(key);
142
+ await deleteCachedValue(catalogueCache, catalogueCacheKey(host, cacheIdentity));
148
143
  }
149
144
  else {
150
- await cache.clear();
145
+ await catalogueCache.clear();
151
146
  }
152
147
  }
148
+ function catalogueCacheKey(host, cacheIdentity) {
149
+ return JSON.stringify([CACHE_KEY_NAMESPACE, host, cacheUserKey(cacheIdentity)]);
150
+ }
153
151
  /**
154
152
  * Result of fuzzy-resolving a user-supplied model name against the live
155
153
  * endpoint list. `score` is the ranker's distance (`0` is exact, `1` is no match);
@@ -196,4 +194,4 @@ export function resolveModelId(input, endpoints, options = {}) {
196
194
  }
197
195
  return { modelId: input, matched: false };
198
196
  }
199
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY2F0YWxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RlbC1jYXRhbG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFDTCxLQUFLLEdBS04sTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNGLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFFN0IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztBQVMzQywwR0FBMEc7QUFDMUcsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFFeEQsd0VBQXdFO0FBQ3hFLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUUzQyxnRUFBZ0U7QUFDaEUsTUFBTSxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQztBQW9CaEQsNEVBQTRFO0FBQzVFLFNBQVMsWUFBWSxDQUFDLFFBQWdCO0lBQ3BDLE9BQU8sU0FBUyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0FBQ3hFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsb0JBQW9CLENBQ3hDLE1BQTJCLEVBQzNCLElB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LFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNFLENBQUM7SUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGl2ZSBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgY2F0YWxvZ3VlIGFjY2Vzcy5cbiAqXG4gKiBMaXN0cyB0aGUgd29ya3NwYWNlJ3MgYC9zZXJ2aW5nLWVuZHBvaW50c2AgYW5kLCB3aGVuIHRoZSBjYWxsZXIgc3VwcGxpZXMgYVxuICogdHJ1c3RlZCBjcmVkZW50aWFsIGlkZW50aXR5LCBjYWNoZXMgdGhlIHJlc3VsdCBwZXIgaG9zdCBhbmQgaWRlbnRpdHkgd2l0aCBhXG4gKiBUVEwgdmlhIEFwcEtpdCdzIGBDYWNoZU1hbmFnZXJgLiBDb25jdXJyZW50IGNhbGxlcnMgaW4gdGhlIHNhbWUgc2NvcGUgc2hhcmVcbiAqIG9uZSBpbi1mbGlnaHQgcHJvbWlzZS4gU3VyZmFjZXMgZWFjaCBlbmRwb2ludCBhcyBhIHN0YWJsZVxuICoge0BsaW5rIFNlcnZpbmdFbmRwb2ludFN1bW1hcnl9IC0gaW5jbHVkaW5nIHRoZSBGb3VuZGF0aW9uIE1vZGVsIEFQSVxuICogYHF1YWxpdHlgIC8gYHNwZWVkYCAvIGBjb3N0YCBwcm9maWxlIHdoZW4gcHJlc2VudCwgdGhlIGNsYXNzaWZpZWRcbiAqIHtAbGluayBNb2RlbENsYXNzfSwgYW5kIChmb3IgZW1iZWRkaW5nIGVuZHBvaW50cykgdGhlIG1lYXN1cmVkIHZlY3RvclxuICogYGRpbWVuc2lvbmAgLSBhbmQgc25hcHMgbG9vc2UsIGh1bWFuLXR5cGVkIG5hbWVzIHRvIHJlYWwgZW5kcG9pbnQgaWRzXG4gKiB0aHJvdWdoIHRoZSBUeXBlU2NyaXB0IG1vZGVsIHJhbmtlciBzbyB0b2tlbnMgbGlrZSBgXCJjbGF1ZGUgc29ubmV0XCJgIHJlc29sdmUgdG9cbiAqIGBkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02YC5cbiAqXG4gKiBUaGUgY2xhc3Mgc3RhbXAgYW5kIGVtYmVkZGluZyBkaW1lbnNpb24gYXJlIGNvbXB1dGVkIG9uY2UgcGVyIGNhY2hlIGxvYWQ6XG4gKiBldmVyeSBlbWJlZGRpbmcgZW5kcG9pbnQgaXMgXCJwaW5nZWRcIiBpbiBwYXJhbGxlbCBhbmQgdGhlIHJlc3VsdGluZyB2ZWN0b3JcbiAqIGxlbmd0aCByZWNvcmRlZCwgc28gdGhlIGNvc3QgaXMgcGFpZCBvbiBhIGNhY2hlIG1pc3MsIG5vdCBwZXIgcmVhZC4gVGhlIHBpbmdcbiAqIGlzIGJlc3QtZWZmb3J0IC0gYSBmYWlsdXJlIGxvZ3MgYXQgZGVidWcgYW5kIGxlYXZlcyBgZGltZW5zaW9uYCB1bnNldCByYXRoZXJcbiAqIHRoYW4gZmFpbGluZyB0aGUgd2hvbGUgbGlzdGluZy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgQ2FjaGVNYW5hZ2VyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgbW9kZWwsXG4gIHR5cGUgUmVzb2x2ZWRNb2RlbCxcbiAgdHlwZSBSZXNvbHZlTW9kZWxPcHRpb25zLFxuICB0eXBlIFNjb3JlZEVuZHBvaW50LFxuICB0eXBlIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuXG5pbXBvcnQgeyBjbGFzc2lmeUVuZHBvaW50Q2xhc3Nlcywgbm9ybWFsaXplRW5kcG9pbnRzLCByYW5rRW5kcG9pbnRzIH0gZnJvbSBcIi4vX3JhbmtpbmcudHNcIjtcblxuY29uc3QgeyBNb2RlbENsYXNzIH0gPSBtb2RlbDtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1vZGVsL3NlcnZpbmdcIik7XG5cbi8qKlxuICogU3RydWN0dXJhbCB0eXBlIGZvciB0aGUgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgY2xpZW50LCByZS1leHBvcnRlZCBzbyB0aGUgcmVzdFxuICogb2YgdGhpcyBwYWNrYWdlIGNhbiBrZWVwIGltcG9ydGluZyBpdCBmcm9tIGhlcmUuIFNlZVxuICogYGFwcGtpdC5Xb3Jrc3BhY2VDbGllbnRMaWtlYCAobm9kZS1hcHBraXQpIGZvciB0aGUgY2Fub25pY2FsIGRlZmluaXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZUNsaWVudExpa2UgPSBQaWNrPGFwcGtpdC5Xb3Jrc3BhY2VDbGllbnRMaWtlLCBcInNlcnZpbmdFbmRwb2ludHNcIj47XG5cbi8qKiBEZWZhdWx0IFRUTCBmb3IgdGhlIGluLW1lbW9yeSBlbmRwb2ludCBjYWNoZS4gTWF0Y2hlcyB0aGUgRGF0YWJyaWNrcyBTREsncyBzZXNzaW9uIGxpZmV0aW1lIGJ1ZGdldC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01PREVMX0NBQ0hFX1RUTF9NUyA9IDUgKiA2MCAqIDEwMDA7XG5cbi8qKiBEZWZhdWx0IGZ1enp5IGRpc3RhbmNlIHRocmVzaG9sZCBiZWxvdyB3aGljaCBhIG1hdGNoIGlzIGFjY2VwdGVkLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRlVaWllfVEhSRVNIT0xEID0gMC40O1xuXG4vKiogQ2FjaGUga2V5IHBhcnRzIHVuZGVyIHdoaWNoIGVuZHBvaW50IGxpc3RpbmdzIGFyZSBzdG9yZWQuICovXG5jb25zdCBDQUNIRV9LRVlfTkFNRVNQQUNFID0gXCJzZXJ2aW5nLWVuZHBvaW50c1wiO1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIGxpc3RTZXJ2aW5nRW5kcG9pbnRzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFNlcnZpbmdFbmRwb2ludHNPcHRpb25zIHtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGNhY2hlIFRUTCBmb3IgdGhpcyBjYWxsLCBpbiBtaWxsaXNlY29uZHMuIEZvcndhcmRlZCB0b1xuICAgKiBgQ2FjaGVNYW5hZ2VyYCBhcyBzZWNvbmRzLlxuICAgKi9cbiAgdHRsTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUcnVzdGVkIGlkZW50aXR5IG9mIHRoZSBjcmVkZW50aWFsIHVzZWQgYnkgYGNsaWVudGAuXG4gICAqXG4gICAqIFRoZSB2YWx1ZSBpcyBoYXNoZWQgYmVmb3JlIGl0IGVudGVycyB0aGUgY2FjaGUga2V5IGFuZCBpcyBuZXZlciBsb2dnZWQuXG4gICAqIE9taXQgaXQgd2hlbiB0aGUgY2FsbGVyIGNhbm5vdCBwcm92ZSB0aGUgY3JlZGVudGlhbCBpZGVudGl0eTsgdGhhdCBjYWxsXG4gICAqIGJ5cGFzc2VzIHNoYXJlZCBjYWNoaW5nIHNvIG9uZSBwcmluY2lwYWwgY2FuIG5ldmVyIHJlYWQgYW5vdGhlcidzXG4gICAqIGNhdGFsb2d1ZS5cbiAgICovXG4gIGNhY2hlSWRlbnRpdHk/OiBzdHJpbmc7XG59XG5cbi8qKiBIYXNoIGFuIG9wYXF1ZSBjcmVkZW50aWFsIGlkZW50aXR5IGJlZm9yZSBoYW5kaW5nIGl0IHRvIENhY2hlTWFuYWdlci4gKi9cbmZ1bmN0aW9uIGNhY2hlVXNlcktleShpZGVudGl0eTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBtb2RlbC0ke2NyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGlkZW50aXR5KS5kaWdlc3QoXCJoZXhcIil9YDtcbn1cblxuLyoqXG4gKiBMaXN0IE1vZGVsIFNlcnZpbmcgZW5kcG9pbnRzIGZvciB0aGUgd29ya3NwYWNlIG93bmluZyBgY2xpZW50YCwgcm91dGVkXG4gKiB0aHJvdWdoIEFwcEtpdCdzIGBDYWNoZU1hbmFnZXJgLiBUaGUgbWFuYWdlciBnaXZlcyB1cyBldmVyeXRoaW5nXG4gKiBgY2FjaGV0b29scy5UVExDYWNoZWAgcHJvdmlkZXMgcGx1cyB3aGF0IGBjYWNoZXRvb2xzLWFzeW5jYCBhZGRzIG9uIHRvcDpcbiAqIHBlci1lbnRyeSBUVEwsIGluLWZsaWdodCByZXF1ZXN0IGNvYWxlc2NpbmcgKGNvbmN1cnJlbnQgY2FsbGVycyBzaGFyZSBvbmVcbiAqIGZldGNoIHZpYSB0aGUgbWFuYWdlcidzIGludGVybmFsIGBpbkZsaWdodFJlcXVlc3RzYCBtYXApLCBib3VuZGVkIHNpemUsXG4gKiB0ZWxlbWV0cnkgc3BhbnMgKGBjYWNoZS5nZXRPckV4ZWN1dGVgKSwgYW5kIG9wdGlvbmFsIExha2ViYXNlIHBlcnNpc3RlbmNlIHNvXG4gKiB0aGUgY2F0YWxvZ3VlIHN1cnZpdmVzIHJlc3RhcnRzIHdoZW4gdGhlIGxha2ViYXNlIHBsdWdpbiBpcyB3aXJlZCB1cC5cbiAqXG4gKiBSZXR1cm5zIHBsYWluIHtAbGluayBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5fSBvYmplY3RzIChhIHN0YWJsZSBzdWJzZXQgb2YgdGhlXG4gKiBTREsgdHlwZSkgc28gY2FjaGUgaGl0cyBuZXZlciBleHBvc2Ugc3RhbGUgU0RLIGludGVybmFscy4gRXJyb3JzIGZyb21cbiAqIGBDYWNoZU1hbmFnZXJgIG9yIHRoZSBTREsgZmV0Y2ggcHJvcGFnYXRlIHRvIHRoZSBjYWxsZXIgLSB3ZSBkb24ndCBzd2FsbG93XG4gKiB0aGVtIHNvIHVzZXJzIHNlZSB0aGUgcmVhbCBhdXRoIC8gbmV0d29yayBpc3N1ZS5cbiAqXG4gKiBAcGFyYW0gaG9zdCAtIFdvcmtzcGFjZSBob3N0IHVzZWQgYXMgdGhlIGNhY2hlIGtleS4gUGFzcyB0aGUgdmFsdWUgcmVzb2x2ZWRcbiAqICAgZnJvbSBgY2xpZW50LmNvbmZpZy5nZXRIb3N0KClgIHNvIG11bHRpLWhvc3QgYXBwcyBzaGFyZSBvbmUgZW50cnkgcGVyXG4gKiAgIHdvcmtzcGFjZS5cbiAqIEBwYXJhbSBvcHRpb25zLnR0bE1zIC0gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgVFRMIGp1c3QgZm9yIHRoaXMgY2FsbC4gRm9yd2FyZGVkXG4gKiAgIHRvIGBDYWNoZU1hbmFnZXJgIGFzIHNlY29uZHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0U2VydmluZ0VuZHBvaW50cyhcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlLFxuICBob3N0OiBzdHJpbmcsXG4gIG9wdGlvbnM6IExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgaWYgKCFvcHRpb25zLmNhY2hlSWRlbnRpdHkpIHJldHVybiBmZXRjaEVuZHBvaW50cyhjbGllbnQpO1xuICBjb25zdCB0dGxTZWMgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKChvcHRpb25zLnR0bE1zID8/IERFRkFVTFRfTU9ERUxfQ0FDSEVfVFRMX01TKSAvIDEwMDApKTtcbiAgcmV0dXJuIENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKS5nZXRPckV4ZWN1dGUoXG4gICAgW0NBQ0hFX0tFWV9OQU1FU1BBQ0UsIGhvc3RdLFxuICAgICgpID0+IGZldGNoRW5kcG9pbnRzKGNsaWVudCksXG4gICAgY2FjaGVVc2VyS2V5KG9wdGlvbnMuY2FjaGVJZGVudGl0eSksXG4gICAgeyB0dGw6IHR0bFNlYyB9LFxuICApO1xufVxuXG4vKipcbiAqIExpc3QgdGhlIHdvcmtzcGFjZSdzIHNlcnZpbmcgZW5kcG9pbnRzIGFzIG1pbmltYWxcbiAqIHtAbGluayBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5fSBvYmplY3RzIHN0cmFpZ2h0IGZyb20gdGhlIFNESzogbm8gY2FjaGluZywgYW5kXG4gKiBub25lIG9mIHRoZSBjYWNoZS1sb2FkIGVucmljaG1lbnQgKHtAbGluayBsaXN0U2VydmluZ0VuZHBvaW50c30gYWRkcyB0aGVcbiAqIHtAbGluayBNb2RlbENsYXNzfSBzdGFtcCBhbmQgdGhlIGVtYmVkZGluZy1kaW1lbnNpb24gcHJvYmUpLiBVc2UgdGhpcyBmb3IgYVxuICogb25lLXNob3QsIGRlcGVuZGVuY3ktbGlnaHQgbGlzdGluZyAtIGUuZy4gYSBDTEkgdGhhdCBvbmx5IG5lZWRzIG5hbWVzL3Rhc2tzXG4gKiBmb3IgZnV6enkgcmVzb2x1dGlvbiBhbmQgZG9lc24ndCB3YW50IEFwcEtpdCdzIGBDYWNoZU1hbmFnZXJgIG9yIHRoZVxuICogcGVyLWVtYmVkZGluZyBwaW5nIGNvc3QuIFByZWZlciB7QGxpbmsgbGlzdFNlcnZpbmdFbmRwb2ludHN9IGZvciB0aGUgY2FjaGVkLFxuICogZW5yaWNoZWQgdmlldy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTZXJ2aW5nRW5kcG9pbnRzVW5jYWNoZWQoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSxcbik6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gIGNvbnN0IGVuZHBvaW50czogdW5rbm93bltdID0gW107XG4gIGZvciBhd2FpdCAoY29uc3QgZXAgb2YgY2xpZW50LnNlcnZpbmdFbmRwb2ludHMubGlzdCgpKSB7XG4gICAgZW5kcG9pbnRzLnB1c2goZXApO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVFbmRwb2ludHMoZW5kcG9pbnRzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hFbmRwb2ludHMoY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlKTogUHJvbWlzZTxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgY2xhc3NpZmllZCA9IHN0YW1wTW9kZWxDbGFzc2VzKGF3YWl0IGxpc3RTZXJ2aW5nRW5kcG9pbnRzVW5jYWNoZWQoY2xpZW50KSk7XG4gIGNvbnN0IG91dCA9IGF3YWl0IG1lYXN1cmVFbWJlZGRpbmdEaW1lbnNpb25zKGNsaWVudCwgY2xhc3NpZmllZCk7XG4gIGxvZ2dlci5kZWJ1ZyhcImxpc3RlZFwiLCB7IGNvdW50OiBvdXQubGVuZ3RoLCBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQgfSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogU3RhbXAgZWFjaCBzdW1tYXJ5J3Mge0BsaW5rIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkuY2xhc3N9IGZyb20gdGhlIHJlbGF0aXZlXG4gKiBjbGFzc2lmaWNhdGlvbiBvZiB0aGUgd2hvbGUgc2V0LiBFbmRwb2ludHMgdGhlIGNsYXNzaWZpZXIgZG9lc24ndCByZWNvZ25pemVcbiAqIChjdXN0b20sIHVuc2NvcmVkLCBub24tTExNKSBhcmUgbGVmdCB3aXRob3V0IGEgY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIHN0YW1wTW9kZWxDbGFzc2VzKHN1bW1hcmllczogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdKTogU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdIHtcbiAgY29uc3QgY2xhc3NPZiA9IGNsYXNzaWZ5RW5kcG9pbnRDbGFzc2VzKHN1bW1hcmllcyk7XG4gIHJldHVybiBzdW1tYXJpZXMubWFwKChzdW1tYXJ5KSA9PiB7XG4gICAgY29uc3QgY2xzID0gY2xhc3NPZi5nZXQoc3VtbWFyeS5uYW1lKTtcbiAgICByZXR1cm4gY2xzID09PSB1bmRlZmluZWQgPyBzdW1tYXJ5IDogeyAuLi5zdW1tYXJ5LCBjbGFzczogY2xzIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIE1lYXN1cmUgdGhlIGVtYmVkZGluZyB2ZWN0b3IgZGltZW5zaW9uIG9mIGV2ZXJ5IHtAbGluayBNb2RlbENsYXNzLkVtYmVkZGluZ31cbiAqIGVuZHBvaW50IGJ5IHBpbmdpbmcgaXQgb25jZSwgYWxsIGluIHBhcmFsbGVsLiBSdW5zIG9ubHkgb24gYSBjYWNoZSBtaXNzIChpdCdzXG4gKiBjYWxsZWQgZnJvbSB7QGxpbmsgZmV0Y2hFbmRwb2ludHN9KSwgc28gdGhlIHByb2JlIGNvc3QgaXMgYW1vcnRpemVkIGFjcm9zcyB0aGVcbiAqIGNhY2hlZCBUVEwgd2luZG93LiBQZXItZW5kcG9pbnQgZmFpbHVyZXMgYXJlIHN3YWxsb3dlZCAobG9nZ2VkIGF0IHdhcm4pIHNvIG9uZVxuICogdW5yZWFjaGFibGUgZW1iZWRkaW5nIG1vZGVsIG5ldmVyIGZhaWxzIHRoZSBsaXN0aW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiBtZWFzdXJlRW1iZWRkaW5nRGltZW5zaW9ucyhcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlLFxuICBzdW1tYXJpZXM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbik6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gIHJldHVybiBQcm9taXNlLmFsbChcbiAgICBzdW1tYXJpZXMubWFwKGFzeW5jIChzdW1tYXJ5KSA9PiB7XG4gICAgICBpZiAoc3VtbWFyeS5jbGFzcyAhPT0gTW9kZWxDbGFzcy5FbWJlZGRpbmcpIHJldHVybiBzdW1tYXJ5O1xuICAgICAgY29uc3QgZGltZW5zaW9uID0gYXdhaXQgcGluZ0VtYmVkZGluZ0RpbWVuc2lvbihjbGllbnQsIHN1bW1hcnkubmFtZSk7XG4gICAgICByZXR1cm4gZGltZW5zaW9uID09PSB1bmRlZmluZWQgPyBzdW1tYXJ5IDogeyAuLi5zdW1tYXJ5LCBkaW1lbnNpb24gfTtcbiAgICB9KSxcbiAgKTtcbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBlbWJlZGRpbmcgZGltZW5zaW9uIHByb2JlOiBxdWVyeSBgbmFtZWAgd2l0aCBhIHRpbnkgYFwicGluZ1wiYFxuICogaW5wdXQgYW5kIHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSByZXR1cm5lZCB2ZWN0b3IuIFJldHVybnMgYHVuZGVmaW5lZGAgKGFuZFxuICogbG9ncyBhdCB3YXJuKSB3aGVuIHRoZSBlbmRwb2ludCBjYW4ndCBiZSBxdWVyaWVkIG9yIHJldHVybnMgbm8gdmVjdG9yIC0gdGhlXG4gKiBkaW1lbnNpb24gaXMgaW5mb3JtYXRpb25hbCwgbmV2ZXIgcmVxdWlyZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBpbmdFbWJlZGRpbmdEaW1lbnNpb24oXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSxcbiAgbmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5zZXJ2aW5nRW5kcG9pbnRzLnF1ZXJ5KHsgbmFtZSwgaW5wdXQ6IFwicGluZ1wiIH0pO1xuICAgIGNvbnN0IGRpbWVuc2lvbiA9IHJlc3BvbnNlLmRhdGE/LlswXT8uZW1iZWRkaW5nPy5sZW5ndGg7XG4gICAgaWYgKHR5cGVvZiBkaW1lbnNpb24gPT09IFwibnVtYmVyXCIgJiYgZGltZW5zaW9uID4gMCkgcmV0dXJuIGRpbWVuc2lvbjtcbiAgICBsb2dnZXIud2FybihcImVtYmVkZGluZyBwaW5nIHJldHVybmVkIG5vIHZlY3RvclwiLCB7IG5hbWUgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJlbWJlZGRpbmcgcGluZyBmYWlsZWRcIiwgeyBuYW1lLCBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogRm9yY2UtZXZpY3QgY2FjaGVkIGVuZHBvaW50IGxpc3RpbmdzIHZpYSBBcHBLaXQncyBgQ2FjaGVNYW5hZ2VyYC4gQSBob3N0IGFuZFxuICogaWRlbnRpdHkgZGVsZXRlIG9ubHkgdGhhdCBwcmluY2lwYWwncyB3b3Jrc3BhY2UgZW50cnkuIEJlY2F1c2UgQ2FjaGVNYW5hZ2VyXG4gKiBjYW5ub3QgZW51bWVyYXRlIGEgbmFtZXNwYWNlLCBvbWl0dGluZyBlaXRoZXIgdmFsdWUgY2xlYXJzIHRoZSBjb21wbGV0ZVxuICogbWFuYWdlciBhbmQgc2hvdWxkIGJlIHJlc2VydmVkIGZvciB0ZXN0cyBvciBhZG1pbmlzdHJhdGl2ZSByZWZyZXNoZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhclNlcnZpbmdFbmRwb2ludHNDYWNoZShcbiAgaG9zdD86IHN0cmluZyxcbiAgY2FjaGVJZGVudGl0eT86IHN0cmluZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWNoZSA9IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKTtcbiAgaWYgKGhvc3QgJiYgY2FjaGVJZGVudGl0eSkge1xuICAgIGNvbnN0IGtleSA9IGNhY2hlLmdlbmVyYXRlS2V5KFtDQUNIRV9LRVlfTkFNRVNQQUNFLCBob3N0XSwgY2FjaGVVc2VyS2V5KGNhY2hlSWRlbnRpdHkpKTtcbiAgICBhd2FpdCBjYWNoZS5kZWxldGUoa2V5KTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBjYWNoZS5jbGVhcigpO1xuICB9XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGZ1enp5LXJlc29sdmluZyBhIHVzZXItc3VwcGxpZWQgbW9kZWwgbmFtZSBhZ2FpbnN0IHRoZSBsaXZlXG4gKiBlbmRwb2ludCBsaXN0LiBgc2NvcmVgIGlzIHRoZSByYW5rZXIncyBkaXN0YW5jZSAoYDBgIGlzIGV4YWN0LCBgMWAgaXMgbm8gbWF0Y2gpO1xuICogYG1hdGNoZWRgIGlzIGBmYWxzZWAgd2hlbiB0aGUgc2NvcmUgZXhjZWVkcyB0aGUgY29uZmlndXJlZCB0aHJlc2hvbGQgc29cbiAqIGNhbGxlcnMgY2FuIGZhbGwgYmFjayB0byB0aGUgb3JpZ2luYWwgaW5wdXQgKERhdGFicmlja3Mgd2lsbCB0aGVuIHJldHVybiBhXG4gKiBjbGVhbiA0MDQpLlxuICovXG4vKipcbiAqIEZ1enp5LXJhbmsgZW5kcG9pbnRzIGJ5IGhvdyBjbG9zZWx5IHRoZWlyIGBuYW1lYCBtYXRjaGVzIGBpbnB1dGAsIGJlc3RcbiAqIChsb3dlc3Qgc2NvcmUpIGZpcnN0LCBrZWVwaW5nIG9ubHkgdGhvc2Ugd2l0aGluIGB0aHJlc2hvbGRgOlxuICpcbiAqIDEuIEFuIGV4YWN0IG5hbWUgbWF0Y2ggc2hvcnQtY2lyY3VpdHMgdG8gYSBzaW5nbGUgYHNjb3JlOiAwYCByZXN1bHQuXG4gKiAyLiBPdGhlcndpc2UgdGhlIHNoYXJlZCBUeXBlU2NyaXB0IHBvbGljeSB0b2tlbml6ZXMgYW5kIHNjb3JlcyBldmVyeSBlbmRwb2ludCB0aHJvdWdoIHRoZVxuICogICAgc2FtZSBmdXp6eS1kaXN0YW5jZSBwb2xpY3kgdXNlZCBieSB7QGxpbmsgbG9va3VwTW9kZWxzfS5cbiAqXG4gKiBSZXR1cm5zIGBbXWAgZm9yIGFuIGVtcHR5IGVuZHBvaW50IGxpc3Qgb3Igd2hlbiBgaW5wdXRgIHRva2VuaXplcyB0byBub3RoaW5nLFxuICogc28gY2FsbGVycyBmYWxsIGJhY2sgdG8gdGhlIHJhdyBpbnB1dCBhbmQgbGV0IERhdGFicmlja3Mgc3VyZmFjZSBhIGNsZWFuIDQwNC5cbiAqIFRoaXMgbXVsdGktcmVzdWx0IGNvcmUgaXMgc2hhcmVkIGJ5IHtAbGluayByZXNvbHZlTW9kZWxJZH0gKHNpbmdsZSBiZXN0KSBhbmRcbiAqIHRoZSByYW5rZWQgYGxvb2t1cE1vZGVsc2Agc2VsZWN0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWFyY2hTZXJ2aW5nRW5kcG9pbnRzKFxuICBpbnB1dDogc3RyaW5nLFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgb3B0aW9uczogUmVzb2x2ZU1vZGVsT3B0aW9ucyA9IHt9LFxuKTogU2NvcmVkRW5kcG9pbnRbXSB7XG4gIGlmIChlbmRwb2ludHMubGVuZ3RoID09PSAwIHx8ICFpbnB1dC50cmltKCkpIHJldHVybiBbXTtcbiAgcmV0dXJuIHJhbmtFbmRwb2ludHMoXG4gICAgZW5kcG9pbnRzLFxuICAgIHtcbiAgICAgIHNlYXJjaDogaW5wdXQsXG4gICAgICAuLi4ob3B0aW9ucy5yZXF1aXJlc1Rvb2xzICE9PSB1bmRlZmluZWQgPyB7IHJlcXVpcmVzVG9vbHM6IG9wdGlvbnMucmVxdWlyZXNUb29scyB9IDoge30pLFxuICAgICAgdGhyZXNob2xkOiBvcHRpb25zLnRocmVzaG9sZCA/PyBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCxcbiAgICB9LFxuICAgIHtcbiAgICAgIGluY2x1ZGVEZXByZWNhdGVkOiB0cnVlLFxuICAgICAgdGFzazogXCJsbG0vdjEvY2hhdFwiLFxuICAgIH0sXG4gICkubWFwKChyYW5rZWQpID0+ICh7IGVuZHBvaW50OiByYW5rZWQuZW5kcG9pbnQsIHNjb3JlOiByYW5rZWQuc2NvcmUgPz8gMCB9KSk7XG59XG5cbi8qKlxuICogU25hcCBhIHVzZXItc3VwcGxpZWQgbW9kZWwgbmFtZSB0byB0aGUgc2luZ2xlIGNsb3Nlc3QgY29uZmlndXJlZCBzZXJ2aW5nXG4gKiBlbmRwb2ludCB2aWEge0BsaW5rIHNlYXJjaFNlcnZpbmdFbmRwb2ludHN9LiBSZXR1cm5zIHRoZSBpbnB1dCB1bmNoYW5nZWQgd2l0aFxuICogYG1hdGNoZWQ6IGZhbHNlYCB3aGVuIG5vdGhpbmcgc2NvcmVzIHdpdGhpbiB0aGUgdGhyZXNob2xkIChvciB0aGUgY2F0YWxvZ3VlXG4gKiBpcyBlbXB0eSksIHNvIGEgZGVsaWJlcmF0ZSBtb2RlbCBpZCBpcyBuZXZlciBzaWxlbnRseSByZXdyaXR0ZW4gdG8gYVxuICogc2ltaWxhci1sb29raW5nIG5laWdoYm91ciBhbmQgdGhlIHVwc3RyZWFtIGNhbGwgc3VyZmFjZXMgdGhlIGNhbm9uaWNhbCA0MDQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTW9kZWxJZChcbiAgaW5wdXQ6IHN0cmluZyxcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIG9wdGlvbnM6IFJlc29sdmVNb2RlbE9wdGlvbnMgPSB7fSxcbik6IFJlc29sdmVkTW9kZWwge1xuICBjb25zdCBbYmVzdF0gPSBzZWFyY2hTZXJ2aW5nRW5kcG9pbnRzKGlucHV0LCBlbmRwb2ludHMsIG9wdGlvbnMpO1xuICBpZiAoYmVzdCkge1xuICAgIHJldHVybiB7IG1vZGVsSWQ6IGJlc3QuZW5kcG9pbnQubmFtZSwgbWF0Y2hlZDogdHJ1ZSwgc2NvcmU6IGJlc3Quc2NvcmUgfTtcbiAgfVxuICByZXR1cm4geyBtb2RlbElkOiBpbnB1dCwgbWF0Y2hlZDogZmFsc2UgfTtcbn1cbiJdfQ==
197
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY2F0YWxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RlbC1jYXRhbG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFDTCxLQUFLLEdBS04sTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzRixNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsS0FBSyxDQUFDO0FBRTdCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUFTM0MsMEdBQTBHO0FBQzFHLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRXhELHdFQUF3RTtBQUN4RSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFFM0MsZ0VBQWdFO0FBQ2hFLE1BQU0sbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7QUFDaEQsTUFBTSxjQUFjLEdBQUcsbUJBQW1CLENBQUM7QUFtQjNDLGdGQUFnRjtBQUNoRixTQUFTLFlBQVksQ0FBQyxRQUFnQjtJQUNwQyxPQUFPLFNBQVMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUN4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O1FBQ1QsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDM0UsQ0FBQztJQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMaXZlIERhdGFicmlja3MgTW9kZWwgU2VydmluZyBjYXRhbG9ndWUgYWNjZXNzLlxuICpcbiAqIExpc3RzIHRoZSB3b3Jrc3BhY2UncyBgL3NlcnZpbmctZW5kcG9pbnRzYCBhbmQsIHdoZW4gdGhlIGNhbGxlciBzdXBwbGllcyBhXG4gKiB0cnVzdGVkIGNyZWRlbnRpYWwgaWRlbnRpdHksIGNhY2hlcyB0aGUgcmVzdWx0IHBlciBob3N0IGFuZCBpZGVudGl0eSB3aXRoIGFcbiAqIFRUTCB2aWEgYEBkYngtdG9vbHMvY2FjaGVgLiBDb25jdXJyZW50IGNhbGxlcnMgaW4gdGhlIHNhbWUgc2NvcGUgc2hhcmVcbiAqIG9uZSBpbi1mbGlnaHQgcHJvbWlzZS4gU3VyZmFjZXMgZWFjaCBlbmRwb2ludCBhcyBhIHN0YWJsZVxuICoge0BsaW5rIFNlcnZpbmdFbmRwb2ludFN1bW1hcnl9IC0gaW5jbHVkaW5nIHRoZSBGb3VuZGF0aW9uIE1vZGVsIEFQSVxuICogYHF1YWxpdHlgIC8gYHNwZWVkYCAvIGBjb3N0YCBwcm9maWxlIHdoZW4gcHJlc2VudCwgdGhlIGNsYXNzaWZpZWRcbiAqIHtAbGluayBNb2RlbENsYXNzfSwgYW5kIChmb3IgZW1iZWRkaW5nIGVuZHBvaW50cykgdGhlIG1lYXN1cmVkIHZlY3RvclxuICogYGRpbWVuc2lvbmAgLSBhbmQgc25hcHMgbG9vc2UsIGh1bWFuLXR5cGVkIG5hbWVzIHRvIHJlYWwgZW5kcG9pbnQgaWRzXG4gKiB0aHJvdWdoIHRoZSBUeXBlU2NyaXB0IG1vZGVsIHJhbmtlciBzbyB0b2tlbnMgbGlrZSBgXCJjbGF1ZGUgc29ubmV0XCJgIHJlc29sdmUgdG9cbiAqIGBkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02YC5cbiAqXG4gKiBUaGUgY2xhc3Mgc3RhbXAgYW5kIGVtYmVkZGluZyBkaW1lbnNpb24gYXJlIGNvbXB1dGVkIG9uY2UgcGVyIGNhY2hlIGxvYWQ6XG4gKiBldmVyeSBlbWJlZGRpbmcgZW5kcG9pbnQgaXMgXCJwaW5nZWRcIiBpbiBwYXJhbGxlbCBhbmQgdGhlIHJlc3VsdGluZyB2ZWN0b3JcbiAqIGxlbmd0aCByZWNvcmRlZCwgc28gdGhlIGNvc3QgaXMgcGFpZCBvbiBhIGNhY2hlIG1pc3MsIG5vdCBwZXIgcmVhZC4gVGhlIHBpbmdcbiAqIGlzIGJlc3QtZWZmb3J0IC0gYSBmYWlsdXJlIGxvZ3MgYXQgZGVidWcgYW5kIGxlYXZlcyBgZGltZW5zaW9uYCB1bnNldCByYXRoZXJcbiAqIHRoYW4gZmFpbGluZyB0aGUgd2hvbGUgbGlzdGluZy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBkZWxldGVDYWNoZWRWYWx1ZSwgZ2V0T3JTZXQgfSBmcm9tIFwiQGRieC10b29scy9jYWNoZS9jYWNoZVwiO1xuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIG1vZGVsLFxuICB0eXBlIFJlc29sdmVkTW9kZWwsXG4gIHR5cGUgUmVzb2x2ZU1vZGVsT3B0aW9ucyxcbiAgdHlwZSBTY29yZWRFbmRwb2ludCxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcblxuaW1wb3J0IHsgbW9kZWxDYXRhbG9ndWVDYWNoZSB9IGZyb20gXCIuL19jYWNoZS50c1wiO1xuaW1wb3J0IHsgY2xhc3NpZnlFbmRwb2ludENsYXNzZXMsIG5vcm1hbGl6ZUVuZHBvaW50cywgcmFua0VuZHBvaW50cyB9IGZyb20gXCIuL19yYW5raW5nLnRzXCI7XG5cbmNvbnN0IHsgTW9kZWxDbGFzcyB9ID0gbW9kZWw7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtb2RlbC9zZXJ2aW5nXCIpO1xuXG4vKipcbiAqIFN0cnVjdHVyYWwgdHlwZSBmb3IgdGhlIERhdGFicmlja3Mgd29ya3NwYWNlIGNsaWVudCwgcmUtZXhwb3J0ZWQgc28gdGhlIHJlc3RcbiAqIG9mIHRoaXMgcGFja2FnZSBjYW4ga2VlcCBpbXBvcnRpbmcgaXQgZnJvbSBoZXJlLiBTZWVcbiAqIGBhcHBraXQuV29ya3NwYWNlQ2xpZW50TGlrZWAgKG5vZGUtYXBwa2l0KSBmb3IgdGhlIGNhbm9uaWNhbCBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlID0gUGljazxhcHBraXQuV29ya3NwYWNlQ2xpZW50TGlrZSwgXCJzZXJ2aW5nRW5kcG9pbnRzXCI+O1xuXG4vKiogRGVmYXVsdCBUVEwgZm9yIHRoZSBpbi1tZW1vcnkgZW5kcG9pbnQgY2FjaGUuIE1hdGNoZXMgdGhlIERhdGFicmlja3MgU0RLJ3Mgc2Vzc2lvbiBsaWZldGltZSBidWRnZXQuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NT0RFTF9DQUNIRV9UVExfTVMgPSA1ICogNjAgKiAxMDAwO1xuXG4vKiogRGVmYXVsdCBmdXp6eSBkaXN0YW5jZSB0aHJlc2hvbGQgYmVsb3cgd2hpY2ggYSBtYXRjaCBpcyBhY2NlcHRlZC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCA9IDAuNDtcblxuLyoqIENhY2hlIGtleSBwYXJ0cyB1bmRlciB3aGljaCBlbmRwb2ludCBsaXN0aW5ncyBhcmUgc3RvcmVkLiAqL1xuY29uc3QgQ0FDSEVfS0VZX05BTUVTUEFDRSA9IFwic2VydmluZy1lbmRwb2ludHNcIjtcbmNvbnN0IGNhdGFsb2d1ZUNhY2hlID0gbW9kZWxDYXRhbG9ndWVDYWNoZTtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBsaXN0U2VydmluZ0VuZHBvaW50c30uICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBjYWNoZSBUVEwgZm9yIHRoaXMgY2FsbCwgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgdHRsTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUcnVzdGVkIGlkZW50aXR5IG9mIHRoZSBjcmVkZW50aWFsIHVzZWQgYnkgYGNsaWVudGAuXG4gICAqXG4gICAqIFRoZSB2YWx1ZSBpcyBoYXNoZWQgYmVmb3JlIGl0IGVudGVycyB0aGUgY2FjaGUga2V5IGFuZCBpcyBuZXZlciBsb2dnZWQuXG4gICAqIE9taXQgaXQgd2hlbiB0aGUgY2FsbGVyIGNhbm5vdCBwcm92ZSB0aGUgY3JlZGVudGlhbCBpZGVudGl0eTsgdGhhdCBjYWxsXG4gICAqIGJ5cGFzc2VzIHNoYXJlZCBjYWNoaW5nIHNvIG9uZSBwcmluY2lwYWwgY2FuIG5ldmVyIHJlYWQgYW5vdGhlcidzXG4gICAqIGNhdGFsb2d1ZS5cbiAgICovXG4gIGNhY2hlSWRlbnRpdHk/OiBzdHJpbmc7XG59XG5cbi8qKiBIYXNoIGFuIG9wYXF1ZSBjcmVkZW50aWFsIGlkZW50aXR5IGJlZm9yZSBoYW5kaW5nIGl0IHRvIHRoZSBzaGFyZWQgY2FjaGUuICovXG5mdW5jdGlvbiBjYWNoZVVzZXJLZXkoaWRlbnRpdHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgbW9kZWwtJHtjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShpZGVudGl0eSkuZGlnZXN0KFwiaGV4XCIpfWA7XG59XG5cbi8qKlxuICogTGlzdCBNb2RlbCBTZXJ2aW5nIGVuZHBvaW50cyBmb3IgdGhlIHdvcmtzcGFjZSBvd25pbmcgYGNsaWVudGAsIHJvdXRlZFxuICogdGhyb3VnaCB0aGUgc2hhcmVkIG1lbW9yeS1maXJzdCBjYWNoZSwgaW5jbHVkaW5nIHBlci1lbnRyeSBUVEwsIGluLWZsaWdodFxuICogcmVxdWVzdCBjb2FsZXNjaW5nLCBib3VuZGVkIHByb2Nlc3MgbWVtb3J5LCBhbmQgcG9ydGFibGUgcGVyc2lzdGVuY2UuXG4gKlxuICogUmV0dXJucyBwbGFpbiB7QGxpbmsgU2VydmluZ0VuZHBvaW50U3VtbWFyeX0gb2JqZWN0cyAoYSBzdGFibGUgc3Vic2V0IG9mIHRoZVxuICogU0RLIHR5cGUpIHNvIGNhY2hlIGhpdHMgbmV2ZXIgZXhwb3NlIHN0YWxlIFNESyBpbnRlcm5hbHMuXG4gKlxuICogQHBhcmFtIGhvc3QgLSBXb3Jrc3BhY2UgaG9zdCB1c2VkIGFzIHRoZSBjYWNoZSBrZXkuIFBhc3MgdGhlIHZhbHVlIHJlc29sdmVkXG4gKiAgIGZyb20gYGNsaWVudC5jb25maWcuZ2V0SG9zdCgpYCBzbyBtdWx0aS1ob3N0IGFwcHMgc2hhcmUgb25lIGVudHJ5IHBlclxuICogICB3b3Jrc3BhY2UuXG4gKiBAcGFyYW0gb3B0aW9ucy50dGxNcyAtIE92ZXJyaWRlIHRoZSBkZWZhdWx0IFRUTCBqdXN0IGZvciB0aGlzIGNhbGwuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0U2VydmluZ0VuZHBvaW50cyhcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlLFxuICBob3N0OiBzdHJpbmcsXG4gIG9wdGlvbnM6IExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgaWYgKCFvcHRpb25zLmNhY2hlSWRlbnRpdHkpIHJldHVybiBmZXRjaEVuZHBvaW50cyhjbGllbnQpO1xuICByZXR1cm4gKGF3YWl0IGdldE9yU2V0KFxuICAgIGNhdGFsb2d1ZUNhY2hlLFxuICAgIGNhdGFsb2d1ZUNhY2hlS2V5KGhvc3QsIG9wdGlvbnMuY2FjaGVJZGVudGl0eSksXG4gICAgKCkgPT4gZmV0Y2hFbmRwb2ludHMoY2xpZW50KSxcbiAgICB7XG4gICAgICB0dGw6IG9wdGlvbnMudHRsTXMgPz8gREVGQVVMVF9NT0RFTF9DQUNIRV9UVExfTVMsXG4gICAgICByZXR1cm5DYWNoZWRPbkVycm9yOiB0cnVlLFxuICAgICAgY2FjaGVkT25FcnJvclR0bDogXCI3ZFwiLFxuICAgICAgdGhyb3dFcnJvcnM6IHRydWUsXG4gICAgfSxcbiAgKSkhO1xufVxuXG4vKipcbiAqIExpc3QgdGhlIHdvcmtzcGFjZSdzIHNlcnZpbmcgZW5kcG9pbnRzIGFzIG1pbmltYWxcbiAqIHtAbGluayBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5fSBvYmplY3RzIHN0cmFpZ2h0IGZyb20gdGhlIFNESzogbm8gY2FjaGluZywgYW5kXG4gKiBub25lIG9mIHRoZSBjYWNoZS1sb2FkIGVucmljaG1lbnQgKHtAbGluayBsaXN0U2VydmluZ0VuZHBvaW50c30gYWRkcyB0aGVcbiAqIHtAbGluayBNb2RlbENsYXNzfSBzdGFtcCBhbmQgdGhlIGVtYmVkZGluZy1kaW1lbnNpb24gcHJvYmUpLiBVc2UgdGhpcyBmb3IgYVxuICogb25lLXNob3QsIGRlcGVuZGVuY3ktbGlnaHQgbGlzdGluZyAtIGUuZy4gYSBDTEkgdGhhdCBvbmx5IG5lZWRzIG5hbWVzL3Rhc2tzXG4gKiBmb3IgZnV6enkgcmVzb2x1dGlvbiBhbmQgZG9lc24ndCB3YW50IHNoYXJlZCBjYWNoZSBwZXJzaXN0ZW5jZSBvciB0aGVcbiAqIHBlci1lbWJlZGRpbmcgcGluZyBjb3N0LiBQcmVmZXIge0BsaW5rIGxpc3RTZXJ2aW5nRW5kcG9pbnRzfSBmb3IgdGhlIGNhY2hlZCxcbiAqIGVucmljaGVkIHZpZXcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0U2VydmluZ0VuZHBvaW50c1VuY2FjaGVkKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UsXG4pOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICBjb25zdCBlbmRwb2ludHM6IHVua25vd25bXSA9IFtdO1xuICBmb3IgYXdhaXQgKGNvbnN0IGVwIG9mIGNsaWVudC5zZXJ2aW5nRW5kcG9pbnRzLmxpc3QoKSkge1xuICAgIGVuZHBvaW50cy5wdXNoKGVwKTtcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplRW5kcG9pbnRzKGVuZHBvaW50cyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoRW5kcG9pbnRzKGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSk6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IGNsYXNzaWZpZWQgPSBzdGFtcE1vZGVsQ2xhc3Nlcyhhd2FpdCBsaXN0U2VydmluZ0VuZHBvaW50c1VuY2FjaGVkKGNsaWVudCkpO1xuICBjb25zdCBvdXQgPSBhd2FpdCBtZWFzdXJlRW1iZWRkaW5nRGltZW5zaW9ucyhjbGllbnQsIGNsYXNzaWZpZWQpO1xuICBsb2dnZXIuZGVidWcoXCJsaXN0ZWRcIiwgeyBjb3VudDogb3V0Lmxlbmd0aCwgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0IH0pO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFN0YW1wIGVhY2ggc3VtbWFyeSdzIHtAbGluayBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LmNsYXNzfSBmcm9tIHRoZSByZWxhdGl2ZVxuICogY2xhc3NpZmljYXRpb24gb2YgdGhlIHdob2xlIHNldC4gRW5kcG9pbnRzIHRoZSBjbGFzc2lmaWVyIGRvZXNuJ3QgcmVjb2duaXplXG4gKiAoY3VzdG9tLCB1bnNjb3JlZCwgbm9uLUxMTSkgYXJlIGxlZnQgd2l0aG91dCBhIGNsYXNzLlxuICovXG5mdW5jdGlvbiBzdGFtcE1vZGVsQ2xhc3NlcyhzdW1tYXJpZXM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSk6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSB7XG4gIGNvbnN0IGNsYXNzT2YgPSBjbGFzc2lmeUVuZHBvaW50Q2xhc3NlcyhzdW1tYXJpZXMpO1xuICByZXR1cm4gc3VtbWFyaWVzLm1hcCgoc3VtbWFyeSkgPT4ge1xuICAgIGNvbnN0IGNscyA9IGNsYXNzT2YuZ2V0KHN1bW1hcnkubmFtZSk7XG4gICAgcmV0dXJuIGNscyA9PT0gdW5kZWZpbmVkID8gc3VtbWFyeSA6IHsgLi4uc3VtbWFyeSwgY2xhc3M6IGNscyB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBNZWFzdXJlIHRoZSBlbWJlZGRpbmcgdmVjdG9yIGRpbWVuc2lvbiBvZiBldmVyeSB7QGxpbmsgTW9kZWxDbGFzcy5FbWJlZGRpbmd9XG4gKiBlbmRwb2ludCBieSBwaW5naW5nIGl0IG9uY2UsIGFsbCBpbiBwYXJhbGxlbC4gUnVucyBvbmx5IG9uIGEgY2FjaGUgbWlzcyAoaXQnc1xuICogY2FsbGVkIGZyb20ge0BsaW5rIGZldGNoRW5kcG9pbnRzfSksIHNvIHRoZSBwcm9iZSBjb3N0IGlzIGFtb3J0aXplZCBhY3Jvc3MgdGhlXG4gKiBjYWNoZWQgVFRMIHdpbmRvdy4gUGVyLWVuZHBvaW50IGZhaWx1cmVzIGFyZSBzd2FsbG93ZWQgKGxvZ2dlZCBhdCB3YXJuKSBzbyBvbmVcbiAqIHVucmVhY2hhYmxlIGVtYmVkZGluZyBtb2RlbCBuZXZlciBmYWlscyB0aGUgbGlzdGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbWVhc3VyZUVtYmVkZGluZ0RpbWVuc2lvbnMoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSxcbiAgc3VtbWFyaWVzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4pOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgc3VtbWFyaWVzLm1hcChhc3luYyAoc3VtbWFyeSkgPT4ge1xuICAgICAgaWYgKHN1bW1hcnkuY2xhc3MgIT09IE1vZGVsQ2xhc3MuRW1iZWRkaW5nKSByZXR1cm4gc3VtbWFyeTtcbiAgICAgIGNvbnN0IGRpbWVuc2lvbiA9IGF3YWl0IHBpbmdFbWJlZGRpbmdEaW1lbnNpb24oY2xpZW50LCBzdW1tYXJ5Lm5hbWUpO1xuICAgICAgcmV0dXJuIGRpbWVuc2lvbiA9PT0gdW5kZWZpbmVkID8gc3VtbWFyeSA6IHsgLi4uc3VtbWFyeSwgZGltZW5zaW9uIH07XG4gICAgfSksXG4gICk7XG59XG5cbi8qKlxuICogQmVzdC1lZmZvcnQgZW1iZWRkaW5nIGRpbWVuc2lvbiBwcm9iZTogcXVlcnkgYG5hbWVgIHdpdGggYSB0aW55IGBcInBpbmdcImBcbiAqIGlucHV0IGFuZCByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgcmV0dXJuZWQgdmVjdG9yLiBSZXR1cm5zIGB1bmRlZmluZWRgIChhbmRcbiAqIGxvZ3MgYXQgd2Fybikgd2hlbiB0aGUgZW5kcG9pbnQgY2FuJ3QgYmUgcXVlcmllZCBvciByZXR1cm5zIG5vIHZlY3RvciAtIHRoZVxuICogZGltZW5zaW9uIGlzIGluZm9ybWF0aW9uYWwsIG5ldmVyIHJlcXVpcmVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBwaW5nRW1iZWRkaW5nRGltZW5zaW9uKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UsXG4gIG5hbWU6IHN0cmluZyxcbik6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuc2VydmluZ0VuZHBvaW50cy5xdWVyeSh7IG5hbWUsIGlucHV0OiBcInBpbmdcIiB9KTtcbiAgICBjb25zdCBkaW1lbnNpb24gPSByZXNwb25zZS5kYXRhPy5bMF0/LmVtYmVkZGluZz8ubGVuZ3RoO1xuICAgIGlmICh0eXBlb2YgZGltZW5zaW9uID09PSBcIm51bWJlclwiICYmIGRpbWVuc2lvbiA+IDApIHJldHVybiBkaW1lbnNpb247XG4gICAgbG9nZ2VyLndhcm4oXCJlbWJlZGRpbmcgcGluZyByZXR1cm5lZCBubyB2ZWN0b3JcIiwgeyBuYW1lIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiZW1iZWRkaW5nIHBpbmcgZmFpbGVkXCIsIHsgbmFtZSwgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIEZvcmNlLWV2aWN0IGNhY2hlZCBlbmRwb2ludCBsaXN0aW5ncy4gQSBob3N0IGFuZCBpZGVudGl0eSBkZWxldGUgb25seSB0aGF0XG4gKiBwcmluY2lwYWwncyB3b3Jrc3BhY2UgZW50cnkuIE9taXR0aW5nIGVpdGhlciB2YWx1ZSBjbGVhcnMgdGhpcyBjYXRhbG9ndWUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhclNlcnZpbmdFbmRwb2ludHNDYWNoZShcbiAgaG9zdD86IHN0cmluZyxcbiAgY2FjaGVJZGVudGl0eT86IHN0cmluZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoaG9zdCAmJiBjYWNoZUlkZW50aXR5KSB7XG4gICAgYXdhaXQgZGVsZXRlQ2FjaGVkVmFsdWUoY2F0YWxvZ3VlQ2FjaGUsIGNhdGFsb2d1ZUNhY2hlS2V5KGhvc3QsIGNhY2hlSWRlbnRpdHkpKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBjYXRhbG9ndWVDYWNoZS5jbGVhcigpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhdGFsb2d1ZUNhY2hlS2V5KGhvc3Q6IHN0cmluZywgY2FjaGVJZGVudGl0eTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFtDQUNIRV9LRVlfTkFNRVNQQUNFLCBob3N0LCBjYWNoZVVzZXJLZXkoY2FjaGVJZGVudGl0eSldKTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgZnV6enktcmVzb2x2aW5nIGEgdXNlci1zdXBwbGllZCBtb2RlbCBuYW1lIGFnYWluc3QgdGhlIGxpdmVcbiAqIGVuZHBvaW50IGxpc3QuIGBzY29yZWAgaXMgdGhlIHJhbmtlcidzIGRpc3RhbmNlIChgMGAgaXMgZXhhY3QsIGAxYCBpcyBubyBtYXRjaCk7XG4gKiBgbWF0Y2hlZGAgaXMgYGZhbHNlYCB3aGVuIHRoZSBzY29yZSBleGNlZWRzIHRoZSBjb25maWd1cmVkIHRocmVzaG9sZCBzb1xuICogY2FsbGVycyBjYW4gZmFsbCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBpbnB1dCAoRGF0YWJyaWNrcyB3aWxsIHRoZW4gcmV0dXJuIGFcbiAqIGNsZWFuIDQwNCkuXG4gKi9cbi8qKlxuICogRnV6enktcmFuayBlbmRwb2ludHMgYnkgaG93IGNsb3NlbHkgdGhlaXIgYG5hbWVgIG1hdGNoZXMgYGlucHV0YCwgYmVzdFxuICogKGxvd2VzdCBzY29yZSkgZmlyc3QsIGtlZXBpbmcgb25seSB0aG9zZSB3aXRoaW4gYHRocmVzaG9sZGA6XG4gKlxuICogMS4gQW4gZXhhY3QgbmFtZSBtYXRjaCBzaG9ydC1jaXJjdWl0cyB0byBhIHNpbmdsZSBgc2NvcmU6IDBgIHJlc3VsdC5cbiAqIDIuIE90aGVyd2lzZSB0aGUgc2hhcmVkIFR5cGVTY3JpcHQgcG9saWN5IHRva2VuaXplcyBhbmQgc2NvcmVzIGV2ZXJ5IGVuZHBvaW50IHRocm91Z2ggdGhlXG4gKiAgICBzYW1lIGZ1enp5LWRpc3RhbmNlIHBvbGljeSB1c2VkIGJ5IHtAbGluayBsb29rdXBNb2RlbHN9LlxuICpcbiAqIFJldHVybnMgYFtdYCBmb3IgYW4gZW1wdHkgZW5kcG9pbnQgbGlzdCBvciB3aGVuIGBpbnB1dGAgdG9rZW5pemVzIHRvIG5vdGhpbmcsXG4gKiBzbyBjYWxsZXJzIGZhbGwgYmFjayB0byB0aGUgcmF3IGlucHV0IGFuZCBsZXQgRGF0YWJyaWNrcyBzdXJmYWNlIGEgY2xlYW4gNDA0LlxuICogVGhpcyBtdWx0aS1yZXN1bHQgY29yZSBpcyBzaGFyZWQgYnkge0BsaW5rIHJlc29sdmVNb2RlbElkfSAoc2luZ2xlIGJlc3QpIGFuZFxuICogdGhlIHJhbmtlZCBgbG9va3VwTW9kZWxzYCBzZWxlY3Rvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlYXJjaFNlcnZpbmdFbmRwb2ludHMoXG4gIGlucHV0OiBzdHJpbmcsXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICBvcHRpb25zOiBSZXNvbHZlTW9kZWxPcHRpb25zID0ge30sXG4pOiBTY29yZWRFbmRwb2ludFtdIHtcbiAgaWYgKGVuZHBvaW50cy5sZW5ndGggPT09IDAgfHwgIWlucHV0LnRyaW0oKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gcmFua0VuZHBvaW50cyhcbiAgICBlbmRwb2ludHMsXG4gICAge1xuICAgICAgc2VhcmNoOiBpbnB1dCxcbiAgICAgIC4uLihvcHRpb25zLnJlcXVpcmVzVG9vbHMgIT09IHVuZGVmaW5lZCA/IHsgcmVxdWlyZXNUb29sczogb3B0aW9ucy5yZXF1aXJlc1Rvb2xzIH0gOiB7fSksXG4gICAgICB0aHJlc2hvbGQ6IG9wdGlvbnMudGhyZXNob2xkID8/IERFRkFVTFRfRlVaWllfVEhSRVNIT0xELFxuICAgIH0sXG4gICAge1xuICAgICAgaW5jbHVkZURlcHJlY2F0ZWQ6IHRydWUsXG4gICAgICB0YXNrOiBcImxsbS92MS9jaGF0XCIsXG4gICAgfSxcbiAgKS5tYXAoKHJhbmtlZCkgPT4gKHsgZW5kcG9pbnQ6IHJhbmtlZC5lbmRwb2ludCwgc2NvcmU6IHJhbmtlZC5zY29yZSA/PyAwIH0pKTtcbn1cblxuLyoqXG4gKiBTbmFwIGEgdXNlci1zdXBwbGllZCBtb2RlbCBuYW1lIHRvIHRoZSBzaW5nbGUgY2xvc2VzdCBjb25maWd1cmVkIHNlcnZpbmdcbiAqIGVuZHBvaW50IHZpYSB7QGxpbmsgc2VhcmNoU2VydmluZ0VuZHBvaW50c30uIFJldHVybnMgdGhlIGlucHV0IHVuY2hhbmdlZCB3aXRoXG4gKiBgbWF0Y2hlZDogZmFsc2VgIHdoZW4gbm90aGluZyBzY29yZXMgd2l0aGluIHRoZSB0aHJlc2hvbGQgKG9yIHRoZSBjYXRhbG9ndWVcbiAqIGlzIGVtcHR5KSwgc28gYSBkZWxpYmVyYXRlIG1vZGVsIGlkIGlzIG5ldmVyIHNpbGVudGx5IHJld3JpdHRlbiB0byBhXG4gKiBzaW1pbGFyLWxvb2tpbmcgbmVpZ2hib3VyIGFuZCB0aGUgdXBzdHJlYW0gY2FsbCBzdXJmYWNlcyB0aGUgY2Fub25pY2FsIDQwNC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVNb2RlbElkKFxuICBpbnB1dDogc3RyaW5nLFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgb3B0aW9uczogUmVzb2x2ZU1vZGVsT3B0aW9ucyA9IHt9LFxuKTogUmVzb2x2ZWRNb2RlbCB7XG4gIGNvbnN0IFtiZXN0XSA9IHNlYXJjaFNlcnZpbmdFbmRwb2ludHMoaW5wdXQsIGVuZHBvaW50cywgb3B0aW9ucyk7XG4gIGlmIChiZXN0KSB7XG4gICAgcmV0dXJuIHsgbW9kZWxJZDogYmVzdC5lbmRwb2ludC5uYW1lLCBtYXRjaGVkOiB0cnVlLCBzY29yZTogYmVzdC5zY29yZSB9O1xuICB9XG4gIHJldHVybiB7IG1vZGVsSWQ6IGlucHV0LCBtYXRjaGVkOiBmYWxzZSB9O1xufVxuIl19
@@ -1 +1 @@
1
- {"root":["../src/_metadata-contract.ts","../src/_metadata-generator.ts","../src/_ranking.ts","../src/_retirement.ts","../src/_selection.ts","../src/bindings.ts","../src/classes.ts","../src/classify.ts","../src/fallback.ts","../src/invoke.ts","../src/metadata-cache.ts","../src/metadata.ts","../src/model-catalog.ts","../src/model-client.ts","../src/policy.ts","../src/reasoning-translation.ts","../src/resolve.ts","../scripts/generate-metadata.ts","../index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/_cache.ts","../src/_metadata-contract.ts","../src/_metadata-generator.ts","../src/_ranking.ts","../src/_retirement.ts","../src/_selection.ts","../src/bindings.ts","../src/classes.ts","../src/classify.ts","../src/fallback.ts","../src/invoke.ts","../src/metadata-cache.ts","../src/metadata.ts","../src/model-catalog.ts","../src/model-client.ts","../src/policy.ts","../src/reasoning-translation.ts","../src/resolve.ts","../scripts/generate-metadata.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -20,20 +20,18 @@
20
20
  "projen": "projen"
21
21
  },
22
22
  "devDependencies": {
23
- "@types/cacache": "^20.0.1",
24
23
  "@types/node": "^24.6.0",
25
24
  "typescript": "^5.9.3"
26
25
  },
27
26
  "dependencies": {
28
27
  "@databricks/appkit": "0.81.0",
29
- "@dbx-tools/appkit": "^0.9.118",
30
- "@dbx-tools/auth": "^0.9.118",
31
- "@dbx-tools/shared-auth": "^0.9.118",
32
- "@dbx-tools/shared-core": "^0.9.118",
33
- "@dbx-tools/shared-model": "^0.9.118",
34
- "cacache": "^21.0.1",
28
+ "@dbx-tools/appkit": "^0.9.119",
29
+ "@dbx-tools/auth": "^0.9.119",
30
+ "@dbx-tools/cache": "^0.9.119",
31
+ "@dbx-tools/shared-auth": "^0.9.119",
32
+ "@dbx-tools/shared-core": "^0.9.119",
33
+ "@dbx-tools/shared-model": "^0.9.119",
35
34
  "cheerio": "^1.2.0",
36
- "env-paths": "^4.0.0",
37
35
  "fuse.js": "^7.4.2"
38
36
  },
39
37
  "main": "./lib/index.js",
@@ -102,7 +100,7 @@
102
100
  "./package.json": "./package.json"
103
101
  }
104
102
  },
105
- "version": "0.9.118",
103
+ "version": "0.9.119",
106
104
  "types": "./lib/index.d.ts",
107
105
  "dbxToolsConfig": {
108
106
  "tags": [
package/src/_cache.ts ADDED
@@ -0,0 +1,13 @@
1
+ import { projectCache } from "@dbx-tools/cache/cache";
2
+
3
+ /** Memory-first cache for endpoint catalogues, isolated for full invalidation. */
4
+ export const modelCatalogueCache = projectCache("model-catalog", {
5
+ maxEntries: 256,
6
+ useClone: false,
7
+ });
8
+
9
+ /** One memory-first project cache shared by every model metadata key. */
10
+ export const modelMetadataCache = projectCache("model-metadata", {
11
+ maxEntries: 256,
12
+ useClone: false,
13
+ });