@dbx-tools/search 0.6.46 → 0.6.48

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.
package/lib/src/config.js CHANGED
@@ -22,7 +22,7 @@
22
22
  * @module
23
23
  */
24
24
  import { ConfigurationError } from "@databricks/appkit";
25
- import { object, string } from "@dbx-tools/shared-core";
25
+ import { env, object, string } from "@dbx-tools/shared-core";
26
26
  /** The default index, honoring AppKit's standard Vector Search binding name. */
27
27
  export const INDEX_ENV = "SEARCH_INDEX";
28
28
  /** AppKit's standard environment name for a Vector Search index binding. */
@@ -122,17 +122,9 @@ function toResolvedIndex(entry) {
122
122
  ...(raw.columns && raw.columns.length > 0 ? { columns: [...raw.columns] } : {}),
123
123
  };
124
124
  }
125
- /** Coerce a positive integer from config or an env var, falling back to a default. */
126
- function resolvePositiveInt(configured, envVar, fallback) {
127
- const raw = configured ?? Number(process.env[envVar]);
128
- const value = Number(raw);
129
- if (Number.isFinite(value) && value > 0)
130
- return Math.floor(value);
131
- return fallback;
132
- }
133
125
  /** Parse and validate a {@link SearchMode} from config or an env var. */
