@dbx-tools/appkit-web-search 0.6.87 → 0.6.89

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
@@ -44,7 +44,7 @@
44
44
  * @module
45
45
  */
46
46
  import { ConfigurationError } from "@databricks/appkit";
47
- import { config as runtimeConfig } from "@dbx-tools/core";
47
+ import { config as coreConfig } from "@dbx-tools/core";
48
48
  import { serving } from "@dbx-tools/model";
49
49
  import { json, object, string } from "@dbx-tools/shared-core";
50
50
  import { parseAllowedUrls, toUrlAllowList } from "./allowlist.js";
@@ -146,7 +146,7 @@ export const WEB_SEARCH_CONFIG_SCHEMA = {
146
146
  * silently leave the built-in tool specs in place, so it throws.
147
147
  */
148
148
  function parseToolsEnv() {
149
- const raw = runtimeConfig.text("WEB_SEARCH_TOOLS", runtimeConfig.ENV_ONLY);
149
+ const raw = coreConfig.text("WEB_SEARCH_TOOLS", coreConfig.ENV_ONLY);
150
150
  if (raw === undefined)
151
151
  return {};
152
152
  const parsed = json.parseRecord(raw);
@@ -160,10 +160,10 @@ function resolveModelPin(config) {
160
160
  const fromConfig = string.trimToNull(config.model);
161
161
  if (fromConfig !== null)
162
162
  return { model: fromConfig, source: "config" };
163
- const fromModelEnv = runtimeConfig.text(MODEL_ENV, runtimeConfig.ENV_ONLY);
163
+ const fromModelEnv = coreConfig.text(MODEL_ENV, coreConfig.ENV_ONLY);
164
164
  if (fromModelEnv !== undefined)
165
165
  return { model: fromModelEnv, source: MODEL_ENV };
166
- const fromResourceEnv = runtimeConfig.text(SERVING_ENDPOINT_ENV, runtimeConfig.ENV_ONLY);
166
+ const fromResourceEnv = coreConfig.text(SERVING_ENDPOINT_ENV, coreConfig.ENV_ONLY);
167
167
  if (fromResourceEnv !== undefined) {
168
168
  return { model: fromResourceEnv, source: SERVING_ENDPOINT_ENV };
169
169
  }
@@ -174,7 +174,7 @@ function resolveModelPin(config) {
174
174
  * contradicts the allow-list entries it was given.
175
175
  */
176
176
  function resolveUrlPolicy(configured, patterns) {
177
- const raw = configured ?? runtimeConfig.text("WEB_SEARCH_URL_POLICY", runtimeConfig.ENV_ONLY);
177
+ const raw = configured ?? coreConfig.text("WEB_SEARCH_URL_POLICY", coreConfig.ENV_ONLY);
178
178
  if (raw === undefined)
179
179
  return patterns.length > 0 ? "allowlist" : "unrestricted";
180
180
  if (raw !== "allowlist" && raw !== "unrestricted") {
@@ -222,22 +222,22 @@ export function toApprovalPolicy(gate) {
222
222
  * {@link ConfigurationError} naming the field and the environment variable.
223
223
  */
224
224
  export function resolveWebSearchConfig(config = {}) {
225
- const patterns = parseAllowedUrls(config.allowedUrls ?? runtimeConfig.text("WEB_SEARCH_ALLOWED_URLS", runtimeConfig.ENV_ONLY));
225
+ const patterns = parseAllowedUrls(config.allowedUrls ?? coreConfig.text("WEB_SEARCH_ALLOWED_URLS", coreConfig.ENV_ONLY));
226
226
  const urlPolicy = resolveUrlPolicy(config.urlPolicy, patterns);
227
227
  const { model, source } = resolveModelPin(config);
228
- const fallbacks = runtimeConfig.list(config.modelFallbacks, "WEB_SEARCH_MODEL_FALLBACKS", undefined, runtimeConfig.ENV_ONLY);
228
+ const fallbacks = coreConfig.list(config.modelFallbacks, "WEB_SEARCH_MODEL_FALLBACKS", undefined, coreConfig.ENV_ONLY);
229
229
  return {
230
230
  ...(model ? { model } : {}),
231
231
  modelSource: source,
232
232
  modelFallbacks: fallbacks.length > 0 ? fallbacks : DEFAULT_MODEL_FALLBACKS,
233
233
  webSearchTools: { ...parseToolsEnv(), ...(config.webSearchTools ?? {}) },
234
- fuzzy: runtimeConfig.boolean(config.modelFuzzyMatch, "WEB_SEARCH_FUZZY", runtimeConfig.ENV_ONLY) ??
234
+ fuzzy: coreConfig.boolean(config.modelFuzzyMatch, "WEB_SEARCH_FUZZY", coreConfig.ENV_ONLY) ??
235
235
  true,
236
- fuzzyThreshold: runtimeConfig.positiveNumber(config.modelFuzzyThreshold, "WEB_SEARCH_FUZZY_THRESHOLD", serving.DEFAULT_FUZZY_THRESHOLD, runtimeConfig.ENV_ONLY),
237
- maxCitations: runtimeConfig.positiveInt(config.maxCitations, "WEB_SEARCH_MAX_CITATIONS", DEFAULT_MAX_CITATIONS, runtimeConfig.ENV_ONLY),
238
- fetchMaxLength: runtimeConfig.positiveInt(config.fetchMaxLength, "WEB_SEARCH_FETCH_MAX_LENGTH", DEFAULT_FETCH_MAX_LENGTH, runtimeConfig.ENV_ONLY),
239
- timeoutMs: runtimeConfig.positiveInt(config.timeoutMs, "WEB_SEARCH_TIMEOUT_MS", DEFAULT_TIMEOUT_MS, runtimeConfig.ENV_ONLY),
240
- scrapeFallback: runtimeConfig.boolean(config.scrapeFallback, "WEB_SEARCH_SCRAPE_FALLBACK", runtimeConfig.ENV_ONLY) ?? true,
236
+ fuzzyThreshold: coreConfig.positiveNumber(config.modelFuzzyThreshold, "WEB_SEARCH_FUZZY_THRESHOLD", serving.DEFAULT_FUZZY_THRESHOLD, coreConfig.ENV_ONLY),
237
+ maxCitations: coreConfig.positiveInt(config.maxCitations, "WEB_SEARCH_MAX_CITATIONS", DEFAULT_MAX_CITATIONS, coreConfig.ENV_ONLY),
238
+ fetchMaxLength: coreConfig.positiveInt(config.fetchMaxLength, "WEB_SEARCH_FETCH_MAX_LENGTH", DEFAULT_FETCH_MAX_LENGTH, coreConfig.ENV_ONLY),
239
+ timeoutMs: coreConfig.positiveInt(config.timeoutMs, "WEB_SEARCH_TIMEOUT_MS", DEFAULT_TIMEOUT_MS, coreConfig.ENV_ONLY),
240
+ scrapeFallback: coreConfig.boolean(config.scrapeFallback, "WEB_SEARCH_SCRAPE_FALLBACK", coreConfig.ENV_ONLY) ?? true,
241
241
  urlPolicy,
242
242
  allowList: toUrlAllowList(urlPolicy === "allowlist" ? patterns : []),
243
243
  approval: toApprovalPolicy(config.approval),
@@ -259,4 +259,4 @@ export function approvalMatches(gate, urls) {
259
259
  const list = toUrlAllowList(policy.patterns);
260
260
  return urls.some((url) => list.allows(url));
261
261
  }
262
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQXlCLE1BQU0sb0JBQW9CLENBQUM7QUFDL0UsT0FBTyxFQUFFLE1BQU0sSUFBSSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQWtCLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQXFCLE1BQU0sZ0JBQWdCLENBQUM7QUE2QnJGLHlEQUF5RDtBQUN6RCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsa0JBQWtCLENBQUM7QUFFNUMsK0VBQStFO0FBQy9FLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGtDQUFrQyxDQUFDO0FBS3ZFOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFzQjtJQUN4RCx5QkFBeUI7SUFDekIsMkJBQTJCO0lBQzNCLGtCQUFrQjtJQUNsQix1QkFBdUI7Q0FDeEIsQ0FBQztBQUVGLDRFQUE0RTtBQUM1RSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFFeEMsb0VBQW9FO0FBQ3BFLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLE1BQU0sQ0FBQztBQUUvQyxtRUFBbUU7QUFDbkUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDO0FBa0h6QywrREFBK0Q7QUFDL0QsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQWdCO0lBQ25ELElBQUksRUFBRSxRQUFRO0lBQ2QsVUFBVSxFQUFFO1FB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Q3JCLDRCQUE0QixFQUM1QixhQUFhLENBQUMsUUFBUSxDQUN2QixJQUFJLElBQUk7UUFDWCxTQUFTO1FBQ1QsU0FBUyxFQUFFLGNBQWMsQ0FBQyxTQUFTLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRSxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztLQUM1QyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzdCLElBQW1DLEVBQ25DLElBQXVCO0lBRXZCLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDekMsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVE7UUFBRSxPQUFPLElBQUksQ0FBQztJQUMxQyxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSB3ZWItc2VhcmNoIHBsdWdpbjogdGhlIHR5cGVkXG4gKiB7QGxpbmsgV2ViU2VhcmNoUGx1Z2luQ29uZmlnfSAodGhlIHBsdWdpbidzIHNsaWNlIG9mIEFwcEtpdCBjb25maWcpLCB0aGVcbiAqIEpTT04gU2NoZW1hIHRoZSBtYW5pZmVzdCBwdWJsaXNoZXMgZm9yIGl0LCBhbmQge0BsaW5rIHJlc29sdmVXZWJTZWFyY2hDb25maWd9XG4gKiB3aGljaCBsYXllcnMgdGhhdCBjb25maWcgb3ZlciBlbnZpcm9ubWVudCBkZWZhdWx0cyBpbnRvIHRoZSBjb25jcmV0ZVxuICoge0BsaW5rIFJlc29sdmVkV2ViU2VhcmNoQ29uZmlnfSB0aGUgcnVudGltZSArIHRvb2xzIHJlYWQuXG4gKlxuICogYHdlYl9zZWFyY2hgIHJ1bnMgb24gdGhlIERhdGFicmlja3MgTW9kZWwgU2VydmluZyBuYXRpdmUgd2ViLXNlYXJjaCB0b29sXG4gKiAoc2VlIGBwcm92aWRlci50c2AgLyBgc2VhcmNoLnRzYCksIHNvIHRoZSBrZXkga25vYiBpcyB3aGljaCB3ZWItc2VhcmNoLVxuICogY2FwYWJsZSBtb2RlbCB0byB1c2UuIEl0IHJlc29sdmVzIGluZGVwZW5kZW50bHkgb2YgdGhlIGNhbGxpbmcgYWdlbnQncyBjaGF0XG4gKiBtb2RlbDogYG1vZGVsYCAoYSBuYW1lLCBsb29zZSBuYW1lLCBvciBjYXBhYmlsaXR5IGNsYXNzKSBpcyBmdXp6eS1tYXRjaGVkXG4gKiBhZ2FpbnN0IHRoZSB3b3Jrc3BhY2UgY2F0YWxvZ3VlLCBhbmQgd2hlbiBub3RoaW5nIGlzIHBpbm5lZCB0aGVcbiAqIHtAbGluayBXZWJTZWFyY2hQbHVnaW5Db25maWcubW9kZWxGYWxsYmFja3N9IG9yZGVyIChHZW1pbmksIHRoZW4gR1BULCB0aGVuIGFcbiAqIHJlcG8gZmxvb3IpIHBpY2tzIHRoZSBmaXJzdCB3ZWItc2VhcmNoLWNhcGFibGUgZW5kcG9pbnQgdGhhdCBleGlzdHMuXG4gKlxuICogV2hpY2ggZW5kcG9pbnQgaWQgaXMgdXNlZCBmb2xsb3dzIHRoZSBzdGFuZGFyZCBwcmVjZWRlbmNlIC0gZXhwbGljaXQgcGx1Z2luXG4gKiBjb25maWcsIHRoZW4gZW52aXJvbm1lbnQsIHRoZW4gYSBkZWZhdWx0IC0gd2l0aCB0d28gZW52aXJvbm1lbnQgc291cmNlczpcbiAqXG4gKiAgIDEuIGBtb2RlbGAgaW4gcGx1Z2luIGNvbmZpZztcbiAqICAgMi4gYFdFQl9TRUFSQ0hfTU9ERUxgLCB0aGUgZGVkaWNhdGVkIG92ZXJyaWRlLCBzbyBhIGRlcGxveW1lbnQgY2FuIHBvaW50XG4gKiAgICAgIHdlYiBzZWFyY2ggYXQgYSBkaWZmZXJlbnQgZW5kcG9pbnQgdGhhbiB0aGUgYWdlbnQncyBjaGF0IG1vZGVsO1xuICogICAzLiBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgLCBBcHBLaXQncyBzdGFuZGFyZCBuYW1lIGZvciBhXG4gKiAgICAgIE1vZGVsIFNlcnZpbmcgYmluZGluZywgaG9ub3JlZCBzbyB0aGUgcmVzb3VyY2UgZGVjbGFyZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiAgICAgIHdpcmVzIHRoaXMgcGx1Z2luIHVwIGxpa2UgYW55IG90aGVyLiBCZWNhdXNlIHRoYXQgYmluZGluZyBpcyBzaGFyZWRcbiAqICAgICAgd2l0aCB3aGF0ZXZlciBlbHNlIHRoZSBhcHAgc2VydmVzLCBpdCBpcyB0cmVhdGVkIGFzIGEgcHJlZmVyZW5jZTogYW5cbiAqICAgICAgZW5kcG9pbnQgdGhhdCBjYW5ub3QgcnVuIHRoZSBuYXRpdmUgd2ViLXNlYXJjaCB0b29sIGlzIHNraXBwZWQgaW5cbiAqICAgICAgZmF2b3Igb2Yge0BsaW5rIFdlYlNlYXJjaFBsdWdpbkNvbmZpZy5tb2RlbEZhbGxiYWNrc30gcmF0aGVyIHRoYW5cbiAqICAgICAgZmFpbGluZyB0aGUgY2FsbC4gQSBwaW4gZnJvbSAoMSkgb3IgKDIpIGlzIGV4cGxpY2l0IGFuZCBET0VTIGZhaWw7XG4gKiAgIDQuIG90aGVyd2lzZSB0aGUgZmFsbGJhY2sgb3JkZXIsIHJlc29sdmVkIGFnYWluc3QgdGhlIGxpdmUgY2F0YWxvZ3VlLlxuICpcbiAqIFdoaWNoIG1vZGVsIHdpbnMgaXMgZGVjaWRlZCBsYXppbHksIGF0IGNhbGwgdGltZSwgYWdhaW5zdCB0aGUgbGl2ZVxuICogY2F0YWxvZ3VlLiBSZXNvbHV0aW9uIGhlcmUgaXMgZWFnZXIgYWJvdXQgZXZlcnl0aGluZyBlbHNlIGFuZCBmYWlscyBsb3VkbHlcbiAqIG9uIGEgY29udHJhZGljdGlvbjogYW4gdW5wYXJzZWFibGUgYFdFQl9TRUFSQ0hfVE9PTFNgLCBhbiB1bmtub3duXG4gKiB7QGxpbmsgVXJsUG9saWN5TW9kZX0sIG9yIGEgVVJMIHBvbGljeSB0aGF0IGRpc2FncmVlcyB3aXRoIHRoZSBhbGxvdy1saXN0IGl0XG4gKiB3YXMgZ2l2ZW4uXG4gKlxuICogRW52IGZhbGxiYWNrczogYFdFQl9TRUFSQ0hfTU9ERUxgLCBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgLFxuICogYFdFQl9TRUFSQ0hfTU9ERUxfRkFMTEJBQ0tTYCwgYFdFQl9TRUFSQ0hfVE9PTFNgIChKU09OKSxcbiAqIGBXRUJfU0VBUkNIX1VSTF9QT0xJQ1lgLCBgV0VCX1NFQVJDSF9BTExPV0VEX1VSTFNgLFxuICogYFdFQl9TRUFSQ0hfTUFYX0NJVEFUSU9OU2AsIGBXRUJfU0VBUkNIX0ZFVENIX01BWF9MRU5HVEhgLFxuICogYFdFQl9TRUFSQ0hfVElNRU9VVF9NU2AsIGBXRUJfU0VBUkNIX1NDUkFQRV9GQUxMQkFDS2AsIGBXRUJfU0VBUkNIX0ZVWlpZYCxcbiAqIGBXRUJfU0VBUkNIX0ZVWlpZX1RIUkVTSE9MRGAuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciwgdHlwZSBCYXNlUGx1Z2luQ29uZmlnIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY29uZmlnIGFzIHJ1bnRpbWVDb25maWcgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBzZXJ2aW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmltcG9ydCB7IGpzb24sIG9iamVjdCwgdHlwZSBPbmVPck1hbnksIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IEpTT05TY2hlbWE3IH0gZnJvbSBcImpzb24tc2NoZW1hXCI7XG5pbXBvcnQgeyBwYXJzZUFsbG93ZWRVcmxzLCB0b1VybEFsbG93TGlzdCwgdHlwZSBVcmxBbGxvd0xpc3QgfSBmcm9tIFwiLi9hbGxvd2xpc3QudHNcIjtcblxuLyoqXG4gKiBBIFVSTC1wYXR0ZXJuIGdhdGUgZm9yIHBlci10b29sIGFwcHJvdmFsLiBgdHJ1ZWAgZ2F0ZXMgZXZlcnkgY2FsbDsgYVxuICogcGF0dGVybiAob3IgbGlzdCBvZiBwYXR0ZXJucywgaW4gdGhlIHtAbGluayBPbmVPck1hbnl9IHNoYXBlIHVzZWQgYWNyb3NzXG4gKiB0aGUgcmVwbykgZ2F0ZXMgb25seSBjYWxscyB3aG9zZSBVUkwgbWF0Y2hlcy4gUGF0dGVybnMgdXNlIHRoZSBzYW1lIGdsb2JcbiAqIHN5bnRheCBhcyB0aGUgYWxsb3ctbGlzdCAoc2VlIGBhbGxvd2xpc3QudHNgKS4gT21pdCAvIGBmYWxzZWAgZm9yIG5vXG4gKiBhcHByb3ZhbC4gTm9ybWFsaXplZCB0byBhbiB7QGxpbmsgQXBwcm92YWxQb2xpY3l9IGJlZm9yZSB1c2UuXG4gKi9cbmV4cG9ydCB0eXBlIEFwcHJvdmFsR2F0ZSA9IGJvb2xlYW4gfCBPbmVPck1hbnk8c3RyaW5nPiB8IHN0cmluZztcblxuLyoqXG4gKiBUaGUgbm9ybWFsaXplZCBmb3JtIG9mIGFuIHtAbGluayBBcHByb3ZhbEdhdGV9OiB3aGljaCBjYWxscyBwYXVzZSBmb3IgYVxuICogaHVtYW4uIGBcIm5vbmVcImAgcnVucyBldmVyeSBjYWxsIHN0cmFpZ2h0IHRocm91Z2gsIGBcImFsd2F5c1wiYCBnYXRlcyBhbGwgb2ZcbiAqIHRoZW0sIGFuZCBgXCJ1cmxzXCJgIGdhdGVzIG9ubHkgY2FsbHMgd2hvc2UgVVJMIG1hdGNoZXMgb25lIG9mIGBwYXR0ZXJuc2AuXG4gKi9cbmV4cG9ydCB0eXBlIEFwcHJvdmFsUG9saWN5ID1cbiAgfCB7IHJlYWRvbmx5IG1vZGU6IFwibm9uZVwiIH1cbiAgfCB7IHJlYWRvbmx5IG1vZGU6IFwiYWx3YXlzXCIgfVxuICB8IHsgcmVhZG9ubHkgbW9kZTogXCJ1cmxzXCI7IHJlYWRvbmx5IHBhdHRlcm5zOiByZWFkb25seSBzdHJpbmdbXSB9O1xuXG4vKipcbiAqIFdoaWNoIFVSTHMgdGhlIHRvb2xzIG1heSByZWFjaC4gYFwiYWxsb3dsaXN0XCJgIHBlcm1pdHMgb25seSB0aGUgY29uZmlndXJlZFxuICogZW50cmllczsgYFwidW5yZXN0cmljdGVkXCJgIG5hbWVzIHRoZSBwZXJtaXNzaXZlIG1vZGUgZXhwbGljaXRseSwgc28gYW5cbiAqIHVucmVzdHJpY3RlZCBkZXBsb3ltZW50IGlzIGEgc3RhdGVkIGNob2ljZSB2aXNpYmxlIGluIHRoZSBib290IGxvZyByYXRoZXJcbiAqIHRoYW4gYW4gZW1wdHkgbGlzdCBub2JvZHkgbm90aWNlZC5cbiAqL1xuZXhwb3J0IHR5cGUgVXJsUG9saWN5TW9kZSA9IFwidW5yZXN0cmljdGVkXCIgfCBcImFsbG93bGlzdFwiO1xuXG4vKiogRGVkaWNhdGVkIG92ZXJyaWRlIGZvciB0aGUgd2ViLXNlYXJjaCBlbmRwb2ludCBpZC4gKi9cbmV4cG9ydCBjb25zdCBNT0RFTF9FTlYgPSBcIldFQl9TRUFSQ0hfTU9ERUxcIjtcblxuLyoqIEFwcEtpdCdzIHN0YW5kYXJkIGVudmlyb25tZW50IG5hbWUgZm9yIGEgTW9kZWwgU2VydmluZyBlbmRwb2ludCBiaW5kaW5nLiAqL1xuZXhwb3J0IGNvbnN0IFNFUlZJTkdfRU5EUE9JTlRfRU5WID0gXCJEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRVwiO1xuXG4vKiogV2hlcmUgdGhlIHBpbm5lZCB3ZWItc2VhcmNoIGVuZHBvaW50IGlkIGNhbWUgZnJvbSwgb3IgYFwibm9uZVwiYCB3aGVuIHVucGlubmVkLiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxTb3VyY2UgPSBcImNvbmZpZ1wiIHwgdHlwZW9mIE1PREVMX0VOViB8IHR5cGVvZiBTRVJWSU5HX0VORFBPSU5UX0VOViB8IFwibm9uZVwiO1xuXG4vKipcbiAqIERlZmF1bHQgd2ViLXNlYXJjaCBtb2RlbCBwcmVmZXJlbmNlLCB0cmllZCBpbiBvcmRlciB3aGVuIG5vIG1vZGVsIGlzXG4gKiBwaW5uZWQuIEdlbWluaSBmaXJzdCwgdGhlbiBHUFQgLSBib3RoIHN1cHBvcnQgdGhlIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2w7XG4gKiBhIHdvcmtzcGFjZSB0eXBpY2FsbHkgaGFzIGF0IGxlYXN0IG9uZS4gRWFjaCBpcyBmdXp6eS1tYXRjaGVkIGFnYWluc3QgdGhlXG4gKiBsaXZlIGNhdGFsb2d1ZSwgc28gYSBjbG9zZSB2YXJpYW50IChlLmcuIGBkYXRhYnJpY2tzLWdlbWluaS0zLTEtcHJvYCkgaXNcbiAqIHBpY2tlZCB3aGVuIHRoZSBleGFjdCBpZCBpc24ndCBwcmVzZW50LlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NT0RFTF9GQUxMQkFDS1M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICBcImRhdGFicmlja3MtZ2VtaW5pLTMtcHJvXCIsXG4gIFwiZGF0YWJyaWNrcy1nZW1pbmktMi01LXByb1wiLFxuICBcImRhdGFicmlja3MtZ3B0LTVcIixcbiAgXCJkYXRhYnJpY2tzLWdwdC01LW1pbmlcIixcbl07XG5cbi8qKiBEZWZhdWx0IGNhcCBvbiB0aGUgbnVtYmVyIG9mIGNpdGF0aW9ucyByZXR1cm5lZCBmcm9tIGEgc2luZ2xlIHNlYXJjaC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01BWF9DSVRBVElPTlMgPSAxMDtcblxuLyoqIERlZmF1bHQgY2FwIG9uIGNoYXJhY3RlcnMgcmV0dXJuZWQgZnJvbSBhIHNpbmdsZSBgd2ViX2ZldGNoYC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZFVENIX01BWF9MRU5HVEggPSA1MF8wMDA7XG5cbi8qKiBEZWZhdWx0IHBlci1yZXF1ZXN0IG5ldHdvcmsgdGltZW91dCAobXMpIGZvciBzZWFyY2ggKyBmZXRjaC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJTUVPVVRfTVMgPSAzMF8wMDA7XG5cbi8qKiBBcHBLaXQgY29uZmlnIGFjY2VwdGVkIGJ5IHRoZSB3ZWItc2VhcmNoIHBsdWdpbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU2VhcmNoUGx1Z2luQ29uZmlnIGV4dGVuZHMgQmFzZVBsdWdpbkNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgd2ViLXNlYXJjaCBtb2RlbCB0byB1c2UgYnkgZGVmYXVsdDogYSBEYXRhYnJpY2tzIHNlcnZpbmcgZW5kcG9pbnRcbiAgICogbmFtZSAoYFwiZGF0YWJyaWNrcy1nZW1pbmktMy1wcm9cImApLCBhIGxvb3NlIG5hbWUgKGBcImdlbWluaVwiYCwgYFwiZ3B0XCJgKSxcbiAgICogb3IgYSBjYXBhYmlsaXR5IGNsYXNzLiBGdXp6eS1tYXRjaGVkIGFnYWluc3QgdGhlIGxpdmUgY2F0YWxvZ3VlLiBGYWxsc1xuICAgKiBiYWNrIHRvIGBXRUJfU0VBUkNIX01PREVMYCwgdGhlbiBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgLCB0aGVuXG4gICAqIHRoZSB7QGxpbmsgbW9kZWxGYWxsYmFja3N9IG9yZGVyLiBDaG9zZW4gaW5kZXBlbmRlbnRseSBvZiB0aGUgY2FsbGluZ1xuICAgKiBhZ2VudCdzIGNoYXQgbW9kZWwuXG4gICAqL1xuICBtb2RlbD86IHN0cmluZztcbiAgLyoqXG4gICAqIFByaW9yaXR5LW9yZGVyZWQgd2ViLXNlYXJjaCBtb2RlbCBjYW5kaWRhdGVzIHRyaWVkIHdoZW4ge0BsaW5rIG1vZGVsfSBpc1xuICAgKiB1bnNldCwgZWFjaCBmdXp6eS1tYXRjaGVkIGFuZCBjaGVja2VkIGZvciB3ZWItc2VhcmNoIHN1cHBvcnQuIEZhbGxzIGJhY2tcbiAgICogdG8gYFdFQl9TRUFSQ0hfTU9ERUxfRkFMTEJBQ0tTYCAoY29tbWEvc3BhY2Utc2VwYXJhdGVkKSwgdGhlblxuICAgKiB7QGxpbmsgREVGQVVMVF9NT0RFTF9GQUxMQkFDS1N9IChHZW1pbmksIHRoZW4gR1BUKS5cbiAgICovXG4gIG1vZGVsRmFsbGJhY2tzPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKlxuICAgKiBQcm92aWRlciAtPiB0b29sLXNwZWMgb3ZlcnJpZGUgbWFwLCBtZXJnZWQgb3ZlciB0aGUgYnVpbHQtaW5cbiAgICoge0BsaW5rIFdFQl9TRUFSQ0hfUFJPVklERVJTfSBkZWZhdWx0cy4gS2V5ZWQgYnkgcHJvdmlkZXIgZmFtaWx5XG4gICAqIChgXCJvcGVuYWlcImAsIGBcImdlbWluaVwiYCk7IGVhY2ggdmFsdWUgbWF5IG92ZXJyaWRlIHRoZSBgdG9vbGAgZW50cnlcbiAgICogYW5kL29yIHRoZSBgYXBpYCBzdXJmYWNlLiBVc2UgdG8gY2hhbmdlIHRoZSB0b29sIHNoYXBlIGFzIHRoZSBwbGF0Zm9ybVxuICAgKiBldm9sdmVzIHdpdGhvdXQgYSBjb2RlIGNoYW5nZS4gRmFsbHMgYmFjayB0byBgV0VCX1NFQVJDSF9UT09MU2AgcGFyc2VkIGFzXG4gICAqIEpTT04uIFRoaXMgaXMgdGhlIGBXRUJfU0VBUkNIX1RPT0xTYCBzZXR0aW5nLlxuICAgKi9cbiAgd2ViU2VhcmNoVG9vbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqXG4gICAqIEVuYWJsZSBmdXp6eSBtYXRjaGluZyBvZiBsb29zZSBtb2RlbCBuYW1lcyBhZ2FpbnN0IHRoZSBjYXRhbG9ndWUuXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYDsgZmFsbHMgYmFjayB0byBgV0VCX1NFQVJDSF9GVVpaWWAuXG4gICAqL1xuICBtb2RlbEZ1enp5TWF0Y2g/OiBib29sZWFuO1xuICAvKiogRnVzZS5qcyBmdXp6eSB0aHJlc2hvbGQuIEZhbGxzIGJhY2sgdG8gYFdFQl9TRUFSQ0hfRlVaWllfVEhSRVNIT0xEYCwgdGhlbiB0aGUgc2hhcmVkIGRlZmF1bHQuICovXG4gIG1vZGVsRnV6enlUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBIYXJkIGNhcCBvbiB0aGUgbnVtYmVyIG9mIGNpdGF0aW9ucyBhIHNpbmdsZSBzZWFyY2ggcmV0dXJucy4gRmFsbHMgYmFja1xuICAgKiB0byBgV0VCX1NFQVJDSF9NQVhfQ0lUQVRJT05TYCwgdGhlbiB7QGxpbmsgREVGQVVMVF9NQVhfQ0lUQVRJT05TfS5cbiAgICovXG4gIG1heENpdGF0aW9ucz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEhhcmQgY2FwIG9uIHRoZSBjaGFyYWN0ZXIgbGVuZ3RoIG9mIGEgc2luZ2xlIGB3ZWJfZmV0Y2hgIHJlc3VsdC4gRmFsbHNcbiAgICogYmFjayB0byBgV0VCX1NFQVJDSF9GRVRDSF9NQVhfTEVOR1RIYCwgdGhlbiB7QGxpbmsgREVGQVVMVF9GRVRDSF9NQVhfTEVOR1RIfS5cbiAgICovXG4gIGZldGNoTWF4TGVuZ3RoPzogbnVtYmVyO1xuICAvKipcbiAgICogUGVyLXJlcXVlc3QgbmV0d29yayB0aW1lb3V0IGluIG1zIGZvciBzZWFyY2ggKyBmZXRjaC4gRmFsbHMgYmFjayB0b1xuICAgKiBgV0VCX1NFQVJDSF9USU1FT1VUX01TYCwgdGhlbiB7QGxpbmsgREVGQVVMVF9USU1FT1VUX01TfS5cbiAgICovXG4gIHRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEZhbGwgYmFjayB0byBhIER1Y2tEdWNrR28gc2NyYXBlIHdoZW4gdGhlIHdvcmtzcGFjZSBoYXMgTk8gZGVwbG95ZWRcbiAgICogd2ViLXNlYXJjaC1jYXBhYmxlIG1vZGVsIChubyBHUFQgLyBHZW1pbmkgc2VydmluZyBlbmRwb2ludCkuIFRoZSBuYXRpdmVcbiAgICogRGF0YWJyaWNrcyB0b29sIGlzIGFsd2F5cyBwcmVmZXJyZWQ7IHRoaXMgb25seSBraWNrcyBpbiB3aGVuIHRoZXJlIGlzIG5vXG4gICAqIG5hdGl2ZSBvcHRpb24sIHNvIHRoZSB0b29sIHN0aWxsIHJldHVybnMgcmVzdWx0cyBpbnN0ZWFkIG9mIGVycm9yaW5nLlxuICAgKiBEZWZhdWx0cyB0byBgdHJ1ZWA7IHNldCBgZmFsc2VgIChvciBgV0VCX1NFQVJDSF9TQ1JBUEVfRkFMTEJBQ0s9MGApIHRvXG4gICAqIHJlcXVpcmUgYSBuYXRpdmUgbW9kZWwgYW5kIGVycm9yIG90aGVyd2lzZS5cbiAgICovXG4gIHNjcmFwZUZhbGxiYWNrPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoaWNoIFVSTHMgdGhlIHRvb2xzIG1heSByZWFjaCAoe0BsaW5rIFVybFBvbGljeU1vZGV9KS4gRmFsbHMgYmFjayB0b1xuICAgKiBgV0VCX1NFQVJDSF9VUkxfUE9MSUNZYCwgdGhlbiB0byBgXCJhbGxvd2xpc3RcImAgd2hlbiB7QGxpbmsgYWxsb3dlZFVybHN9XG4gICAqIGhhcyBlbnRyaWVzIGFuZCBgXCJ1bnJlc3RyaWN0ZWRcImAgd2hlbiBpdCBkb2VzIG5vdC4gTmFtaW5nIHRoZSBtb2RlXG4gICAqIGV4cGxpY2l0bHkgaXMgdGhlIHdheSB0byBzdGF0ZSB0aGF0IGFuIG9wZW4gZGVwbG95bWVudCBpcyBpbnRlbmRlZDtcbiAgICogYFwiYWxsb3dsaXN0XCJgIHdpdGggbm8gZW50cmllcywgb3IgYFwidW5yZXN0cmljdGVkXCJgIGFsb25nc2lkZSBlbnRyaWVzLCBpc1xuICAgKiBhIGNvbnRyYWRpY3Rpb24gYW5kIGZhaWxzIGF0IHJlc29sdXRpb24uXG4gICAqL1xuICB1cmxQb2xpY3k/OiBVcmxQb2xpY3lNb2RlO1xuICAvKipcbiAgICogT3B0aW9uYWwgVVJMIGFsbG93LWxpc3QuIEVhY2ggZW50cnkgaXMgYSBnbG9iIChvciBiYXJlIGhvc3QpIHRlc3RlZFxuICAgKiBhZ2FpbnN0IGEgVVJMJ3MgZnVsbCBgaHJlZmAuIFdoZW4gc2V0LCBgd2ViX3NlYXJjaGAgc2lsZW50bHkgZmlsdGVyc1xuICAgKiBjaXRhdGlvbnMgdG8gdGhlIHBlcm1pdHRlZCBzZXQgYW5kIGB3ZWJfZmV0Y2hgIHJlZnVzZXMgYSBkaXNhbGxvd2VkIFVSTC5cbiAgICogQWNjZXB0cyBhIGBzdHJpbmdbXWAgb3IgYSBjb21tYS0vd2hpdGVzcGFjZS1zZXBhcmF0ZWQgc3RyaW5nOyBmYWxscyBiYWNrXG4gICAqIHRvIGBXRUJfU0VBUkNIX0FMTE9XRURfVVJMU2AuIE9taXQgKG9yIGxlYXZlIGVtcHR5KSBmb3Igbm8gcmVzdHJpY3Rpb24uXG4gICAqIFNlZSBgYWxsb3dsaXN0LnRzYC5cbiAgICovXG4gIGFsbG93ZWRVcmxzPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKlxuICAgKiBBcHByb3ZhbCBnYXRlIGFwcGxpZWQgdG8gQk9USCB0b29scyAocGVyLXRvb2wgb3ZlcnJpZGVzIHZpYVxuICAgKiB7QGxpbmsgV2ViU2VhcmNoVG9vbE9wdGlvbnMuYXBwcm92YWx9IHdpbikuIGB0cnVlYCBnYXRlcyBldmVyeSBjYWxsO1xuICAgKiBhIFVSTC1wYXR0ZXJuIChvciBsaXN0KSBnYXRlcyBvbmx5IG1hdGNoaW5nIGNhbGxzOyBhblxuICAgKiB7QGxpbmsgQXBwcm92YWxQb2xpY3l9IHN0YXRlcyB0aGUgbW9kZSBkaXJlY3RseS4gT21pdCBmb3Igbm8gYXBwcm92YWwuXG4gICAqL1xuICBhcHByb3ZhbD86IEFwcHJvdmFsR2F0ZSB8IEFwcHJvdmFsUG9saWN5O1xufVxuXG4vKiogQ29uY3JldGUsIHZhbGlkYXRlZCBjb25maWcgdGhlIHJ1bnRpbWUgKyB0b29scyByZWFkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFdlYlNlYXJjaENvbmZpZyB7XG4gIC8qKiBQaW5uZWQgd2ViLXNlYXJjaCBtb2RlbCwgd2hlbiBjb25maWd1cmVkIChlbHNlIHVuZGVmaW5lZCAtIHVzZSBmYWxsYmFja3MpLiAqL1xuICBtb2RlbD86IHN0cmluZztcbiAgLyoqIFdoZXJlIHtAbGluayBtb2RlbH0gY2FtZSBmcm9tLCB3aGljaCBkZWNpZGVzIHdoZXRoZXIgYW4gdW5zdXBwb3J0ZWQgcGluIGlzIGZhdGFsLiAqL1xuICBtb2RlbFNvdXJjZTogTW9kZWxTb3VyY2U7XG4gIC8qKiBPcmRlcmVkIGZhbGxiYWNrIG1vZGVsIGNhbmRpZGF0ZXMgKEdlbWluaSwgdGhlbiBHUFQsIHRoZW4gYSBmbG9vcikuICovXG4gIG1vZGVsRmFsbGJhY2tzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIFByb3ZpZGVyIC0+IHRvb2wtc3BlYyBvdmVycmlkZSBtYXAsIG1lcmdlZCBvdmVyIHRoZSBidWlsdC1pbiBkZWZhdWx0cy4gKi9cbiAgd2ViU2VhcmNoVG9vbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogV2hldGhlciB0byBmdXp6eS1tYXRjaCBsb29zZSBtb2RlbCBuYW1lcy4gKi9cbiAgZnV6enk6IGJvb2xlYW47XG4gIC8qKiBGdXNlLmpzIGZ1enp5IHRocmVzaG9sZC4gKi9cbiAgZnV6enlUaHJlc2hvbGQ6IG51bWJlcjtcbiAgbWF4Q2l0YXRpb25zOiBudW1iZXI7XG4gIGZldGNoTWF4TGVuZ3RoOiBudW1iZXI7XG4gIHRpbWVvdXRNczogbnVtYmVyO1xuICAvKiogV2hldGhlciB0byBzY3JhcGUtZmFsbGJhY2sgd2hlbiBubyBuYXRpdmUgd2ViLXNlYXJjaCBtb2RlbCBpcyBkZXBsb3llZC4gKi9cbiAgc2NyYXBlRmFsbGJhY2s6IGJvb2xlYW47XG4gIC8qKiBUaGUgbmFtZWQgVVJMIHBvbGljeSBpbiBmb3JjZS4gKi9cbiAgdXJsUG9saWN5OiBVcmxQb2xpY3lNb2RlO1xuICAvKiogQ29tcGlsZWQgYWxsb3ctbGlzdCAocGVybWl0LWFsbCB1bmRlciB0aGUgYHVucmVzdHJpY3RlZGAgcG9saWN5KS4gKi9cbiAgYWxsb3dMaXN0OiBVcmxBbGxvd0xpc3Q7XG4gIC8qKiBEZWZhdWx0IHBlci10b29sIGFwcHJvdmFsIHBvbGljeS4gKi9cbiAgYXBwcm92YWw6IEFwcHJvdmFsUG9saWN5O1xufVxuXG4vKiogSlNPTiBTY2hlbWEgcHVibGlzaGVkIG9uIHRoZSBtYW5pZmVzdCdzIGBjb25maWcuc2NoZW1hYC4gKi9cbmV4cG9ydCBjb25zdCBXRUJfU0VBUkNIX0NPTkZJR19TQ0hFTUE6IEpTT05TY2hlbWE3ID0ge1xuICB0eXBlOiBcIm9iamVjdFwiLFxuICBwcm9wZXJ0aWVzOiB7XG4gICAgbW9kZWw6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJEZWZhdWx0IHdlYi1zZWFyY2ggbW9kZWwgKGVuZHBvaW50IG5hbWUsIGxvb3NlIG5hbWUsIG9yIGNsYXNzKS4gRnV6enktbWF0Y2hlZC4gRW52OiBXRUJfU0VBUkNIX01PREVMLCB0aGVuIERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FLlwiLFxuICAgIH0sXG4gICAgbW9kZWxGYWxsYmFja3M6IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGl0ZW1zOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIk9yZGVyZWQgd2ViLXNlYXJjaCBtb2RlbCBjYW5kaWRhdGVzIHdoZW4gYG1vZGVsYCBpcyB1bnNldCAoR2VtaW5pLCB0aGVuIEdQVCkuIEVudjogV0VCX1NFQVJDSF9NT0RFTF9GQUxMQkFDS1MuXCIsXG4gICAgfSxcbiAgICB3ZWJTZWFyY2hUb29sczoge1xuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnUHJvdmlkZXIgLT4gdG9vbC1zcGVjIG92ZXJyaWRlIG1hcCBtZXJnZWQgb3ZlciB0aGUgYnVpbHQtaW4gZGVmYXVsdHMgKG9wZW5haSAtPiB7XCJ0eXBlXCI6XCJ3ZWJfc2VhcmNoXCJ9LCBnZW1pbmkgLT4ge1wiZ29vZ2xlX3NlYXJjaFwiOnt9fSkuIEVudjogV0VCX1NFQVJDSF9UT09MUyAoSlNPTikuJyxcbiAgICB9LFxuICAgIG1vZGVsRnV6enlNYXRjaDoge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJGdXp6eS1tYXRjaCBsb29zZSBtb2RlbCBuYW1lcyBhZ2FpbnN0IHRoZSBsaXZlIGNhdGFsb2d1ZS4gRGVmYXVsdCB0cnVlIChlbnY6IFdFQl9TRUFSQ0hfRlVaWlkpLlwiLFxuICAgIH0sXG4gICAgbW9kZWxGdXp6eVRocmVzaG9sZDoge1xuICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkZ1c2UuanMgc2NvcmUgdGhyZXNob2xkIGJlbG93IHdoaWNoIGEgZnV6enkgbW9kZWwgbWF0Y2ggaXMgYWNjZXB0ZWQgKGVudjogV0VCX1NFQVJDSF9GVVpaWV9USFJFU0hPTEQpLlwiLFxuICAgIH0sXG4gICAgbWF4Q2l0YXRpb25zOiB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiSGFyZCBjYXAgb24gY2l0YXRpb25zIHJldHVybmVkIChlbnY6IFdFQl9TRUFSQ0hfTUFYX0NJVEFUSU9OUykuXCIsXG4gICAgfSxcbiAgICBmZXRjaE1heExlbmd0aDoge1xuICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkhhcmQgY2FwIG9uIHdlYl9mZXRjaCBjb250ZW50IGxlbmd0aCAoZW52OiBXRUJfU0VBUkNIX0ZFVENIX01BWF9MRU5HVEgpLlwiLFxuICAgIH0sXG4gICAgdGltZW91dE1zOiB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiUGVyLXJlcXVlc3QgbmV0d29yayB0aW1lb3V0IGluIG1zIChlbnY6IFdFQl9TRUFSQ0hfVElNRU9VVF9NUykuXCIsXG4gICAgfSxcbiAgICBzY3JhcGVGYWxsYmFjazoge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJGYWxsIGJhY2sgdG8gYSBEdWNrRHVja0dvIHNjcmFwZSB3aGVuIG5vIHdlYi1zZWFyY2gtY2FwYWJsZSBtb2RlbCBpcyBkZXBsb3llZC4gRGVmYXVsdCB0cnVlIChlbnY6IFdFQl9TRUFSQ0hfU0NSQVBFX0ZBTExCQUNLKS5cIixcbiAgICB9LFxuICAgIHVybFBvbGljeToge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGVudW06IFtcInVucmVzdHJpY3RlZFwiLCBcImFsbG93bGlzdFwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIldoaWNoIFVSTHMgdGhlIHRvb2xzIG1heSByZWFjaC4gRGVmYXVsdHMgdG8gYWxsb3dsaXN0IHdoZW4gYWxsb3dlZFVybHMgaGFzIGVudHJpZXMsIGVsc2UgdW5yZXN0cmljdGVkIChlbnY6IFdFQl9TRUFSQ0hfVVJMX1BPTElDWSkuXCIsXG4gICAgfSxcbiAgICBhbGxvd2VkVXJsczoge1xuICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdVUkwgYWxsb3ctbGlzdCBvZiBnbG9icyAvIGJhcmUgaG9zdHMgKGUuZy4gXCIqLmRhdGFicmlja3MuY29tXCIsIFwiZG9jcy5leGFtcGxlLmNvbVwiKS4gQWxzbyBhY2NlcHRzIGEgY29tbWEvc3BhY2Utc2VwYXJhdGVkIHN0cmluZy4gRmFsbHMgYmFjayB0byBXRUJfU0VBUkNIX0FMTE9XRURfVVJMUy4gRW1wdHkgPSB1bnJlc3RyaWN0ZWQuJyxcbiAgICB9LFxuICAgIGFwcHJvdmFsOiB7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0FwcHJvdmFsIGdhdGUgZm9yIGJvdGggdG9vbHM6IHRydWUgZ2F0ZXMgZXZlcnkgY2FsbCwgYSBnbG9iIChvciBsaXN0IG9mIGdsb2JzKSBnYXRlcyBvbmx5IG1hdGNoaW5nIFVSTHMsIG9yIHN0YXRlIHRoZSBtb2RlIGRpcmVjdGx5IGFzIHtcIm1vZGVcIjpcIm5vbmVcInxcImFsd2F5c1wifFwidXJsc1wifS4gRGVmYXVsdCBub25lLicsXG4gICAgICBvbmVPZjogW1xuICAgICAgICB7IHR5cGU6IFwiYm9vbGVhblwiIH0sXG4gICAgICAgIHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICB7IHR5cGU6IFwiYXJyYXlcIiwgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9IH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG1vZGU6IHsgdHlwZTogXCJzdHJpbmdcIiwgZW51bTogW1wibm9uZVwiLCBcImFsd2F5c1wiLCBcInVybHNcIl0gfSxcbiAgICAgICAgICAgIHBhdHRlcm5zOiB7IHR5cGU6IFwiYXJyYXlcIiwgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9IH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1aXJlZDogW1wibW9kZVwiXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSxcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGBXRUJfU0VBUkNIX1RPT0xTYCBlbnYgdmFyIChKU09OIG9iamVjdCksIGVsc2UgYHt9YC4gQSB2YWx1ZSB0aGF0XG4gKiBpcyBzZXQgYnV0IG5vdCBhIEpTT04gb2JqZWN0IGlzIGEgZGVwbG95bWVudCBtaXN0YWtlIHRoYXQgd291bGQgb3RoZXJ3aXNlXG4gKiBzaWxlbnRseSBsZWF2ZSB0aGUgYnVpbHQtaW4gdG9vbCBzcGVjcyBpbiBwbGFjZSwgc28gaXQgdGhyb3dzLlxuICovXG5mdW5jdGlvbiBwYXJzZVRvb2xzRW52KCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgcmF3ID0gcnVudGltZUNvbmZpZy50ZXh0KFwiV0VCX1NFQVJDSF9UT09MU1wiLCBydW50aW1lQ29uZmlnLkVOVl9PTkxZKTtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkKSByZXR1cm4ge307XG4gIGNvbnN0IHBhcnNlZCA9IGpzb24ucGFyc2VSZWNvcmQocmF3KTtcbiAgaWYgKCFwYXJzZWQpIHtcbiAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgICAgXCJXRUJfU0VBUkNIX1RPT0xTIG11c3QgYmUgYSBKU09OIG9iamVjdCBtYXBwaW5nIGEgcHJvdmlkZXIgZmFtaWx5IHRvIGl0cyB0b29sIHNwZWNcIixcbiAgICAgIHsgY29udGV4dDogeyBlbnZWYXI6IFwiV0VCX1NFQVJDSF9UT09MU1wiIH0gfSxcbiAgICApO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKiBSZWFkIHRoZSBwaW5uZWQgZW5kcG9pbnQgaWQgYW5kIHJlY29yZCB3aGljaCBzb3VyY2Ugc3VwcGxpZWQgaXQuICovXG5mdW5jdGlvbiByZXNvbHZlTW9kZWxQaW4oY29uZmlnOiBXZWJTZWFyY2hQbHVnaW5Db25maWcpOiB7IG1vZGVsPzogc3RyaW5nOyBzb3VyY2U6IE1vZGVsU291cmNlIH0ge1xuICBjb25zdCBmcm9tQ29uZmlnID0gc3RyaW5nLnRyaW1Ub051bGwoY29uZmlnLm1vZGVsKTtcbiAgaWYgKGZyb21Db25maWcgIT09IG51bGwpIHJldHVybiB7IG1vZGVsOiBmcm9tQ29uZmlnLCBzb3VyY2U6IFwiY29uZmlnXCIgfTtcbiAgY29uc3QgZnJvbU1vZGVsRW52ID0gcnVudGltZUNvbmZpZy50ZXh0KE1PREVMX0VOViwgcnVudGltZUNvbmZpZy5FTlZfT05MWSk7XG4gIGlmIChmcm9tTW9kZWxFbnYgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHsgbW9kZWw6IGZyb21Nb2RlbEVudiwgc291cmNlOiBNT0RFTF9FTlYgfTtcbiAgY29uc3QgZnJvbVJlc291cmNlRW52ID0gcnVudGltZUNvbmZpZy50ZXh0KFNFUlZJTkdfRU5EUE9JTlRfRU5WLCBydW50aW1lQ29uZmlnLkVOVl9PTkxZKTtcbiAgaWYgKGZyb21SZXNvdXJjZUVudiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHsgbW9kZWw6IGZyb21SZXNvdXJjZUVudiwgc291cmNlOiBTRVJWSU5HX0VORFBPSU5UX0VOViB9O1xuICB9XG4gIHJldHVybiB7IHNvdXJjZTogXCJub25lXCIgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBuYW1lZCB7QGxpbmsgVXJsUG9saWN5TW9kZX0sIGZhaWxpbmcgb24gYSBzdGF0ZWQgbW9kZSB0aGF0XG4gKiBjb250cmFkaWN0cyB0aGUgYWxsb3ctbGlzdCBlbnRyaWVzIGl0IHdhcyBnaXZlbi5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVVybFBvbGljeShcbiAgY29uZmlndXJlZDogVXJsUG9saWN5TW9kZSB8IHVuZGVmaW5lZCxcbiAgcGF0dGVybnM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogVXJsUG9saWN5TW9kZSB7XG4gIGNvbnN0IHJhdyA9IGNvbmZpZ3VyZWQgPz8gcnVudGltZUNvbmZpZy50ZXh0KFwiV0VCX1NFQVJDSF9VUkxfUE9MSUNZXCIsIHJ1bnRpbWVDb25maWcuRU5WX09OTFkpO1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQpIHJldHVybiBwYXR0ZXJucy5sZW5ndGggPiAwID8gXCJhbGxvd2xpc3RcIiA6IFwidW5yZXN0cmljdGVkXCI7XG4gIGlmIChyYXcgIT09IFwiYWxsb3dsaXN0XCIgJiYgcmF3ICE9PSBcInVucmVzdHJpY3RlZFwiKSB7XG4gICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcbiAgICAgICd1cmxQb2xpY3kgbXVzdCBiZSBcImFsbG93bGlzdFwiIG9yIFwidW5yZXN0cmljdGVkXCIgKGVudjogV0VCX1NFQVJDSF9VUkxfUE9MSUNZKScsXG4gICAgICB7IGNvbnRleHQ6IHsgZmllbGQ6IFwidXJsUG9saWN5XCIsIGVudlZhcjogXCJXRUJfU0VBUkNIX1VSTF9QT0xJQ1lcIiB9IH0sXG4gICAgKTtcbiAgfVxuICBpZiAocmF3ID09PSBcImFsbG93bGlzdFwiICYmIHBhdHRlcm5zLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgICAndXJsUG9saWN5IFwiYWxsb3dsaXN0XCIgbmVlZHMgYXQgbGVhc3Qgb25lIGVudHJ5IGluIGFsbG93ZWRVcmxzIChlbnY6IFdFQl9TRUFSQ0hfQUxMT1dFRF9VUkxTKScsXG4gICAgICB7IGNvbnRleHQ6IHsgZmllbGQ6IFwiYWxsb3dlZFVybHNcIiwgZW52VmFyOiBcIldFQl9TRUFSQ0hfQUxMT1dFRF9VUkxTXCIgfSB9LFxuICAgICk7XG4gIH1cbiAgaWYgKHJhdyA9PT0gXCJ1bnJlc3RyaWN0ZWRcIiAmJiBwYXR0ZXJucy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcbiAgICAgICd1cmxQb2xpY3kgXCJ1bnJlc3RyaWN0ZWRcIiBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBhbGxvd2VkVXJscyBlbnRyaWVzOyBkcm9wIHRoZSBlbnRyaWVzIG9yIHNldCB1cmxQb2xpY3kgdG8gXCJhbGxvd2xpc3RcIicsXG4gICAgICB7IGNvbnRleHQ6IHsgZmllbGQ6IFwiYWxsb3dlZFVybHNcIiwgZW52VmFyOiBcIldFQl9TRUFSQ0hfQUxMT1dFRF9VUkxTXCIgfSB9LFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJhdztcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgYW55IGFjY2VwdGVkIGFwcHJvdmFsIHNwZWxsaW5nIGludG8gYW4ge0BsaW5rIEFwcHJvdmFsUG9saWN5fS5cbiAqIEEgcGF0dGVybiBnYXRlIHdpdGggbm8gdXNhYmxlIHBhdHRlcm5zIGNvbGxhcHNlcyB0byBgXCJub25lXCJgIHJhdGhlciB0aGFuXG4gKiBnYXRpbmcgZXZlcnl0aGluZywgc28gYSBibGFuayBlbnYgdmFyIGNhbiBuZXZlciB3ZWRnZSB0aGUgdG9vbHMgYmVoaW5kIGFuXG4gKiBhcHByb3ZhbCBub2JvZHkgY29uZmlndXJlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQXBwcm92YWxQb2xpY3koZ2F0ZTogQXBwcm92YWxHYXRlIHwgQXBwcm92YWxQb2xpY3kgfCB1bmRlZmluZWQpOiBBcHByb3ZhbFBvbGljeSB7XG4gIGlmIChnYXRlID09PSB1bmRlZmluZWQgfHwgZ2F0ZSA9PT0gZmFsc2UpIHJldHVybiB7IG1vZGU6IFwibm9uZVwiIH07XG4gIGlmIChnYXRlID09PSB0cnVlKSByZXR1cm4geyBtb2RlOiBcImFsd2F5c1wiIH07XG4gIGlmIChvYmplY3QuaXNSZWNvcmQoZ2F0ZSkgJiYgXCJtb2RlXCIgaW4gZ2F0ZSkge1xuICAgIGlmIChnYXRlLm1vZGUgPT09IFwidXJsc1wiKSB7XG4gICAgICBjb25zdCBwYXR0ZXJucyA9IHBhcnNlQWxsb3dlZFVybHMoWy4uLmdhdGUucGF0dGVybnNdKTtcbiAgICAgIHJldHVybiBwYXR0ZXJucy5sZW5ndGggPiAwID8geyBtb2RlOiBcInVybHNcIiwgcGF0dGVybnMgfSA6IHsgbW9kZTogXCJub25lXCIgfTtcbiAgICB9XG4gICAgaWYgKGdhdGUubW9kZSA9PT0gXCJhbHdheXNcIiB8fCBnYXRlLm1vZGUgPT09IFwibm9uZVwiKSByZXR1cm4geyBtb2RlOiBnYXRlLm1vZGUgfTtcbiAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKCdhcHByb3ZhbCBtb2RlIG11c3QgYmUgXCJub25lXCIsIFwiYWx3YXlzXCIgb3IgXCJ1cmxzXCInLCB7XG4gICAgICBjb250ZXh0OiB7IGZpZWxkOiBcImFwcHJvdmFsXCIgfSxcbiAgICB9KTtcbiAgfVxuICBjb25zdCBwYXR0ZXJucyA9IHBhcnNlQWxsb3dlZFVybHModHlwZW9mIGdhdGUgPT09IFwic3RyaW5nXCIgPyBnYXRlIDogWy4uLmdhdGVdKTtcbiAgcmV0dXJuIHBhdHRlcm5zLmxlbmd0aCA+IDAgPyB7IG1vZGU6IFwidXJsc1wiLCBwYXR0ZXJucyB9IDogeyBtb2RlOiBcIm5vbmVcIiB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgcGx1Z2luIGNvbmZpZyBvdmVyIGVudmlyb25tZW50IGRlZmF1bHRzIGludG8gdGhlIGNvbmNyZXRlXG4gKiB7QGxpbmsgUmVzb2x2ZWRXZWJTZWFyY2hDb25maWd9LiBXaGljaCBtb2RlbCBpcyB1c2VkIHN0YXlzIGxhenkgLSBpdCBpc1xuICogcGlja2VkIGF0IGNhbGwgdGltZSBhZ2FpbnN0IHRoZSBsaXZlIGNhdGFsb2d1ZSAtIGJ1dCBldmVyeXRoaW5nIGVsc2UgaXNcbiAqIHNldHRsZWQgaGVyZSwgYW5kIGEgY29udHJhZGljdGlvbiAodW5wYXJzZWFibGUgYFdFQl9TRUFSQ0hfVE9PTFNgLCBhblxuICogdW5rbm93biBVUkwgcG9saWN5LCBhIHBvbGljeSB0aGF0IGRpc2FncmVlcyB3aXRoIGl0cyBhbGxvdy1saXN0KSB0aHJvd3MgYVxuICoge0BsaW5rIENvbmZpZ3VyYXRpb25FcnJvcn0gbmFtaW5nIHRoZSBmaWVsZCBhbmQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdlYlNlYXJjaENvbmZpZyhcbiAgY29uZmlnOiBXZWJTZWFyY2hQbHVnaW5Db25maWcgPSB7fSxcbik6IFJlc29sdmVkV2ViU2VhcmNoQ29uZmlnIHtcbiAgY29uc3QgcGF0dGVybnMgPSBwYXJzZUFsbG93ZWRVcmxzKFxuICAgIGNvbmZpZy5hbGxvd2VkVXJscyA/PyBydW50aW1lQ29uZmlnLnRleHQoXCJXRUJfU0VBUkNIX0FMTE9XRURfVVJMU1wiLCBydW50aW1lQ29uZmlnLkVOVl9PTkxZKSxcbiAgKTtcbiAgY29uc3QgdXJsUG9saWN5ID0gcmVzb2x2ZVVybFBvbGljeShjb25maWcudXJsUG9saWN5LCBwYXR0ZXJucyk7XG4gIGNvbnN0IHsgbW9kZWwsIHNvdXJjZSB9ID0gcmVzb2x2ZU1vZGVsUGluKGNvbmZpZyk7XG4gIGNvbnN0IGZhbGxiYWNrcyA9IHJ1bnRpbWVDb25maWcubGlzdChcbiAgICBjb25maWcubW9kZWxGYWxsYmFja3MsXG4gICAgXCJXRUJfU0VBUkNIX01PREVMX0ZBTExCQUNLU1wiLFxuICAgIHVuZGVmaW5lZCxcbiAgICBydW50aW1lQ29uZmlnLkVOVl9PTkxZLFxuICApO1xuICByZXR1cm4ge1xuICAgIC4uLihtb2RlbCA/IHsgbW9kZWwgfSA6IHt9KSxcbiAgICBtb2RlbFNvdXJjZTogc291cmNlLFxuICAgIG1vZGVsRmFsbGJhY2tzOiBmYWxsYmFja3MubGVuZ3RoID4gMCA/IGZhbGxiYWNrcyA6IERFRkFVTFRfTU9ERUxfRkFMTEJBQ0tTLFxuICAgIHdlYlNlYXJjaFRvb2xzOiB7IC4uLnBhcnNlVG9vbHNFbnYoKSwgLi4uKGNvbmZpZy53ZWJTZWFyY2hUb29scyA/PyB7fSkgfSxcbiAgICBmdXp6eTpcbiAgICAgIHJ1bnRpbWVDb25maWcuYm9vbGVhbihjb25maWcubW9kZWxGdXp6eU1hdGNoLCBcIldFQl9TRUFSQ0hfRlVaWllcIiwgcnVudGltZUNvbmZpZy5FTlZfT05MWSkgPz9cbiAgICAgIHRydWUsXG4gICAgZnV6enlUaHJlc2hvbGQ6IHJ1bnRpbWVDb25maWcucG9zaXRpdmVOdW1iZXIoXG4gICAgICBjb25maWcubW9kZWxGdXp6eVRocmVzaG9sZCxcbiAgICAgIFwiV0VCX1NFQVJDSF9GVVpaWV9USFJFU0hPTERcIixcbiAgICAgIHNlcnZpbmcuREVGQVVMVF9GVVpaWV9USFJFU0hPTEQsXG4gICAgICBydW50aW1lQ29uZmlnLkVOVl9PTkxZLFxuICAgICksXG4gICAgbWF4Q2l0YXRpb25zOiBydW50aW1lQ29uZmlnLnBvc2l0aXZlSW50KFxuICAgICAgY29uZmlnLm1heENpdGF0aW9ucyxcbiAgICAgIFwiV0VCX1NFQVJDSF9NQVhfQ0lUQVRJT05TXCIsXG4gICAgICBERUZBVUxUX01BWF9DSVRBVElPTlMsXG4gICAgICBydW50aW1lQ29uZmlnLkVOVl9PTkxZLFxuICAgICksXG4gICAgZmV0Y2hNYXhMZW5ndGg6IHJ1bnRpbWVDb25maWcucG9zaXRpdmVJbnQoXG4gICAgICBjb25maWcuZmV0Y2hNYXhMZW5ndGgsXG4gICAgICBcIldFQl9TRUFSQ0hfRkVUQ0hfTUFYX0xFTkdUSFwiLFxuICAgICAgREVGQVVMVF9GRVRDSF9NQVhfTEVOR1RILFxuICAgICAgcnVudGltZUNvbmZpZy5FTlZfT05MWSxcbiAgICApLFxuICAgIHRpbWVvdXRNczogcnVudGltZUNvbmZpZy5wb3NpdGl2ZUludChcbiAgICAgIGNvbmZpZy50aW1lb3V0TXMsXG4gICAgICBcIldFQl9TRUFSQ0hfVElNRU9VVF9NU1wiLFxuICAgICAgREVGQVVMVF9USU1FT1VUX01TLFxuICAgICAgcnVudGltZUNvbmZpZy5FTlZfT05MWSxcbiAgICApLFxuICAgIHNjcmFwZUZhbGxiYWNrOlxuICAgICAgcnVudGltZUNvbmZpZy5ib29sZWFuKFxuICAgICAgICBjb25maWcuc2NyYXBlRmFsbGJhY2ssXG4gICAgICAgIFwiV0VCX1NFQVJDSF9TQ1JBUEVfRkFMTEJBQ0tcIixcbiAgICAgICAgcnVudGltZUNvbmZpZy5FTlZfT05MWSxcbiAgICAgICkgPz8gdHJ1ZSxcbiAgICB1cmxQb2xpY3ksXG4gICAgYWxsb3dMaXN0OiB0b1VybEFsbG93TGlzdCh1cmxQb2xpY3kgPT09IFwiYWxsb3dsaXN0XCIgPyBwYXR0ZXJucyA6IFtdKSxcbiAgICBhcHByb3ZhbDogdG9BcHByb3ZhbFBvbGljeShjb25maWcuYXBwcm92YWwpLFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYW4gYXBwcm92YWwgZ2F0ZSBhZ2FpbnN0IGEgc2V0IG9mIGNhbmRpZGF0ZSBVUkxzIGludG8gYSBjb25jcmV0ZVxuICogYm9vbGVhbjogYFwibm9uZVwiYCAvIGBcImFsd2F5c1wiYCBwYXNzIHN0cmFpZ2h0IHRocm91Z2g7IGEgYFwidXJsc1wiYCBwb2xpY3lcbiAqIGdhdGVzIHdoZW4gQU5ZIGNhbmRpZGF0ZSBtYXRjaGVzLiBFbXB0eSBjYW5kaWRhdGVzIHdpdGggYSBwYXR0ZXJuIGdhdGVcbiAqIG5ldmVyIG1hdGNoIChub3RoaW5nIHRvIGFwcHJvdmUpLiBSZXVzZXMgdGhlIGFsbG93LWxpc3QgbWF0Y2hlciBzbyBhcHByb3ZhbFxuICogZ2xvYnMgcmVhZCBleGFjdGx5IGxpa2UgYWxsb3ctbGlzdCBnbG9icy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcHJvdmFsTWF0Y2hlcyhcbiAgZ2F0ZTogQXBwcm92YWxHYXRlIHwgQXBwcm92YWxQb2xpY3ksXG4gIHVybHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBvbGljeSA9IHRvQXBwcm92YWxQb2xpY3koZ2F0ZSk7XG4gIGlmIChwb2xpY3kubW9kZSA9PT0gXCJub25lXCIpIHJldHVybiBmYWxzZTtcbiAgaWYgKHBvbGljeS5tb2RlID09PSBcImFsd2F5c1wiKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgbGlzdCA9IHRvVXJsQWxsb3dMaXN0KHBvbGljeS5wYXR0ZXJucyk7XG4gIHJldHVybiB1cmxzLnNvbWUoKHVybCkgPT4gbGlzdC5hbGxvd3ModXJsKSk7XG59XG4iXX0=
262
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQXlCLE1BQU0sb0JBQW9CLENBQUM7QUFDL0UsT0FBTyxFQUFFLE1BQU0sSUFBSSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQWtCLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQXFCLE1BQU0sZ0JBQWdCLENBQUM7QUE2QnJGLHlEQUF5RDtBQUN6RCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsa0JBQWtCLENBQUM7QUFFNUMsK0VBQStFO0FBQy9FLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGtDQUFrQyxDQUFDO0FBS3ZFOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFzQjtJQUN4RCx5QkFBeUI7SUFDekIsMkJBQTJCO0lBQzNCLGtCQUFrQjtJQUNsQix1QkFBdUI7Q0FDeEIsQ0FBQztBQUVGLDRFQUE0RTtBQUM1RSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFFeEMsb0VBQW9FO0FBQ3BFLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLE1BQU0sQ0FBQztBQUUvQyxtRUFBbUU7QUFDbkUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDO0FBa0h6QywrREFBK0Q7QUFDL0QsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQWdCO0lBQ25ELElBQUksRUFBRSxRQUFRO0lBQ2QsVUFBVSxFQUFFO1FBQ1YsS0FBSyxFQUFFO1lBQ0wsSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQ1QsOElBQThJO1NBQ2pKO1FBQ0QsY0FBYyxFQUFFO1lBQ2QsSUFBSSxFQUFFLE9BQU87WUFDYixLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO1lBQ3pCLFdBQVcsRUFDVCxnSEFBZ0g7U0FDbkg7UUFDRCxjQUFjLEVBQUU7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFDVCx1S0FBdUs7U0FDMUs7UUFDRCxlQUFlLEVBQUU7WUFDZixJQUFJLEVBQUUsU0FBUztZQUNmLFdBQVcsRUFDVCxpR0FBaUc7U0FDcEc7UUFDRCxtQkFBbUIsRUFBRTtZQUNuQixJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFDVCx3R0FBd0c7U0FDM0c7UUFDRCxZQUFZLEVBQUU7WUFDWixJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFBRSxpRUFBaUU7U0FDL0U7UUFDRCxjQUFjLEVBQUU7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFBRSwwRUFBMEU7U0FDeEY7UUFDRCxTQUFTLEVBQUU7WUFDVCxJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFBRSxpRUFBaUU7U0FDL0U7UUFDRCxjQUFjLEVBQUU7WUFDZCxJQUFJLEVBQUUsU0FBUztZQUNmLFdBQVcsRUFDVCxnSUFBZ0k7U0FDbkk7UUFDRCxTQUFTLEVBQUU7WUFDVCxJQUFJLEVBQUUsUUFBUTtZQUNkLElBQUksRUFBRSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUM7WUFDbkMsV0FBVyxFQUNULHFJQUFxSTtTQUN4STtRQUNELFdBQVcsRUFBRTtZQUNYLElBQUksRUFBRSxPQUFPO1lBQ2IsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUN6QixXQUFXLEVBQ1QsK0xBQStMO1NBQ2xNO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsV0FBVyxFQUNULHVMQUF1TDtZQUN6TCxLQUFLLEVBQUU7Z0JBQ0wsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO2dCQUNuQixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7Z0JBQ2xCLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUU7Z0JBQzVDO29CQUNFLElBQUksRUFBRSxRQUFRO29CQUNkLFVBQVUsRUFBRTt3QkFDVixJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQUU7d0JBQzFELFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFO3FCQUN2RDtvQkFDRCxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUM7aUJBQ25CO2FBQ0Y7U0FDRjtLQUNGO0NBQ0YsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxTQUFTLGFBQWE7SUFDcEIsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckUsSUFBSSxHQUFHLEtBQUssU0FBUztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxJQUFJLGtCQUFrQixDQUMxQixtRkFBbUYsRUFDbkYsRUFBRSxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxDQUM1QyxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCx1RUFBdUU7QUFDdkUsU0FBUyxlQUFlLENBQUMsTUFBNkI7SUFDcEQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkQsSUFBSSxVQUFVLEtBQUssSUFBSTtRQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUN4RSxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckUsSUFBSSxZQUFZLEtBQUssU0FBUztRQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNsRixNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuRixJQUFJLGVBQWUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNsQyxPQUFPLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztJQUNsRSxDQUFDO0lBQ0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUM1QixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FDdkIsVUFBcUMsRUFDckMsUUFBMkI7SUFFM0IsTUFBTSxHQUFHLEdBQUcsVUFBVSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hGLElBQUksR0FBRyxLQUFLLFNBQVM7UUFBRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztJQUNqRixJQUFJLEdBQUcsS0FBSyxXQUFXLElBQUksR0FBRyxLQUFLLGNBQWMsRUFBRSxDQUFDO1FBQ2xELE1BQU0sSUFBSSxrQkFBa0IsQ0FDMUIsOEVBQThFLEVBQzlFLEVBQUUsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsdUJBQXVCLEVBQUUsRUFBRSxDQUNyRSxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksR0FBRyxLQUFLLFdBQVcsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2pELE1BQU0sSUFBSSxrQkFBa0IsQ0FDMUIsOEZBQThGLEVBQzlGLEVBQUUsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUseUJBQXlCLEVBQUUsRUFBRSxDQUN6RSxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksR0FBRyxLQUFLLGNBQWMsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2xELE1BQU0sSUFBSSxrQkFBa0IsQ0FDMUIsd0hBQXdILEVBQ3hILEVBQUUsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUseUJBQXlCLEVBQUUsRUFBRSxDQUN6RSxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLElBQStDO0lBQzlFLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssS0FBSztRQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDbEUsSUFBSSxJQUFJLEtBQUssSUFBSTtRQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDN0MsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUM1QyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDekIsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3RELE9BQU8sUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDN0UsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNO1lBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDL0UsTUFBTSxJQUFJLGtCQUFrQixDQUFDLGtEQUFrRCxFQUFFO1lBQy9FLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7U0FDL0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMvRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzdFLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxTQUFnQyxFQUFFO0lBRWxDLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUMvQixNQUFNLENBQUMsV0FBVyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUN0RixDQUFDO0lBQ0YsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMvRCxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUMvQixNQUFNLENBQUMsY0FBYyxFQUNyQiw0QkFBNEIsRUFDNUIsU0FBUyxFQUNULFVBQVUsQ0FBQyxRQUFRLENBQ3BCLENBQUM7SUFDRixPQUFPO1FBQ0wsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNCLFdBQVcsRUFBRSxNQUFNO1FBQ25CLGNBQWMsRUFBRSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyx1QkFBdUI7UUFDMUUsY0FBYyxFQUFFLEVBQUUsR0FBRyxhQUFhLEVBQUUsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUMsRUFBRTtRQUN4RSxLQUFLLEVBQ0gsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDbkYsSUFBSTtRQUNOLGNBQWMsRUFBRSxVQUFVLENBQUMsY0FBYyxDQUN2QyxNQUFNLENBQUMsbUJBQW1CLEVBQzFCLDRCQUE0QixFQUM1QixPQUFPLENBQUMsdUJBQXVCLEVBQy9CLFVBQVUsQ0FBQyxRQUFRLENBQ3BCO1FBQ0QsWUFBWSxFQUFFLFVBQVUsQ0FBQyxXQUFXLENBQ2xDLE1BQU0sQ0FBQyxZQUFZLEVBQ25CLDBCQUEwQixFQUMxQixxQkFBcUIsRUFDckIsVUFBVSxDQUFDLFFBQVEsQ0FDcEI7UUFDRCxjQUFjLEVBQUUsVUFBVSxDQUFDLFdBQVcsQ0FDcEMsTUFBTSxDQUFDLGNBQWMsRUFDckIsNkJBQTZCLEVBQzdCLHdCQUF3QixFQUN4QixVQUFVLENBQUMsUUFBUSxDQUNwQjtRQUNELFNBQVMsRUFBRSxVQUFVLENBQUMsV0FBVyxDQUMvQixNQUFNLENBQUMsU0FBUyxFQUNoQix1QkFBdUIsRUFDdkIsa0JBQWtCLEVBQ2xCLFVBQVUsQ0FBQyxRQUFRLENBQ3BCO1FBQ0QsY0FBYyxFQUNaLFVBQVUsQ0FBQyxPQUFPLENBQ2hCLE1BQU0sQ0FBQyxjQUFjLEVBQ3JCLDRCQUE0QixFQUM1QixVQUFVLENBQUMsUUFBUSxDQUNwQixJQUFJLElBQUk7UUFDWCxTQUFTO1FBQ1QsU0FBUyxFQUFFLGNBQWMsQ0FBQyxTQUFTLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRSxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztLQUM1QyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzdCLElBQW1DLEVBQ25DLElBQXVCO0lBRXZCLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDekMsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVE7UUFBRSxPQUFPLElBQUksQ0FBQztJQUMxQyxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSB3ZWItc2VhcmNoIHBsdWdpbjogdGhlIHR5cGVkXG4gKiB7QGxpbmsgV2ViU2VhcmNoUGx1Z2luQ29uZmlnfSAodGhlIHBsdWdpbidzIHNsaWNlIG9mIEFwcEtpdCBjb25maWcpLCB0aGVcbiAqIEpTT04gU2NoZW1hIHRoZSBtYW5pZmVzdCBwdWJsaXNoZXMgZm9yIGl0LCBhbmQge0BsaW5rIHJlc29sdmVXZWJTZWFyY2hDb25maWd9XG4gKiB3aGljaCBsYXllcnMgdGhhdCBjb25maWcgb3ZlciBlbnZpcm9ubWVudCBkZWZhdWx0cyBpbnRvIHRoZSBjb25jcmV0ZVxuICoge0BsaW5rIFJlc29sdmVkV2ViU2VhcmNoQ29uZmlnfSB0aGUgcnVudGltZSArIHRvb2xzIHJlYWQuXG4gKlxuICogYHdlYl9zZWFyY2hgIHJ1bnMgb24gdGhlIERhdGFicmlja3MgTW9kZWwgU2VydmluZyBuYXRpdmUgd2ViLXNlYXJjaCB0b29sXG4gKiAoc2VlIGBwcm92aWRlci50c2AgLyBgc2VhcmNoLnRzYCksIHNvIHRoZSBrZXkga25vYiBpcyB3aGljaCB3ZWItc2VhcmNoLVxuICogY2FwYWJsZSBtb2RlbCB0byB1c2UuIEl0IHJlc29sdmVzIGluZGVwZW5kZW50bHkgb2YgdGhlIGNhbGxpbmcgYWdlbnQncyBjaGF0XG4gKiBtb2RlbDogYG1vZGVsYCAoYSBuYW1lLCBsb29zZSBuYW1lLCBvciBjYXBhYmlsaXR5IGNsYXNzKSBpcyBmdXp6eS1tYXRjaGVkXG4gKiBhZ2FpbnN0IHRoZSB3b3Jrc3BhY2UgY2F0YWxvZ3VlLCBhbmQgd2hlbiBub3RoaW5nIGlzIHBpbm5lZCB0aGVcbiAqIHtAbGluayBXZWJTZWFyY2hQbHVnaW5Db25maWcubW9kZWxGYWxsYmFja3N9IG9yZGVyIChHZW1pbmksIHRoZW4gR1BULCB0aGVuIGFcbiAqIHJlcG8gZmxvb3IpIHBpY2tzIHRoZSBmaXJzdCB3ZWItc2VhcmNoLWNhcGFibGUgZW5kcG9pbnQgdGhhdCBleGlzdHMuXG4gKlxuICogV2hpY2ggZW5kcG9pbnQgaWQgaXMgdXNlZCBmb2xsb3dzIHRoZSBzdGFuZGFyZCBwcmVjZWRlbmNlIC0gZXhwbGljaXQgcGx1Z2luXG4gKiBjb25maWcsIHRoZW4gZW52aXJvbm1lbnQsIHRoZW4gYSBkZWZhdWx0IC0gd2l0aCB0d28gZW52aXJvbm1lbnQgc291cmNlczpcbiAqXG4gKiAgIDEuIGBtb2RlbGAgaW4gcGx1Z2luIGNvbmZpZztcbiAqICAgMi4gYFdFQl9TRUFSQ0hfTU9ERUxgLCB0aGUgZGVkaWNhdGVkIG92ZXJyaWRlLCBzbyBhIGRlcGxveW1lbnQgY2FuIHBvaW50XG4gKiAgICAgIHdlYiBzZWFyY2ggYXQgYSBkaWZmZXJlbnQgZW5kcG9pbnQgdGhhbiB0aGUgYWdlbnQncyBjaGF0IG1vZGVsO1xuICogICAzLiBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgLCBBcHBLaXQncyBzdGFuZGFyZCBuYW1lIGZvciBhXG4gKiAgICAgIE1vZGVsIFNlcnZpbmcgYmluZGluZywgaG9ub3JlZCBzbyB0aGUgcmVzb3VyY2UgZGVjbGFyZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiAgICAgIHdpcmVzIHRoaXMgcGx1Z2luIHVwIGxpa2UgYW55IG90aGVyLiBCZWNhdXNlIHRoYXQgYmluZGluZyBpcyBzaGFyZWRcbiAqICAgICAgd2l0aCB3aGF0ZXZlciBlbHNlIHRoZSBhcHAgc2VydmVzLCBpdCBpcyB0cmVhdGVkIGFzIGEgcHJlZmVyZW5jZTogYW5cbiAqICAgICAgZW5kcG9pbnQgdGhhdCBjYW5ub3QgcnVuIHRoZSBuYXRpdmUgd2ViLXNlYXJjaCB0b29sIGlzIHNraXBwZWQgaW5cbiAqICAgICAgZmF2b3Igb2Yge0BsaW5rIFdlYlNlYXJjaFBsdWdpbkNvbmZpZy5tb2RlbEZhbGxiYWNrc30gcmF0aGVyIHRoYW5cbiAqICAgICAgZmFpbGluZyB0aGUgY2FsbC4gQSBwaW4gZnJvbSAoMSkgb3IgKDIpIGlzIGV4cGxpY2l0IGFuZCBET0VTIGZhaWw7XG4gKiAgIDQuIG90aGVyd2lzZSB0aGUgZmFsbGJhY2sgb3JkZXIsIHJlc29sdmVkIGFnYWluc3QgdGhlIGxpdmUgY2F0YWxvZ3VlLlxuICpcbiAqIFdoaWNoIG1vZGVsIHdpbnMgaXMgZGVjaWRlZCBsYXppbHksIGF0IGNhbGwgdGltZSwgYWdhaW5zdCB0aGUgbGl2ZVxuICogY2F0YWxvZ3VlLiBSZXNvbHV0aW9uIGhlcmUgaXMgZWFnZXIgYWJvdXQgZXZlcnl0aGluZyBlbHNlIGFuZCBmYWlscyBsb3VkbHlcbiAqIG9uIGEgY29udHJhZGljdGlvbjogYW4gdW5wYXJzZWFibGUgYFdFQl9TRUFSQ0hfVE9PTFNgLCBhbiB1bmtub3duXG4gKiB7QGxpbmsgVXJsUG9saWN5TW9kZX0sIG9yIGEgVVJMIHBvbGljeSB0aGF0IGRpc2FncmVlcyB3aXRoIHRoZSBhbGxvdy1saXN0IGl0XG4gKiB3YXMgZ2l2ZW4uXG4gKlxuICogRW52IGZhbGxiYWNrczogYFdFQl9TRUFSQ0hfTU9ERUxgLCBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgLFxuICogYFdFQl9TRUFSQ0hfTU9ERUxfRkFMTEJBQ0tTYCwgYFdFQl9TRUFSQ0hfVE9PTFNgIChKU09OKSxcbiAqIGBXRUJfU0VBUkNIX1VSTF9QT0xJQ1lgLCBgV0VCX1NFQVJDSF9BTExPV0VEX1VSTFNgLFxuICogYFdFQl9TRUFSQ0hfTUFYX0NJVEFUSU9OU2AsIGBXRUJfU0VBUkNIX0ZFVENIX01BWF9MRU5HVEhgLFxuICogYFdFQl9TRUFSQ0hfVElNRU9VVF9NU2AsIGBXRUJfU0VBUkNIX1NDUkFQRV9GQUxMQkFDS2AsIGBXRUJfU0VBUkNIX0ZVWlpZYCxcbiAqIGBXRUJfU0VBUkNIX0ZVWlpZX1RIUkVTSE9MRGAuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciwgdHlwZSBCYXNlUGx1Z2luQ29uZmlnIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY29uZmlnIGFzIGNvcmVDb25maWcgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBzZXJ2aW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmltcG9ydCB7IGpzb24sIG9iamVjdCwgdHlwZSBPbmVPck1hbnksIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IEpTT05TY2hlbWE3IH0gZnJvbSBcImpzb24tc2NoZW1hXCI7XG5pbXBvcnQgeyBwYXJzZUFsbG93ZWRVcmxzLCB0b1VybEFsbG93TGlzdCwgdHlwZSBVcmxBbGxvd0xpc3QgfSBmcm9tIFwiLi9hbGxvd2xpc3QudHNcIjtcblxuLyoqXG4gKiBBIFVSTC1wYXR0ZXJuIGdhdGUgZm9yIHBlci10b29sIGFwcHJvdmFsLiBgdHJ1ZWAgZ2F0ZXMgZXZlcnkgY2FsbDsgYVxuICogcGF0dGVybiAob3IgbGlzdCBvZiBwYXR0ZXJucywgaW4gdGhlIHtAbGluayBPbmVPck1hbnl9IHNoYXBlIHVzZWQgYWNyb3NzXG4gKiB0aGUgcmVwbykgZ2F0ZXMgb25seSBjYWxscyB3aG9zZSBVUkwgbWF0Y2hlcy4gUGF0dGVybnMgdXNlIHRoZSBzYW1lIGdsb2JcbiAqIHN5bnRheCBhcyB0aGUgYWxsb3ctbGlzdCAoc2VlIGBhbGxvd2xpc3QudHNgKS4gT21pdCAvIGBmYWxzZWAgZm9yIG5vXG4gKiBhcHByb3ZhbC4gTm9ybWFsaXplZCB0byBhbiB7QGxpbmsgQXBwcm92YWxQb2xpY3l9IGJlZm9yZSB1c2UuXG4gKi9cbmV4cG9ydCB0eXBlIEFwcHJvdmFsR2F0ZSA9IGJvb2xlYW4gfCBPbmVPck1hbnk8c3RyaW5nPiB8IHN0cmluZztcblxuLyoqXG4gKiBUaGUgbm9ybWFsaXplZCBmb3JtIG9mIGFuIHtAbGluayBBcHByb3ZhbEdhdGV9OiB3aGljaCBjYWxscyBwYXVzZSBmb3IgYVxuICogaHVtYW4uIGBcIm5vbmVcImAgcnVucyBldmVyeSBjYWxsIHN0cmFpZ2h0IHRocm91Z2gsIGBcImFsd2F5c1wiYCBnYXRlcyBhbGwgb2ZcbiAqIHRoZW0sIGFuZCBgXCJ1cmxzXCJgIGdhdGVzIG9ubHkgY2FsbHMgd2hvc2UgVVJMIG1hdGNoZXMgb25lIG9mIGBwYXR0ZXJuc2AuXG4gKi9cbmV4cG9ydCB0eXBlIEFwcHJvdmFsUG9saWN5ID1cbiAgfCB7IHJlYWRvbmx5IG1vZGU6IFwibm9uZVwiIH1cbiAgfCB7IHJlYWRvbmx5IG1vZGU6IFwiYWx3YXlzXCIgfVxuICB8IHsgcmVhZG9ubHkgbW9kZTogXCJ1cmxzXCI7IHJlYWRvbmx5IHBhdHRlcm5zOiByZWFkb25seSBzdHJpbmdbXSB9O1xuXG4vKipcbiAqIFdoaWNoIFVSTHMgdGhlIHRvb2xzIG1heSByZWFjaC4gYFwiYWxsb3dsaXN0XCJgIHBlcm1pdHMgb25seSB0aGUgY29uZmlndXJlZFxuICogZW50cmllczsgYFwidW5yZXN0cmljdGVkXCJgIG5hbWVzIHRoZSBwZXJtaXNzaXZlIG1vZGUgZXhwbGljaXRseSwgc28gYW5cbiAqIHVucmVzdHJpY3RlZCBkZXBsb3ltZW50IGlzIGEgc3RhdGVkIGNob2ljZSB2aXNpYmxlIGluIHRoZSBib290IGxvZyByYXRoZXJcbiAqIHRoYW4gYW4gZW1wdHkgbGlzdCBub2JvZHkgbm90aWNlZC5cbiAqL1xuZXhwb3J0IHR5cGUgVXJsUG9saWN5TW9kZSA9IFwidW5yZXN0cmljdGVkXCIgfCBcImFsbG93bGlzdFwiO1xuXG4vKiogRGVkaWNhdGVkIG92ZXJyaWRlIGZvciB0aGUgd2ViLXNlYXJjaCBlbmRwb2ludCBpZC4gKi9cbmV4cG9ydCBjb25zdCBNT0RFTF9FTlYgPSBcIldFQl9TRUFSQ0hfTU9ERUxcIjtcblxuLyoqIEFwcEtpdCdzIHN0YW5kYXJkIGVudmlyb25tZW50IG5hbWUgZm9yIGEgTW9kZWwgU2VydmluZyBlbmRwb2ludCBiaW5kaW5nLiAqL1xuZXhwb3J0IGNvbnN0IFNFUlZJTkdfRU5EUE9JTlRfRU5WID0gXCJEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRVwiO1xuXG4vKiogV2hlcmUgdGhlIHBpbm5lZCB3ZWItc2VhcmNoIGVuZHBvaW50IGlkIGNhbWUgZnJvbSwgb3IgYFwibm9uZVwiYCB3aGVuIHVucGlubmVkLiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxTb3VyY2UgPSBcImNvbmZpZ1wiIHwgdHlwZW9mIE1PREVMX0VOViB8IHR5cGVvZiBTRVJWSU5HX0VORFBPSU5UX0VOViB8IFwibm9uZVwiO1xuXG4vKipcbiAqIERlZmF1bHQgd2ViLXNlYXJjaCBtb2RlbCBwcmVmZXJlbmNlLCB0cmllZCBpbiBvcmRlciB3aGVuIG5vIG1vZGVsIGlzXG4gKiBwaW5uZWQuIEdlbWluaSBmaXJzdCwgdGhlbiBHUFQgLSBib3RoIHN1cHBvcnQgdGhlIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2w7XG4gKiBhIHdvcmtzcGFjZSB0eXBpY2FsbHkgaGFzIGF0IGxlYXN0IG9uZS4gRWFjaCBpcyBmdXp6eS1tYXRjaGVkIGFnYWluc3QgdGhlXG4gKiBsaXZlIGNhdGFsb2d1ZSwgc28gYSBjbG9zZSB2YXJpYW50IChlLmcuIGBkYXRhYnJpY2tzLWdlbWluaS0zLTEtcHJvYCkgaXNcbiAqIHBpY2tlZCB3aGVuIHRoZSBleGFjdCBpZCBpc24ndCBwcmVzZW50LlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NT0RFTF9GQUxMQkFDS1M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICBcImRhdGFicmlja3MtZ2VtaW5pLTMtcHJvXCIsXG4gIFwiZGF0YWJyaWNrcy1nZW1pbmktMi01LXByb1wiLFxuICBcImRhdGFicmlja3MtZ3B0LTVcIixcbiAgXCJkYXRhYnJpY2tzLWdwdC01LW1pbmlcIixcbl07XG5cbi8qKiBEZWZhdWx0IGNhcCBvbiB0aGUgbnVtYmVyIG9mIGNpdGF0aW9ucyByZXR1cm5lZCBmcm9tIGEgc2luZ2xlIHNlYXJjaC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01BWF9DSVRBVElPTlMgPSAxMDtcblxuLyoqIERlZmF1bHQgY2FwIG9uIGNoYXJhY3RlcnMgcmV0dXJuZWQgZnJvbSBhIHNpbmdsZSBgd2ViX2ZldGNoYC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZFVENIX01BWF9MRU5HVEggPSA1MF8wMDA7XG5cbi8qKiBEZWZhdWx0IHBlci1yZXF1ZXN0IG5ldHdvcmsgdGltZW91dCAobXMpIGZvciBzZWFyY2ggKyBmZXRjaC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJTUVPVVRfTVMgPSAzMF8wMDA7XG5cbi8qKiBBcHBLaXQgY29uZmlnIGFjY2VwdGVkIGJ5IHRoZSB3ZWItc2VhcmNoIHBsdWdpbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU2VhcmNoUGx1Z2luQ29uZmlnIGV4dGVuZHMgQmFzZVBsdWdpbkNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgd2ViLXNlYXJjaCBtb2RlbCB0byB1c2UgYnkgZGVmYXVsdDogYSBEYXRhYnJpY2tzIHNlcnZpbmcgZW5kcG9pbnRcbiAgICogbmFtZSAoYFwiZGF0YWJyaWNrcy1nZW1pbmktMy1wcm9cImApLCBhIGxvb3NlIG5hbWUgKGBcImdlbWluaVwiYCwgYFwiZ3B0XCJgKSxcbiAgICogb3IgYSBjYXBhYmlsaXR5IGNsYXNzLiBGdXp6eS1tYXRjaGVkIGFnYWluc3QgdGhlIGxpdmUgY2F0YWxvZ3VlLiBGYWxsc1xuICAgKiBiYWNrIHRvIGBXRUJfU0VBUkNIX01PREVMYCwgdGhlbiBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgLCB0aGVuXG4gICAqIHRoZSB7QGxpbmsgbW9kZWxGYWxsYmFja3N9IG9yZGVyLiBDaG9zZW4gaW5kZXBlbmRlbnRseSBvZiB0aGUgY2FsbGluZ1xuICAgKiBhZ2VudCdzIGNoYXQgbW9kZWwuXG4gICAqL1xuICBtb2RlbD86IHN0cmluZztcbiAgLyoqXG4gICAqIFByaW9yaXR5LW9yZGVyZWQgd2ViLXNlYXJjaCBtb2RlbCBjYW5kaWRhdGVzIHRyaWVkIHdoZW4ge0BsaW5rIG1vZGVsfSBpc1xuICAgKiB1bnNldCwgZWFjaCBmdXp6eS1tYXRjaGVkIGFuZCBjaGVja2VkIGZvciB3ZWItc2VhcmNoIHN1cHBvcnQuIEZhbGxzIGJhY2tcbiAgICogdG8gYFdFQl9TRUFSQ0hfTU9ERUxfRkFMTEJBQ0tTYCAoY29tbWEvc3BhY2Utc2VwYXJhdGVkKSwgdGhlblxuICAgKiB7QGxpbmsgREVGQVVMVF9NT0RFTF9GQUxMQkFDS1N9IChHZW1pbmksIHRoZW4gR1BUKS5cbiAgICovXG4gIG1vZGVsRmFsbGJhY2tzPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKlxuICAgKiBQcm92aWRlciAtPiB0b29sLXNwZWMgb3ZlcnJpZGUgbWFwLCBtZXJnZWQgb3ZlciB0aGUgYnVpbHQtaW5cbiAgICoge0BsaW5rIFdFQl9TRUFSQ0hfUFJPVklERVJTfSBkZWZhdWx0cy4gS2V5ZWQgYnkgcHJvdmlkZXIgZmFtaWx5XG4gICAqIChgXCJvcGVuYWlcImAsIGBcImdlbWluaVwiYCk7IGVhY2ggdmFsdWUgbWF5IG92ZXJyaWRlIHRoZSBgdG9vbGAgZW50cnlcbiAgICogYW5kL29yIHRoZSBgYXBpYCBzdXJmYWNlLiBVc2UgdG8gY2hhbmdlIHRoZSB0b29sIHNoYXBlIGFzIHRoZSBwbGF0Zm9ybVxuICAgKiBldm9sdmVzIHdpdGhvdXQgYSBjb2RlIGNoYW5nZS4gRmFsbHMgYmFjayB0byBgV0VCX1NFQVJDSF9UT09MU2AgcGFyc2VkIGFzXG4gICAqIEpTT04uIFRoaXMgaXMgdGhlIGBXRUJfU0VBUkNIX1RPT0xTYCBzZXR0aW5nLlxuICAgKi9cbiAgd2ViU2VhcmNoVG9vbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqXG4gICAqIEVuYWJsZSBmdXp6eSBtYXRjaGluZyBvZiBsb29zZSBtb2RlbCBuYW1lcyBhZ2FpbnN0IHRoZSBjYXRhbG9ndWUuXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYDsgZmFsbHMgYmFjayB0byBgV0VCX1NFQVJDSF9GVVpaWWAuXG4gICAqL1xuICBtb2RlbEZ1enp5TWF0Y2g/OiBib29sZWFuO1xuICAvKiogRnVzZS5qcyBmdXp6eSB0aHJlc2hvbGQuIEZhbGxzIGJhY2sgdG8gYFdFQl9TRUFSQ0hfRlVaWllfVEhSRVNIT0xEYCwgdGhlbiB0aGUgc2hhcmVkIGRlZmF1bHQuICovXG4gIG1vZGVsRnV6enlUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBIYXJkIGNhcCBvbiB0aGUgbnVtYmVyIG9mIGNpdGF0aW9ucyBhIHNpbmdsZSBzZWFyY2ggcmV0dXJucy4gRmFsbHMgYmFja1xuICAgKiB0byBgV0VCX1NFQVJDSF9NQVhfQ0lUQVRJT05TYCwgdGhlbiB7QGxpbmsgREVGQVVMVF9NQVhfQ0lUQVRJT05TfS5cbiAgICovXG4gIG1heENpdGF0aW9ucz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEhhcmQgY2FwIG9uIHRoZSBjaGFyYWN0ZXIgbGVuZ3RoIG9mIGEgc2luZ2xlIGB3ZWJfZmV0Y2hgIHJlc3VsdC4gRmFsbHNcbiAgICogYmFjayB0byBgV0VCX1NFQVJDSF9GRVRDSF9NQVhfTEVOR1RIYCwgdGhlbiB7QGxpbmsgREVGQVVMVF9GRVRDSF9NQVhfTEVOR1RIfS5cbiAgICovXG4gIGZldGNoTWF4TGVuZ3RoPzogbnVtYmVyO1xuICAvKipcbiAgICogUGVyLXJlcXVlc3QgbmV0d29yayB0aW1lb3V0IGluIG1zIGZvciBzZWFyY2ggKyBmZXRjaC4gRmFsbHMgYmFjayB0b1xuICAgKiBgV0VCX1NFQVJDSF9USU1FT1VUX01TYCwgdGhlbiB7QGxpbmsgREVGQVVMVF9USU1FT1VUX01TfS5cbiAgICovXG4gIHRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEZhbGwgYmFjayB0byBhIER1Y2tEdWNrR28gc2NyYXBlIHdoZW4gdGhlIHdvcmtzcGFjZSBoYXMgTk8gZGVwbG95ZWRcbiAgICogd2ViLXNlYXJjaC1jYXBhYmxlIG1vZGVsIChubyBHUFQgLyBHZW1pbmkgc2VydmluZyBlbmRwb2ludCkuIFRoZSBuYXRpdmVcbiAgICogRGF0YWJyaWNrcyB0b29sIGlzIGFsd2F5cyBwcmVmZXJyZWQ7IHRoaXMgb25seSBraWNrcyBpbiB3aGVuIHRoZXJlIGlzIG5vXG4gICAqIG5hdGl2ZSBvcHRpb24sIHNvIHRoZSB0b29sIHN0aWxsIHJldHVybnMgcmVzdWx0cyBpbnN0ZWFkIG9mIGVycm9yaW5nLlxuICAgKiBEZWZhdWx0cyB0byBgdHJ1ZWA7IHNldCBgZmFsc2VgIChvciBgV0VCX1NFQVJDSF9TQ1JBUEVfRkFMTEJBQ0s9MGApIHRvXG4gICAqIHJlcXVpcmUgYSBuYXRpdmUgbW9kZWwgYW5kIGVycm9yIG90aGVyd2lzZS5cbiAgICovXG4gIHNjcmFwZUZhbGxiYWNrPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoaWNoIFVSTHMgdGhlIHRvb2xzIG1heSByZWFjaCAoe0BsaW5rIFVybFBvbGljeU1vZGV9KS4gRmFsbHMgYmFjayB0b1xuICAgKiBgV0VCX1NFQVJDSF9VUkxfUE9MSUNZYCwgdGhlbiB0byBgXCJhbGxvd2xpc3RcImAgd2hlbiB7QGxpbmsgYWxsb3dlZFVybHN9XG4gICAqIGhhcyBlbnRyaWVzIGFuZCBgXCJ1bnJlc3RyaWN0ZWRcImAgd2hlbiBpdCBkb2VzIG5vdC4gTmFtaW5nIHRoZSBtb2RlXG4gICAqIGV4cGxpY2l0bHkgaXMgdGhlIHdheSB0byBzdGF0ZSB0aGF0IGFuIG9wZW4gZGVwbG95bWVudCBpcyBpbnRlbmRlZDtcbiAgICogYFwiYWxsb3dsaXN0XCJgIHdpdGggbm8gZW50cmllcywgb3IgYFwidW5yZXN0cmljdGVkXCJgIGFsb25nc2lkZSBlbnRyaWVzLCBpc1xuICAgKiBhIGNvbnRyYWRpY3Rpb24gYW5kIGZhaWxzIGF0IHJlc29sdXRpb24uXG4gICAqL1xuICB1cmxQb2xpY3k/OiBVcmxQb2xpY3lNb2RlO1xuICAvKipcbiAgICogT3B0aW9uYWwgVVJMIGFsbG93LWxpc3QuIEVhY2ggZW50cnkgaXMgYSBnbG9iIChvciBiYXJlIGhvc3QpIHRlc3RlZFxuICAgKiBhZ2FpbnN0IGEgVVJMJ3MgZnVsbCBgaHJlZmAuIFdoZW4gc2V0LCBgd2ViX3NlYXJjaGAgc2lsZW50bHkgZmlsdGVyc1xuICAgKiBjaXRhdGlvbnMgdG8gdGhlIHBlcm1pdHRlZCBzZXQgYW5kIGB3ZWJfZmV0Y2hgIHJlZnVzZXMgYSBkaXNhbGxvd2VkIFVSTC5cbiAgICogQWNjZXB0cyBhIGBzdHJpbmdbXWAgb3IgYSBjb21tYS0vd2hpdGVzcGFjZS1zZXBhcmF0ZWQgc3RyaW5nOyBmYWxscyBiYWNrXG4gICAqIHRvIGBXRUJfU0VBUkNIX0FMTE9XRURfVVJMU2AuIE9taXQgKG9yIGxlYXZlIGVtcHR5KSBmb3Igbm8gcmVzdHJpY3Rpb24uXG4gICAqIFNlZSBgYWxsb3dsaXN0LnRzYC5cbiAgICovXG4gIGFsbG93ZWRVcmxzPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKlxuICAgKiBBcHByb3ZhbCBnYXRlIGFwcGxpZWQgdG8gQk9USCB0b29scyAocGVyLXRvb2wgb3ZlcnJpZGVzIHZpYVxuICAgKiB7QGxpbmsgV2ViU2VhcmNoVG9vbE9wdGlvbnMuYXBwcm92YWx9IHdpbikuIGB0cnVlYCBnYXRlcyBldmVyeSBjYWxsO1xuICAgKiBhIFVSTC1wYXR0ZXJuIChvciBsaXN0KSBnYXRlcyBvbmx5IG1hdGNoaW5nIGNhbGxzOyBhblxuICAgKiB7QGxpbmsgQXBwcm92YWxQb2xpY3l9IHN0YXRlcyB0aGUgbW9kZSBkaXJlY3RseS4gT21pdCBmb3Igbm8gYXBwcm92YWwuXG4gICAqL1xuICBhcHByb3ZhbD86IEFwcHJvdmFsR2F0ZSB8IEFwcHJvdmFsUG9saWN5O1xufVxuXG4vKiogQ29uY3JldGUsIHZhbGlkYXRlZCBjb25maWcgdGhlIHJ1bnRpbWUgKyB0b29scyByZWFkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFdlYlNlYXJjaENvbmZpZyB7XG4gIC8qKiBQaW5uZWQgd2ViLXNlYXJjaCBtb2RlbCwgd2hlbiBjb25maWd1cmVkIChlbHNlIHVuZGVmaW5lZCAtIHVzZSBmYWxsYmFja3MpLiAqL1xuICBtb2RlbD86IHN0cmluZztcbiAgLyoqIFdoZXJlIHtAbGluayBtb2RlbH0gY2FtZSBmcm9tLCB3aGljaCBkZWNpZGVzIHdoZXRoZXIgYW4gdW5zdXBwb3J0ZWQgcGluIGlzIGZhdGFsLiAqL1xuICBtb2RlbFNvdXJjZTogTW9kZWxTb3VyY2U7XG4gIC8qKiBPcmRlcmVkIGZhbGxiYWNrIG1vZGVsIGNhbmRpZGF0ZXMgKEdlbWluaSwgdGhlbiBHUFQsIHRoZW4gYSBmbG9vcikuICovXG4gIG1vZGVsRmFsbGJhY2tzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIFByb3ZpZGVyIC0+IHRvb2wtc3BlYyBvdmVycmlkZSBtYXAsIG1lcmdlZCBvdmVyIHRoZSBidWlsdC1pbiBkZWZhdWx0cy4gKi9cbiAgd2ViU2VhcmNoVG9vbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogV2hldGhlciB0byBmdXp6eS1tYXRjaCBsb29zZSBtb2RlbCBuYW1lcy4gKi9cbiAgZnV6enk6IGJvb2xlYW47XG4gIC8qKiBGdXNlLmpzIGZ1enp5IHRocmVzaG9sZC4gKi9cbiAgZnV6enlUaHJlc2hvbGQ6IG51bWJlcjtcbiAgbWF4Q2l0YXRpb25zOiBudW1iZXI7XG4gIGZldGNoTWF4TGVuZ3RoOiBudW1iZXI7XG4gIHRpbWVvdXRNczogbnVtYmVyO1xuICAvKiogV2hldGhlciB0byBzY3JhcGUtZmFsbGJhY2sgd2hlbiBubyBuYXRpdmUgd2ViLXNlYXJjaCBtb2RlbCBpcyBkZXBsb3llZC4gKi9cbiAgc2NyYXBlRmFsbGJhY2s6IGJvb2xlYW47XG4gIC8qKiBUaGUgbmFtZWQgVVJMIHBvbGljeSBpbiBmb3JjZS4gKi9cbiAgdXJsUG9saWN5OiBVcmxQb2xpY3lNb2RlO1xuICAvKiogQ29tcGlsZWQgYWxsb3ctbGlzdCAocGVybWl0LWFsbCB1bmRlciB0aGUgYHVucmVzdHJpY3RlZGAgcG9saWN5KS4gKi9cbiAgYWxsb3dMaXN0OiBVcmxBbGxvd0xpc3Q7XG4gIC8qKiBEZWZhdWx0IHBlci10b29sIGFwcHJvdmFsIHBvbGljeS4gKi9cbiAgYXBwcm92YWw6IEFwcHJvdmFsUG9saWN5O1xufVxuXG4vKiogSlNPTiBTY2hlbWEgcHVibGlzaGVkIG9uIHRoZSBtYW5pZmVzdCdzIGBjb25maWcuc2NoZW1hYC4gKi9cbmV4cG9ydCBjb25zdCBXRUJfU0VBUkNIX0NPTkZJR19TQ0hFTUE6IEpTT05TY2hlbWE3ID0ge1xuICB0eXBlOiBcIm9iamVjdFwiLFxuICBwcm9wZXJ0aWVzOiB7XG4gICAgbW9kZWw6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJEZWZhdWx0IHdlYi1zZWFyY2ggbW9kZWwgKGVuZHBvaW50IG5hbWUsIGxvb3NlIG5hbWUsIG9yIGNsYXNzKS4gRnV6enktbWF0Y2hlZC4gRW52OiBXRUJfU0VBUkNIX01PREVMLCB0aGVuIERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FLlwiLFxuICAgIH0sXG4gICAgbW9kZWxGYWxsYmFja3M6IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGl0ZW1zOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIk9yZGVyZWQgd2ViLXNlYXJjaCBtb2RlbCBjYW5kaWRhdGVzIHdoZW4gYG1vZGVsYCBpcyB1bnNldCAoR2VtaW5pLCB0aGVuIEdQVCkuIEVudjogV0VCX1NFQVJDSF9NT0RFTF9GQUxMQkFDS1MuXCIsXG4gICAgfSxcbiAgICB3ZWJTZWFyY2hUb29sczoge1xuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnUHJvdmlkZXIgLT4gdG9vbC1zcGVjIG92ZXJyaWRlIG1hcCBtZXJnZWQgb3ZlciB0aGUgYnVpbHQtaW4gZGVmYXVsdHMgKG9wZW5haSAtPiB7XCJ0eXBlXCI6XCJ3ZWJfc2VhcmNoXCJ9LCBnZW1pbmkgLT4ge1wiZ29vZ2xlX3NlYXJjaFwiOnt9fSkuIEVudjogV0VCX1NFQVJDSF9UT09MUyAoSlNPTikuJyxcbiAgICB9LFxuICAgIG1vZGVsRnV6enlNYXRjaDoge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJGdXp6eS1tYXRjaCBsb29zZSBtb2RlbCBuYW1lcyBhZ2FpbnN0IHRoZSBsaXZlIGNhdGFsb2d1ZS4gRGVmYXVsdCB0cnVlIChlbnY6IFdFQl9TRUFSQ0hfRlVaWlkpLlwiLFxuICAgIH0sXG4gICAgbW9kZWxGdXp6eVRocmVzaG9sZDoge1xuICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkZ1c2UuanMgc2NvcmUgdGhyZXNob2xkIGJlbG93IHdoaWNoIGEgZnV6enkgbW9kZWwgbWF0Y2ggaXMgYWNjZXB0ZWQgKGVudjogV0VCX1NFQVJDSF9GVVpaWV9USFJFU0hPTEQpLlwiLFxuICAgIH0sXG4gICAgbWF4Q2l0YXRpb25zOiB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiSGFyZCBjYXAgb24gY2l0YXRpb25zIHJldHVybmVkIChlbnY6IFdFQl9TRUFSQ0hfTUFYX0NJVEFUSU9OUykuXCIsXG4gICAgfSxcbiAgICBmZXRjaE1heExlbmd0aDoge1xuICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkhhcmQgY2FwIG9uIHdlYl9mZXRjaCBjb250ZW50IGxlbmd0aCAoZW52OiBXRUJfU0VBUkNIX0ZFVENIX01BWF9MRU5HVEgpLlwiLFxuICAgIH0sXG4gICAgdGltZW91dE1zOiB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiUGVyLXJlcXVlc3QgbmV0d29yayB0aW1lb3V0IGluIG1zIChlbnY6IFdFQl9TRUFSQ0hfVElNRU9VVF9NUykuXCIsXG4gICAgfSxcbiAgICBzY3JhcGVGYWxsYmFjazoge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJGYWxsIGJhY2sgdG8gYSBEdWNrRHVja0dvIHNjcmFwZSB3aGVuIG5vIHdlYi1zZWFyY2gtY2FwYWJsZSBtb2RlbCBpcyBkZXBsb3llZC4gRGVmYXVsdCB0cnVlIChlbnY6IFdFQl9TRUFSQ0hfU0NSQVBFX0ZBTExCQUNLKS5cIixcbiAgICB9LFxuICAgIHVybFBvbGljeToge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGVudW06IFtcInVucmVzdHJpY3RlZFwiLCBcImFsbG93bGlzdFwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIldoaWNoIFVSTHMgdGhlIHRvb2xzIG1heSByZWFjaC4gRGVmYXVsdHMgdG8gYWxsb3dsaXN0IHdoZW4gYWxsb3dlZFVybHMgaGFzIGVudHJpZXMsIGVsc2UgdW5yZXN0cmljdGVkIChlbnY6IFdFQl9TRUFSQ0hfVVJMX1BPTElDWSkuXCIsXG4gICAgfSxcbiAgICBhbGxvd2VkVXJsczoge1xuICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdVUkwgYWxsb3ctbGlzdCBvZiBnbG9icyAvIGJhcmUgaG9zdHMgKGUuZy4gXCIqLmRhdGFicmlja3MuY29tXCIsIFwiZG9jcy5leGFtcGxlLmNvbVwiKS4gQWxzbyBhY2NlcHRzIGEgY29tbWEvc3BhY2Utc2VwYXJhdGVkIHN0cmluZy4gRmFsbHMgYmFjayB0byBXRUJfU0VBUkNIX0FMTE9XRURfVVJMUy4gRW1wdHkgPSB1bnJlc3RyaWN0ZWQuJyxcbiAgICB9LFxuICAgIGFwcHJvdmFsOiB7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0FwcHJvdmFsIGdhdGUgZm9yIGJvdGggdG9vbHM6IHRydWUgZ2F0ZXMgZXZlcnkgY2FsbCwgYSBnbG9iIChvciBsaXN0IG9mIGdsb2JzKSBnYXRlcyBvbmx5IG1hdGNoaW5nIFVSTHMsIG9yIHN0YXRlIHRoZSBtb2RlIGRpcmVjdGx5IGFzIHtcIm1vZGVcIjpcIm5vbmVcInxcImFsd2F5c1wifFwidXJsc1wifS4gRGVmYXVsdCBub25lLicsXG4gICAgICBvbmVPZjogW1xuICAgICAgICB7IHR5cGU6IFwiYm9vbGVhblwiIH0sXG4gICAgICAgIHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICB7IHR5cGU6IFwiYXJyYXlcIiwgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9IH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG1vZGU6IHsgdHlwZTogXCJzdHJpbmdcIiwgZW51bTogW1wibm9uZVwiLCBcImFsd2F5c1wiLCBcInVybHNcIl0gfSxcbiAgICAgICAgICAgIHBhdHRlcm5zOiB7IHR5cGU6IFwiYXJyYXlcIiwgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9IH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1aXJlZDogW1wibW9kZVwiXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSxcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGBXRUJfU0VBUkNIX1RPT0xTYCBlbnYgdmFyIChKU09OIG9iamVjdCksIGVsc2UgYHt9YC4gQSB2YWx1ZSB0aGF0XG4gKiBpcyBzZXQgYnV0IG5vdCBhIEpTT04gb2JqZWN0IGlzIGEgZGVwbG95bWVudCBtaXN0YWtlIHRoYXQgd291bGQgb3RoZXJ3aXNlXG4gKiBzaWxlbnRseSBsZWF2ZSB0aGUgYnVpbHQtaW4gdG9vbCBzcGVjcyBpbiBwbGFjZSwgc28gaXQgdGhyb3dzLlxuICovXG5mdW5jdGlvbiBwYXJzZVRvb2xzRW52KCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgcmF3ID0gY29yZUNvbmZpZy50ZXh0KFwiV0VCX1NFQVJDSF9UT09MU1wiLCBjb3JlQ29uZmlnLkVOVl9PTkxZKTtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkKSByZXR1cm4ge307XG4gIGNvbnN0IHBhcnNlZCA9IGpzb24ucGFyc2VSZWNvcmQocmF3KTtcbiAgaWYgKCFwYXJzZWQpIHtcbiAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgICAgXCJXRUJfU0VBUkNIX1RPT0xTIG11c3QgYmUgYSBKU09OIG9iamVjdCBtYXBwaW5nIGEgcHJvdmlkZXIgZmFtaWx5IHRvIGl0cyB0b29sIHNwZWNcIixcbiAgICAgIHsgY29udGV4dDogeyBlbnZWYXI6IFwiV0VCX1NFQVJDSF9UT09MU1wiIH0gfSxcbiAgICApO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKiBSZWFkIHRoZSBwaW5uZWQgZW5kcG9pbnQgaWQgYW5kIHJlY29yZCB3aGljaCBzb3VyY2Ugc3VwcGxpZWQgaXQuICovXG5mdW5jdGlvbiByZXNvbHZlTW9kZWxQaW4oY29uZmlnOiBXZWJTZWFyY2hQbHVnaW5Db25maWcpOiB7IG1vZGVsPzogc3RyaW5nOyBzb3VyY2U6IE1vZGVsU291cmNlIH0ge1xuICBjb25zdCBmcm9tQ29uZmlnID0gc3RyaW5nLnRyaW1Ub051bGwoY29uZmlnLm1vZGVsKTtcbiAgaWYgKGZyb21Db25maWcgIT09IG51bGwpIHJldHVybiB7IG1vZGVsOiBmcm9tQ29uZmlnLCBzb3VyY2U6IFwiY29uZmlnXCIgfTtcbiAgY29uc3QgZnJvbU1vZGVsRW52ID0gY29yZUNvbmZpZy50ZXh0KE1PREVMX0VOViwgY29yZUNvbmZpZy5FTlZfT05MWSk7XG4gIGlmIChmcm9tTW9kZWxFbnYgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHsgbW9kZWw6IGZyb21Nb2RlbEVudiwgc291cmNlOiBNT0RFTF9FTlYgfTtcbiAgY29uc3QgZnJvbVJlc291cmNlRW52ID0gY29yZUNvbmZpZy50ZXh0KFNFUlZJTkdfRU5EUE9JTlRfRU5WLCBjb3JlQ29uZmlnLkVOVl9PTkxZKTtcbiAgaWYgKGZyb21SZXNvdXJjZUVudiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHsgbW9kZWw6IGZyb21SZXNvdXJjZUVudiwgc291cmNlOiBTRVJWSU5HX0VORFBPSU5UX0VOViB9O1xuICB9XG4gIHJldHVybiB7IHNvdXJjZTogXCJub25lXCIgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBuYW1lZCB7QGxpbmsgVXJsUG9saWN5TW9kZX0sIGZhaWxpbmcgb24gYSBzdGF0ZWQgbW9kZSB0aGF0XG4gKiBjb250cmFkaWN0cyB0aGUgYWxsb3ctbGlzdCBlbnRyaWVzIGl0IHdhcyBnaXZlbi5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVVybFBvbGljeShcbiAgY29uZmlndXJlZDogVXJsUG9saWN5TW9kZSB8IHVuZGVmaW5lZCxcbiAgcGF0dGVybnM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogVXJsUG9saWN5TW9kZSB7XG4gIGNvbnN0IHJhdyA9IGNvbmZpZ3VyZWQgPz8gY29yZUNvbmZpZy50ZXh0KFwiV0VCX1NFQVJDSF9VUkxfUE9MSUNZXCIsIGNvcmVDb25maWcuRU5WX09OTFkpO1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQpIHJldHVybiBwYXR0ZXJucy5sZW5ndGggPiAwID8gXCJhbGxvd2xpc3RcIiA6IFwidW5yZXN0cmljdGVkXCI7XG4gIGlmIChyYXcgIT09IFwiYWxsb3dsaXN0XCIgJiYgcmF3ICE9PSBcInVucmVzdHJpY3RlZFwiKSB7XG4gICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcbiAgICAgICd1cmxQb2xpY3kgbXVzdCBiZSBcImFsbG93bGlzdFwiIG9yIFwidW5yZXN0cmljdGVkXCIgKGVudjogV0VCX1NFQVJDSF9VUkxfUE9MSUNZKScsXG4gICAgICB7IGNvbnRleHQ6IHsgZmllbGQ6IFwidXJsUG9saWN5XCIsIGVudlZhcjogXCJXRUJfU0VBUkNIX1VSTF9QT0xJQ1lcIiB9IH0sXG4gICAgKTtcbiAgfVxuICBpZiAocmF3ID09PSBcImFsbG93bGlzdFwiICYmIHBhdHRlcm5zLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgICAndXJsUG9saWN5IFwiYWxsb3dsaXN0XCIgbmVlZHMgYXQgbGVhc3Qgb25lIGVudHJ5IGluIGFsbG93ZWRVcmxzIChlbnY6IFdFQl9TRUFSQ0hfQUxMT1dFRF9VUkxTKScsXG4gICAgICB7IGNvbnRleHQ6IHsgZmllbGQ6IFwiYWxsb3dlZFVybHNcIiwgZW52VmFyOiBcIldFQl9TRUFSQ0hfQUxMT1dFRF9VUkxTXCIgfSB9LFxuICAgICk7XG4gIH1cbiAgaWYgKHJhdyA9PT0gXCJ1bnJlc3RyaWN0ZWRcIiAmJiBwYXR0ZXJucy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcbiAgICAgICd1cmxQb2xpY3kgXCJ1bnJlc3RyaWN0ZWRcIiBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBhbGxvd2VkVXJscyBlbnRyaWVzOyBkcm9wIHRoZSBlbnRyaWVzIG9yIHNldCB1cmxQb2xpY3kgdG8gXCJhbGxvd2xpc3RcIicsXG4gICAgICB7IGNvbnRleHQ6IHsgZmllbGQ6IFwiYWxsb3dlZFVybHNcIiwgZW52VmFyOiBcIldFQl9TRUFSQ0hfQUxMT1dFRF9VUkxTXCIgfSB9LFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJhdztcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgYW55IGFjY2VwdGVkIGFwcHJvdmFsIHNwZWxsaW5nIGludG8gYW4ge0BsaW5rIEFwcHJvdmFsUG9saWN5fS5cbiAqIEEgcGF0dGVybiBnYXRlIHdpdGggbm8gdXNhYmxlIHBhdHRlcm5zIGNvbGxhcHNlcyB0byBgXCJub25lXCJgIHJhdGhlciB0aGFuXG4gKiBnYXRpbmcgZXZlcnl0aGluZywgc28gYSBibGFuayBlbnYgdmFyIGNhbiBuZXZlciB3ZWRnZSB0aGUgdG9vbHMgYmVoaW5kIGFuXG4gKiBhcHByb3ZhbCBub2JvZHkgY29uZmlndXJlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQXBwcm92YWxQb2xpY3koZ2F0ZTogQXBwcm92YWxHYXRlIHwgQXBwcm92YWxQb2xpY3kgfCB1bmRlZmluZWQpOiBBcHByb3ZhbFBvbGljeSB7XG4gIGlmIChnYXRlID09PSB1bmRlZmluZWQgfHwgZ2F0ZSA9PT0gZmFsc2UpIHJldHVybiB7IG1vZGU6IFwibm9uZVwiIH07XG4gIGlmIChnYXRlID09PSB0cnVlKSByZXR1cm4geyBtb2RlOiBcImFsd2F5c1wiIH07XG4gIGlmIChvYmplY3QuaXNSZWNvcmQoZ2F0ZSkgJiYgXCJtb2RlXCIgaW4gZ2F0ZSkge1xuICAgIGlmIChnYXRlLm1vZGUgPT09IFwidXJsc1wiKSB7XG4gICAgICBjb25zdCBwYXR0ZXJucyA9IHBhcnNlQWxsb3dlZFVybHMoWy4uLmdhdGUucGF0dGVybnNdKTtcbiAgICAgIHJldHVybiBwYXR0ZXJucy5sZW5ndGggPiAwID8geyBtb2RlOiBcInVybHNcIiwgcGF0dGVybnMgfSA6IHsgbW9kZTogXCJub25lXCIgfTtcbiAgICB9XG4gICAgaWYgKGdhdGUubW9kZSA9PT0gXCJhbHdheXNcIiB8fCBnYXRlLm1vZGUgPT09IFwibm9uZVwiKSByZXR1cm4geyBtb2RlOiBnYXRlLm1vZGUgfTtcbiAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKCdhcHByb3ZhbCBtb2RlIG11c3QgYmUgXCJub25lXCIsIFwiYWx3YXlzXCIgb3IgXCJ1cmxzXCInLCB7XG4gICAgICBjb250ZXh0OiB7IGZpZWxkOiBcImFwcHJvdmFsXCIgfSxcbiAgICB9KTtcbiAgfVxuICBjb25zdCBwYXR0ZXJucyA9IHBhcnNlQWxsb3dlZFVybHModHlwZW9mIGdhdGUgPT09IFwic3RyaW5nXCIgPyBnYXRlIDogWy4uLmdhdGVdKTtcbiAgcmV0dXJuIHBhdHRlcm5zLmxlbmd0aCA+IDAgPyB7IG1vZGU6IFwidXJsc1wiLCBwYXR0ZXJucyB9IDogeyBtb2RlOiBcIm5vbmVcIiB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgcGx1Z2luIGNvbmZpZyBvdmVyIGVudmlyb25tZW50IGRlZmF1bHRzIGludG8gdGhlIGNvbmNyZXRlXG4gKiB7QGxpbmsgUmVzb2x2ZWRXZWJTZWFyY2hDb25maWd9LiBXaGljaCBtb2RlbCBpcyB1c2VkIHN0YXlzIGxhenkgLSBpdCBpc1xuICogcGlja2VkIGF0IGNhbGwgdGltZSBhZ2FpbnN0IHRoZSBsaXZlIGNhdGFsb2d1ZSAtIGJ1dCBldmVyeXRoaW5nIGVsc2UgaXNcbiAqIHNldHRsZWQgaGVyZSwgYW5kIGEgY29udHJhZGljdGlvbiAodW5wYXJzZWFibGUgYFdFQl9TRUFSQ0hfVE9PTFNgLCBhblxuICogdW5rbm93biBVUkwgcG9saWN5LCBhIHBvbGljeSB0aGF0IGRpc2FncmVlcyB3aXRoIGl0cyBhbGxvdy1saXN0KSB0aHJvd3MgYVxuICoge0BsaW5rIENvbmZpZ3VyYXRpb25FcnJvcn0gbmFtaW5nIHRoZSBmaWVsZCBhbmQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdlYlNlYXJjaENvbmZpZyhcbiAgY29uZmlnOiBXZWJTZWFyY2hQbHVnaW5Db25maWcgPSB7fSxcbik6IFJlc29sdmVkV2ViU2VhcmNoQ29uZmlnIHtcbiAgY29uc3QgcGF0dGVybnMgPSBwYXJzZUFsbG93ZWRVcmxzKFxuICAgIGNvbmZpZy5hbGxvd2VkVXJscyA/PyBjb3JlQ29uZmlnLnRleHQoXCJXRUJfU0VBUkNIX0FMTE9XRURfVVJMU1wiLCBjb3JlQ29uZmlnLkVOVl9PTkxZKSxcbiAgKTtcbiAgY29uc3QgdXJsUG9saWN5ID0gcmVzb2x2ZVVybFBvbGljeShjb25maWcudXJsUG9saWN5LCBwYXR0ZXJucyk7XG4gIGNvbnN0IHsgbW9kZWwsIHNvdXJjZSB9ID0gcmVzb2x2ZU1vZGVsUGluKGNvbmZpZyk7XG4gIGNvbnN0IGZhbGxiYWNrcyA9IGNvcmVDb25maWcubGlzdChcbiAgICBjb25maWcubW9kZWxGYWxsYmFja3MsXG4gICAgXCJXRUJfU0VBUkNIX01PREVMX0ZBTExCQUNLU1wiLFxuICAgIHVuZGVmaW5lZCxcbiAgICBjb3JlQ29uZmlnLkVOVl9PTkxZLFxuICApO1xuICByZXR1cm4ge1xuICAgIC4uLihtb2RlbCA/IHsgbW9kZWwgfSA6IHt9KSxcbiAgICBtb2RlbFNvdXJjZTogc291cmNlLFxuICAgIG1vZGVsRmFsbGJhY2tzOiBmYWxsYmFja3MubGVuZ3RoID4gMCA/IGZhbGxiYWNrcyA6IERFRkFVTFRfTU9ERUxfRkFMTEJBQ0tTLFxuICAgIHdlYlNlYXJjaFRvb2xzOiB7IC4uLnBhcnNlVG9vbHNFbnYoKSwgLi4uKGNvbmZpZy53ZWJTZWFyY2hUb29scyA/PyB7fSkgfSxcbiAgICBmdXp6eTpcbiAgICAgIGNvcmVDb25maWcuYm9vbGVhbihjb25maWcubW9kZWxGdXp6eU1hdGNoLCBcIldFQl9TRUFSQ0hfRlVaWllcIiwgY29yZUNvbmZpZy5FTlZfT05MWSkgPz9cbiAgICAgIHRydWUsXG4gICAgZnV6enlUaHJlc2hvbGQ6IGNvcmVDb25maWcucG9zaXRpdmVOdW1iZXIoXG4gICAgICBjb25maWcubW9kZWxGdXp6eVRocmVzaG9sZCxcbiAgICAgIFwiV0VCX1NFQVJDSF9GVVpaWV9USFJFU0hPTERcIixcbiAgICAgIHNlcnZpbmcuREVGQVVMVF9GVVpaWV9USFJFU0hPTEQsXG4gICAgICBjb3JlQ29uZmlnLkVOVl9PTkxZLFxuICAgICksXG4gICAgbWF4Q2l0YXRpb25zOiBjb3JlQ29uZmlnLnBvc2l0aXZlSW50KFxuICAgICAgY29uZmlnLm1heENpdGF0aW9ucyxcbiAgICAgIFwiV0VCX1NFQVJDSF9NQVhfQ0lUQVRJT05TXCIsXG4gICAgICBERUZBVUxUX01BWF9DSVRBVElPTlMsXG4gICAgICBjb3JlQ29uZmlnLkVOVl9PTkxZLFxuICAgICksXG4gICAgZmV0Y2hNYXhMZW5ndGg6IGNvcmVDb25maWcucG9zaXRpdmVJbnQoXG4gICAgICBjb25maWcuZmV0Y2hNYXhMZW5ndGgsXG4gICAgICBcIldFQl9TRUFSQ0hfRkVUQ0hfTUFYX0xFTkdUSFwiLFxuICAgICAgREVGQVVMVF9GRVRDSF9NQVhfTEVOR1RILFxuICAgICAgY29yZUNvbmZpZy5FTlZfT05MWSxcbiAgICApLFxuICAgIHRpbWVvdXRNczogY29yZUNvbmZpZy5wb3NpdGl2ZUludChcbiAgICAgIGNvbmZpZy50aW1lb3V0TXMsXG4gICAgICBcIldFQl9TRUFSQ0hfVElNRU9VVF9NU1wiLFxuICAgICAgREVGQVVMVF9USU1FT1VUX01TLFxuICAgICAgY29yZUNvbmZpZy5FTlZfT05MWSxcbiAgICApLFxuICAgIHNjcmFwZUZhbGxiYWNrOlxuICAgICAgY29yZUNvbmZpZy5ib29sZWFuKFxuICAgICAgICBjb25maWcuc2NyYXBlRmFsbGJhY2ssXG4gICAgICAgIFwiV0VCX1NFQVJDSF9TQ1JBUEVfRkFMTEJBQ0tcIixcbiAgICAgICAgY29yZUNvbmZpZy5FTlZfT05MWSxcbiAgICAgICkgPz8gdHJ1ZSxcbiAgICB1cmxQb2xpY3ksXG4gICAgYWxsb3dMaXN0OiB0b1VybEFsbG93TGlzdCh1cmxQb2xpY3kgPT09IFwiYWxsb3dsaXN0XCIgPyBwYXR0ZXJucyA6IFtdKSxcbiAgICBhcHByb3ZhbDogdG9BcHByb3ZhbFBvbGljeShjb25maWcuYXBwcm92YWwpLFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYW4gYXBwcm92YWwgZ2F0ZSBhZ2FpbnN0IGEgc2V0IG9mIGNhbmRpZGF0ZSBVUkxzIGludG8gYSBjb25jcmV0ZVxuICogYm9vbGVhbjogYFwibm9uZVwiYCAvIGBcImFsd2F5c1wiYCBwYXNzIHN0cmFpZ2h0IHRocm91Z2g7IGEgYFwidXJsc1wiYCBwb2xpY3lcbiAqIGdhdGVzIHdoZW4gQU5ZIGNhbmRpZGF0ZSBtYXRjaGVzLiBFbXB0eSBjYW5kaWRhdGVzIHdpdGggYSBwYXR0ZXJuIGdhdGVcbiAqIG5ldmVyIG1hdGNoIChub3RoaW5nIHRvIGFwcHJvdmUpLiBSZXVzZXMgdGhlIGFsbG93LWxpc3QgbWF0Y2hlciBzbyBhcHByb3ZhbFxuICogZ2xvYnMgcmVhZCBleGFjdGx5IGxpa2UgYWxsb3ctbGlzdCBnbG9icy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcHJvdmFsTWF0Y2hlcyhcbiAgZ2F0ZTogQXBwcm92YWxHYXRlIHwgQXBwcm92YWxQb2xpY3ksXG4gIHVybHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBvbGljeSA9IHRvQXBwcm92YWxQb2xpY3koZ2F0ZSk7XG4gIGlmIChwb2xpY3kubW9kZSA9PT0gXCJub25lXCIpIHJldHVybiBmYWxzZTtcbiAgaWYgKHBvbGljeS5tb2RlID09PSBcImFsd2F5c1wiKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgbGlzdCA9IHRvVXJsQWxsb3dMaXN0KHBvbGljeS5wYXR0ZXJucyk7XG4gIHJldHVybiB1cmxzLnNvbWUoKHVybCkgPT4gbGlzdC5hbGxvd3ModXJsKSk7XG59XG4iXX0=
package/package.json CHANGED
@@ -26,11 +26,11 @@
26
26
  },
27
27
  "dependencies": {
28
28
  "@databricks/appkit": "^0.43.0",
29
- "@dbx-tools/core": "0.6.87",
30
- "@dbx-tools/model": "0.6.87",
31
- "@dbx-tools/path": "0.6.87",
32
- "@dbx-tools/shared-core": "0.6.87",
33
- "@dbx-tools/shared-model": "0.6.87",
29
+ "@dbx-tools/core": "0.6.89",
30
+ "@dbx-tools/model": "0.6.89",
31
+ "@dbx-tools/path": "0.6.89",
32
+ "@dbx-tools/shared-core": "0.6.89",
33
+ "@dbx-tools/shared-model": "0.6.89",
34
34
  "@mastra/core": "^1.47.0",
35
35
  "got-scraping": "^4.2.1",
36
36
  "zod": "4.3.6"
@@ -49,7 +49,7 @@
49
49
  "./package.json": "./package.json"
50
50
  }
51
51
  },
52
- "version": "0.6.87",
52
+ "version": "0.6.89",
53
53
  "types": "./lib/index.d.ts",
54
54
  "type": "module",
55
55
  "exports": {
package/src/config.ts CHANGED
@@ -45,7 +45,7 @@
45
45
  */
46
46
 
47
47
  import { ConfigurationError, type BasePluginConfig } from "@databricks/appkit";
48
- import { config as runtimeConfig } from "@dbx-tools/core";
48
+ import { config as coreConfig } from "@dbx-tools/core";
49
49
  import { serving } from "@dbx-tools/model";
50
50
  import { json, object, type OneOrMany, string } from "@dbx-tools/shared-core";
51
51
  import type { JSONSchema7 } from "json-schema";
@@ -307,7 +307,7 @@ export const WEB_SEARCH_CONFIG_SCHEMA: JSONSchema7 = {
307
307
  * silently leave the built-in tool specs in place, so it throws.
308
308
  */
309
309
  function parseToolsEnv(): Record<string, unknown> {
310
- const raw = runtimeConfig.text("WEB_SEARCH_TOOLS", runtimeConfig.ENV_ONLY);
310
+ const raw = coreConfig.text("WEB_SEARCH_TOOLS", coreConfig.ENV_ONLY);
311
311
  if (raw === undefined) return {};
312
312
  const parsed = json.parseRecord(raw);
313
313
  if (!parsed) {
@@ -323,9 +323,9 @@ function parseToolsEnv(): Record<string, unknown> {
323
323
  function resolveModelPin(config: WebSearchPluginConfig): { model?: string; source: ModelSource } {
324
324
  const fromConfig = string.trimToNull(config.model);
325
325
  if (fromConfig !== null) return { model: fromConfig, source: "config" };
326
- const fromModelEnv = runtimeConfig.text(MODEL_ENV, runtimeConfig.ENV_ONLY);
326
+ const fromModelEnv = coreConfig.text(MODEL_ENV, coreConfig.ENV_ONLY);
327
327
  if (fromModelEnv !== undefined) return { model: fromModelEnv, source: MODEL_ENV };
328
- const fromResourceEnv = runtimeConfig.text(SERVING_ENDPOINT_ENV, runtimeConfig.ENV_ONLY);
328
+ const fromResourceEnv = coreConfig.text(SERVING_ENDPOINT_ENV, coreConfig.ENV_ONLY);
329
329
  if (fromResourceEnv !== undefined) {
330
330
  return { model: fromResourceEnv, source: SERVING_ENDPOINT_ENV };
331
331
  }
@@ -340,7 +340,7 @@ function resolveUrlPolicy(
340
340
  configured: UrlPolicyMode | undefined,
341
341
  patterns: readonly string[],
342
342
  ): UrlPolicyMode {
343
- const raw = configured ?? runtimeConfig.text("WEB_SEARCH_URL_POLICY", runtimeConfig.ENV_ONLY);
343
+ const raw = configured ?? coreConfig.text("WEB_SEARCH_URL_POLICY", coreConfig.ENV_ONLY);
344
344
  if (raw === undefined) return patterns.length > 0 ? "allowlist" : "unrestricted";
345
345
  if (raw !== "allowlist" && raw !== "unrestricted") {
346
346
  throw new ConfigurationError(
@@ -398,15 +398,15 @@ export function resolveWebSearchConfig(
398
398
  config: WebSearchPluginConfig = {},
399
399
  ): ResolvedWebSearchConfig {
400
400
  const patterns = parseAllowedUrls(
401
- config.allowedUrls ?? runtimeConfig.text("WEB_SEARCH_ALLOWED_URLS", runtimeConfig.ENV_ONLY),
401
+ config.allowedUrls ?? coreConfig.text("WEB_SEARCH_ALLOWED_URLS", coreConfig.ENV_ONLY),
402
402
  );
403
403
  const urlPolicy = resolveUrlPolicy(config.urlPolicy, patterns);
404
404
  const { model, source } = resolveModelPin(config);
405
- const fallbacks = runtimeConfig.list(
405
+ const fallbacks = coreConfig.list(
406
406
  config.modelFallbacks,
407
407
  "WEB_SEARCH_MODEL_FALLBACKS",
408
408
  undefined,
409
- runtimeConfig.ENV_ONLY,
409
+ coreConfig.ENV_ONLY,
410
410
  );
411
411
  return {
412
412
  ...(model ? { model } : {}),
@@ -414,37 +414,37 @@ export function resolveWebSearchConfig(
414
414
  modelFallbacks: fallbacks.length > 0 ? fallbacks : DEFAULT_MODEL_FALLBACKS,
415
415
  webSearchTools: { ...parseToolsEnv(), ...(config.webSearchTools ?? {}) },
416
416
  fuzzy:
417
- runtimeConfig.boolean(config.modelFuzzyMatch, "WEB_SEARCH_FUZZY", runtimeConfig.ENV_ONLY) ??
417
+ coreConfig.boolean(config.modelFuzzyMatch, "WEB_SEARCH_FUZZY", coreConfig.ENV_ONLY) ??
418
418
  true,
419
- fuzzyThreshold: runtimeConfig.positiveNumber(
419
+ fuzzyThreshold: coreConfig.positiveNumber(
420
420
  config.modelFuzzyThreshold,
421
421
  "WEB_SEARCH_FUZZY_THRESHOLD",
422
422
  serving.DEFAULT_FUZZY_THRESHOLD,
423
- runtimeConfig.ENV_ONLY,
423
+ coreConfig.ENV_ONLY,
424
424
  ),
425
- maxCitations: runtimeConfig.positiveInt(
425
+ maxCitations: coreConfig.positiveInt(
426
426
  config.maxCitations,
427
427
  "WEB_SEARCH_MAX_CITATIONS",
428
428
  DEFAULT_MAX_CITATIONS,
429
- runtimeConfig.ENV_ONLY,
429
+ coreConfig.ENV_ONLY,
430
430
  ),
431
- fetchMaxLength: runtimeConfig.positiveInt(
431
+ fetchMaxLength: coreConfig.positiveInt(
432
432
  config.fetchMaxLength,
433
433
  "WEB_SEARCH_FETCH_MAX_LENGTH",
434
434
  DEFAULT_FETCH_MAX_LENGTH,
435
- runtimeConfig.ENV_ONLY,
435
+ coreConfig.ENV_ONLY,
436
436
  ),
437
- timeoutMs: runtimeConfig.positiveInt(
437
+ timeoutMs: coreConfig.positiveInt(
438
438
  config.timeoutMs,
439
439
  "WEB_SEARCH_TIMEOUT_MS",
440
440
  DEFAULT_TIMEOUT_MS,
441
- runtimeConfig.ENV_ONLY,
441
+ coreConfig.ENV_ONLY,
442
442
  ),
443
443
  scrapeFallback:
444
- runtimeConfig.boolean(
444
+ coreConfig.boolean(
445
445
  config.scrapeFallback,
446
446
  "WEB_SEARCH_SCRAPE_FALLBACK",
447
- runtimeConfig.ENV_ONLY,
447
+ coreConfig.ENV_ONLY,
448
448
  ) ?? true,
449
449
  urlPolicy,
450
450
  allowList: toUrlAllowList(urlPolicy === "allowlist" ? patterns : []),