134
126
  function resolveMode(configured) {
135
- const raw = configured ?? string.trimToNull(process.env.SEARCH_MODE) ?? undefined;
127
+ const raw = configured ?? env.text("SEARCH_MODE") ?? undefined;
136
128
  if (raw === undefined)
137
129
  return DEFAULT_MODE;
138
130
  if (raw !== "hybrid" && raw !== "vector" && raw !== "keyword") {
@@ -147,20 +139,17 @@ function resolveMode(configured) {
147
139
  * and a bad mode throws a {@link ConfigurationError} naming the field.
148
140
  */
149
141
  export function resolveSearchConfig(config = {}) {
150
- const defaultIndexRaw = string.trimToNull(config.index) ??
151
- string.trimToNull(process.env[INDEX_ENV]) ??
152
- string.trimToNull(process.env[DATABRICKS_INDEX_ENV]) ??
153
- undefined;
142
+ const defaultIndexRaw = env.string(config.index, [INDEX_ENV, DATABRICKS_INDEX_ENV]) ?? undefined;
154
143
  const configured = (config.indexes ?? [])
155
144
  .map(toResolvedIndex)
156
145
  .filter((entry) => entry !== null);
157
146
  // Ensure the default index is represented in the known set.
158
147
  if (defaultIndexRaw && !configured.some((i) => i.name === defaultIndexRaw)) {
159
- const fromEnv = string.parseList(process.env.SEARCH_COLUMNS);
148
+ const envColumns = env.list(undefined, "SEARCH_COLUMNS");
160
149
  configured.unshift({
161
150
  name: defaultIndexRaw,
162
151
  alias: defaultAlias(defaultIndexRaw),
163
- ...(fromEnv.length > 0 ? { columns: fromEnv } : {}),
152
+ ...(envColumns.length > 0 ? { columns: envColumns } : {}),
164
153
  });
165
154
  }
166
155
  const seenAliases = new Set();
@@ -172,31 +161,18 @@ export function resolveSearchConfig(config = {}) {
172
161
  return { ...entry, alias };
173
162
  });
174
163
  const defaultIndex = defaultIndexRaw ?? indexes[0]?.name;
175
- const columns = config.columns ?? string.parseList(process.env.SEARCH_COLUMNS);
164
+ const columns = env.list(config.columns, "SEARCH_COLUMNS");
176
165
  return {
177
- ...(defaultIndex ? { defaultIndex } : {}),
166
+ ...object.optional("defaultIndex", defaultIndex),
178
167
  indexes,
179
- ...((string.trimToNull(config.endpoint) ?? string.trimToNull(process.env[ENDPOINT_ENV]))
180
- ? {
181
- endpoint: string.trimToNull(config.endpoint) ??
182
- string.trimToNull(process.env[ENDPOINT_ENV]) ??
183
- undefined,
184
- }
185
- : {}),
168
+ ...object.optional("endpoint", env.string(config.endpoint, ENDPOINT_ENV)),
186
169
  ...(columns.length > 0 ? { columns } : {}),
187
- pageSize: resolvePositiveInt(config.pageSize, "SEARCH_PAGE_SIZE", DEFAULT_PAGE_SIZE),
170
+ pageSize: env.positiveInt(config.pageSize, "SEARCH_PAGE_SIZE", DEFAULT_PAGE_SIZE),
188
171
  mode: resolveMode(config.mode),
189
- ...((string.trimToNull(config.embeddingModel) ??
190
- string.trimToNull(process.env.SEARCH_EMBEDDING_MODEL))
191
- ? {
192
- embeddingModel: string.trimToNull(config.embeddingModel) ??
193
- string.trimToNull(process.env.SEARCH_EMBEDDING_MODEL) ??
194
- undefined,
195
- }
196
- : {}),
172
+ ...object.optional("embeddingModel", env.string(config.embeddingModel, "SEARCH_EMBEDDING_MODEL")),
197
173
  basePath: DEFAULT_BASE_PATH,
198
- timeoutMs: resolvePositiveInt(config.timeoutMs, "SEARCH_TIMEOUT_MS", DEFAULT_TIMEOUT_MS),
199
- allowWrite: config.allowWrite ?? object.toBoolean(process.env.SEARCH_WRITE) ?? false,
174
+ timeoutMs: env.positiveInt(config.timeoutMs, "SEARCH_TIMEOUT_MS", DEFAULT_TIMEOUT_MS),
175
+ allowWrite: env.boolean(config.allowWrite, "SEARCH_WRITE") ?? false,
200
176
  ...(config.ensureOnSetup ? { ensureOnSetup: config.ensureOnSetup } : {}),
201
177
  };
202
178
  }
@@ -222,4 +198,4 @@ export function resolveIndexName(config, reference) {
222
198
  export function indexConfigFor(config, name) {
223
199
  return config.indexes.find((i) => i.name === name || i.alias === name);
224
200
  }
225
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBeUIsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBSXhELGdGQUFnRjtBQUNoRixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDO0FBRXhDLDRFQUE0RTtBQUM1RSxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxnQ0FBZ0MsQ0FBQztBQUVyRSxvRkFBb0Y7QUFDcEYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLGlCQUFpQixDQUFDO0FBRTlDLDJGQUEyRjtBQUMzRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWUsUUFBUSxDQUFDO0FBRWpELHlGQUF5RjtBQUN6RixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFFcEMsK0RBQStEO0FBQy9ELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQztBQUV6Qyx1RUFBdUU7QUFDdkUsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsYUFBYSxDQUFDO0FBcUcvQyxnRkFBZ0Y7QUFDaEYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQWdCO0lBQy9DLElBQUksRUFBRSxRQUFRO0lBQ2Qsb0JBQW9CLEVBQUUsSUFBSTtJQUMxQixVQUFVLEVBQUU7UUFDVixLQUFLLEVBQUU7WUFDTCxJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFBRSx1RUFBdUU7U0FDckY7UUFDRCxPQUFPLEVBQUU7WUFDUCxJQUFJLEVBQUUsT0FBTztZQUNiLFdBQVcsRUFBRSw0RUFBNEU7WUFDekYsS0FBSyxFQUFFO2dCQUNMLEtBQUssRUFBRTtvQkFDTCxFQUFFLElBQUks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SSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQ3pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBBSSBTZWFyY2ggcGx1Z2luOiB0aGUgdHlwZWRcbiAqIHtAbGluayBTZWFyY2hQbHVnaW5Db25maWd9ICh0aGUgcGx1Z2luJ3Mgc2xpY2Ugb2YgQXBwS2l0IGNvbmZpZyksIHRoZSBKU09OXG4gKiBTY2hlbWEgdGhlIG1hbmlmZXN0IHB1Ymxpc2hlcyBmb3IgaXQsIGFuZCB7QGxpbmsgcmVzb2x2ZVNlYXJjaENvbmZpZ31cbiAqIHdoaWNoIGxheWVycyB0aGF0IGNvbmZpZyBvdmVyIGVudmlyb25tZW50IGRlZmF1bHRzIGludG8gdGhlIGNvbmNyZXRlXG4gKiB7QGxpbmsgUmVzb2x2ZWRTZWFyY2hDb25maWd9IHRoZSBydW50aW1lLCBjbGllbnQsIHRvb2xzLCBhbmQgcm91dGVzIHJlYWQuXG4gKlxuICogVGhlIGRlc2lnbiBnb2FsIGlzIFwib25lIGluZGV4LCB6ZXJvIGNvbmZpZ1wiOiBuYW1lIGEgZGVmYXVsdCBpbmRleCAob3Igc2V0XG4gKiBgREFUQUJSSUNLU19WRUNUT1JfU0VBUkNIX0lOREVYYCkgYW5kIGV2ZXJ5dGhpbmcgZWxzZSAtIHRoZSBjb2x1bW5zIHRvXG4gKiByZXR1cm4sIHRoZSBwYWdlIHNpemUsIHRoZSBtYXRjaCBtb2RlLCB0aGUgbW91bnRlZCByb3V0ZSBwYXRoLCB0aGUgZW1iZWRkaW5nXG4gKiBtb2RlbCB1c2VkIHdoZW4gY3JlYXRpbmcgYW4gaW5kZXggLSBoYXMgYSBzZW5zaWJsZSBkZWZhdWx0IHRoYXQgY2FuIGJlXG4gKiBvdmVycmlkZGVuIHdoZW4gYSBkZXBsb3ltZW50IG5lZWRzIHRvIGdvIGRlZXBlci5cbiAqXG4gKiBXaGljaCBpbmRleCAvIGVuZHBvaW50IGlzIHVzZWQgZm9sbG93cyB0aGUgc3RhbmRhcmQgcHJlY2VkZW5jZTogZXhwbGljaXRcbiAqIHBsdWdpbiBjb25maWcsIHRoZW4gZW52aXJvbm1lbnQsIHRoZW4gYSBkZWZhdWx0LlxuICpcbiAqIEVudiBmYWxsYmFja3M6IGBEQVRBQlJJQ0tTX1ZFQ1RPUl9TRUFSQ0hfSU5ERVhgICh0aGUgZGVmYXVsdCBpbmRleCksXG4gKiBgU0VBUkNIX0lOREVYYCwgYFNFQVJDSF9FTkRQT0lOVGAsIGBTRUFSQ0hfQ09MVU1OU2AsXG4gKiBgU0VBUkNIX1BBR0VfU0laRWAsIGBTRUFSQ0hfTU9ERWAsIGBTRUFSQ0hfRU1CRURESU5HX01PREVMYCxcbiAqIGBTRUFSQ0hfVElNRU9VVF9NU2AsIGBTRUFSQ0hfV1JJVEVgLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uRXJyb3IsIHR5cGUgQmFzZVBsdWdpbkNvbmZpZyB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IG9iamVjdCwgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgU2VhcmNoRG9jdW1lbnQsIFNlYXJjaE1vZGUgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtc2VhcmNoXCI7XG5pbXBvcnQgdHlwZSB7IEpTT05TY2hlbWE3IH0gZnJvbSBcImpzb24tc2NoZW1hXCI7XG5cbi8qKiBUaGUgZGVmYXVsdCBpbmRleCwgaG9ub3JpbmcgQXBwS2l0J3Mgc3RhbmRhcmQgVmVjdG9yIFNlYXJjaCBiaW5kaW5nIG5hbWUuICovXG5leHBvcnQgY29uc3QgSU5ERVhfRU5WID0gXCJTRUFSQ0hfSU5ERVhcIjtcblxuLyoqIEFwcEtpdCdzIHN0YW5kYXJkIGVudmlyb25tZW50IG5hbWUgZm9yIGEgVmVjdG9yIFNlYXJjaCBpbmRleCBiaW5kaW5nLiAqL1xuZXhwb3J0IGNvbnN0IERBVEFCUklDS1NfSU5ERVhfRU5WID0gXCJEQVRBQlJJQ0tTX1ZFQ1RPUl9TRUFSQ0hfSU5ERVhcIjtcblxuLyoqIERlZGljYXRlZCBvdmVycmlkZSBmb3IgdGhlIFZlY3RvciBTZWFyY2ggc2VydmluZyBlbmRwb2ludCB0aGF0IGhvc3RzIGluZGV4ZXMuICovXG5leHBvcnQgY29uc3QgRU5EUE9JTlRfRU5WID0gXCJTRUFSQ0hfRU5EUE9JTlRcIjtcblxuLyoqIERlZmF1bHQgbWF0Y2ggbW9kZSB3aGVuIGEgcmVxdWVzdCBkb2VzIG5vdCBuYW1lIG9uZS4gSHlicmlkIHN1aXRzIG1vc3Qgc2VhcmNoIGJveGVzLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTU9ERTogU2VhcmNoTW9kZSA9IFwiaHlicmlkXCI7XG5cbi8qKiBEZWZhdWx0IG51bWJlciBvZiBoaXRzIGEgc2VhcmNoIHJldHVybnMgKGEgZ29vZCBhdXRvY29tcGxldGUgLyByZXN1bHRzLWxpc3Qgc2l6ZSkuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9QQUdFX1NJWkUgPSAxMDtcblxuLyoqIERlZmF1bHQgcGVyLWNhbGwgdGltZW91dCBmb3IgYSBzZWFyY2ggLyBpbmRleCBvcGVyYXRpb24uICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9USU1FT1VUX01TID0gMzBfMDAwO1xuXG4vKiogQmFzZSBwYXRoIHRoZSBwbHVnaW4gbW91bnRzIGl0cyByb3V0ZXMgdW5kZXIsIHVubGVzcyBvdmVycmlkZGVuLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQkFTRV9QQVRIID0gXCIvYXBpL3NlYXJjaFwiO1xuXG4vKipcbiAqIEEgY29uZmlndXJlZCBpbmRleCB0aGUgcGx1Z2luIGtub3dzIGFib3V0IGFoZWFkIG9mIHRpbWUuIE9ubHkgYG5hbWVgIChvclxuICogYGFsaWFzYCkgaXMgcmVxdWlyZWQ7IHRoZSByZXN0IGlzIHJlc29sdmVkIGZyb20gdGhlIGxpdmUgaW5kZXggZGVmaW5pdGlvblxuICogd2hlbiBvbWl0dGVkLCBzbyBhIGRlcGxveW1lbnQgY2FuIHJlZ2lzdGVyIGB7IG5hbWUgfWAgYW5kIGxldCB0aGUgcGx1Z2luIGZpbGxcbiAqIGluIHRoZSBwcmltYXJ5IGtleSBhbmQgY29sdW1ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hJbmRleENvbmZpZyB7XG4gIC8qKiBVbml0eSBDYXRhbG9nIG5hbWUgb2YgdGhlIGluZGV4IChjYXRhbG9nLnNjaGVtYS5pbmRleCkuICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFNob3J0IGFsaWFzIGEgY2FsbGVyIG1heSB1c2UgaW4gcGxhY2Ugb2YgYG5hbWVgIChkZWZhdWx0cyB0byB0aGUgbGFzdCBuYW1lIHNlZ21lbnQpLiAqL1xuICBhbGlhcz86IHN0cmluZztcbiAgLyoqIFByaW1hcnkta2V5IGNvbHVtbi4gUmVzb2x2ZWQgZnJvbSB0aGUgaW5kZXggZGVmaW5pdGlvbiB3aGVuIG9taXR0ZWQuICovXG4gIHByaW1hcnlLZXk/OiBzdHJpbmc7XG4gIC8qKiBDb2x1bW5zIHRvIHJldHVybiBwZXIgaGl0LCBpbiBkaXNwbGF5IG9yZGVyLiBEZWZhdWx0cyB0byBldmVyeSBpbmRleGVkIGNvbHVtbi4gKi9cbiAgY29sdW1ucz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBBSSBTZWFyY2ggcGx1Z2luJ3Mgc2xpY2Ugb2YgQXBwS2l0IGNvbmZpZy4gRXZlcnkgZmllbGQgaXMgb3B0aW9uYWwgLSB0aGVcbiAqIHBsdWdpbiB3b3JrcyB3aXRoIG5vdGhpbmcgYnV0IGFuIGluZGV4IG5hbWUgaW4gdGhlIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFBsdWdpbkNvbmZpZyBleHRlbmRzIEJhc2VQbHVnaW5Db25maWcge1xuICAvKiogVGhlIGRlZmF1bHQgaW5kZXggc2VhcmNoZWQgd2hlbiBhIHJlcXVlc3Qgb21pdHMgb25lIChuYW1lIG9yIGFsaWFzKS4gKi9cbiAgaW5kZXg/OiBzdHJpbmc7XG4gIC8qKiBJbmRleGVzIHRoZSBwbHVnaW4gc2hvdWxkIGtub3cgYWJvdXQgKGZvciBhbGlhc2VzLCB1bml2ZXJzYWwgc2VhcmNoLCBhbmQgdGhlIFVJIGNhdGFsb2d1ZSkuICovXG4gIGluZGV4ZXM/OiBBcnJheTxzdHJpbmcgfCBTZWFyY2hJbmRleENvbmZpZz47XG4gIC8qKiBUaGUgVmVjdG9yIFNlYXJjaCBzZXJ2aW5nIGVuZHBvaW50IGluZGV4ZXMgbGl2ZSBvbiAob25seSBuZWVkZWQgdG8gY3JlYXRlIGFuIGluZGV4KS4gKi9cbiAgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIC8qKiBEZWZhdWx0IGNvbHVtbnMgdG8gcmV0dXJuIHBlciBoaXQuIEZhbGxzIGJhY2sgdG8gZWFjaCBpbmRleCdzIG93biBjb2x1bW5zLiAqL1xuICBjb2x1bW5zPzogc3RyaW5nW107XG4gIC8qKiBEZWZhdWx0IG51bWJlciBvZiBoaXRzIGEgc2VhcmNoIHJldHVybnMuICovXG4gIHBhZ2VTaXplPzogbnVtYmVyO1xuICAvKiogRGVmYXVsdCBtYXRjaCBtb2RlLiAqL1xuICBtb2RlPzogU2VhcmNoTW9kZTtcbiAgLyoqIEVtYmVkZGluZyBtb2RlbCBlbmRwb2ludCB1c2VkIHdoZW4gdGhlIHBsdWdpbiBDUkVBVEVTIGEgRGVsdGEgU3luYyBpbmRleC4gRnV6enktcmVzb2x2ZWQuICovXG4gIGVtYmVkZGluZ01vZGVsPzogc3RyaW5nO1xuICAvKiogUGVyLWNhbGwgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuICovXG4gIHRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqIEVuYWJsZSB0aGUgd3JpdGUgc3VyZmFjZSAoYGFkZF9kb2N1bWVudHNgIHRvb2wgKyBgUE9TVCAvZG9jdW1lbnRzYCkuIE9mZiBieSBkZWZhdWx0LiAqL1xuICBhbGxvd1dyaXRlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFByb3Zpc2lvbiBhIFJFQUwgaW5kZXggYXQgYm9vdDogZW5zdXJlIHRoZSBlbmRwb2ludCArIGluZGV4IGV4aXN0IGFuZCBzZWVkXG4gICAqIGRvY3VtZW50cyB3aGVuIHRoZSBpbmRleCBpcyBlbXB0eS4gUnVucyBpbiB0aGUgYmFja2dyb3VuZCBkdXJpbmcgYHNldHVwKClgXG4gICAqIChhIHNsb3cgZmlyc3QtdGltZSBlbmRwb2ludC9pbmRleCBidWlsZCBuZXZlciBibG9ja3MgdGhlIHNlcnZlcikgdXNpbmcgdGhlXG4gICAqIGJvb3QtdGltZSBTREsgYXV0aCAoZW52IC8gY29uZmlnIHByb2ZpbGUpLiBJZGVtcG90ZW50IC0gc2FmZSBldmVyeSBib290LlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBpcyBhIE1BTkFHRUQgZGlyZWN0LWFjY2VzcyBpbmRleCAoRGF0YWJyaWNrcyBlbWJlZHMgdGhlIHRleHRcbiAgICogY29sdW1uKSwgc28gYGRvY3VtZW50c2AgYXJlIHBsYWluIHJvd3MgYW5kIHNlYXJjaC1ieS10ZXh0IHdvcmtzIHdpdGggbm9cbiAgICogRGVsdGEgdGFibGUsIG5vIHdhcmVob3VzZSwgYW5kIG5vIHZlY3RvcnMgdG8gY29tcHV0ZS4gUG9pbnQgaXQgYXQgYVxuICAgKiBgc291cmNlVGFibGVgIHRvIHByb3Zpc2lvbiBhIERlbHRhIFN5bmMgaW5kZXggaW5zdGVhZC5cbiAgICovXG4gIGVuc3VyZU9uU2V0dXA/OiBFbnN1cmVPblNldHVwQ29uZmlnO1xufVxuXG4vKiogQm9vdC10aW1lIHByb3Zpc2lvbmluZyArIHNlZWRpbmcgZm9yIGEgc2luZ2xlIGluZGV4IChzZWUgYGVuc3VyZU9uU2V0dXBgKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5zdXJlT25TZXR1cENvbmZpZyB7XG4gIC8qKiBVQyBuYW1lIG9mIHRoZSBpbmRleCB0byBlbnN1cmUgKGNhdGFsb2cuc2NoZW1hLmluZGV4KS4gRGVmYXVsdHMgdG8gdGhlIHBsdWdpbidzIGBpbmRleGAuICovXG4gIGluZGV4Pzogc3RyaW5nO1xuICAvKiogVmVjdG9yIFNlYXJjaCBlbmRwb2ludCB0byBob3N0IGl0IG9uLiBEZWZhdWx0cyB0byB0aGUgcGx1Z2luJ3MgYGVuZHBvaW50YC4gKi9cbiAgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIC8qKiBQcmltYXJ5LWtleSBjb2x1bW4uIERlZmF1bHRzIHRvIGBpZGAuICovXG4gIHByaW1hcnlLZXk/OiBzdHJpbmc7XG4gIC8qKiBUZXh0IGNvbHVtbiBEYXRhYnJpY2tzIGVtYmVkcyAobWFuYWdlZCBkaXJlY3QtYWNjZXNzKS4gRGVmYXVsdHMgdG8gYHRleHRgLiAqL1xuICB0ZXh0Q29sdW1uPzogc3RyaW5nO1xuICAvKiogRW1iZWRkaW5nIG1vZGVsIGVuZHBvaW50LiBGdXp6eS1tYXRjaGVkOyBkZWZhdWx0cyB0byB0aGUgYmVzdCBlbWJlZGRpbmcgZW5kcG9pbnQuICovXG4gIGVtYmVkZGluZ01vZGVsPzogc3RyaW5nO1xuICAvKiogRm9yIGEgRGVsdGEgU3luYyBpbmRleCBpbnN0ZWFkIG9mIG1hbmFnZWQgZGlyZWN0LWFjY2VzczogdGhlIHNvdXJjZSBEZWx0YSB0YWJsZS4gKi9cbiAgc291cmNlVGFibGU/OiBzdHJpbmc7XG4gIC8qKiBDb2x1bW4gLT4gdHlwZSBtYXAgZm9yIHRoZSBtYW5hZ2VkIGRpcmVjdC1hY2Nlc3MgYHNjaGVtYV9qc29uYC4gSW5mZXJyZWQgZnJvbSBgZG9jdW1lbnRzYCB3aGVuIG9taXR0ZWQuICovXG4gIHNjaGVtYT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBEb2N1bWVudHMgdG8gc2VlZCB3aGVuIHRoZSBpbmRleCBpcyBlbXB0eS4gUGxhaW4gYHsgaWQsIHRleHQsIC4uLiB9YCByb3dzIGZvciBhIG1hbmFnZWQgaW5kZXguICovXG4gIGRvY3VtZW50cz86IFNlYXJjaERvY3VtZW50W107XG4gIC8qKiBNYXggdGltZSB0byB3YWl0IGZvciBlbmRwb2ludCArIGluZGV4IHJlYWRpbmVzcy4gRGVmYXVsdHMgdG8gMjAgbWludXRlcy4gKi9cbiAgdGltZW91dE1zPzogbnVtYmVyO1xufVxuXG4vKiogQSBmdWxseSByZXNvbHZlZCBpbmRleCBlbnRyeSAodGhlIHBsdWdpbi1rbm93biBmb3JtKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRJbmRleENvbmZpZyB7XG4gIG5hbWU6IHN0cmluZztcbiAgYWxpYXM6IHN0cmluZztcbiAgcHJpbWFyeUtleT86IHN0cmluZztcbiAgY29sdW1ucz86IHN0cmluZ1tdO1xufVxuXG4vKiogVGhlIGNvbmNyZXRlIGNvbmZpZyB0aGUgcnVudGltZSwgY2xpZW50LCB0b29scywgYW5kIHJvdXRlcyByZWFkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFNlYXJjaENvbmZpZyB7XG4gIGRlZmF1bHRJbmRleD86IHN0cmluZztcbiAgaW5kZXhlczogUmVzb2x2ZWRJbmRleENvbmZpZ1tdO1xuICBlbmRwb2ludD86IHN0cmluZztcbiAgY29sdW1ucz86IHN0cmluZ1tdO1xuICBwYWdlU2l6ZTogbnVtYmVyO1xuICBtb2RlOiBTZWFyY2hNb2RlO1xuICBlbWJlZGRpbmdNb2RlbD86IHN0cmluZztcbiAgYmFzZVBhdGg6IHN0cmluZztcbiAgdGltZW91dE1zOiBudW1iZXI7XG4gIGFsbG93V3JpdGU6IGJvb2xlYW47XG4gIGVuc3VyZU9uU2V0dXA/OiBFbnN1cmVPblNldHVwQ29uZmlnO1xufVxuXG4vKiogSlNPTiBTY2hlbWEgdGhlIHBsdWdpbiBtYW5pZmVzdCBwdWJsaXNoZXMgZm9yIHtAbGluayBTZWFyY2hQbHVnaW5Db25maWd9LiAqL1xuZXhwb3J0IGNvbnN0IFNFQVJDSF9DT05GSUdfU0NIRU1BOiBKU09OU2NoZW1hNyA9IHtcbiAgdHlwZTogXCJvYmplY3RcIixcbiAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHRydWUsXG4gIHByb3BlcnRpZXM6IHtcbiAgICBpbmRleDoge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkRlZmF1bHQgaW5kZXggdG8gc2VhcmNoIChjYXRhbG9nLnNjaGVtYS5pbmRleCBvciBhIGNvbmZpZ3VyZWQgYWxpYXMpLlwiLFxuICAgIH0sXG4gICAgaW5kZXhlczoge1xuICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiSW5kZXhlcyB0aGUgcGx1Z2luIGtub3dzIGFib3V0LCBmb3IgYWxpYXNlcywgdW5pdmVyc2FsIHNlYXJjaCwgYW5kIHRoZSBVSS5cIixcbiAgICAgIGl0ZW1zOiB7XG4gICAgICAgIG9uZU9mOiBbXG4gICAgICAgICAgeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICAgIHJlcXVpcmVkOiBbXCJuYW1lXCJdLFxuICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICBuYW1lOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgYWxpYXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICBwcmltYXJ5S2V5OiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgY29sdW1uczogeyB0eXBlOiBcImFycmF5XCIsIGl0ZW1zOiB7IHR5cGU6IFwic3RyaW5nXCIgfSB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGVuZHBvaW50OiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiVmVjdG9yIFNlYXJjaCBzZXJ2aW5nIGVuZHBvaW50IGluZGV4ZXMgbGl2ZSBvbiAobmVlZGVkIG9ubHkgdG8gY3JlYXRlIG9uZSkuXCIsXG4gICAgfSxcbiAgICBjb2x1bW5zOiB7XG4gICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICBpdGVtczogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICBkZXNjcmlwdGlvbjogXCJEZWZhdWx0IGNvbHVtbnMgdG8gcmV0dXJuLlwiLFxuICAgIH0sXG4gICAgcGFnZVNpemU6IHsgdHlwZTogXCJudW1iZXJcIiwgZGVzY3JpcHRpb246IFwiRGVmYXVsdCBudW1iZXIgb2YgaGl0cyBwZXIgc2VhcmNoLlwiIH0sXG4gICAgbW9kZTogeyBlbnVtOiBbXCJoeWJyaWRcIiwgXCJ2ZWN0b3JcIiwgXCJrZXl3b3JkXCJdLCBkZXNjcmlwdGlvbjogXCJEZWZhdWx0IG1hdGNoIG1vZGUuXCIgfSxcbiAgICBlbWJlZGRpbmdNb2RlbDoge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkVtYmVkZGluZyBlbmRwb2ludCB1c2VkIHdoZW4gY3JlYXRpbmcgYSBEZWx0YSBTeW5jIGluZGV4IChmdXp6eS1tYXRjaGVkKS5cIixcbiAgICB9LFxuICAgIHRpbWVvdXRNczogeyB0eXBlOiBcIm51bWJlclwiLCBkZXNjcmlwdGlvbjogXCJQZXItY2FsbCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy5cIiB9LFxuICAgIGFsbG93V3JpdGU6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiRW5hYmxlIHRoZSBkb2N1bWVudCB3cml0ZSBzdXJmYWNlIChhZGRfZG9jdW1lbnRzIHRvb2wgKyByb3V0ZSkuXCIsXG4gICAgfSxcbiAgICBlbnN1cmVPblNldHVwOiB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUHJvdmlzaW9uIGEgcmVhbCBpbmRleCBhdCBib290OiBlbnN1cmUgdGhlIGVuZHBvaW50ICsgaW5kZXggZXhpc3QgYW5kIHNlZWQgXCIgK1xuICAgICAgICBcImRvY3VtZW50cyB3aGVuIGVtcHR5LiBSdW5zIGluIHRoZSBiYWNrZ3JvdW5kIGR1cmluZyBzZXR1cCB1c2luZyBib290LXRpbWUgYXV0aC5cIixcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBpbmRleDogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIGVuZHBvaW50OiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgcHJpbWFyeUtleTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHRleHRDb2x1bW46IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBlbWJlZGRpbmdNb2RlbDogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHNvdXJjZVRhYmxlOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgc2NoZW1hOiB7IHR5cGU6IFwib2JqZWN0XCIsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7IHR5cGU6IFwic3RyaW5nXCIgfSB9LFxuICAgICAgICBkb2N1bWVudHM6IHsgdHlwZTogXCJhcnJheVwiLCBpdGVtczogeyB0eXBlOiBcIm9iamVjdFwiLCBhZGRpdGlvbmFsUHJvcGVydGllczogdHJ1ZSB9IH0sXG4gICAgICAgIHRpbWVvdXRNczogeyB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuXG4vKiogRGVyaXZlIHRoZSBkZWZhdWx0IGFsaWFzIGZvciBhbiBpbmRleCBuYW1lIChpdHMgbGFzdCBkb3R0ZWQgc2VnbWVudCkuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdEFsaWFzKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHNlZ21lbnRzID0gbmFtZS5zcGxpdChcIi5cIikuZmlsdGVyKEJvb2xlYW4pO1xuICByZXR1cm4gc2VnbWVudHMubGVuZ3RoID4gMCA/IHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdIDogbmFtZTtcbn1cblxuLyoqIE5vcm1hbGl6ZSBhIGNvbmZpZyBpbmRleCBlbnRyeSAoc3RyaW5nIG9yIG9iamVjdCkgaW50byBhIHtAbGluayBSZXNvbHZlZEluZGV4Q29uZmlnfS4gKi9cbmZ1bmN0aW9uIHRvUmVzb2x2ZWRJbmRleChlbnRyeTogc3RyaW5nIHwgU2VhcmNoSW5kZXhDb25maWcpOiBSZXNvbHZlZEluZGV4Q29uZmlnIHwgbnVsbCB7XG4gIGNvbnN0IHJhdyA9IHR5cGVvZiBlbnRyeSA9PT0gXCJzdHJpbmdcIiA/IHsgbmFtZTogZW50cnkgfSA6IGVudHJ5O1xuICBjb25zdCBuYW1lID0gc3RyaW5nLnRyaW1Ub051bGwocmF3Lm5hbWUpO1xuICBpZiAobmFtZSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICBhbGlhczogc3RyaW5nLnRyaW1Ub051bGwocmF3LmFsaWFzKSA/PyBkZWZhdWx0QWxpYXMobmFtZSksXG4gICAgLi4uKHJhdy5wcmltYXJ5S2V5ID8geyBwcmltYXJ5S2V5OiByYXcucHJpbWFyeUtleSB9IDoge30pLFxuICAgIC4uLihyYXcuY29sdW1ucyAmJiByYXcuY29sdW1ucy5sZW5ndGggPiAwID8geyBjb2x1bW5zOiBbLi4ucmF3LmNvbHVtbnNdIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKiBDb2VyY2UgYSBwb3NpdGl2ZSBpbnRlZ2VyIGZyb20gY29uZmlnIG9yIGFuIGVudiB2YXIsIGZhbGxpbmcgYmFjayB0byBhIGRlZmF1bHQuICovXG5mdW5jdGlvbiByZXNvbHZlUG9zaXRpdmVJbnQoXG4gIGNvbmZpZ3VyZWQ6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgZW52VmFyOiBzdHJpbmcsXG4gIGZhbGxiYWNrOiBudW1iZXIsXG4pOiBudW1iZXIge1xuICBjb25zdCByYXcgPSBjb25maWd1cmVkID8/IE51bWJlcihwcm9jZXNzLmVudltlbnZWYXJdKTtcbiAgY29uc3QgdmFsdWUgPSBOdW1iZXIocmF3KTtcbiAgaWYgKE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgJiYgdmFsdWUgPiAwKSByZXR1cm4gTWF0aC5mbG9vcih2YWx1ZSk7XG4gIHJldHVybiBmYWxsYmFjaztcbn1cblxuLyoqIFBhcnNlIGFuZCB2YWxpZGF0ZSBhIHtAbGluayBTZWFyY2hNb2RlfSBmcm9tIGNvbmZpZyBvciBhbiBlbnYgdmFyLiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU1vZGUoY29uZmlndXJlZDogU2VhcmNoTW9kZSB8IHVuZGVmaW5lZCk6IFNlYXJjaE1vZGUge1xuICBjb25zdCByYXcgPSBjb25maWd1cmVkID8/IHN0cmluZy50cmltVG9OdWxsKHByb2Nlc3MuZW52LlNFQVJDSF9NT0RFKSA/PyB1bmRlZmluZWQ7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCkgcmV0dXJuIERFRkFVTFRfTU9ERTtcbiAgaWYgKHJhdyAhPT0gXCJoeWJyaWRcIiAmJiByYXcgIT09IFwidmVjdG9yXCIgJiYgcmF3ICE9PSBcImtleXdvcmRcIikge1xuICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgICAnbW9kZSBtdXN0IGJlIFwiaHlicmlkXCIsIFwidmVjdG9yXCIgb3IgXCJrZXl3b3JkXCIgKGVudjogU0VBUkNIX01PREUpJyxcbiAgICAgIHsgY29udGV4dDogeyBmaWVsZDogXCJtb2RlXCIsIGVudlZhcjogXCJTRUFSQ0hfTU9ERVwiIH0gfSxcbiAgICApO1xuICB9XG4gIHJldHVybiByYXc7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBwbHVnaW4gY29uZmlnIG92ZXIgZW52aXJvbm1lbnQgZGVmYXVsdHMgaW50byB0aGUgY29uY3JldGVcbiAqIHtAbGluayBSZXNvbHZlZFNlYXJjaENvbmZpZ30uIFRoZSBkZWZhdWx0IGluZGV4IGlzIHVuaW9uZWQgaW50byB0aGUga25vd25cbiAqIGluZGV4ZXMgc28gaXQgYWx3YXlzIGFwcGVhcnMgaW4gdGhlIGNhdGFsb2d1ZSwgYWxpYXNlcyBhcmUgZGUtZHVwbGljYXRlZCxcbiAqIGFuZCBhIGJhZCBtb2RlIHRocm93cyBhIHtAbGluayBDb25maWd1cmF0aW9uRXJyb3J9IG5hbWluZyB0aGUgZmllbGQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU2VhcmNoQ29uZmlnKGNvbmZpZzogU2VhcmNoUGx1Z2luQ29uZmlnID0ge30pOiBSZXNvbHZlZFNlYXJjaENvbmZpZyB7XG4gIGNvbnN0IGRlZmF1bHRJbmRleFJhdyA9XG4gICAgc3RyaW5nLnRyaW1Ub051bGwoY29uZmlnLmluZGV4KSA/P1xuICAgIHN0cmluZy50cmltVG9OdWxsKHByb2Nlc3MuZW52W0lOREVYX0VOVl0pID8/XG4gICAgc3RyaW5nLnRyaW1Ub051bGwocHJvY2Vzcy5lbnZbREFUQUJSSUNLU19JTkRFWF9FTlZdKSA/P1xuICAgIHVuZGVmaW5lZDtcblxuICBjb25zdCBjb25maWd1cmVkID0gKGNvbmZpZy5pbmRleGVzID8/IFtdKVxuICAgIC5tYXAodG9SZXNvbHZlZEluZGV4KVxuICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgUmVzb2x2ZWRJbmRleENvbmZpZyA9PiBlbnRyeSAhPT0gbnVsbCk7XG5cbiAgLy8gRW5zdXJlIHRoZSBkZWZhdWx0IGluZGV4IGlzIHJlcHJlc2VudGVkIGluIHRoZSBrbm93biBzZXQuXG4gIGlmIChkZWZhdWx0SW5kZXhSYXcgJiYgIWNvbmZpZ3VyZWQuc29tZSgoaSkgPT4gaS5uYW1lID09PSBkZWZhdWx0SW5kZXhSYXcpKSB7XG4gICAgY29uc3QgZnJvbUVudiA9IHN0cmluZy5wYXJzZUxpc3QocHJvY2Vzcy5lbnYuU0VBUkNIX0NPTFVNTlMpO1xuICAgIGNvbmZpZ3VyZWQudW5zaGlmdCh7XG4gICAgICBuYW1lOiBkZWZhdWx0SW5kZXhSYXcsXG4gICAgICBhbGlhczogZGVmYXVsdEFsaWFzKGRlZmF1bHRJbmRleFJhdyksXG4gICAgICAuLi4oZnJvbUVudi5sZW5ndGggPiAwID8geyBjb2x1bW5zOiBmcm9tRW52IH0gOiB7fSksXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBzZWVuQWxpYXNlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBpbmRleGVzID0gY29uZmlndXJlZC5tYXAoKGVudHJ5KSA9PiB7XG4gICAgbGV0IGFsaWFzID0gZW50cnkuYWxpYXM7XG4gICAgd2hpbGUgKHNlZW5BbGlhc2VzLmhhcyhhbGlhcykpIGFsaWFzID0gYCR7YWxpYXN9X2A7XG4gICAgc2VlbkFsaWFzZXMuYWRkKGFsaWFzKTtcbiAgICByZXR1cm4geyAuLi5lbnRyeSwgYWxpYXMgfTtcbiAgfSk7XG5cbiAgY29uc3QgZGVmYXVsdEluZGV4ID0gZGVmYXVsdEluZGV4UmF3ID8/IGluZGV4ZXNbMF0/Lm5hbWU7XG4gIGNvbnN0IGNvbHVtbnMgPSBjb25maWcuY29sdW1ucyA/PyBzdHJpbmcucGFyc2VMaXN0KHByb2Nlc3MuZW52LlNFQVJDSF9DT0xVTU5TKTtcblxuICByZXR1cm4ge1xuICAgIC4uLihkZWZhdWx0SW5kZXggPyB7IGRlZmF1bHRJbmRleCB9IDoge30pLFxuICAgIGluZGV4ZXMsXG4gICAgLi4uKChzdHJpbmcudHJpbVRvTnVsbChjb25maWcuZW5kcG9pbnQpID8/IHN0cmluZy50cmltVG9OdWxsKHByb2Nlc3MuZW52W0VORFBPSU5UX0VOVl0pKVxuICAgICAgPyB7XG4gICAgICAgICAgZW5kcG9pbnQ6XG4gICAgICAgICAgICBzdHJpbmcudHJpbVRvTnVsbChjb25maWcuZW5kcG9pbnQpID8/XG4gICAgICAgICAgICBzdHJpbmcudHJpbVRvTnVsbChwcm9jZXNzLmVudltFTkRQT0lOVF9FTlZdKSA/P1xuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4oY29sdW1ucy5sZW5ndGggPiAwID8geyBjb2x1bW5zIH0gOiB7fSksXG4gICAgcGFnZVNpemU6IHJlc29sdmVQb3NpdGl2ZUludChjb25maWcucGFnZVNpemUsIFwiU0VBUkNIX1BBR0VfU0laRVwiLCBERUZBVUxUX1BBR0VfU0laRSksXG4gICAgbW9kZTogcmVzb2x2ZU1vZGUoY29uZmlnLm1vZGUpLFxuICAgIC4uLigoc3RyaW5nLnRyaW1Ub051bGwoY29uZmlnLmVtYmVkZGluZ01vZGVsKSA/P1xuICAgIHN0cmluZy50cmltVG9OdWxsKHByb2Nlc3MuZW52LlNFQVJDSF9FTUJFRERJTkdfTU9ERUwpKVxuICAgICAgPyB7XG4gICAgICAgICAgZW1iZWRkaW5nTW9kZWw6XG4gICAgICAgICAgICBzdHJpbmcudHJpbVRvTnVsbChjb25maWcuZW1iZWRkaW5nTW9kZWwpID8/XG4gICAgICAgICAgICBzdHJpbmcudHJpbVRvTnVsbChwcm9jZXNzLmVudi5TRUFSQ0hfRU1CRURESU5HX01PREVMKSA/P1xuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICBiYXNlUGF0aDogREVGQVVMVF9CQVNFX1BBVEgsXG4gICAgdGltZW91dE1zOiByZXNvbHZlUG9zaXRpdmVJbnQoY29uZmlnLnRpbWVvdXRNcywgXCJTRUFSQ0hfVElNRU9VVF9NU1wiLCBERUZBVUxUX1RJTUVPVVRfTVMpLFxuICAgIGFsbG93V3JpdGU6IGNvbmZpZy5hbGxvd1dyaXRlID8/IG9iamVjdC50b0Jvb2xlYW4ocHJvY2Vzcy5lbnYuU0VBUkNIX1dSSVRFKSA/PyBmYWxzZSxcbiAgICAuLi4oY29uZmlnLmVuc3VyZU9uU2V0dXAgPyB7IGVuc3VyZU9uU2V0dXA6IGNvbmZpZy5lbnN1cmVPblNldHVwIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGNhbGxlci1zdXBwbGllZCBpbmRleCByZWZlcmVuY2UgKGEgZnVsbCBVQyBuYW1lIG9yIGEgY29uZmlndXJlZFxuICogYWxpYXMpIGludG8gYSBjb25jcmV0ZSBpbmRleCBuYW1lLiBGYWxscyBiYWNrIHRvIHRoZSBkZWZhdWx0IGluZGV4IHdoZW4gdGhlXG4gKiByZWZlcmVuY2UgaXMgZW1wdHkuIFJldHVybnMgYG51bGxgIHdoZW4gbm90aGluZyBjYW4gYmUgcmVzb2x2ZWQgc28gY2FsbGVyc1xuICogcmFpc2UgYSBzdGFibGUsIHVzZXItZmFjaW5nIGVycm9yIHJhdGhlciB0aGFuIGNhbGxpbmcgYSBwaGFudG9tIGluZGV4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUluZGV4TmFtZShcbiAgY29uZmlnOiBSZXNvbHZlZFNlYXJjaENvbmZpZyxcbiAgcmVmZXJlbmNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgcmVmID0gc3RyaW5nLnRyaW1Ub051bGwocmVmZXJlbmNlKTtcbiAgaWYgKHJlZiA9PT0gbnVsbCkgcmV0dXJuIGNvbmZpZy5kZWZhdWx0SW5kZXggPz8gbnVsbDtcbiAgY29uc3QgYnlBbGlhcyA9IGNvbmZpZy5pbmRleGVzLmZpbmQoKGkpID0+IGkuYWxpYXMgPT09IHJlZiB8fCBpLm5hbWUgPT09IHJlZik7XG4gIGlmIChieUFsaWFzKSByZXR1cm4gYnlBbGlhcy5uYW1lO1xuICAvLyBBY2NlcHQgYW4gdW5yZWdpc3RlcmVkIGJ1dCBmdWxseS1xdWFsaWZpZWQgVUMgbmFtZSAodGhyZWUgZG90dGVkIHBhcnRzKS5cbiAgaWYgKHJlZi5zcGxpdChcIi5cIikuZmlsdGVyKEJvb2xlYW4pLmxlbmd0aCA9PT0gMykgcmV0dXJuIHJlZjtcbiAgcmV0dXJuIGNvbmZpZy5kZWZhdWx0SW5kZXggPz8gbnVsbDtcbn1cblxuLyoqIFRoZSBrbm93biBjb25maWcgZm9yIGFuIGluZGV4IG5hbWUsIHdoZW4gdGhlIHBsdWdpbiB3YXMgdG9sZCBhYm91dCBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRleENvbmZpZ0ZvcihcbiAgY29uZmlnOiBSZXNvbHZlZFNlYXJjaENvbmZpZyxcbiAgbmFtZTogc3RyaW5nLFxuKTogUmVzb2x2ZWRJbmRleENvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb25maWcuaW5kZXhlcy5maW5kKChpKSA9PiBpLm5hbWUgPT09IG5hbWUgfHwgaS5hbGlhcyA9PT0gbmFtZSk7XG59XG4iXX0=
201
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBeUIsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUk3RCxnRkFBZ0Y7QUFDaEYsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQztBQUV4Qyw0RUFBNEU7QUFDNUUsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsZ0NBQWdDLENBQUM7QUFFckUsb0ZBQW9GO0FBQ3BGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQztBQUU5QywyRkFBMkY7QUFDM0YsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFlLFFBQVEsQ0FBQztBQUVqRCx5RkFBeUY7QUFDekYsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO0FBRXBDLCtEQUErRDtBQUMvRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUM7QUFFekMsdUVBQXVFO0FBQ3ZFLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLGFBQWEsQ0FBQztBQXFHL0MsZ0ZBQWdGO0FBQ2hGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFnQjtJQUMvQyxJQUFJLEVBQUUsUUFBUTtJQUNkLG9CQUFvQixFQUFFLElBQUk7SUFDMUIsVUFBVSxFQUFFO1FBQ1YsS0FBSyxFQUFFO1lBQ0wsSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQUUsdUVBQXVFO1NBQ3JGO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsSUFBSSxFQUFFLE9BQU87WUFDYixXQUFXLEVBQUUsNEVBQTRFO1lBQ3pGLEtBQUssRUFBRTtnQkFDTCxLQUFLLEVBQUU7b0JBQ0ws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LENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUM7QUFDekUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIEFJIFNlYXJjaCBwbHVnaW46IHRoZSB0eXBlZFxuICoge0BsaW5rIFNlYXJjaFBsdWdpbkNvbmZpZ30gKHRoZSBwbHVnaW4ncyBzbGljZSBvZiBBcHBLaXQgY29uZmlnKSwgdGhlIEpTT05cbiAqIFNjaGVtYSB0aGUgbWFuaWZlc3QgcHVibGlzaGVzIGZvciBpdCwgYW5kIHtAbGluayByZXNvbHZlU2VhcmNoQ29uZmlnfVxuICogd2hpY2ggbGF5ZXJzIHRoYXQgY29uZmlnIG92ZXIgZW52aXJvbm1lbnQgZGVmYXVsdHMgaW50byB0aGUgY29uY3JldGVcbiAqIHtAbGluayBSZXNvbHZlZFNlYXJjaENvbmZpZ30gdGhlIHJ1bnRpbWUsIGNsaWVudCwgdG9vbHMsIGFuZCByb3V0ZXMgcmVhZC5cbiAqXG4gKiBUaGUgZGVzaWduIGdvYWwgaXMgXCJvbmUgaW5kZXgsIHplcm8gY29uZmlnXCI6IG5hbWUgYSBkZWZhdWx0IGluZGV4IChvciBzZXRcbiAqIGBEQVRBQlJJQ0tTX1ZFQ1RPUl9TRUFSQ0hfSU5ERVhgKSBhbmQgZXZlcnl0aGluZyBlbHNlIC0gdGhlIGNvbHVtbnMgdG9cbiAqIHJldHVybiwgdGhlIHBhZ2Ugc2l6ZSwgdGhlIG1hdGNoIG1vZGUsIHRoZSBtb3VudGVkIHJvdXRlIHBhdGgsIHRoZSBlbWJlZGRpbmdcbiAqIG1vZGVsIHVzZWQgd2hlbiBjcmVhdGluZyBhbiBpbmRleCAtIGhhcyBhIHNlbnNpYmxlIGRlZmF1bHQgdGhhdCBjYW4gYmVcbiAqIG92ZXJyaWRkZW4gd2hlbiBhIGRlcGxveW1lbnQgbmVlZHMgdG8gZ28gZGVlcGVyLlxuICpcbiAqIFdoaWNoIGluZGV4IC8gZW5kcG9pbnQgaXMgdXNlZCBmb2xsb3dzIHRoZSBzdGFuZGFyZCBwcmVjZWRlbmNlOiBleHBsaWNpdFxuICogcGx1Z2luIGNvbmZpZywgdGhlbiBlbnZpcm9ubWVudCwgdGhlbiBhIGRlZmF1bHQuXG4gKlxuICogRW52IGZhbGxiYWNrczogYERBVEFCUklDS1NfVkVDVE9SX1NFQVJDSF9JTkRFWGAgKHRoZSBkZWZhdWx0IGluZGV4KSxcbiAqIGBTRUFSQ0hfSU5ERVhgLCBgU0VBUkNIX0VORFBPSU5UYCwgYFNFQVJDSF9DT0xVTU5TYCxcbiAqIGBTRUFSQ0hfUEFHRV9TSVpFYCwgYFNFQVJDSF9NT0RFYCwgYFNFQVJDSF9FTUJFRERJTkdfTU9ERUxgLFxuICogYFNFQVJDSF9USU1FT1VUX01TYCwgYFNFQVJDSF9XUklURWAuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciwgdHlwZSBCYXNlUGx1Z2luQ29uZmlnIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZW52LCBvYmplY3QsIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IFNlYXJjaERvY3VtZW50LCBTZWFyY2hNb2RlIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaFwiO1xuaW1wb3J0IHR5cGUgeyBKU09OU2NoZW1hNyB9IGZyb20gXCJqc29uLXNjaGVtYVwiO1xuXG4vKiogVGhlIGRlZmF1bHQgaW5kZXgsIGhvbm9yaW5nIEFwcEtpdCdzIHN0YW5kYXJkIFZlY3RvciBTZWFyY2ggYmluZGluZyBuYW1lLiAqL1xuZXhwb3J0IGNvbnN0IElOREVYX0VOViA9IFwiU0VBUkNIX0lOREVYXCI7XG5cbi8qKiBBcHBLaXQncyBzdGFuZGFyZCBlbnZpcm9ubWVudCBuYW1lIGZvciBhIFZlY3RvciBTZWFyY2ggaW5kZXggYmluZGluZy4gKi9cbmV4cG9ydCBjb25zdCBEQVRBQlJJQ0tTX0lOREVYX0VOViA9IFwiREFUQUJSSUNLU19WRUNUT1JfU0VBUkNIX0lOREVYXCI7XG5cbi8qKiBEZWRpY2F0ZWQgb3ZlcnJpZGUgZm9yIHRoZSBWZWN0b3IgU2VhcmNoIHNlcnZpbmcgZW5kcG9pbnQgdGhhdCBob3N0cyBpbmRleGVzLiAqL1xuZXhwb3J0IGNvbnN0IEVORFBPSU5UX0VOViA9IFwiU0VBUkNIX0VORFBPSU5UXCI7XG5cbi8qKiBEZWZhdWx0IG1hdGNoIG1vZGUgd2hlbiBhIHJlcXVlc3QgZG9lcyBub3QgbmFtZSBvbmUuIEh5YnJpZCBzdWl0cyBtb3N0IHNlYXJjaCBib3hlcy4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01PREU6IFNlYXJjaE1vZGUgPSBcImh5YnJpZFwiO1xuXG4vKiogRGVmYXVsdCBudW1iZXIgb2YgaGl0cyBhIHNlYXJjaCByZXR1cm5zIChhIGdvb2QgYXV0b2NvbXBsZXRlIC8gcmVzdWx0cy1saXN0IHNpemUpLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUEFHRV9TSVpFID0gMTA7XG5cbi8qKiBEZWZhdWx0IHBlci1jYWxsIHRpbWVvdXQgZm9yIGEgc2VhcmNoIC8gaW5kZXggb3BlcmF0aW9uLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVElNRU9VVF9NUyA9IDMwXzAwMDtcblxuLyoqIEJhc2UgcGF0aCB0aGUgcGx1Z2luIG1vdW50cyBpdHMgcm91dGVzIHVuZGVyLCB1bmxlc3Mgb3ZlcnJpZGRlbi4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0JBU0VfUEFUSCA9IFwiL2FwaS9zZWFyY2hcIjtcblxuLyoqXG4gKiBBIGNvbmZpZ3VyZWQgaW5kZXggdGhlIHBsdWdpbiBrbm93cyBhYm91dCBhaGVhZCBvZiB0aW1lLiBPbmx5IGBuYW1lYCAob3JcbiAqIGBhbGlhc2ApIGlzIHJlcXVpcmVkOyB0aGUgcmVzdCBpcyByZXNvbHZlZCBmcm9tIHRoZSBsaXZlIGluZGV4IGRlZmluaXRpb25cbiAqIHdoZW4gb21pdHRlZCwgc28gYSBkZXBsb3ltZW50IGNhbiByZWdpc3RlciBgeyBuYW1lIH1gIGFuZCBsZXQgdGhlIHBsdWdpbiBmaWxsXG4gKiBpbiB0aGUgcHJpbWFyeSBrZXkgYW5kIGNvbHVtbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoSW5kZXhDb25maWcge1xuICAvKiogVW5pdHkgQ2F0YWxvZyBuYW1lIG9mIHRoZSBpbmRleCAoY2F0YWxvZy5zY2hlbWEuaW5kZXgpLiAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBTaG9ydCBhbGlhcyBhIGNhbGxlciBtYXkgdXNlIGluIHBsYWNlIG9mIGBuYW1lYCAoZGVmYXVsdHMgdG8gdGhlIGxhc3QgbmFtZSBzZWdtZW50KS4gKi9cbiAgYWxpYXM/OiBzdHJpbmc7XG4gIC8qKiBQcmltYXJ5LWtleSBjb2x1bW4uIFJlc29sdmVkIGZyb20gdGhlIGluZGV4IGRlZmluaXRpb24gd2hlbiBvbWl0dGVkLiAqL1xuICBwcmltYXJ5S2V5Pzogc3RyaW5nO1xuICAvKiogQ29sdW1ucyB0byByZXR1cm4gcGVyIGhpdCwgaW4gZGlzcGxheSBvcmRlci4gRGVmYXVsdHMgdG8gZXZlcnkgaW5kZXhlZCBjb2x1bW4uICovXG4gIGNvbHVtbnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgQUkgU2VhcmNoIHBsdWdpbidzIHNsaWNlIG9mIEFwcEtpdCBjb25maWcuIEV2ZXJ5IGZpZWxkIGlzIG9wdGlvbmFsIC0gdGhlXG4gKiBwbHVnaW4gd29ya3Mgd2l0aCBub3RoaW5nIGJ1dCBhbiBpbmRleCBuYW1lIGluIHRoZSBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hQbHVnaW5Db25maWcgZXh0ZW5kcyBCYXNlUGx1Z2luQ29uZmlnIHtcbiAgLyoqIFRoZSBkZWZhdWx0IGluZGV4IHNlYXJjaGVkIHdoZW4gYSByZXF1ZXN0IG9taXRzIG9uZSAobmFtZSBvciBhbGlhcykuICovXG4gIGluZGV4Pzogc3RyaW5nO1xuICAvKiogSW5kZXhlcyB0aGUgcGx1Z2luIHNob3VsZCBrbm93IGFib3V0IChmb3IgYWxpYXNlcywgdW5pdmVyc2FsIHNlYXJjaCwgYW5kIHRoZSBVSSBjYXRhbG9ndWUpLiAqL1xuICBpbmRleGVzPzogQXJyYXk8c3RyaW5nIHwgU2VhcmNoSW5kZXhDb25maWc+O1xuICAvKiogVGhlIFZlY3RvciBTZWFyY2ggc2VydmluZyBlbmRwb2ludCBpbmRleGVzIGxpdmUgb24gKG9ubHkgbmVlZGVkIHRvIGNyZWF0ZSBhbiBpbmRleCkuICovXG4gIGVuZHBvaW50Pzogc3RyaW5nO1xuICAvKiogRGVmYXVsdCBjb2x1bW5zIHRvIHJldHVybiBwZXIgaGl0LiBGYWxscyBiYWNrIHRvIGVhY2ggaW5kZXgncyBvd24gY29sdW1ucy4gKi9cbiAgY29sdW1ucz86IHN0cmluZ1tdO1xuICAvKiogRGVmYXVsdCBudW1iZXIgb2YgaGl0cyBhIHNlYXJjaCByZXR1cm5zLiAqL1xuICBwYWdlU2l6ZT86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgbWF0Y2ggbW9kZS4gKi9cbiAgbW9kZT86IFNlYXJjaE1vZGU7XG4gIC8qKiBFbWJlZGRpbmcgbW9kZWwgZW5kcG9pbnQgdXNlZCB3aGVuIHRoZSBwbHVnaW4gQ1JFQVRFUyBhIERlbHRhIFN5bmMgaW5kZXguIEZ1enp5LXJlc29sdmVkLiAqL1xuICBlbWJlZGRpbmdNb2RlbD86IHN0cmluZztcbiAgLyoqIFBlci1jYWxsIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiAqL1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG4gIC8qKiBFbmFibGUgdGhlIHdyaXRlIHN1cmZhY2UgKGBhZGRfZG9jdW1lbnRzYCB0b29sICsgYFBPU1QgL2RvY3VtZW50c2ApLiBPZmYgYnkgZGVmYXVsdC4gKi9cbiAgYWxsb3dXcml0ZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBQcm92aXNpb24gYSBSRUFMIGluZGV4IGF0IGJvb3Q6IGVuc3VyZSB0aGUgZW5kcG9pbnQgKyBpbmRleCBleGlzdCBhbmQgc2VlZFxuICAgKiBkb2N1bWVudHMgd2hlbiB0aGUgaW5kZXggaXMgZW1wdHkuIFJ1bnMgaW4gdGhlIGJhY2tncm91bmQgZHVyaW5nIGBzZXR1cCgpYFxuICAgKiAoYSBzbG93IGZpcnN0LXRpbWUgZW5kcG9pbnQvaW5kZXggYnVpbGQgbmV2ZXIgYmxvY2tzIHRoZSBzZXJ2ZXIpIHVzaW5nIHRoZVxuICAgKiBib290LXRpbWUgU0RLIGF1dGggKGVudiAvIGNvbmZpZyBwcm9maWxlKS4gSWRlbXBvdGVudCAtIHNhZmUgZXZlcnkgYm9vdC5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgaXMgYSBNQU5BR0VEIGRpcmVjdC1hY2Nlc3MgaW5kZXggKERhdGFicmlja3MgZW1iZWRzIHRoZSB0ZXh0XG4gICAqIGNvbHVtbiksIHNvIGBkb2N1bWVudHNgIGFyZSBwbGFpbiByb3dzIGFuZCBzZWFyY2gtYnktdGV4dCB3b3JrcyB3aXRoIG5vXG4gICAqIERlbHRhIHRhYmxlLCBubyB3YXJlaG91c2UsIGFuZCBubyB2ZWN0b3JzIHRvIGNvbXB1dGUuIFBvaW50IGl0IGF0IGFcbiAgICogYHNvdXJjZVRhYmxlYCB0byBwcm92aXNpb24gYSBEZWx0YSBTeW5jIGluZGV4IGluc3RlYWQuXG4gICAqL1xuICBlbnN1cmVPblNldHVwPzogRW5zdXJlT25TZXR1cENvbmZpZztcbn1cblxuLyoqIEJvb3QtdGltZSBwcm92aXNpb25pbmcgKyBzZWVkaW5nIGZvciBhIHNpbmdsZSBpbmRleCAoc2VlIGBlbnN1cmVPblNldHVwYCkuICovXG5leHBvcnQgaW50ZXJmYWNlIEVuc3VyZU9uU2V0dXBDb25maWcge1xuICAvKiogVUMgbmFtZSBvZiB0aGUgaW5kZXggdG8gZW5zdXJlIChjYXRhbG9nLnNjaGVtYS5pbmRleCkuIERlZmF1bHRzIHRvIHRoZSBwbHVnaW4ncyBgaW5kZXhgLiAqL1xuICBpbmRleD86IHN0cmluZztcbiAgLyoqIFZlY3RvciBTZWFyY2ggZW5kcG9pbnQgdG8gaG9zdCBpdCBvbi4gRGVmYXVsdHMgdG8gdGhlIHBsdWdpbidzIGBlbmRwb2ludGAuICovXG4gIGVuZHBvaW50Pzogc3RyaW5nO1xuICAvKiogUHJpbWFyeS1rZXkgY29sdW1uLiBEZWZhdWx0cyB0byBgaWRgLiAqL1xuICBwcmltYXJ5S2V5Pzogc3RyaW5nO1xuICAvKiogVGV4dCBjb2x1bW4gRGF0YWJyaWNrcyBlbWJlZHMgKG1hbmFnZWQgZGlyZWN0LWFjY2VzcykuIERlZmF1bHRzIHRvIGB0ZXh0YC4gKi9cbiAgdGV4dENvbHVtbj86IHN0cmluZztcbiAgLyoqIEVtYmVkZGluZyBtb2RlbCBlbmRwb2ludC4gRnV6enktbWF0Y2hlZDsgZGVmYXVsdHMgdG8gdGhlIGJlc3QgZW1iZWRkaW5nIGVuZHBvaW50LiAqL1xuICBlbWJlZGRpbmdNb2RlbD86IHN0cmluZztcbiAgLyoqIEZvciBhIERlbHRhIFN5bmMgaW5kZXggaW5zdGVhZCBvZiBtYW5hZ2VkIGRpcmVjdC1hY2Nlc3M6IHRoZSBzb3VyY2UgRGVsdGEgdGFibGUuICovXG4gIHNvdXJjZVRhYmxlPzogc3RyaW5nO1xuICAvKiogQ29sdW1uIC0+IHR5cGUgbWFwIGZvciB0aGUgbWFuYWdlZCBkaXJlY3QtYWNjZXNzIGBzY2hlbWFfanNvbmAuIEluZmVycmVkIGZyb20gYGRvY3VtZW50c2Agd2hlbiBvbWl0dGVkLiAqL1xuICBzY2hlbWE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogRG9jdW1lbnRzIHRvIHNlZWQgd2hlbiB0aGUgaW5kZXggaXMgZW1wdHkuIFBsYWluIGB7IGlkLCB0ZXh0LCAuLi4gfWAgcm93cyBmb3IgYSBtYW5hZ2VkIGluZGV4LiAqL1xuICBkb2N1bWVudHM/OiBTZWFyY2hEb2N1bWVudFtdO1xuICAvKiogTWF4IHRpbWUgdG8gd2FpdCBmb3IgZW5kcG9pbnQgKyBpbmRleCByZWFkaW5lc3MuIERlZmF1bHRzIHRvIDIwIG1pbnV0ZXMuICovXG4gIHRpbWVvdXRNcz86IG51bWJlcjtcbn1cblxuLyoqIEEgZnVsbHkgcmVzb2x2ZWQgaW5kZXggZW50cnkgKHRoZSBwbHVnaW4ta25vd24gZm9ybSkuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkSW5kZXhDb25maWcge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFsaWFzOiBzdHJpbmc7XG4gIHByaW1hcnlLZXk/OiBzdHJpbmc7XG4gIGNvbHVtbnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqIFRoZSBjb25jcmV0ZSBjb25maWcgdGhlIHJ1bnRpbWUsIGNsaWVudCwgdG9vbHMsIGFuZCByb3V0ZXMgcmVhZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRTZWFyY2hDb25maWcge1xuICBkZWZhdWx0SW5kZXg/OiBzdHJpbmc7XG4gIGluZGV4ZXM6IFJlc29sdmVkSW5kZXhDb25maWdbXTtcbiAgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIGNvbHVtbnM/OiBzdHJpbmdbXTtcbiAgcGFnZVNpemU6IG51bWJlcjtcbiAgbW9kZTogU2VhcmNoTW9kZTtcbiAgZW1iZWRkaW5nTW9kZWw/OiBzdHJpbmc7XG4gIGJhc2VQYXRoOiBzdHJpbmc7XG4gIHRpbWVvdXRNczogbnVtYmVyO1xuICBhbGxvd1dyaXRlOiBib29sZWFuO1xuICBlbnN1cmVPblNldHVwPzogRW5zdXJlT25TZXR1cENvbmZpZztcbn1cblxuLyoqIEpTT04gU2NoZW1hIHRoZSBwbHVnaW4gbWFuaWZlc3QgcHVibGlzaGVzIGZvciB7QGxpbmsgU2VhcmNoUGx1Z2luQ29uZmlnfS4gKi9cbmV4cG9ydCBjb25zdCBTRUFSQ0hfQ09ORklHX1NDSEVNQTogSlNPTlNjaGVtYTcgPSB7XG4gIHR5cGU6IFwib2JqZWN0XCIsXG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlLFxuICBwcm9wZXJ0aWVzOiB7XG4gICAgaW5kZXg6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJEZWZhdWx0IGluZGV4IHRvIHNlYXJjaCAoY2F0YWxvZy5zY2hlbWEuaW5kZXggb3IgYSBjb25maWd1cmVkIGFsaWFzKS5cIixcbiAgICB9LFxuICAgIGluZGV4ZXM6IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkluZGV4ZXMgdGhlIHBsdWdpbiBrbm93cyBhYm91dCwgZm9yIGFsaWFzZXMsIHVuaXZlcnNhbCBzZWFyY2gsIGFuZCB0aGUgVUkuXCIsXG4gICAgICBpdGVtczoge1xuICAgICAgICBvbmVPZjogW1xuICAgICAgICAgIHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICByZXF1aXJlZDogW1wibmFtZVwiXSxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgbmFtZTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgIGFsaWFzOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgcHJpbWFyeUtleTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgIGNvbHVtbnM6IHsgdHlwZTogXCJhcnJheVwiLCBpdGVtczogeyB0eXBlOiBcInN0cmluZ1wiIH0gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBlbmRwb2ludDoge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlZlY3RvciBTZWFyY2ggc2VydmluZyBlbmRwb2ludCBpbmRleGVzIGxpdmUgb24gKG5lZWRlZCBvbmx5IHRvIGNyZWF0ZSBvbmUpLlwiLFxuICAgIH0sXG4gICAgY29sdW1uczoge1xuICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgZGVzY3JpcHRpb246IFwiRGVmYXVsdCBjb2x1bW5zIHRvIHJldHVybi5cIixcbiAgICB9LFxuICAgIHBhZ2VTaXplOiB7IHR5cGU6IFwibnVtYmVyXCIsIGRlc2NyaXB0aW9uOiBcIkRlZmF1bHQgbnVtYmVyIG9mIGhpdHMgcGVyIHNlYXJjaC5cIiB9LFxuICAgIG1vZGU6IHsgZW51bTogW1wiaHlicmlkXCIsIFwidmVjdG9yXCIsIFwia2V5d29yZFwiXSwgZGVzY3JpcHRpb246IFwiRGVmYXVsdCBtYXRjaCBtb2RlLlwiIH0sXG4gICAgZW1iZWRkaW5nTW9kZWw6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJFbWJlZGRpbmcgZW5kcG9pbnQgdXNlZCB3aGVuIGNyZWF0aW5nIGEgRGVsdGEgU3luYyBpbmRleCAoZnV6enktbWF0Y2hlZCkuXCIsXG4gICAgfSxcbiAgICB0aW1lb3V0TXM6IHsgdHlwZTogXCJudW1iZXJcIiwgZGVzY3JpcHRpb246IFwiUGVyLWNhbGwgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuXCIgfSxcbiAgICBhbGxvd1dyaXRlOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkVuYWJsZSB0aGUgZG9jdW1lbnQgd3JpdGUgc3VyZmFjZSAoYWRkX2RvY3VtZW50cyB0b29sICsgcm91dGUpLlwiLFxuICAgIH0sXG4gICAgZW5zdXJlT25TZXR1cDoge1xuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlByb3Zpc2lvbiBhIHJlYWwgaW5kZXggYXQgYm9vdDogZW5zdXJlIHRoZSBlbmRwb2ludCArIGluZGV4IGV4aXN0IGFuZCBzZWVkIFwiICtcbiAgICAgICAgXCJkb2N1bWVudHMgd2hlbiBlbXB0eS4gUnVucyBpbiB0aGUgYmFja2dyb3VuZCBkdXJpbmcgc2V0dXAgdXNpbmcgYm9vdC10aW1lIGF1dGguXCIsXG4gICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogdHJ1ZSxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgaW5kZXg6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBlbmRwb2ludDogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHByaW1hcnlLZXk6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICB0ZXh0Q29sdW1uOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgZW1iZWRkaW5nTW9kZWw6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICBzb3VyY2VUYWJsZTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIHNjaGVtYTogeyB0eXBlOiBcIm9iamVjdFwiLCBhZGRpdGlvbmFsUHJvcGVydGllczogeyB0eXBlOiBcInN0cmluZ1wiIH0gfSxcbiAgICAgICAgZG9jdW1lbnRzOiB7IHR5cGU6IFwiYXJyYXlcIiwgaXRlbXM6IHsgdHlwZTogXCJvYmplY3RcIiwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHRydWUgfSB9LFxuICAgICAgICB0aW1lb3V0TXM6IHsgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcblxuLyoqIERlcml2ZSB0aGUgZGVmYXVsdCBhbGlhcyBmb3IgYW4gaW5kZXggbmFtZSAoaXRzIGxhc3QgZG90dGVkIHNlZ21lbnQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRBbGlhcyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzZWdtZW50cyA9IG5hbWUuc3BsaXQoXCIuXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgcmV0dXJuIHNlZ21lbnRzLmxlbmd0aCA+IDAgPyBzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLSAxXSA6IG5hbWU7XG59XG5cbi8qKiBOb3JtYWxpemUgYSBjb25maWcgaW5kZXggZW50cnkgKHN0cmluZyBvciBvYmplY3QpIGludG8gYSB7QGxpbmsgUmVzb2x2ZWRJbmRleENvbmZpZ30uICovXG5mdW5jdGlvbiB0b1Jlc29sdmVkSW5kZXgoZW50cnk6IHN0cmluZyB8IFNlYXJjaEluZGV4Q29uZmlnKTogUmVzb2x2ZWRJbmRleENvbmZpZyB8IG51bGwge1xuICBjb25zdCByYXcgPSB0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIgPyB7IG5hbWU6IGVudHJ5IH0gOiBlbnRyeTtcbiAgY29uc3QgbmFtZSA9IHN0cmluZy50cmltVG9OdWxsKHJhdy5uYW1lKTtcbiAgaWYgKG5hbWUgPT09IG51bGwpIHJldHVybiBudWxsO1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgYWxpYXM6IHN0cmluZy50cmltVG9OdWxsKHJhdy5hbGlhcykgPz8gZGVmYXVsdEFsaWFzKG5hbWUpLFxuICAgIC4uLihyYXcucHJpbWFyeUtleSA/IHsgcHJpbWFyeUtleTogcmF3LnByaW1hcnlLZXkgfSA6IHt9KSxcbiAgICAuLi4ocmF3LmNvbHVtbnMgJiYgcmF3LmNvbHVtbnMubGVuZ3RoID4gMCA/IHsgY29sdW1uczogWy4uLnJhdy5jb2x1bW5zXSB9IDoge30pLFxuICB9O1xufVxuXG4vKiogUGFyc2UgYW5kIHZhbGlkYXRlIGEge0BsaW5rIFNlYXJjaE1vZGV9IGZyb20gY29uZmlnIG9yIGFuIGVudiB2YXIuICovXG5mdW5jdGlvbiByZXNvbHZlTW9kZShjb25maWd1cmVkOiBTZWFyY2hNb2RlIHwgdW5kZWZpbmVkKTogU2VhcmNoTW9kZSB7XG4gIGNvbnN0IHJhdyA9IGNvbmZpZ3VyZWQgPz8gZW52LnRleHQoXCJTRUFSQ0hfTU9ERVwiKSA/PyB1bmRlZmluZWQ7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCkgcmV0dXJuIERFRkFVTFRfTU9ERTtcbiAgaWYgKHJhdyAhPT0gXCJoeWJyaWRcIiAmJiByYXcgIT09IFwidmVjdG9yXCIgJiYgcmF3ICE9PSBcImtleXdvcmRcIikge1xuICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgICAnbW9kZSBtdXN0IGJlIFwiaHlicmlkXCIsIFwidmVjdG9yXCIgb3IgXCJrZXl3b3JkXCIgKGVudjogU0VBUkNIX01PREUpJyxcbiAgICAgIHsgY29udGV4dDogeyBmaWVsZDogXCJtb2RlXCIsIGVudlZhcjogXCJTRUFSQ0hfTU9ERVwiIH0gfSxcbiAgICApO1xuICB9XG4gIHJldHVybiByYXc7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBwbHVnaW4gY29uZmlnIG92ZXIgZW52aXJvbm1lbnQgZGVmYXVsdHMgaW50byB0aGUgY29uY3JldGVcbiAqIHtAbGluayBSZXNvbHZlZFNlYXJjaENvbmZpZ30uIFRoZSBkZWZhdWx0IGluZGV4IGlzIHVuaW9uZWQgaW50byB0aGUga25vd25cbiAqIGluZGV4ZXMgc28gaXQgYWx3YXlzIGFwcGVhcnMgaW4gdGhlIGNhdGFsb2d1ZSwgYWxpYXNlcyBhcmUgZGUtZHVwbGljYXRlZCxcbiAqIGFuZCBhIGJhZCBtb2RlIHRocm93cyBhIHtAbGluayBDb25maWd1cmF0aW9uRXJyb3J9IG5hbWluZyB0aGUgZmllbGQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU2VhcmNoQ29uZmlnKGNvbmZpZzogU2VhcmNoUGx1Z2luQ29uZmlnID0ge30pOiBSZXNvbHZlZFNlYXJjaENvbmZpZyB7XG4gIGNvbnN0IGRlZmF1bHRJbmRleFJhdyA9IGVudi5zdHJpbmcoY29uZmlnLmluZGV4LCBbSU5ERVhfRU5WLCBEQVRBQlJJQ0tTX0lOREVYX0VOVl0pID8/IHVuZGVmaW5lZDtcblxuICBjb25zdCBjb25maWd1cmVkID0gKGNvbmZpZy5pbmRleGVzID8/IFtdKVxuICAgIC5tYXAodG9SZXNvbHZlZEluZGV4KVxuICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgUmVzb2x2ZWRJbmRleENvbmZpZyA9PiBlbnRyeSAhPT0gbnVsbCk7XG5cbiAgLy8gRW5zdXJlIHRoZSBkZWZhdWx0IGluZGV4IGlzIHJlcHJlc2VudGVkIGluIHRoZSBrbm93biBzZXQuXG4gIGlmIChkZWZhdWx0SW5kZXhSYXcgJiYgIWNvbmZpZ3VyZWQuc29tZSgoaSkgPT4gaS5uYW1lID09PSBkZWZhdWx0SW5kZXhSYXcpKSB7XG4gICAgY29uc3QgZW52Q29sdW1ucyA9IGVudi5saXN0KHVuZGVmaW5lZCwgXCJTRUFSQ0hfQ09MVU1OU1wiKTtcbiAgICBjb25maWd1cmVkLnVuc2hpZnQoe1xuICAgICAgbmFtZTogZGVmYXVsdEluZGV4UmF3LFxuICAgICAgYWxpYXM6IGRlZmF1bHRBbGlhcyhkZWZhdWx0SW5kZXhSYXcpLFxuICAgICAgLi4uKGVudkNvbHVtbnMubGVuZ3RoID4gMCA/IHsgY29sdW1uczogZW52Q29sdW1ucyB9IDoge30pLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3Qgc2VlbkFsaWFzZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgaW5kZXhlcyA9IGNvbmZpZ3VyZWQubWFwKChlbnRyeSkgPT4ge1xuICAgIGxldCBhbGlhcyA9IGVudHJ5LmFsaWFzO1xuICAgIHdoaWxlIChzZWVuQWxpYXNlcy5oYXMoYWxpYXMpKSBhbGlhcyA9IGAke2FsaWFzfV9gO1xuICAgIHNlZW5BbGlhc2VzLmFkZChhbGlhcyk7XG4gICAgcmV0dXJuIHsgLi4uZW50cnksIGFsaWFzIH07XG4gIH0pO1xuXG4gIGNvbnN0IGRlZmF1bHRJbmRleCA9IGRlZmF1bHRJbmRleFJhdyA/PyBpbmRleGVzWzBdPy5uYW1lO1xuICBjb25zdCBjb2x1bW5zID0gZW52Lmxpc3QoY29uZmlnLmNvbHVtbnMsIFwiU0VBUkNIX0NPTFVNTlNcIik7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vYmplY3Qub3B0aW9uYWwoXCJkZWZhdWx0SW5kZXhcIiwgZGVmYXVsdEluZGV4KSxcbiAgICBpbmRleGVzLFxuICAgIC4uLm9iamVjdC5vcHRpb25hbChcImVuZHBvaW50XCIsIGVudi5zdHJpbmcoY29uZmlnLmVuZHBvaW50LCBFTkRQT0lOVF9FTlYpKSxcbiAgICAuLi4oY29sdW1ucy5sZW5ndGggPiAwID8geyBjb2x1bW5zIH0gOiB7fSksXG4gICAgcGFnZVNpemU6IGVudi5wb3NpdGl2ZUludChjb25maWcucGFnZVNpemUsIFwiU0VBUkNIX1BBR0VfU0laRVwiLCBERUZBVUxUX1BBR0VfU0laRSksXG4gICAgbW9kZTogcmVzb2x2ZU1vZGUoY29uZmlnLm1vZGUpLFxuICAgIC4uLm9iamVjdC5vcHRpb25hbChcbiAgICAgIFwiZW1iZWRkaW5nTW9kZWxcIixcbiAgICAgIGVudi5zdHJpbmcoY29uZmlnLmVtYmVkZGluZ01vZGVsLCBcIlNFQVJDSF9FTUJFRERJTkdfTU9ERUxcIiksXG4gICAgKSxcbiAgICBiYXNlUGF0aDogREVGQVVMVF9CQVNFX1BBVEgsXG4gICAgdGltZW91dE1zOiBlbnYucG9zaXRpdmVJbnQoY29uZmlnLnRpbWVvdXRNcywgXCJTRUFSQ0hfVElNRU9VVF9NU1wiLCBERUZBVUxUX1RJTUVPVVRfTVMpLFxuICAgIGFsbG93V3JpdGU6IGVudi5ib29sZWFuKGNvbmZpZy5hbGxvd1dyaXRlLCBcIlNFQVJDSF9XUklURVwiKSA/PyBmYWxzZSxcbiAgICAuLi4oY29uZmlnLmVuc3VyZU9uU2V0dXAgPyB7IGVuc3VyZU9uU2V0dXA6IGNvbmZpZy5lbnN1cmVPblNldHVwIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGNhbGxlci1zdXBwbGllZCBpbmRleCByZWZlcmVuY2UgKGEgZnVsbCBVQyBuYW1lIG9yIGEgY29uZmlndXJlZFxuICogYWxpYXMpIGludG8gYSBjb25jcmV0ZSBpbmRleCBuYW1lLiBGYWxscyBiYWNrIHRvIHRoZSBkZWZhdWx0IGluZGV4IHdoZW4gdGhlXG4gKiByZWZlcmVuY2UgaXMgZW1wdHkuIFJldHVybnMgYG51bGxgIHdoZW4gbm90aGluZyBjYW4gYmUgcmVzb2x2ZWQgc28gY2FsbGVyc1xuICogcmFpc2UgYSBzdGFibGUsIHVzZXItZmFjaW5nIGVycm9yIHJhdGhlciB0aGFuIGNhbGxpbmcgYSBwaGFudG9tIGluZGV4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUluZGV4TmFtZShcbiAgY29uZmlnOiBSZXNvbHZlZFNlYXJjaENvbmZpZyxcbiAgcmVmZXJlbmNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgcmVmID0gc3RyaW5nLnRyaW1Ub051bGwocmVmZXJlbmNlKTtcbiAgaWYgKHJlZiA9PT0gbnVsbCkgcmV0dXJuIGNvbmZpZy5kZWZhdWx0SW5kZXggPz8gbnVsbDtcbiAgY29uc3QgYnlBbGlhcyA9IGNvbmZpZy5pbmRleGVzLmZpbmQoKGkpID0+IGkuYWxpYXMgPT09IHJlZiB8fCBpLm5hbWUgPT09IHJlZik7XG4gIGlmIChieUFsaWFzKSByZXR1cm4gYnlBbGlhcy5uYW1lO1xuICAvLyBBY2NlcHQgYW4gdW5yZWdpc3RlcmVkIGJ1dCBmdWxseS1xdWFsaWZpZWQgVUMgbmFtZSAodGhyZWUgZG90dGVkIHBhcnRzKS5cbiAgaWYgKHJlZi5zcGxpdChcIi5cIikuZmlsdGVyKEJvb2xlYW4pLmxlbmd0aCA9PT0gMykgcmV0dXJuIHJlZjtcbiAgcmV0dXJuIGNvbmZpZy5kZWZhdWx0SW5kZXggPz8gbnVsbDtcbn1cblxuLyoqIFRoZSBrbm93biBjb25maWcgZm9yIGFuIGluZGV4IG5hbWUsIHdoZW4gdGhlIHBsdWdpbiB3YXMgdG9sZCBhYm91dCBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRleENvbmZpZ0ZvcihcbiAgY29uZmlnOiBSZXNvbHZlZFNlYXJjaENvbmZpZyxcbiAgbmFtZTogc3RyaW5nLFxuKTogUmVzb2x2ZWRJbmRleENvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb25maWcuaW5kZXhlcy5maW5kKChpKSA9PiBpLm5hbWUgPT09IG5hbWUgfHwgaS5hbGlhcyA9PT0gbmFtZSk7XG59XG4iXX0=
package/package.json CHANGED
@@ -28,11 +28,11 @@
28
28
  "dependencies": {
29
29
  "@databricks/appkit": "^0.43.0",
30
30
  "@databricks/sdk-experimental": "^0.17.0",
31
- "@dbx-tools/appkit": "0.6.46",
32
- "@dbx-tools/model": "0.6.46",
33
- "@dbx-tools/shared-core": "0.6.46",
34
- "@dbx-tools/shared-model": "0.6.46",
35
- "@dbx-tools/shared-search": "0.6.46",
31
+ "@dbx-tools/appkit": "0.6.48",
32
+ "@dbx-tools/model": "0.6.48",
33
+ "@dbx-tools/shared-core": "0.6.48",
34
+ "@dbx-tools/shared-model": "0.6.48",
35
+ "@dbx-tools/shared-search": "0.6.48",
36
36
  "@mastra/core": "^1.47.0",
37
37
  "pg": "^8.22.0",
38
38
  "zod": "4.3.6"
@@ -51,7 +51,7 @@
51
51
  "./package.json": "./package.json"
52
52
  }
53
53
  },
54
- "version": "0.6.46",
54
+ "version": "0.6.48",
55
55
  "types": "./lib/index.d.ts",
56
56
  "type": "module",
57
57
  "exports": {
package/src/config.ts CHANGED
@@ -23,7 +23,7 @@
23
23
  */
24
24
 
25
25
  import { ConfigurationError, type BasePluginConfig } from "@databricks/appkit";
26
- import { object, string } from "@dbx-tools/shared-core";
26
+ import { env, object, string } from "@dbx-tools/shared-core";
27
27
  import type { SearchDocument, SearchMode } from "@dbx-tools/shared-search";
28
28
  import type { JSONSchema7 } from "json-schema";
29
29
 
@@ -235,21 +235,9 @@ function toResolvedIndex(entry: string | SearchIndexConfig): ResolvedIndexConfig
235
235
  };
236
236
  }
237
237
 
238
- /** Coerce a positive integer from config or an env var, falling back to a default. */
239
- function resolvePositiveInt(
240
- configured: number | undefined,
241
- envVar: string,
242
- fallback: number,
243
- ): number {
244
- const raw = configured ?? Number(process.env[envVar]);
245
- const value = Number(raw);
246
- if (Number.isFinite(value) && value > 0) return Math.floor(value);
247
- return fallback;
248
- }
249
-
250
238
  /** Parse and validate a {@link SearchMode} from config or an env var. */
251
239
  function resolveMode(configured: SearchMode | undefined): SearchMode {
252
- const raw = configured ?? string.trimToNull(process.env.SEARCH_MODE) ?? undefined;
240
+ const raw = configured ?? env.text("SEARCH_MODE") ?? undefined;
253
241
  if (raw === undefined) return DEFAULT_MODE;
254
242
  if (raw !== "hybrid" && raw !== "vector" && raw !== "keyword") {
255
243
  throw new ConfigurationError(
@@ -267,11 +255,7 @@ function resolveMode(configured: SearchMode | undefined): SearchMode {
267
255
  * and a bad mode throws a {@link ConfigurationError} naming the field.
268
256
  */
269
257
  export function resolveSearchConfig(config: SearchPluginConfig = {}): ResolvedSearchConfig {
270
- const defaultIndexRaw =
271
- string.trimToNull(config.index) ??
272
- string.trimToNull(process.env[INDEX_ENV]) ??
273
- string.trimToNull(process.env[DATABRICKS_INDEX_ENV]) ??
274
- undefined;
258
+ const defaultIndexRaw = env.string(config.index, [INDEX_ENV, DATABRICKS_INDEX_ENV]) ?? undefined;
275
259
 
276
260
  const configured = (config.indexes ?? [])
277
261
  .map(toResolvedIndex)
@@ -279,11 +263,11 @@ export function resolveSearchConfig(config: SearchPluginConfig = {}): ResolvedSe
279
263
 
280
264
  // Ensure the default index is represented in the known set.
281
265
  if (defaultIndexRaw && !configured.some((i) => i.name === defaultIndexRaw)) {
282
- const fromEnv = string.parseList(process.env.SEARCH_COLUMNS);
266
+ const envColumns = env.list(undefined, "SEARCH_COLUMNS");
283
267
  configured.unshift({
284
268
  name: defaultIndexRaw,
285
269
  alias: defaultAlias(defaultIndexRaw),
286
- ...(fromEnv.length > 0 ? { columns: fromEnv } : {}),
270
+ ...(envColumns.length > 0 ? { columns: envColumns } : {}),
287
271
  });
288
272
  }
289
273
 
@@ -296,34 +280,22 @@ export function resolveSearchConfig(config: SearchPluginConfig = {}): ResolvedSe
296
280
  });
297
281
 
298
282
  const defaultIndex = defaultIndexRaw ?? indexes[0]?.name;
299
- const columns = config.columns ?? string.parseList(process.env.SEARCH_COLUMNS);
283
+ const columns = env.list(config.columns, "SEARCH_COLUMNS");
300
284
 
301
285
  return {
302
- ...(defaultIndex ? { defaultIndex } : {}),
286
+ ...object.optional("defaultIndex", defaultIndex),
303
287
  indexes,
304
- ...((string.trimToNull(config.endpoint) ?? string.trimToNull(process.env[ENDPOINT_ENV]))
305
- ? {
306
- endpoint:
307
- string.trimToNull(config.endpoint) ??
308
- string.trimToNull(process.env[ENDPOINT_ENV]) ??
309
- undefined,
310
- }
311
- : {}),
288
+ ...object.optional("endpoint", env.string(config.endpoint, ENDPOINT_ENV)),
312
289
  ...(columns.length > 0 ? { columns } : {}),
313
- pageSize: resolvePositiveInt(config.pageSize, "SEARCH_PAGE_SIZE", DEFAULT_PAGE_SIZE),
290
+ pageSize: env.positiveInt(config.pageSize, "SEARCH_PAGE_SIZE", DEFAULT_PAGE_SIZE),
314
291
  mode: resolveMode(config.mode),
315
- ...((string.trimToNull(config.embeddingModel) ??
316
- string.trimToNull(process.env.SEARCH_EMBEDDING_MODEL))
317
- ? {
318
- embeddingModel:
319
- string.trimToNull(config.embeddingModel) ??
320
- string.trimToNull(process.env.SEARCH_EMBEDDING_MODEL) ??
321
- undefined,
322
- }
323
- : {}),
292
+ ...object.optional(
293
+ "embeddingModel",
294
+ env.string(config.embeddingModel, "SEARCH_EMBEDDING_MODEL"),
295
+ ),
324
296
  basePath: DEFAULT_BASE_PATH,
325
- timeoutMs: resolvePositiveInt(config.timeoutMs, "SEARCH_TIMEOUT_MS", DEFAULT_TIMEOUT_MS),
326
- allowWrite: config.allowWrite ?? object.toBoolean(process.env.SEARCH_WRITE) ?? false,
297
+ timeoutMs: env.positiveInt(config.timeoutMs, "SEARCH_TIMEOUT_MS", DEFAULT_TIMEOUT_MS),
298
+ allowWrite: env.boolean(config.allowWrite, "SEARCH_WRITE") ?? false,
327
299
  ...(config.ensureOnSetup ? { ensureOnSetup: config.ensureOnSetup } : {}),
328
300
  };
329
301
  }