@dbx-tools/search 0.6.9 → 0.6.10
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/README.md +17 -1
- package/index.ts +2 -6
- package/lib/index.d.ts +2 -6
- package/lib/index.js +3 -7
- package/lib/src/client.js +1 -1
- package/lib/src/config.js +1 -1
- package/lib/src/lakebase.d.ts +40 -2
- package/lib/src/lakebase.js +75 -15
- package/lib/src/plugin.js +3 -3
- package/lib/src/query.js +1 -1
- package/lib/src/schema.js +2 -2
- package/package.json +6 -6
- package/src/client.ts +3 -3
- package/src/config.ts +1 -1
- package/src/lakebase.ts +102 -17
- package/src/plugin.ts +2 -2
- package/src/query.ts +1 -1
- package/src/schema.ts +1 -1
package/lib/src/plugin.js
CHANGED
|
@@ -24,11 +24,11 @@
|
|
|
24
24
|
import { lakebase, Plugin, ResourceType, toPlugin, } from "@databricks/appkit";
|
|
25
25
|
import { defineTool, executeFromRegistry, toolsFromRegistry, } from "@databricks/appkit/beta";
|
|
26
26
|
import { plugin as pluginLookup } from "@dbx-tools/appkit";
|
|
27
|
-
import { search as searchContract } from "@dbx-tools/shared-search";
|
|
28
27
|
import { error as errorUtil, log, string } from "@dbx-tools/shared-core";
|
|
28
|
+
import { search as searchContract } from "@dbx-tools/shared-search";
|
|
29
29
|
import { SEARCH_CONFIG_SCHEMA, DATABRICKS_INDEX_ENV, ENDPOINT_ENV, INDEX_ENV, resolveSearchConfig, } from "./config.js";
|
|
30
|
-
import { LakebaseSearchBackend } from "./lakebase.js";
|
|
31
30
|
import { toCreateIndexOptions } from "./index-tools.js";
|
|
31
|
+
import { LakebaseSearchBackend } from "./lakebase.js";
|
|
32
32
|
import { toDocumentArray } from "./query.js";
|
|
33
33
|
import { getSearchRuntime, resetSearchRuntime } from "./runtime.js";
|
|
34
34
|
import { ADD_DOCUMENTS_TOOL_DESCRIPTION, CREATE_INDEX_TOOL_DESCRIPTION, SEARCH_TOOL_DESCRIPTION, SYNC_INDEX_TOOL_DESCRIPTION, UNIVERSAL_SEARCH_TOOL_DESCRIPTION, } from "./schema.js";
|
|
@@ -503,4 +503,4 @@ export class SearchPlugin extends Plugin {
|
|
|
503
503
|
* ```
|
|
504
504
|
*/
|
|
505
505
|
export const search = toPlugin(SearchPlugin);
|
|
506
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFlBQVksRUFDWixRQUFRLEdBSVQsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixpQkFBaUIsR0FJbEIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsTUFBTSxJQUFJLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNELE9BQU8sRUFBRSxNQUFNLElBQUksY0FBYyxFQUEyQixNQUFNLDBCQUEwQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxLQUFLLElBQUksU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixZQUFZLEVBQ1osU0FBUyxFQUNULG1CQUFtQixHQUVwQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEUsT0FBTyxFQUNMLDhCQUE4QixFQUM5Qiw2QkFBNkIsRUFDN0IsdUJBQXVCLEVBQ3ZCLDJCQUEyQixFQUMzQixpQ0FBaUMsR0FDbEMsTUFBTSxhQUFhLENBQUM7QUFFckIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVwQyw0RUFBNEU7QUFD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QztRQUNqQixJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDdkMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLGdCQUFnQixFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRTtnQkFDekMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNyRCxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzNELEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN0RSxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZFLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDOUQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM3QixHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENB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QztJQUVPLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBYSxFQUFFLE1BQW9CO1FBQzVELE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzlDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDekQsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNqQyxDQUFDOztBQUdIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0IHBsdWdpbiAocmVnaXN0ZXJlZCBuYW1lOiBgc2VhcmNoYCkgdGhhdCB0dXJucyBhIERhdGFicmlja3MgQUlcbiAqIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXggaW50byBhIGJhdHRlcmllcy1pbmNsdWRlZCBzZWFyY2ggc3VyZmFjZS4gSXQgaXNcbiAqIHRoZSBcInNob3J0Y3V0XCIgaGFsZiBvZiB0aGlzIHBhY2thZ2U6IHJlZ2lzdGVyIGl0IHdpdGggbm90aGluZyBidXQgYW4gaW5kZXhcbiAqIG5hbWUgYW5kIHlvdSBnZXQsIGFsbCBhdCBvbmNlIC1cbiAqXG4gKiAgIC0gYSBgc2VhcmNoYCAvIGB1bml2ZXJzYWxfc2VhcmNoYCAvIChvcHQtaW4pIGBhZGRfZG9jdW1lbnRzYCB0b29sIHNldCBmb3JcbiAqICAgICBib3RoIE1hc3RyYSBhbmQgQXBwS2l0IGFnZW50cyAoYXV0b2NvbXBsZXRlIGlzIGEgc21hbGwtYGxpbWl0YCBzZWFyY2gpO1xuICogICAtIEhUVFAgcm91dGVzIHVuZGVyIGAvYXBpL3NlYXJjaGAgYSBicm93c2VyIHNlYXJjaCBib3ggY2FsbHMgZGlyZWN0bHlcbiAqICAgICAoYFBPU1QgL2Agc2VhcmNoLCBgUE9TVCAvdW5pdmVyc2FsYCBmZWRlcmF0ZWQsIGBHRVQgL2luZGV4ZXNgIGNhdGFsb2d1ZSxcbiAqICAgICBhbmQgYFBPU1QgL2RvY3VtZW50c2Agd2hlbiB3cml0ZXMgYXJlIGVuYWJsZWQpO1xuICogICAtIGEgYGNsaWVudENvbmZpZygpYCBwYXlsb2FkIHNvIGEgVUkga25vd3MgdGhlIGluZGV4ZXMsIGRlZmF1bHQsIGFuZCBwYWdlXG4gKiAgICAgc2l6ZSBhdCBib290IHdpdGggbm8gcm91bmQtdHJpcDtcbiAqICAgLSBgZXhwb3J0cygpYCBzbyBhcHAgY29kZSBjYW4gYGFwcGtpdC5zZWFyY2guc2VhcmNoKC4uLilgIGRpcmVjdGx5LlxuICpcbiAqIEV2ZXJ5dGhpbmcgcnVucyB1bmRlciB0aGUgY2FsbGVyJ3MgT0JPIGlkZW50aXR5IChyb3V0ZXMgd3JhcCBpbiBgYXNVc2VyYCksXG4gKiBzbyBVbml0eSBDYXRhbG9nIEFDTHMgb24gdGhlIGluZGV4IGFwcGx5LiBSZWdpc3RlcmluZyB0aGUgcGx1Z2luIHJlc29sdmVzXG4gKiBhbmQgbG9ncyB0aGUgZWZmZWN0aXZlIGNvbmZpZyAoZGVmYXVsdCBpbmRleCwga25vd24gaW5kZXhlcywgcGFnZSBzaXplLFxuICogbW9kZSkgc28gYSBtaXNjb25maWd1cmF0aW9uIHNob3dzIHVwIGluIHRoZSBib290IGxvZyByYXRoZXIgdGhhbiBvbiB0aGVcbiAqIGZpcnN0IHNlYXJjaC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgbGFrZWJhc2UsXG4gIFBsdWdpbixcbiAgUmVzb3VyY2VUeXBlLFxuICB0b1BsdWdpbixcbiAgdHlwZSBJQXBwUm91dGVyLFxuICB0eXBlIFBsdWdpbk1hbmlmZXN0LFxuICB0eXBlIFJlc291cmNlUmVxdWlyZW1lbnQsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGRlZmluZVRvb2wsXG4gIGV4ZWN1dGVGcm9tUmVnaXN0cnksXG4gIHRvb2xzRnJvbVJlZ2lzdHJ5LFxuICB0eXBlIEFnZW50VG9vbERlZmluaXRpb24sXG4gIHR5cGUgVG9vbFByb3ZpZGVyLFxuICB0eXBlIFRvb2xSZWdpc3RyeSxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBwbHVnaW4gYXMgcGx1Z2luTG9va3VwIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBzZWFyY2ggYXMgc2VhcmNoQ29udHJhY3QsIHR5cGUgU2VhcmNoQ2xpZW50Q29uZmlnIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaFwiO1xuaW1wb3J0IHsgZXJyb3IgYXMgZXJyb3JVdGlsLCBsb2csIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBTRUFSQ0hfQ09ORklHX1NDSEVNQSxcbiAgREFUQUJSSUNLU19JTkRFWF9FTlYsXG4gIEVORFBPSU5UX0VOVixcbiAgSU5ERVhfRU5WLFxuICByZXNvbHZlU2VhcmNoQ29uZmlnLFxuICB0eXBlIFNlYXJjaFBsdWdpbkNvbmZpZyxcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBMYWtlYmFzZVNlYXJjaEJhY2tlbmQgfSBmcm9tIFwiLi9sYWtlYmFzZS50c1wiO1xuaW1wb3J0IHsgdG9DcmVhdGVJbmRleE9wdGlvbnMgfSBmcm9tIFwiLi9pbmRleC10b29scy50c1wiO1xuaW1wb3J0IHsgdG9Eb2N1bWVudEFycmF5IH0gZnJvbSBcIi4vcXVlcnkudHNcIjtcbmltcG9ydCB7IGdldFNlYXJjaFJ1bnRpbWUsIHJlc2V0U2VhcmNoUnVudGltZSB9IGZyb20gXCIuL3J1bnRpbWUudHNcIjtcbmltcG9ydCB7XG4gIEFERF9ET0NVTUVOVFNfVE9PTF9ERVNDUklQVElPTixcbiAgQ1JFQVRFX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gIFNFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICBTWU5DX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gIFVOSVZFUlNBTF9TRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbn0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJzZWFyY2hcIik7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSAodW5kZXIgYC9hcGkvc2VhcmNoYCkgZm9yIGEgc2luZ2xlLWluZGV4IHNlYXJjaC4gKi9cbmNvbnN0IFNFQVJDSF9ST1VURSA9IFwiL1wiO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcm91dGUgZm9yIGEgdW5pdmVyc2FsIChmZWRlcmF0ZWQpIHNlYXJjaCBhY3Jvc3MgaW5kZXhlcy4gKi9cbmNvbnN0IFVOSVZFUlNBTF9ST1VURSA9IFwiL3VuaXZlcnNhbFwiO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcm91dGUgc2VydmluZyB0aGUgaW5kZXggY2F0YWxvZ3VlIGEgc2VhcmNoIGJveCByZWFkcy4gKi9cbmNvbnN0IElOREVYRVNfUk9VVEUgPSBcIi9pbmRleGVzXCI7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSBmb3IgYWRkaW5nIGRvY3VtZW50cyB0byBhIGRpcmVjdC1hY2Nlc3MgaW5kZXguICovXG5jb25zdCBET0NVTUVOVFNfUk9VVEUgPSBcIi9kb2N1bWVudHNcIjtcblxuLyoqIE1vdW50LXJlbGF0aXZlIHJvdXRlIGZvciBjcmVhdGluZyBhIFZlY3RvciBTZWFyY2ggaW5kZXguICovXG5jb25zdCBJTkRFWF9ST1VURSA9IFwiL2luZGV4XCI7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSBmb3Igc3luY2luZyBhIERlbHRhIFN5bmMgaW5kZXggZnJvbSBpdHMgc291cmNlIHRhYmxlLiAqL1xuY29uc3QgSU5ERVhfU1lOQ19ST1VURSA9IFwiL2luZGV4L3N5bmNcIjtcblxuLyoqXG4gKiBUaGUgQUkgU2VhcmNoIGluZGV4IHJlc291cmNlLiBEZWNsYXJlZCBvcHRpb25hbCBiZWNhdXNlIHRoZSBwbHVnaW4gaXMgaGFwcHlcbiAqIHdpdGggbm8gZGVmYXVsdCBpbmRleCAoYSBjYWxsZXIgY2FuIG5hbWUgb25lIHBlciByZXF1ZXN0KTsgaXQgaXMgcHJvbW90ZWQgdG9cbiAqIHJlcXVpcmVkIG9uY2UgYSBkZXBsb3ltZW50IHBpbnMgb25lLiBgU0VMRUNUYCBpcyB0aGUgcGVybWlzc2lvbiBhIHF1ZXJ5IG5lZWRzLlxuICovXG5jb25zdCBJTkRFWF9SRVNPVVJDRSA9IHtcbiAgdHlwZTogUmVzb3VyY2VUeXBlLlZFQ1RPUl9TRUFSQ0hfSU5ERVgsXG4gIGFsaWFzOiBcIkFJIFNlYXJjaCBJbmRleFwiLFxuICByZXNvdXJjZUtleTogXCJzZWFyY2gtaW5kZXhcIixcbiAgZGVzY3JpcHRpb246XG4gICAgXCJEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXggdGhlIGFwcCBzZWFyY2hlcyBieSBkZWZhdWx0IFwiICtcbiAgICBcIihjYXRhbG9nLnNjaGVtYS5pbmRleCkuIE9wdGlvbmFsOiBhIHJlcXVlc3QgbWF5IG5hbWUgYW55IGluZGV4IHRoZSBjYWxsZXIgY2FuIHJlYWQuXCIsXG4gIHBlcm1pc3Npb246IFwiU0VMRUNUXCIsXG4gIGZpZWxkczoge1xuICAgIG5hbWU6IHtcbiAgICAgIGVudjogSU5ERVhfRU5WLFxuICAgICAgZGVzY3JpcHRpb246IGBEZWZhdWx0IEFJIFNlYXJjaCBpbmRleC4gJHtEQVRBQlJJQ0tTX0lOREVYX0VOVn0gaXMgYWxzbyBob25vcmVkLmAsXG4gICAgICBkaXNjb3Zlcnk6IHtcbiAgICAgICAgdHlwZTogXCJjbGlcIixcbiAgICAgICAgY2xpQ29tbWFuZDpcbiAgICAgICAgICBcImRhdGFicmlja3MgdmVjdG9yLXNlYXJjaC1pbmRleGVzIGxpc3QtaW5kZXhlcyAtLWVuZHBvaW50LW5hbWUgPEVORFBPSU5UPiAtLW91dHB1dCBqc29uXCIsXG4gICAgICAgIHNlbGVjdEZpZWxkOiBcIi5uYW1lXCIsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IHNhdGlzZmllcyBPbWl0PFJlc291cmNlUmVxdWlyZW1lbnQsIFwicmVxdWlyZWRcIj47XG5cbi8qKlxuICogQXBwS2l0IHBsdWdpbiBleHBvc2luZyBBSSBTZWFyY2ggYXMgYSBzZWFyY2ggYm94LCBhbiBhZ2VudCB0b29sIHNldCwgYW5kIGFcbiAqIGRpcmVjdCBBUEkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIHNlcnZlciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IHBsdWdpbiBhcyBzZWFyY2hQbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9zZWFyY2hcIjtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgLy8gemVyby1jb25maWc6IHJlYWRzIERBVEFCUklDS1NfVkVDVE9SX1NFQVJDSF9JTkRFWFxuICogICAgIHNlYXJjaFBsdWdpbi5zZWFyY2goKSxcbiAqICAgICAvLyBvciBnbyBkZWVwZXI6XG4gKiAgICAgLy8gc2VhcmNoUGx1Z2luLnNlYXJjaCh7XG4gKiAgICAgLy8gICBpbmRleDogXCJtYWluLnN1cHBvcnQuZG9jc1wiLFxuICogICAgIC8vICAgaW5kZXhlczogW1wibWFpbi5zdXBwb3J0LmRvY3NcIiwgXCJtYWluLmNhdGFsb2cucHJvZHVjdHNcIl0sXG4gKiAgICAgLy8gICBjb2x1bW5zOiBbXCJ0aXRsZVwiLCBcInVybFwiLCBcImJvZHlcIl0sXG4gKiAgICAgLy8gICBtb2RlOiBcImh5YnJpZFwiLFxuICogICAgIC8vIH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFNlYXJjaFBsdWdpbiBleHRlbmRzIFBsdWdpbjxTZWFyY2hQbHVnaW5Db25maWc+IGltcGxlbWVudHMgVG9vbFByb3ZpZGVyIHtcbiAgc3RhdGljIG1hbmlmZXN0ID0ge1xuICAgIG5hbWU6IFwic2VhcmNoXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiQUkgU2VhcmNoXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlNlYXJjaCBEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXhlczogYWdlbnQgdG9vbHMsIEhUVFAgcm91dGVzIGZvciBhIFwiICtcbiAgICAgIFwic2VhcmNoIGJveCwgdW5pdmVyc2FsIHNlYXJjaCBhY3Jvc3MgaW5kZXhlcywgYW5kIGFuIG9wdC1pbiBkb2N1bWVudCB3cml0ZSBzdXJmYWNlLlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7XG4gICAgICByZXF1aXJlZDogW10sXG4gICAgICBvcHRpb25hbDogW0lOREVYX1JFU09VUkNFXSxcbiAgICB9LFxuICAgIGNvbmZpZzogeyBzY2hlbWE6IFNFQVJDSF9DT05GSUdfU0NIRU1BIH0sXG4gIH0gc2F0aXNmaWVzIFBsdWdpbk1hbmlmZXN0PFwic2VhcmNoXCI+O1xuXG4gIC8qKiBUaGUgYmFzZSBwYXRoIEFwcEtpdCBtb3VudHMgdGhpcyBwbHVnaW4ncyByb3V0ZXMgdW5kZXIuICovXG4gIHByaXZhdGUgZ2V0IGJhc2VQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvYXBpLyR7U2VhcmNoUGx1Z2luLm1hbmlmZXN0Lm5hbWV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9tb3RlIHRoZSBpbmRleCB0byBhIHJlcXVpcmVkIHJlc291cmNlIG9uY2UgYSBkZXBsb3ltZW50IHBpbnMgYSBkZWZhdWx0LFxuICAgKiB0aHJvdWdoIHBsdWdpbiBjb25maWcgb3IgZWl0aGVyIGVudmlyb25tZW50IG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0UmVzb3VyY2VSZXF1aXJlbWVudHMoY29uZmlnOiBTZWFyY2hQbHVnaW5Db25maWcpOiBSZXNvdXJjZVJlcXVpcmVtZW50W10ge1xuICAgIGNvbnN0IHBpbm5lZCA9XG4gICAgICBzdHJpbmcudHJpbVRvTnVsbChjb25maWcuaW5kZXgpID8/XG4gICAgICBzdHJpbmcudHJpbVRvTnVsbChwcm9jZXNzLmVudltJTkRFWF9FTlZdKSA/P1xuICAgICAgc3RyaW5nLnRyaW1Ub051bGwocHJvY2Vzcy5lbnZbREFUQUJSSUNLU19JTkRFWF9FTlZdKTtcbiAgICByZXR1cm4gcGlubmVkID09PSBudWxsID8gW10gOiBbeyAuLi5JTkRFWF9SRVNPVVJDRSwgcmVxdWlyZWQ6IHRydWUgfV07XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRvb2xzIHRoaXMgcGx1Z2luIG9mZmVycyB0byBhbiBBcHBLaXQgYWdlbnQuIGBzZWFyY2hgIC9cbiAgICogYHVuaXZlcnNhbF9zZWFyY2hgIGFyZSByZWFkczsgYGFkZF9kb2N1bWVudHNgIC8gYGNyZWF0ZV9pbmRleGAgL1xuICAgKiBgc3luY19pbmRleGAgYXJlIG9ubHkgb2ZmZXJlZCB3aGVuIHRoZSB3cml0ZSBzdXJmYWNlIGlzIGVuYWJsZWQuIE5vbmUgaXNcbiAgICogYXV0b0luaGVyaXRhYmxlOiBldmVyeSB0b29sIHJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIGlkZW50aXR5LCBzbyBpdCBtdXN0IGJlXG4gICAqIGdyYW50ZWQgZXhwbGljaXRseS5cbiAgICovXG4gIHByaXZhdGUgZ2V0IHRvb2xzKCk6IFRvb2xSZWdpc3RyeSB7XG4gICAgY29uc3QgeyBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoeyBjb25maWc6IHRoaXMuY29uZmlnIH0pO1xuICAgIGNvbnN0IHJlZ2lzdHJ5OiBUb29sUmVnaXN0cnkgPSB7XG4gICAgICBzZWFyY2g6IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgIHNjaGVtYTogc2VhcmNoQ29udHJhY3Quc2VhcmNoUmVxdWVzdFNjaGVtYSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHsgZWZmZWN0OiBcInJlYWRcIiwgcmVxdWlyZXNVc2VyQ29udGV4dDogdHJ1ZSB9LFxuICAgICAgICBhdXRvSW5oZXJpdGFibGU6IGZhbHNlLFxuICAgICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLnJ1blNlYXJjaChhcmdzLCBzaWduYWwpLFxuICAgICAgfSksXG4gICAgICB1bml2ZXJzYWxfc2VhcmNoOiBkZWZpbmVUb29sKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFVOSVZFUlNBTF9TRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbiAgICAgICAgc2NoZW1hOiBzZWFyY2hDb250cmFjdC51bml2ZXJzYWxTZWFyY2hSZXF1ZXN0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwicmVhZFwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuVW5pdmVyc2FsU2VhcmNoKGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KSxcbiAgICB9O1xuICAgIGlmIChjb25maWcuYWxsb3dXcml0ZSkge1xuICAgICAgcmVnaXN0cnkuYWRkX2RvY3VtZW50cyA9IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogQUREX0RPQ1VNRU5UU19UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICBzY2hlbWE6IHNlYXJjaENvbnRyYWN0LnNlYXJjaFJlcXVlc3RTY2hlbWFcbiAgICAgICAgICAucGljayh7IGluZGV4OiB0cnVlIH0pXG4gICAgICAgICAgLmV4dGVuZCh7IGRvY3VtZW50czogc2VhcmNoQ29udHJhY3Quc2VhcmNoRG9jdW1lbnRTY2hlbWEuYXJyYXkoKSB9KSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHsgZWZmZWN0OiBcIndyaXRlXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5ydW5BZGREb2N1bWVudHMoYXJncywgc2lnbmFsKSxcbiAgICAgIH0pO1xuICAgICAgcmVnaXN0cnkuY3JlYXRlX2luZGV4ID0gZGVmaW5lVG9vbCh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBDUkVBVEVfSU5ERVhfVE9PTF9ERVNDUklQVElPTixcbiAgICAgICAgc2NoZW1hOiBzZWFyY2hDb250cmFjdC5jcmVhdGVJbmRleFJlcXVlc3RTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJ3cml0ZVwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuQ3JlYXRlSW5kZXgoYXJncywgc2lnbmFsKSxcbiAgICAgIH0pO1xuICAgICAgcmVnaXN0cnkuc3luY19pbmRleCA9IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogU1lOQ19JTkRFWF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICBzY2hlbWE6IHNlYXJjaENvbnRyYWN0LnN5bmNJbmRleFJlcXVlc3RTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJ3cml0ZVwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuU3luY0luZGV4KGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqIFByaW1lIHRoZSBzaGFyZWQgcnVudGltZSBmcm9tIGNvbmZpZyBhbmQgbG9nIHRoZSBlZmZlY3RpdmUgcG9saWN5IGF0IGJvb3QuICovXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENob29zZSBhIGJhY2tlbmQuIFZlY3RvciBTZWFyY2ggaXMgcHJpbWFyeTsgd2hlbiBOTyBWZWN0b3IgU2VhcmNoXG4gICAgLy8gZW5kcG9pbnQgaXMgY29uZmlndXJlZCBidXQgdGhlIEFwcEtpdCBgbGFrZWJhc2VgIHBsdWdpbiBpcyByZWdpc3RlcmVkLFxuICAgIC8vIGZhbGwgYmFjayB0byBhIFBvc3RncmVzIGZ1bGwtdGV4dCBpbmRleC4gQm90aCBhbnN3ZXIgd2l0aCB0aGUgaWRlbnRpY2FsXG4gICAgLy8gc2hhcGUsIHNvIHRoaXMgY2hvaWNlIGlzIGludmlzaWJsZSB0byB0b29scywgcm91dGVzLCBhbmQgdGhlIFVJLlxuICAgIGNvbnN0IGxha2ViYXNlQmFja2VuZCA9IHRoaXMucmVzb2x2ZUxha2ViYXNlQmFja2VuZCgpO1xuICAgIC8vIFRoZSBydW50aW1lIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBidWlsdCAoY29uZmlnLW9ubHkpIHdoZW4gYHRvb2xzKClgIHJhblxuICAgIC8vIGR1cmluZyByZWdpc3RyYXRpb247IHJlYnVpbGQgaXQgc28gaXQgY2FycmllcyB0aGUgY2hvc2VuIGJhY2tlbmQuXG4gICAgcmVzZXRTZWFyY2hSdW50aW1lKCk7XG4gICAgY29uc3QgeyBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoe1xuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIC4uLihsYWtlYmFzZUJhY2tlbmQgPyB7IGxha2ViYXNlOiBsYWtlYmFzZUJhY2tlbmQgfSA6IHt9KSxcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgIGJhY2tlbmQ6IGxha2ViYXNlQmFja2VuZCA/IFwibGFrZWJhc2VcIiA6IFwidmVjdG9yLXNlYXJjaFwiLFxuICAgICAgZGVmYXVsdEluZGV4OiBjb25maWcuZGVmYXVsdEluZGV4ID8/IFwiKG5vbmUgLSBwYXNzIHBlciByZXF1ZXN0KVwiLFxuICAgICAgaW5kZXhlczogY29uZmlnLmluZGV4ZXMubWFwKChpKSA9PiBpLmFsaWFzKSxcbiAgICAgIHBhZ2VTaXplOiBjb25maWcucGFnZVNpemUsXG4gICAgICBtb2RlOiBjb25maWcubW9kZSxcbiAgICAgIGFsbG93V3JpdGU6IGNvbmZpZy5hbGxvd1dyaXRlLFxuICAgICAgYmFzZVBhdGg6IHRoaXMuYmFzZVBhdGgsXG4gICAgICBlbnN1cmVPblNldHVwOiBjb25maWcuZW5zdXJlT25TZXR1cFxuICAgICAgICA/IChjb25maWcuZW5zdXJlT25TZXR1cC5pbmRleCA/PyBjb25maWcuZGVmYXVsdEluZGV4KVxuICAgICAgICA6IFwib2ZmXCIsXG4gICAgfSk7XG4gICAgLy8gUHJvdmlzaW9uIGEgcmVhbCBpbmRleCBpbiB0aGUgQkFDS0dST1VORCBzbyBhIHNsb3cgZmlyc3QtdGltZSBlbmRwb2ludCBvclxuICAgIC8vIGluZGV4IGJ1aWxkIG5ldmVyIGJsb2NrcyB0aGUgc2VydmVyIGZyb20gY29taW5nIHVwLlxuICAgIGlmIChjb25maWcuZW5zdXJlT25TZXR1cCkgdm9pZCB0aGlzLnJ1bkVuc3VyZU9uU2V0dXAoY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgTGFrZWJhc2UgRkFMTEJBQ0sgYmFja2VuZCwgb3IgcmV0dXJuIGB1bmRlZmluZWRgIHdoZW4gVmVjdG9yXG4gICAqIFNlYXJjaCBzaG91bGQgYmUgdXNlZC4gRmFsbHMgYmFjayBvbmx5IHdoZW4gdGhlcmUgaXMgTk8gVmVjdG9yIFNlYXJjaFxuICAgKiBlbmRwb2ludCBjb25maWd1cmVkIChwbHVnaW4gY29uZmlnIG9yIGBTRUFSQ0hfRU5EUE9JTlRgIC9cbiAgICogYERBVEFCUklDS1NfVkVDVE9SX1NFQVJDSF9FTkRQT0lOVGApIEFORCB0aGUgc2libGluZyBBcHBLaXQgYGxha2ViYXNlYFxuICAgKiBwbHVnaW4gaXMgcmVnaXN0ZXJlZC4gVGhlIHBnIHBvb2wgaXMgYnVpbHQgZnJvbSB0aGF0IHBsdWdpbidzXG4gICAqIHNlcnZpY2UtcHJpbmNpcGFsIGNvbmZpZyBleGFjdGx5IGxpa2UgYEBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYWAncyBtZW1vcnlcbiAgICogcG9vbCAtIG5vIGF1dGggaXMgcmUtaW1wbGVtZW50ZWQgaGVyZS5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUxha2ViYXNlQmFja2VuZCgpOiBMYWtlYmFzZVNlYXJjaEJhY2tlbmQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvbmZpZyA9IHJlc29sdmVTZWFyY2hDb25maWcodGhpcy5jb25maWcpO1xuICAgIGNvbnN0IGhhc0VuZHBvaW50ID1cbiAgICAgIGNvbmZpZy5lbmRwb2ludCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBzdHJpbmcudHJpbVRvTnVsbChwcm9jZXNzLmVudltFTkRQT0lOVF9FTlZdKSAhPT0gbnVsbCB8fFxuICAgICAgc3RyaW5nLnRyaW1Ub051bGwocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19WRUNUT1JfU0VBUkNIX0VORFBPSU5UKSAhPT0gbnVsbDtcbiAgICBpZiAoaGFzRW5kcG9pbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGFrZSA9IHBsdWdpbkxvb2t1cC5pbnN0YW5jZSh0aGlzLmNvbnRleHQsIGxha2ViYXNlKTtcbiAgICBpZiAoIWxha2UpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgbG9nZ2VyLmluZm8oXCJiYWNrZW5kLWxha2ViYXNlXCIsIHtcbiAgICAgIHJlYXNvbjogXCJubyBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IGNvbmZpZ3VyZWQ7IHVzaW5nIHRoZSBMYWtlYmFzZSBmdWxsLXRleHQgZmFsbGJhY2tcIixcbiAgICB9KTtcbiAgICAvLyBgZ2V0UGdDb25maWcoKWAgbXVzdCBiZSByZWFkIE9VVFNJREUgYW55IGFzVXNlciBzY29wZSAoYXMgaXQgaXMgaGVyZSBhdFxuICAgIC8vIHNldHVwKSBzbyBpdCBjYXJyaWVzIHRoZSBTUCBjb25uZWN0aW9uIHRhcmdldCArIHRva2VuLXJlZnJlc2ggY2FsbGJhY2suXG4gICAgcmV0dXJuIG5ldyBMYWtlYmFzZVNlYXJjaEJhY2tlbmQoKCkgPT4gbGFrZS5leHBvcnRzKCkuZ2V0UGdDb25maWcoKSk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIHRoZSBlbmRwb2ludCArIGluZGV4IGV4aXN0IGFuZCBzZWVkIHRoZW0sIGhvbm9yaW5nIGBlbnN1cmVPblNldHVwYC5cbiAgICogVXNlcyBib290LXRpbWUgU0RLIGF1dGggKGVudiAvIGNvbmZpZyBwcm9maWxlKSB2aWEgdGhlIGNsaWVudCdzXG4gICAqIG91dC1vZi1yZXF1ZXN0IGZhbGxiYWNrLiBGYWlsdXJlcyBhcmUgbG9nZ2VkLCBuZXZlciB0aHJvd24gLSBhIHNlYXJjaCBhcHBcbiAgICogc2hvdWxkIHN0aWxsIHN0YXJ0IGV2ZW4gaWYgcHJvdmlzaW9uaW5nIGlzIHNsb3cgb3IgYSBwZXJtaXNzaW9uIGlzIG1pc3NpbmcuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJ1bkVuc3VyZU9uU2V0dXAoXG4gICAgY29uZmlnOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRTZWFyY2hSdW50aW1lPltcImNvbmZpZ1wiXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3BlYyA9IGNvbmZpZy5lbnN1cmVPblNldHVwO1xuICAgIGlmICghc3BlYykgcmV0dXJuO1xuICAgIGNvbnN0IGluZGV4ID0gc3RyaW5nLnRyaW1Ub051bGwoc3BlYy5pbmRleCkgPz8gY29uZmlnLmRlZmF1bHRJbmRleDtcbiAgICBpZiAoIWluZGV4KSB7XG4gICAgICBsb2dnZXIud2FybihcImVuc3VyZS1za2lwcGVkXCIsIHtcbiAgICAgICAgcmVhc29uOiBcIm5vIGluZGV4IG5hbWUgKHNldCBgaW5kZXhgIG9yIGBlbnN1cmVPblNldHVwLmluZGV4YClcIixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkb2N1bWVudHMgPSBzcGVjLmRvY3VtZW50cyA/PyBbXTtcbiAgICAvLyBJbmZlciBhIG1hbmFnZWQtZGlyZWN0LWFjY2VzcyBzY2hlbWEgZnJvbSB0aGUgZmlyc3Qgc2VlZCByb3cgd2hlbiBub3QgZ2l2ZW4uXG4gICAgY29uc3Qgc2NoZW1hID1cbiAgICAgIHNwZWMuc2NoZW1hID8/XG4gICAgICAoZG9jdW1lbnRzLmxlbmd0aCA+IDAgJiYgIXNwZWMuc291cmNlVGFibGVcbiAgICAgICAgPyB0aGlzLmluZmVyU2NoZW1hKGRvY3VtZW50c1swXSwgc3BlYy5wcmltYXJ5S2V5ID8/IFwiaWRcIiwgc3BlYy50ZXh0Q29sdW1uID8/IFwidGV4dFwiKVxuICAgICAgICA6IHVuZGVmaW5lZCk7XG4gICAgdHJ5IHtcbiAgICAgIGxvZ2dlci5pbmZvKFwiZW5zdXJlLXN0YXJ0XCIsIHsgaW5kZXggfSk7XG4gICAgICBjb25zdCB7IGNsaWVudCB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IGNsaWVudC5wcm92aXNpb24oaW5kZXgsIHtcbiAgICAgICAgLi4uKHNwZWMuZW5kcG9pbnQgPyB7IGVuZHBvaW50OiBzcGVjLmVuZHBvaW50IH0gOiB7fSksXG4gICAgICAgIC4uLihzcGVjLnByaW1hcnlLZXkgPyB7IHByaW1hcnlLZXk6IHNwZWMucHJpbWFyeUtleSB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy50ZXh0Q29sdW1uID8geyBlbWJlZGRpbmdTb3VyY2VDb2x1bW46IHNwZWMudGV4dENvbHVtbiB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy5lbWJlZGRpbmdNb2RlbCA/IHsgZW1iZWRkaW5nTW9kZWw6IHNwZWMuZW1iZWRkaW5nTW9kZWwgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwZWMuc291cmNlVGFibGUgPyB7IHNvdXJjZVRhYmxlOiBzcGVjLnNvdXJjZVRhYmxlIH0gOiB7fSksXG4gICAgICAgIC4uLihzY2hlbWEgPyB7IHNjaGVtYSB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy50aW1lb3V0TXMgPyB7IHRpbWVvdXRNczogc3BlYy50aW1lb3V0TXMgfSA6IHt9KSxcbiAgICAgICAgLi4uKGRvY3VtZW50cy5sZW5ndGggPiAwID8geyBzZWVkOiBkb2N1bWVudHMgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLmluZm8oXCJlbnN1cmUtcmVhZHlcIiwge1xuICAgICAgICBpbmRleDogaW5mby5uYW1lLFxuICAgICAgICByZWFkeTogaW5mby5yZWFkeSxcbiAgICAgICAgcm93Q291bnQ6IGluZm8ucm93Q291bnQgPz8gMCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICBsb2dnZXIud2FybihcImVuc3VyZS1mYWlsZWRcIiwgeyBpbmRleCwgbWVzc2FnZTogZXJyb3JVdGlsLmVycm9yTWVzc2FnZShjYXVzZSkgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEJ1aWxkIGEgVmVjdG9yIFNlYXJjaCBgc2NoZW1hX2pzb25gIG1hcCBmcm9tIGEgc2VlZCBkb2N1bWVudCdzIHZhbHVlIHR5cGVzLiAqL1xuICBwcml2YXRlIGluZmVyU2NoZW1hKFxuICAgIGRvYzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgcHJpbWFyeUtleTogc3RyaW5nLFxuICAgIHRleHRDb2x1bW46IHN0cmluZyxcbiAgKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3Qgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBbcHJpbWFyeUtleV06IFwic3RyaW5nXCIsIFt0ZXh0Q29sdW1uXTogXCJzdHJpbmdcIiB9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRvYykpIHtcbiAgICAgIGlmIChrZXkgaW4gc2NoZW1hKSBjb250aW51ZTtcbiAgICAgIHNjaGVtYVtrZXldID1cbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiXG4gICAgICAgICAgPyBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKVxuICAgICAgICAgICAgPyBcImludFwiXG4gICAgICAgICAgICA6IFwiZG91YmxlXCJcbiAgICAgICAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCJcbiAgICAgICAgICAgID8gXCJib29sZWFuXCJcbiAgICAgICAgICAgIDogXCJzdHJpbmdcIjtcbiAgICB9XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuXG4gIC8qKiBEcm9wIHRoZSBzaGFyZWQgcnVudGltZSBzbyBhIHJlc3RhcnRlZCBhcHAgcmUtcmVzb2x2ZXMgY29uZmlnLiAqL1xuICBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXNldFNlYXJjaFJ1bnRpbWUoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFib3J0QWN0aXZlT3BlcmF0aW9ucygpOiB2b2lkIHtcbiAgICBzdXBlci5hYm9ydEFjdGl2ZU9wZXJhdGlvbnMoKTtcbiAgICB2b2lkIHRoaXMuc2h1dGRvd24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgc2VhcmNoIHJvdXRlcyB1bmRlciBgL2FwaS9zZWFyY2hgLiBFYWNoIGlzIHdyYXBwZWQgaW5cbiAgICogYGFzVXNlcihyZXEpYCBzbyB0aGUgcXVlcnkgcnVucyBhcyB0aGUgcmVxdWVzdGluZyB1c2VyIGFuZCB0aGUgaW5kZXgnc1xuICAgKiBVbml0eSBDYXRhbG9nIEFDTHMgYXBwbHkuIGBHRVQgL2luZGV4ZXNgIG5lZWRzIG5vIHVzZXIgc2NvcGUgLSBpdCBqdXN0XG4gICAqIGVjaG9lcyB0aGUgY29uZmlndXJlZCBjYXRhbG9ndWUuXG4gICAqL1xuICBvdmVycmlkZSBpbmplY3RSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwic2VhcmNoXCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogU0VBUkNIX1JPVVRFLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVzcG9uZChyZXMsIFwic2VhcmNoXCIsICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gc2VhcmNoQ29udHJhY3Quc2VhcmNoUmVxdWVzdFNjaGVtYS5wYXJzZShyZXEuYm9keSA/PyB7fSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYXNVc2VyKHJlcSkucnVuU2VhcmNoKHJlcXVlc3QpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwidW5pdmVyc2FsU2VhcmNoXCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogVU5JVkVSU0FMX1JPVVRFLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVzcG9uZChyZXMsIFwidW5pdmVyc2FsU2VhcmNoXCIsICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gc2VhcmNoQ29udHJhY3QudW5pdmVyc2FsU2VhcmNoUmVxdWVzdFNjaGVtYS5wYXJzZShyZXEuYm9keSA/PyB7fSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYXNVc2VyKHJlcSkucnVuVW5pdmVyc2FsU2VhcmNoKHJlcXVlc3QpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiaW5kZXhlc1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogSU5ERVhFU19ST1VURSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChfcmVxLCByZXMpID0+IHtcbiAgICAgICAgcmVzLmpzb24odGhpcy5jbGllbnRDb25maWcoKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImRvY3VtZW50c1wiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IERPQ1VNRU5UU19ST1VURSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCB7IGNvbmZpZyB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgICAgICBpZiAoIWNvbmZpZy5hbGxvd1dyaXRlKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDMpLmpzb24oeyBlcnJvcjogXCJ0aGUgZG9jdW1lbnQgd3JpdGUgc3VyZmFjZSBpcyBkaXNhYmxlZFwiIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlc3BvbmQocmVzLCBcImFkZERvY3VtZW50c1wiLCAoKSA9PlxuICAgICAgICAgIHRoaXMuYXNVc2VyKHJlcSkucnVuQWRkRG9jdW1lbnRzKHJlcS5ib2R5ID8/IHt9KSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiY3JlYXRlSW5kZXhcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBJTkRFWF9ST1VURSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCB7IGNvbmZpZyB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgICAgICBpZiAoIWNvbmZpZy5hbGxvd1dyaXRlKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDMpLmpzb24oeyBlcnJvcjogXCJ0aGUgaW5kZXggd3JpdGUgc3VyZmFjZSBpcyBkaXNhYmxlZFwiIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlc3BvbmQocmVzLCBcImNyZWF0ZUluZGV4XCIsICgpID0+XG4gICAgICAgICAgdGhpcy5hc1VzZXIocmVxKS5ydW5DcmVhdGVJbmRleChyZXEuYm9keSA/PyB7fSksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcInN5bmNJbmRleFwiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IElOREVYX1NZTkNfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICAgICAgaWYgKCFjb25maWcuYWxsb3dXcml0ZSkge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAzKS5qc29uKHsgZXJyb3I6IFwidGhlIGluZGV4IHdyaXRlIHN1cmZhY2UgaXMgZGlzYWJsZWRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJzeW5jSW5kZXhcIiwgKCkgPT4gdGhpcy5hc1VzZXIocmVxKS5ydW5TeW5jSW5kZXgocmVxLmJvZHkgPz8ge30pKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGEgcm91dGUgYm9keSwgdHVybmluZyBhIGZhaWx1cmUgaW50byBhIEpTT04gZXJyb3IgcmVzcG9uc2UuXG4gICAqXG4gICAqIEFwcEtpdCdzIGByb3V0ZSgpYCByZWdpc3RlcnMgdGhlIGhhbmRsZXIgYXMtaXMsIHNvIGEgcmVqZWN0aW9uIGVzY2FwZXMgYXNcbiAgICogYW4gdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIGFuZCB0YWtlcyB0aGUgd2hvbGUgcHJvY2VzcyBkb3duIHJhdGhlciB0aGFuXG4gICAqIGZhaWxpbmcgdGhlIG9uZSByZXF1ZXN0LiBFdmVyeSByb3V0ZSBoZXJlIGdvZXMgdGhyb3VnaCB0aGlzLCBzbyBhIGJhZCBpbmRleFxuICAgKiBuYW1lIG9yIGEgVmVjdG9yIFNlYXJjaCBBUEkgZXJyb3IgcmV0dXJucyA1MDAgd2l0aCBhIG1lc3NhZ2UgaW5zdGVhZCBvZlxuICAgKiBraWxsaW5nIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc3BvbmQoXG4gICAgcmVzOiBQYXJhbWV0ZXJzPFBhcmFtZXRlcnM8SUFwcFJvdXRlcltcInBvc3RcIl0+WzFdPlsxXSxcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBydW46ICgpID0+IFByb21pc2U8dW5rbm93bj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXMuanNvbihhd2FpdCBydW4oKSk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvclV0aWwuZXJyb3JNZXNzYWdlKGNhdXNlKTtcbiAgICAgIGxvZ2dlci53YXJuKFwicm91dGUtZmFpbGVkXCIsIHsgb3BlcmF0aW9uLCBtZXNzYWdlIH0pO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogbWVzc2FnZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogU3VyZmFjZSB0aGUgaW5kZXggY2F0YWxvZ3VlICsgZGVmYXVsdHMgc28gYSBzZWFyY2ggYm94IG5lZWRzIG5vIHJvdW5kLXRyaXAuICovXG4gIG92ZXJyaWRlIGNsaWVudENvbmZpZygpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgeyBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoeyBjb25maWc6IHRoaXMuY29uZmlnIH0pO1xuICAgIGNvbnN0IHBheWxvYWQ6IFNlYXJjaENsaWVudENvbmZpZyA9IHtcbiAgICAgIGluZGV4ZXM6IGNvbmZpZy5pbmRleGVzLm1hcCgoaW5kZXgpID0+ICh7XG4gICAgICAgIG5hbWU6IGluZGV4Lm5hbWUsXG4gICAgICAgIGFsaWFzOiBpbmRleC5hbGlhcyxcbiAgICAgICAgLi4uKGluZGV4LnByaW1hcnlLZXkgPyB7IHByaW1hcnlLZXk6IGluZGV4LnByaW1hcnlLZXkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGluZGV4LmNvbHVtbnMgPyB7IGNvbHVtbnM6IGluZGV4LmNvbHVtbnMgfSA6IHt9KSxcbiAgICAgICAgLi4uKGluZGV4Lm5hbWUgPT09IGNvbmZpZy5kZWZhdWx0SW5kZXggPyB7IGlzRGVmYXVsdDogdHJ1ZSB9IDoge30pLFxuICAgICAgfSkpLFxuICAgICAgLi4uKGNvbmZpZy5kZWZhdWx0SW5kZXggPyB7IGRlZmF1bHRJbmRleDogY29uZmlnLmRlZmF1bHRJbmRleCB9IDoge30pLFxuICAgICAgcGFnZVNpemU6IGNvbmZpZy5wYWdlU2l6ZSxcbiAgICAgIGJhc2VQYXRoOiB0aGlzLmJhc2VQYXRoLFxuICAgIH07XG4gICAgcmV0dXJuIHBheWxvYWQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIC8qKiBBcHBLaXQgYFRvb2xQcm92aWRlcmA6IHRoZSB0b29sIGRlZmluaXRpb25zIG9mZmVyZWQgdG8gYW4gYWdlbnQuICovXG4gIGdldEFnZW50VG9vbHMoKTogQWdlbnRUb29sRGVmaW5pdGlvbltdIHtcbiAgICByZXR1cm4gdG9vbHNGcm9tUmVnaXN0cnkodGhpcy50b29scyk7XG4gIH1cblxuICAvKiogQXBwS2l0IGBUb29sUHJvdmlkZXJgOiBydW4gb25lIHRvb2wgY2FsbCwgdmFsaWRhdGluZyBpbnB1dCBhZ2FpbnN0IGl0cyBzY2hlbWEuICovXG4gIGFzeW5jIGV4ZWN1dGVBZ2VudFRvb2wobmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBleGVjdXRlRnJvbVJlZ2lzdHJ5KHRoaXMudG9vbHMsIG5hbWUsIGFyZ3MsIHNpZ25hbCk7XG4gIH1cblxuICBvdmVycmlkZSBleHBvcnRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvKiogU2VhcmNoIG9uZSBpbmRleCAoZGVmYXVsdCB3aGVuIG9taXR0ZWQpLiBSdW5zIGFzIHRoZSBjdXJyZW50IGNvbnRleHQgdXNlci4gKi9cbiAgICAgIHNlYXJjaDogKHJlcXVlc3Q6IHNlYXJjaENvbnRyYWN0LlNlYXJjaFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1blNlYXJjaChyZXF1ZXN0LCBzaWduYWwpLFxuICAgICAgLyoqIFNlYXJjaCBhY3Jvc3MgZXZlcnkgY29uZmlndXJlZCBpbmRleCBhbmQgbWVyZ2UgdGhlIGhpdHMuICovXG4gICAgICB1bml2ZXJzYWxTZWFyY2g6IChyZXF1ZXN0OiBzZWFyY2hDb250cmFjdC5Vbml2ZXJzYWxTZWFyY2hSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgdGhpcy5ydW5Vbml2ZXJzYWxTZWFyY2gocmVxdWVzdCwgc2lnbmFsKSxcbiAgICAgIC8qKiBBZGQgb3IgdXBkYXRlIGRvY3VtZW50cyBpbiBhIGRpcmVjdC1hY2Nlc3MgaW5kZXggKHRocm93cyB3aGVuIHdyaXRlcyBhcmUgZGlzYWJsZWQpLiAqL1xuICAgICAgYWRkRG9jdW1lbnRzOiAocmVxdWVzdDogeyBpbmRleD86IHN0cmluZzsgZG9jdW1lbnRzOiB1bmtub3duIH0sIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1bkFkZERvY3VtZW50cyhyZXF1ZXN0LCBzaWduYWwpLFxuICAgICAgLyoqIENyZWF0ZSBhIFZlY3RvciBTZWFyY2ggaW5kZXggKHRocm93cyB3aGVuIHdyaXRlcyBhcmUgZGlzYWJsZWQpLiAqL1xuICAgICAgY3JlYXRlSW5kZXg6IChyZXF1ZXN0OiBzZWFyY2hDb250cmFjdC5DcmVhdGVJbmRleFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1bkNyZWF0ZUluZGV4KHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogU3luYyBhIERlbHRhIFN5bmMgaW5kZXggZnJvbSBpdHMgc291cmNlIHRhYmxlICh0aHJvd3Mgd2hlbiB3cml0ZXMgYXJlIGRpc2FibGVkKS4gKi9cbiAgICAgIHN5bmNJbmRleDogKHJlcXVlc3Q6IHNlYXJjaENvbnRyYWN0LlN5bmNJbmRleFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1blN5bmNJbmRleChyZXF1ZXN0LCBzaWduYWwpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1blNlYXJjaChhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBzZWFyY2hDb250cmFjdC5zZWFyY2hSZXF1ZXN0U2NoZW1hLnBhcnNlKGFyZ3MpO1xuICAgIGNvbnN0IHsgY2xpZW50IH0gPSBnZXRTZWFyY2hSdW50aW1lKCk7XG4gICAgcmV0dXJuIGNsaWVudC5zZWFyY2gocmVxdWVzdC5xdWVyeSwge1xuICAgICAgLi4uKHJlcXVlc3QuaW5kZXggPyB7IGluZGV4OiByZXF1ZXN0LmluZGV4IH0gOiB7fSksXG4gICAgICAuLi4ocmVxdWVzdC5saW1pdCA/IHsgbGltaXQ6IHJlcXVlc3QubGltaXQgfSA6IHt9KSxcbiAgICAgIC4uLihyZXF1ZXN0Lm1vZGUgPyB7IG1vZGU6IHJlcXVlc3QubW9kZSB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3QuY29sdW1ucyA/IHsgY29sdW1uczogcmVxdWVzdC5jb2x1bW5zIH0gOiB7fSksXG4gICAgICAuLi4ocmVxdWVzdC5maWx0ZXIgPyB7IGZpbHRlcjogcmVxdWVzdC5maWx0ZXIgfSA6IHt9KSxcbiAgICAgIC4uLihyZXF1ZXN0LnNjb3JlVGhyZXNob2xkICE9PSB1bmRlZmluZWQgPyB7IHNjb3JlVGhyZXNob2xkOiByZXF1ZXN0LnNjb3JlVGhyZXNob2xkIH0gOiB7fSksXG4gICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuVW5pdmVyc2FsU2VhcmNoKGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHNlYXJjaENvbnRyYWN0LnVuaXZlcnNhbFNlYXJjaFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyk7XG4gICAgY29uc3QgeyBjbGllbnQgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICByZXR1cm4gY2xpZW50LnVuaXZlcnNhbFNlYXJjaChyZXF1ZXN0LnF1ZXJ5LCB7XG4gICAgICAuLi4ocmVxdWVzdC5pbmRleGVzID8geyBpbmRleGVzOiByZXF1ZXN0LmluZGV4ZXMgfSA6IHt9KSxcbiAgICAgIC4uLihyZXF1ZXN0LmxpbWl0ID8geyBsaW1pdDogcmVxdWVzdC5saW1pdCB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3QubW9kZSA/IHsgbW9kZTogcmVxdWVzdC5tb2RlIH0gOiB7fSksXG4gICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuQWRkRG9jdW1lbnRzKGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVjb3JkID0gKGFyZ3MgPz8ge30pIGFzIHsgaW5kZXg/OiBzdHJpbmc7IGRvY3VtZW50czogdW5rbm93biB9O1xuICAgIGNvbnN0IHsgY2xpZW50LCBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICBjb25zdCBkb2N1bWVudHMgPSB0b0RvY3VtZW50QXJyYXkocmVjb3JkLmRvY3VtZW50cyk7XG4gICAgY29uc3QgaW5kZXggPSByZWNvcmQuaW5kZXggPz8gY29uZmlnLmRlZmF1bHRJbmRleCA/PyBcIlwiO1xuICAgIHJldHVybiBjbGllbnQuYWRkRG9jdW1lbnRzKGluZGV4LCBkb2N1bWVudHMsIHNpZ25hbCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bkNyZWF0ZUluZGV4KGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHNlYXJjaENvbnRyYWN0LmNyZWF0ZUluZGV4UmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKTtcbiAgICBjb25zdCB7IGNsaWVudCB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgIHJldHVybiBjbGllbnQuY3JlYXRlSW5kZXgocmVxdWVzdC5uYW1lLCB0b0NyZWF0ZUluZGV4T3B0aW9ucyhyZXF1ZXN0LCBzaWduYWwpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuU3luY0luZGV4KGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHNlYXJjaENvbnRyYWN0LnN5bmNJbmRleFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyk7XG4gICAgY29uc3QgeyBjbGllbnQsIGNvbmZpZyB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgIGNvbnN0IGluZGV4ID0gcmVxdWVzdC5pbmRleCA/PyBjb25maWcuZGVmYXVsdEluZGV4ID8/IFwiXCI7XG4gICAgYXdhaXQgY2xpZW50LnN5bmNJbmRleChpbmRleCwgc2lnbmFsKTtcbiAgICByZXR1cm4geyBpbmRleCwgc3luY2VkOiB0cnVlIH07XG4gIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgQUkgU2VhcmNoIHBsdWdpbiB3aXRoIEFwcEtpdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgcGx1Z2luIGFzIHNlYXJjaFBsdWdpbiwgdG9vbCBhcyBzZWFyY2hUb29sTW9kdWxlIH0gZnJvbSBcIkBkYngtdG9vbHMvc2VhcmNoXCI7XG4gKiBpbXBvcnQgeyBhZ2VudHMsIHBsdWdpbiBhcyBtYXN0cmFQbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG4gKlxuICogY29uc3Qgc3VwcG9ydCA9IGFnZW50cy5jcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogXCJBbnN3ZXIgZnJvbSB0aGUgZG9jczsgdXNlIGBzZWFyY2hgIHRvIGZpbmQgdGhlbS5cIixcbiAqICAgdG9vbHM6ICgpID0+ICh7IHNlYXJjaDogc2VhcmNoVG9vbE1vZHVsZS5zZWFyY2hUb29sKCkgfSksXG4gKiB9KTtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgc2VhcmNoUGx1Z2luLnNlYXJjaCh7IGluZGV4OiBcIm1haW4uc3VwcG9ydC5kb2NzXCIgfSksXG4gKiAgICAgbWFzdHJhUGx1Z2luLm1hc3RyYSh7IGFnZW50czogc3VwcG9ydCB9KSxcbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBzZWFyY2ggPSB0b1BsdWdpbihTZWFyY2hQbHVnaW4pO1xuIl19
|
|
506
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFlBQVksRUFDWixRQUFRLEdBSVQsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixpQkFBaUIsR0FJbEIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsTUFBTSxJQUFJLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNELE9BQU8sRUFBRSxLQUFLLElBQUksU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsTUFBTSxJQUFJLGNBQWMsRUFBMkIsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixZQUFZLEVBQ1osU0FBUyxFQUNULG1CQUFtQixHQUVwQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEUsT0FBTyxFQUNMLDhCQUE4QixFQUM5Qiw2QkFBNkIsRUFDN0IsdUJBQXVCLEVBQ3ZCLDJCQUEyQixFQUMzQixpQ0FBaUMsR0FDbEMsTUFBTSxhQUFhLENBQUM7QUFFckIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVwQyw0RUFBNEU7QUFD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QztRQUNqQixJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDdkMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLGdCQUFnQixFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRTtnQkFDekMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNyRCxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzNELEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN0RSxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZFLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDOUQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM3QixHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENB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QztJQUVPLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBYSxFQUFFLE1BQW9CO1FBQzVELE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzlDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDekQsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNqQyxDQUFDOztBQUdIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0IHBsdWdpbiAocmVnaXN0ZXJlZCBuYW1lOiBgc2VhcmNoYCkgdGhhdCB0dXJucyBhIERhdGFicmlja3MgQUlcbiAqIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXggaW50byBhIGJhdHRlcmllcy1pbmNsdWRlZCBzZWFyY2ggc3VyZmFjZS4gSXQgaXNcbiAqIHRoZSBcInNob3J0Y3V0XCIgaGFsZiBvZiB0aGlzIHBhY2thZ2U6IHJlZ2lzdGVyIGl0IHdpdGggbm90aGluZyBidXQgYW4gaW5kZXhcbiAqIG5hbWUgYW5kIHlvdSBnZXQsIGFsbCBhdCBvbmNlIC1cbiAqXG4gKiAgIC0gYSBgc2VhcmNoYCAvIGB1bml2ZXJzYWxfc2VhcmNoYCAvIChvcHQtaW4pIGBhZGRfZG9jdW1lbnRzYCB0b29sIHNldCBmb3JcbiAqICAgICBib3RoIE1hc3RyYSBhbmQgQXBwS2l0IGFnZW50cyAoYXV0b2NvbXBsZXRlIGlzIGEgc21hbGwtYGxpbWl0YCBzZWFyY2gpO1xuICogICAtIEhUVFAgcm91dGVzIHVuZGVyIGAvYXBpL3NlYXJjaGAgYSBicm93c2VyIHNlYXJjaCBib3ggY2FsbHMgZGlyZWN0bHlcbiAqICAgICAoYFBPU1QgL2Agc2VhcmNoLCBgUE9TVCAvdW5pdmVyc2FsYCBmZWRlcmF0ZWQsIGBHRVQgL2luZGV4ZXNgIGNhdGFsb2d1ZSxcbiAqICAgICBhbmQgYFBPU1QgL2RvY3VtZW50c2Agd2hlbiB3cml0ZXMgYXJlIGVuYWJsZWQpO1xuICogICAtIGEgYGNsaWVudENvbmZpZygpYCBwYXlsb2FkIHNvIGEgVUkga25vd3MgdGhlIGluZGV4ZXMsIGRlZmF1bHQsIGFuZCBwYWdlXG4gKiAgICAgc2l6ZSBhdCBib290IHdpdGggbm8gcm91bmQtdHJpcDtcbiAqICAgLSBgZXhwb3J0cygpYCBzbyBhcHAgY29kZSBjYW4gYGFwcGtpdC5zZWFyY2guc2VhcmNoKC4uLilgIGRpcmVjdGx5LlxuICpcbiAqIEV2ZXJ5dGhpbmcgcnVucyB1bmRlciB0aGUgY2FsbGVyJ3MgT0JPIGlkZW50aXR5IChyb3V0ZXMgd3JhcCBpbiBgYXNVc2VyYCksXG4gKiBzbyBVbml0eSBDYXRhbG9nIEFDTHMgb24gdGhlIGluZGV4IGFwcGx5LiBSZWdpc3RlcmluZyB0aGUgcGx1Z2luIHJlc29sdmVzXG4gKiBhbmQgbG9ncyB0aGUgZWZmZWN0aXZlIGNvbmZpZyAoZGVmYXVsdCBpbmRleCwga25vd24gaW5kZXhlcywgcGFnZSBzaXplLFxuICogbW9kZSkgc28gYSBtaXNjb25maWd1cmF0aW9uIHNob3dzIHVwIGluIHRoZSBib290IGxvZyByYXRoZXIgdGhhbiBvbiB0aGVcbiAqIGZpcnN0IHNlYXJjaC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgbGFrZWJhc2UsXG4gIFBsdWdpbixcbiAgUmVzb3VyY2VUeXBlLFxuICB0b1BsdWdpbixcbiAgdHlwZSBJQXBwUm91dGVyLFxuICB0eXBlIFBsdWdpbk1hbmlmZXN0LFxuICB0eXBlIFJlc291cmNlUmVxdWlyZW1lbnQsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGRlZmluZVRvb2wsXG4gIGV4ZWN1dGVGcm9tUmVnaXN0cnksXG4gIHRvb2xzRnJvbVJlZ2lzdHJ5LFxuICB0eXBlIEFnZW50VG9vbERlZmluaXRpb24sXG4gIHR5cGUgVG9vbFByb3ZpZGVyLFxuICB0eXBlIFRvb2xSZWdpc3RyeSxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBwbHVnaW4gYXMgcGx1Z2luTG9va3VwIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBlcnJvciBhcyBlcnJvclV0aWwsIGxvZywgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHNlYXJjaCBhcyBzZWFyY2hDb250cmFjdCwgdHlwZSBTZWFyY2hDbGllbnRDb25maWcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtc2VhcmNoXCI7XG5pbXBvcnQge1xuICBTRUFSQ0hfQ09ORklHX1NDSEVNQSxcbiAgREFUQUJSSUNLU19JTkRFWF9FTlYsXG4gIEVORFBPSU5UX0VOVixcbiAgSU5ERVhfRU5WLFxuICByZXNvbHZlU2VhcmNoQ29uZmlnLFxuICB0eXBlIFNlYXJjaFBsdWdpbkNvbmZpZyxcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyB0b0NyZWF0ZUluZGV4T3B0aW9ucyB9IGZyb20gXCIuL2luZGV4LXRvb2xzLnRzXCI7XG5pbXBvcnQgeyBMYWtlYmFzZVNlYXJjaEJhY2tlbmQgfSBmcm9tIFwiLi9sYWtlYmFzZS50c1wiO1xuaW1wb3J0IHsgdG9Eb2N1bWVudEFycmF5IH0gZnJvbSBcIi4vcXVlcnkudHNcIjtcbmltcG9ydCB7IGdldFNlYXJjaFJ1bnRpbWUsIHJlc2V0U2VhcmNoUnVudGltZSB9IGZyb20gXCIuL3J1bnRpbWUudHNcIjtcbmltcG9ydCB7XG4gIEFERF9ET0NVTUVOVFNfVE9PTF9ERVNDUklQVElPTixcbiAgQ1JFQVRFX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gIFNFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICBTWU5DX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gIFVOSVZFUlNBTF9TRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbn0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJzZWFyY2hcIik7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSAodW5kZXIgYC9hcGkvc2VhcmNoYCkgZm9yIGEgc2luZ2xlLWluZGV4IHNlYXJjaC4gKi9cbmNvbnN0IFNFQVJDSF9ST1VURSA9IFwiL1wiO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcm91dGUgZm9yIGEgdW5pdmVyc2FsIChmZWRlcmF0ZWQpIHNlYXJjaCBhY3Jvc3MgaW5kZXhlcy4gKi9cbmNvbnN0IFVOSVZFUlNBTF9ST1VURSA9IFwiL3VuaXZlcnNhbFwiO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcm91dGUgc2VydmluZyB0aGUgaW5kZXggY2F0YWxvZ3VlIGEgc2VhcmNoIGJveCByZWFkcy4gKi9cbmNvbnN0IElOREVYRVNfUk9VVEUgPSBcIi9pbmRleGVzXCI7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSBmb3IgYWRkaW5nIGRvY3VtZW50cyB0byBhIGRpcmVjdC1hY2Nlc3MgaW5kZXguICovXG5jb25zdCBET0NVTUVOVFNfUk9VVEUgPSBcIi9kb2N1bWVudHNcIjtcblxuLyoqIE1vdW50LXJlbGF0aXZlIHJvdXRlIGZvciBjcmVhdGluZyBhIFZlY3RvciBTZWFyY2ggaW5kZXguICovXG5jb25zdCBJTkRFWF9ST1VURSA9IFwiL2luZGV4XCI7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSBmb3Igc3luY2luZyBhIERlbHRhIFN5bmMgaW5kZXggZnJvbSBpdHMgc291cmNlIHRhYmxlLiAqL1xuY29uc3QgSU5ERVhfU1lOQ19ST1VURSA9IFwiL2luZGV4L3N5bmNcIjtcblxuLyoqXG4gKiBUaGUgQUkgU2VhcmNoIGluZGV4IHJlc291cmNlLiBEZWNsYXJlZCBvcHRpb25hbCBiZWNhdXNlIHRoZSBwbHVnaW4gaXMgaGFwcHlcbiAqIHdpdGggbm8gZGVmYXVsdCBpbmRleCAoYSBjYWxsZXIgY2FuIG5hbWUgb25lIHBlciByZXF1ZXN0KTsgaXQgaXMgcHJvbW90ZWQgdG9cbiAqIHJlcXVpcmVkIG9uY2UgYSBkZXBsb3ltZW50IHBpbnMgb25lLiBgU0VMRUNUYCBpcyB0aGUgcGVybWlzc2lvbiBhIHF1ZXJ5IG5lZWRzLlxuICovXG5jb25zdCBJTkRFWF9SRVNPVVJDRSA9IHtcbiAgdHlwZTogUmVzb3VyY2VUeXBlLlZFQ1RPUl9TRUFSQ0hfSU5ERVgsXG4gIGFsaWFzOiBcIkFJIFNlYXJjaCBJbmRleFwiLFxuICByZXNvdXJjZUtleTogXCJzZWFyY2gtaW5kZXhcIixcbiAgZGVzY3JpcHRpb246XG4gICAgXCJEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXggdGhlIGFwcCBzZWFyY2hlcyBieSBkZWZhdWx0IFwiICtcbiAgICBcIihjYXRhbG9nLnNjaGVtYS5pbmRleCkuIE9wdGlvbmFsOiBhIHJlcXVlc3QgbWF5IG5hbWUgYW55IGluZGV4IHRoZSBjYWxsZXIgY2FuIHJlYWQuXCIsXG4gIHBlcm1pc3Npb246IFwiU0VMRUNUXCIsXG4gIGZpZWxkczoge1xuICAgIG5hbWU6IHtcbiAgICAgIGVudjogSU5ERVhfRU5WLFxuICAgICAgZGVzY3JpcHRpb246IGBEZWZhdWx0IEFJIFNlYXJjaCBpbmRleC4gJHtEQVRBQlJJQ0tTX0lOREVYX0VOVn0gaXMgYWxzbyBob25vcmVkLmAsXG4gICAgICBkaXNjb3Zlcnk6IHtcbiAgICAgICAgdHlwZTogXCJjbGlcIixcbiAgICAgICAgY2xpQ29tbWFuZDpcbiAgICAgICAgICBcImRhdGFicmlja3MgdmVjdG9yLXNlYXJjaC1pbmRleGVzIGxpc3QtaW5kZXhlcyAtLWVuZHBvaW50LW5hbWUgPEVORFBPSU5UPiAtLW91dHB1dCBqc29uXCIsXG4gICAgICAgIHNlbGVjdEZpZWxkOiBcIi5uYW1lXCIsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IHNhdGlzZmllcyBPbWl0PFJlc291cmNlUmVxdWlyZW1lbnQsIFwicmVxdWlyZWRcIj47XG5cbi8qKlxuICogQXBwS2l0IHBsdWdpbiBleHBvc2luZyBBSSBTZWFyY2ggYXMgYSBzZWFyY2ggYm94LCBhbiBhZ2VudCB0b29sIHNldCwgYW5kIGFcbiAqIGRpcmVjdCBBUEkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIHNlcnZlciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IHBsdWdpbiBhcyBzZWFyY2hQbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9zZWFyY2hcIjtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgLy8gemVyby1jb25maWc6IHJlYWRzIERBVEFCUklDS1NfVkVDVE9SX1NFQVJDSF9JTkRFWFxuICogICAgIHNlYXJjaFBsdWdpbi5zZWFyY2goKSxcbiAqICAgICAvLyBvciBnbyBkZWVwZXI6XG4gKiAgICAgLy8gc2VhcmNoUGx1Z2luLnNlYXJjaCh7XG4gKiAgICAgLy8gICBpbmRleDogXCJtYWluLnN1cHBvcnQuZG9jc1wiLFxuICogICAgIC8vICAgaW5kZXhlczogW1wibWFpbi5zdXBwb3J0LmRvY3NcIiwgXCJtYWluLmNhdGFsb2cucHJvZHVjdHNcIl0sXG4gKiAgICAgLy8gICBjb2x1bW5zOiBbXCJ0aXRsZVwiLCBcInVybFwiLCBcImJvZHlcIl0sXG4gKiAgICAgLy8gICBtb2RlOiBcImh5YnJpZFwiLFxuICogICAgIC8vIH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFNlYXJjaFBsdWdpbiBleHRlbmRzIFBsdWdpbjxTZWFyY2hQbHVnaW5Db25maWc+IGltcGxlbWVudHMgVG9vbFByb3ZpZGVyIHtcbiAgc3RhdGljIG1hbmlmZXN0ID0ge1xuICAgIG5hbWU6IFwic2VhcmNoXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiQUkgU2VhcmNoXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlNlYXJjaCBEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXhlczogYWdlbnQgdG9vbHMsIEhUVFAgcm91dGVzIGZvciBhIFwiICtcbiAgICAgIFwic2VhcmNoIGJveCwgdW5pdmVyc2FsIHNlYXJjaCBhY3Jvc3MgaW5kZXhlcywgYW5kIGFuIG9wdC1pbiBkb2N1bWVudCB3cml0ZSBzdXJmYWNlLlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7XG4gICAgICByZXF1aXJlZDogW10sXG4gICAgICBvcHRpb25hbDogW0lOREVYX1JFU09VUkNFXSxcbiAgICB9LFxuICAgIGNvbmZpZzogeyBzY2hlbWE6IFNFQVJDSF9DT05GSUdfU0NIRU1BIH0sXG4gIH0gc2F0aXNmaWVzIFBsdWdpbk1hbmlmZXN0PFwic2VhcmNoXCI+O1xuXG4gIC8qKiBUaGUgYmFzZSBwYXRoIEFwcEtpdCBtb3VudHMgdGhpcyBwbHVnaW4ncyByb3V0ZXMgdW5kZXIuICovXG4gIHByaXZhdGUgZ2V0IGJhc2VQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvYXBpLyR7U2VhcmNoUGx1Z2luLm1hbmlmZXN0Lm5hbWV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9tb3RlIHRoZSBpbmRleCB0byBhIHJlcXVpcmVkIHJlc291cmNlIG9uY2UgYSBkZXBsb3ltZW50IHBpbnMgYSBkZWZhdWx0LFxuICAgKiB0aHJvdWdoIHBsdWdpbiBjb25maWcgb3IgZWl0aGVyIGVudmlyb25tZW50IG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0UmVzb3VyY2VSZXF1aXJlbWVudHMoY29uZmlnOiBTZWFyY2hQbHVnaW5Db25maWcpOiBSZXNvdXJjZVJlcXVpcmVtZW50W10ge1xuICAgIGNvbnN0IHBpbm5lZCA9XG4gICAgICBzdHJpbmcudHJpbVRvTnVsbChjb25maWcuaW5kZXgpID8/XG4gICAgICBzdHJpbmcudHJpbVRvTnVsbChwcm9jZXNzLmVudltJTkRFWF9FTlZdKSA/P1xuICAgICAgc3RyaW5nLnRyaW1Ub051bGwocHJvY2Vzcy5lbnZbREFUQUJSSUNLU19JTkRFWF9FTlZdKTtcbiAgICByZXR1cm4gcGlubmVkID09PSBudWxsID8gW10gOiBbeyAuLi5JTkRFWF9SRVNPVVJDRSwgcmVxdWlyZWQ6IHRydWUgfV07XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRvb2xzIHRoaXMgcGx1Z2luIG9mZmVycyB0byBhbiBBcHBLaXQgYWdlbnQuIGBzZWFyY2hgIC9cbiAgICogYHVuaXZlcnNhbF9zZWFyY2hgIGFyZSByZWFkczsgYGFkZF9kb2N1bWVudHNgIC8gYGNyZWF0ZV9pbmRleGAgL1xuICAgKiBgc3luY19pbmRleGAgYXJlIG9ubHkgb2ZmZXJlZCB3aGVuIHRoZSB3cml0ZSBzdXJmYWNlIGlzIGVuYWJsZWQuIE5vbmUgaXNcbiAgICogYXV0b0luaGVyaXRhYmxlOiBldmVyeSB0b29sIHJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIGlkZW50aXR5LCBzbyBpdCBtdXN0IGJlXG4gICAqIGdyYW50ZWQgZXhwbGljaXRseS5cbiAgICovXG4gIHByaXZhdGUgZ2V0IHRvb2xzKCk6IFRvb2xSZWdpc3RyeSB7XG4gICAgY29uc3QgeyBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoeyBjb25maWc6IHRoaXMuY29uZmlnIH0pO1xuICAgIGNvbnN0IHJlZ2lzdHJ5OiBUb29sUmVnaXN0cnkgPSB7XG4gICAgICBzZWFyY2g6IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgIHNjaGVtYTogc2VhcmNoQ29udHJhY3Quc2VhcmNoUmVxdWVzdFNjaGVtYSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHsgZWZmZWN0OiBcInJlYWRcIiwgcmVxdWlyZXNVc2VyQ29udGV4dDogdHJ1ZSB9LFxuICAgICAgICBhdXRvSW5oZXJpdGFibGU6IGZhbHNlLFxuICAgICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLnJ1blNlYXJjaChhcmdzLCBzaWduYWwpLFxuICAgICAgfSksXG4gICAgICB1bml2ZXJzYWxfc2VhcmNoOiBkZWZpbmVUb29sKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFVOSVZFUlNBTF9TRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbiAgICAgICAgc2NoZW1hOiBzZWFyY2hDb250cmFjdC51bml2ZXJzYWxTZWFyY2hSZXF1ZXN0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwicmVhZFwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuVW5pdmVyc2FsU2VhcmNoKGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KSxcbiAgICB9O1xuICAgIGlmIChjb25maWcuYWxsb3dXcml0ZSkge1xuICAgICAgcmVnaXN0cnkuYWRkX2RvY3VtZW50cyA9IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogQUREX0RPQ1VNRU5UU19UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICBzY2hlbWE6IHNlYXJjaENvbnRyYWN0LnNlYXJjaFJlcXVlc3RTY2hlbWFcbiAgICAgICAgICAucGljayh7IGluZGV4OiB0cnVlIH0pXG4gICAgICAgICAgLmV4dGVuZCh7IGRvY3VtZW50czogc2VhcmNoQ29udHJhY3Quc2VhcmNoRG9jdW1lbnRTY2hlbWEuYXJyYXkoKSB9KSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHsgZWZmZWN0OiBcIndyaXRlXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5ydW5BZGREb2N1bWVudHMoYXJncywgc2lnbmFsKSxcbiAgICAgIH0pO1xuICAgICAgcmVnaXN0cnkuY3JlYXRlX2luZGV4ID0gZGVmaW5lVG9vbCh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBDUkVBVEVfSU5ERVhfVE9PTF9ERVNDUklQVElPTixcbiAgICAgICAgc2NoZW1hOiBzZWFyY2hDb250cmFjdC5jcmVhdGVJbmRleFJlcXVlc3RTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJ3cml0ZVwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuQ3JlYXRlSW5kZXgoYXJncywgc2lnbmFsKSxcbiAgICAgIH0pO1xuICAgICAgcmVnaXN0cnkuc3luY19pbmRleCA9IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogU1lOQ19JTkRFWF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICBzY2hlbWE6IHNlYXJjaENvbnRyYWN0LnN5bmNJbmRleFJlcXVlc3RTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJ3cml0ZVwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuU3luY0luZGV4KGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqIFByaW1lIHRoZSBzaGFyZWQgcnVudGltZSBmcm9tIGNvbmZpZyBhbmQgbG9nIHRoZSBlZmZlY3RpdmUgcG9saWN5IGF0IGJvb3QuICovXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENob29zZSBhIGJhY2tlbmQuIFZlY3RvciBTZWFyY2ggaXMgcHJpbWFyeTsgd2hlbiBOTyBWZWN0b3IgU2VhcmNoXG4gICAgLy8gZW5kcG9pbnQgaXMgY29uZmlndXJlZCBidXQgdGhlIEFwcEtpdCBgbGFrZWJhc2VgIHBsdWdpbiBpcyByZWdpc3RlcmVkLFxuICAgIC8vIGZhbGwgYmFjayB0byBhIFBvc3RncmVzIGZ1bGwtdGV4dCBpbmRleC4gQm90aCBhbnN3ZXIgd2l0aCB0aGUgaWRlbnRpY2FsXG4gICAgLy8gc2hhcGUsIHNvIHRoaXMgY2hvaWNlIGlzIGludmlzaWJsZSB0byB0b29scywgcm91dGVzLCBhbmQgdGhlIFVJLlxuICAgIGNvbnN0IGxha2ViYXNlQmFja2VuZCA9IHRoaXMucmVzb2x2ZUxha2ViYXNlQmFja2VuZCgpO1xuICAgIC8vIFRoZSBydW50aW1lIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBidWlsdCAoY29uZmlnLW9ubHkpIHdoZW4gYHRvb2xzKClgIHJhblxuICAgIC8vIGR1cmluZyByZWdpc3RyYXRpb247IHJlYnVpbGQgaXQgc28gaXQgY2FycmllcyB0aGUgY2hvc2VuIGJhY2tlbmQuXG4gICAgcmVzZXRTZWFyY2hSdW50aW1lKCk7XG4gICAgY29uc3QgeyBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoe1xuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIC4uLihsYWtlYmFzZUJhY2tlbmQgPyB7IGxha2ViYXNlOiBsYWtlYmFzZUJhY2tlbmQgfSA6IHt9KSxcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgIGJhY2tlbmQ6IGxha2ViYXNlQmFja2VuZCA/IFwibGFrZWJhc2VcIiA6IFwidmVjdG9yLXNlYXJjaFwiLFxuICAgICAgZGVmYXVsdEluZGV4OiBjb25maWcuZGVmYXVsdEluZGV4ID8/IFwiKG5vbmUgLSBwYXNzIHBlciByZXF1ZXN0KVwiLFxuICAgICAgaW5kZXhlczogY29uZmlnLmluZGV4ZXMubWFwKChpKSA9PiBpLmFsaWFzKSxcbiAgICAgIHBhZ2VTaXplOiBjb25maWcucGFnZVNpemUsXG4gICAgICBtb2RlOiBjb25maWcubW9kZSxcbiAgICAgIGFsbG93V3JpdGU6IGNvbmZpZy5hbGxvd1dyaXRlLFxuICAgICAgYmFzZVBhdGg6IHRoaXMuYmFzZVBhdGgsXG4gICAgICBlbnN1cmVPblNldHVwOiBjb25maWcuZW5zdXJlT25TZXR1cFxuICAgICAgICA/IChjb25maWcuZW5zdXJlT25TZXR1cC5pbmRleCA/PyBjb25maWcuZGVmYXVsdEluZGV4KVxuICAgICAgICA6IFwib2ZmXCIsXG4gICAgfSk7XG4gICAgLy8gUHJvdmlzaW9uIGEgcmVhbCBpbmRleCBpbiB0aGUgQkFDS0dST1VORCBzbyBhIHNsb3cgZmlyc3QtdGltZSBlbmRwb2ludCBvclxuICAgIC8vIGluZGV4IGJ1aWxkIG5ldmVyIGJsb2NrcyB0aGUgc2VydmVyIGZyb20gY29taW5nIHVwLlxuICAgIGlmIChjb25maWcuZW5zdXJlT25TZXR1cCkgdm9pZCB0aGlzLnJ1bkVuc3VyZU9uU2V0dXAoY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgTGFrZWJhc2UgRkFMTEJBQ0sgYmFja2VuZCwgb3IgcmV0dXJuIGB1bmRlZmluZWRgIHdoZW4gVmVjdG9yXG4gICAqIFNlYXJjaCBzaG91bGQgYmUgdXNlZC4gRmFsbHMgYmFjayBvbmx5IHdoZW4gdGhlcmUgaXMgTk8gVmVjdG9yIFNlYXJjaFxuICAgKiBlbmRwb2ludCBjb25maWd1cmVkIChwbHVnaW4gY29uZmlnIG9yIGBTRUFSQ0hfRU5EUE9JTlRgIC9cbiAgICogYERBVEFCUklDS1NfVkVDVE9SX1NFQVJDSF9FTkRQT0lOVGApIEFORCB0aGUgc2libGluZyBBcHBLaXQgYGxha2ViYXNlYFxuICAgKiBwbHVnaW4gaXMgcmVnaXN0ZXJlZC4gVGhlIHBnIHBvb2wgaXMgYnVpbHQgZnJvbSB0aGF0IHBsdWdpbidzXG4gICAqIHNlcnZpY2UtcHJpbmNpcGFsIGNvbmZpZyBleGFjdGx5IGxpa2UgYEBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYWAncyBtZW1vcnlcbiAgICogcG9vbCAtIG5vIGF1dGggaXMgcmUtaW1wbGVtZW50ZWQgaGVyZS5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUxha2ViYXNlQmFja2VuZCgpOiBMYWtlYmFzZVNlYXJjaEJhY2tlbmQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvbmZpZyA9IHJlc29sdmVTZWFyY2hDb25maWcodGhpcy5jb25maWcpO1xuICAgIGNvbnN0IGhhc0VuZHBvaW50ID1cbiAgICAgIGNvbmZpZy5lbmRwb2ludCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBzdHJpbmcudHJpbVRvTnVsbChwcm9jZXNzLmVudltFTkRQT0lOVF9FTlZdKSAhPT0gbnVsbCB8fFxuICAgICAgc3RyaW5nLnRyaW1Ub051bGwocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19WRUNUT1JfU0VBUkNIX0VORFBPSU5UKSAhPT0gbnVsbDtcbiAgICBpZiAoaGFzRW5kcG9pbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGFrZSA9IHBsdWdpbkxvb2t1cC5pbnN0YW5jZSh0aGlzLmNvbnRleHQsIGxha2ViYXNlKTtcbiAgICBpZiAoIWxha2UpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgbG9nZ2VyLmluZm8oXCJiYWNrZW5kLWxha2ViYXNlXCIsIHtcbiAgICAgIHJlYXNvbjogXCJubyBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IGNvbmZpZ3VyZWQ7IHVzaW5nIHRoZSBMYWtlYmFzZSBmdWxsLXRleHQgZmFsbGJhY2tcIixcbiAgICB9KTtcbiAgICAvLyBgZ2V0UGdDb25maWcoKWAgbXVzdCBiZSByZWFkIE9VVFNJREUgYW55IGFzVXNlciBzY29wZSAoYXMgaXQgaXMgaGVyZSBhdFxuICAgIC8vIHNldHVwKSBzbyBpdCBjYXJyaWVzIHRoZSBTUCBjb25uZWN0aW9uIHRhcmdldCArIHRva2VuLXJlZnJlc2ggY2FsbGJhY2suXG4gICAgcmV0dXJuIG5ldyBMYWtlYmFzZVNlYXJjaEJhY2tlbmQoKCkgPT4gbGFrZS5leHBvcnRzKCkuZ2V0UGdDb25maWcoKSk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIHRoZSBlbmRwb2ludCArIGluZGV4IGV4aXN0IGFuZCBzZWVkIHRoZW0sIGhvbm9yaW5nIGBlbnN1cmVPblNldHVwYC5cbiAgICogVXNlcyBib290LXRpbWUgU0RLIGF1dGggKGVudiAvIGNvbmZpZyBwcm9maWxlKSB2aWEgdGhlIGNsaWVudCdzXG4gICAqIG91dC1vZi1yZXF1ZXN0IGZhbGxiYWNrLiBGYWlsdXJlcyBhcmUgbG9nZ2VkLCBuZXZlciB0aHJvd24gLSBhIHNlYXJjaCBhcHBcbiAgICogc2hvdWxkIHN0aWxsIHN0YXJ0IGV2ZW4gaWYgcHJvdmlzaW9uaW5nIGlzIHNsb3cgb3IgYSBwZXJtaXNzaW9uIGlzIG1pc3NpbmcuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJ1bkVuc3VyZU9uU2V0dXAoXG4gICAgY29uZmlnOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRTZWFyY2hSdW50aW1lPltcImNvbmZpZ1wiXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3BlYyA9IGNvbmZpZy5lbnN1cmVPblNldHVwO1xuICAgIGlmICghc3BlYykgcmV0dXJuO1xuICAgIGNvbnN0IGluZGV4ID0gc3RyaW5nLnRyaW1Ub051bGwoc3BlYy5pbmRleCkgPz8gY29uZmlnLmRlZmF1bHRJbmRleDtcbiAgICBpZiAoIWluZGV4KSB7XG4gICAgICBsb2dnZXIud2FybihcImVuc3VyZS1za2lwcGVkXCIsIHtcbiAgICAgICAgcmVhc29uOiBcIm5vIGluZGV4IG5hbWUgKHNldCBgaW5kZXhgIG9yIGBlbnN1cmVPblNldHVwLmluZGV4YClcIixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkb2N1bWVudHMgPSBzcGVjLmRvY3VtZW50cyA/PyBbXTtcbiAgICAvLyBJbmZlciBhIG1hbmFnZWQtZGlyZWN0LWFjY2VzcyBzY2hlbWEgZnJvbSB0aGUgZmlyc3Qgc2VlZCByb3cgd2hlbiBub3QgZ2l2ZW4uXG4gICAgY29uc3Qgc2NoZW1hID1cbiAgICAgIHNwZWMuc2NoZW1hID8/XG4gICAgICAoZG9jdW1lbnRzLmxlbmd0aCA+IDAgJiYgIXNwZWMuc291cmNlVGFibGVcbiAgICAgICAgPyB0aGlzLmluZmVyU2NoZW1hKGRvY3VtZW50c1swXSwgc3BlYy5wcmltYXJ5S2V5ID8/IFwiaWRcIiwgc3BlYy50ZXh0Q29sdW1uID8/IFwidGV4dFwiKVxuICAgICAgICA6IHVuZGVmaW5lZCk7XG4gICAgdHJ5IHtcbiAgICAgIGxvZ2dlci5pbmZvKFwiZW5zdXJlLXN0YXJ0XCIsIHsgaW5kZXggfSk7XG4gICAgICBjb25zdCB7IGNsaWVudCB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IGNsaWVudC5wcm92aXNpb24oaW5kZXgsIHtcbiAgICAgICAgLi4uKHNwZWMuZW5kcG9pbnQgPyB7IGVuZHBvaW50OiBzcGVjLmVuZHBvaW50IH0gOiB7fSksXG4gICAgICAgIC4uLihzcGVjLnByaW1hcnlLZXkgPyB7IHByaW1hcnlLZXk6IHNwZWMucHJpbWFyeUtleSB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy50ZXh0Q29sdW1uID8geyBlbWJlZGRpbmdTb3VyY2VDb2x1bW46IHNwZWMudGV4dENvbHVtbiB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy5lbWJlZGRpbmdNb2RlbCA/IHsgZW1iZWRkaW5nTW9kZWw6IHNwZWMuZW1iZWRkaW5nTW9kZWwgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwZWMuc291cmNlVGFibGUgPyB7IHNvdXJjZVRhYmxlOiBzcGVjLnNvdXJjZVRhYmxlIH0gOiB7fSksXG4gICAgICAgIC4uLihzY2hlbWEgPyB7IHNjaGVtYSB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy50aW1lb3V0TXMgPyB7IHRpbWVvdXRNczogc3BlYy50aW1lb3V0TXMgfSA6IHt9KSxcbiAgICAgICAgLi4uKGRvY3VtZW50cy5sZW5ndGggPiAwID8geyBzZWVkOiBkb2N1bWVudHMgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLmluZm8oXCJlbnN1cmUtcmVhZHlcIiwge1xuICAgICAgICBpbmRleDogaW5mby5uYW1lLFxuICAgICAgICByZWFkeTogaW5mby5yZWFkeSxcbiAgICAgICAgcm93Q291bnQ6IGluZm8ucm93Q291bnQgPz8gMCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICBsb2dnZXIud2FybihcImVuc3VyZS1mYWlsZWRcIiwgeyBpbmRleCwgbWVzc2FnZTogZXJyb3JVdGlsLmVycm9yTWVzc2FnZShjYXVzZSkgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEJ1aWxkIGEgVmVjdG9yIFNlYXJjaCBgc2NoZW1hX2pzb25gIG1hcCBmcm9tIGEgc2VlZCBkb2N1bWVudCdzIHZhbHVlIHR5cGVzLiAqL1xuICBwcml2YXRlIGluZmVyU2NoZW1hKFxuICAgIGRvYzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgcHJpbWFyeUtleTogc3RyaW5nLFxuICAgIHRleHRDb2x1bW46IHN0cmluZyxcbiAgKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3Qgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBbcHJpbWFyeUtleV06IFwic3RyaW5nXCIsIFt0ZXh0Q29sdW1uXTogXCJzdHJpbmdcIiB9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRvYykpIHtcbiAgICAgIGlmIChrZXkgaW4gc2NoZW1hKSBjb250aW51ZTtcbiAgICAgIHNjaGVtYVtrZXldID1cbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiXG4gICAgICAgICAgPyBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKVxuICAgICAgICAgICAgPyBcImludFwiXG4gICAgICAgICAgICA6IFwiZG91YmxlXCJcbiAgICAgICAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCJcbiAgICAgICAgICAgID8gXCJib29sZWFuXCJcbiAgICAgICAgICAgIDogXCJzdHJpbmdcIjtcbiAgICB9XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuXG4gIC8qKiBEcm9wIHRoZSBzaGFyZWQgcnVudGltZSBzbyBhIHJlc3RhcnRlZCBhcHAgcmUtcmVzb2x2ZXMgY29uZmlnLiAqL1xuICBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXNldFNlYXJjaFJ1bnRpbWUoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFib3J0QWN0aXZlT3BlcmF0aW9ucygpOiB2b2lkIHtcbiAgICBzdXBlci5hYm9ydEFjdGl2ZU9wZXJhdGlvbnMoKTtcbiAgICB2b2lkIHRoaXMuc2h1dGRvd24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgc2VhcmNoIHJvdXRlcyB1bmRlciBgL2FwaS9zZWFyY2hgLiBFYWNoIGlzIHdyYXBwZWQgaW5cbiAgICogYGFzVXNlcihyZXEpYCBzbyB0aGUgcXVlcnkgcnVucyBhcyB0aGUgcmVxdWVzdGluZyB1c2VyIGFuZCB0aGUgaW5kZXgnc1xuICAgKiBVbml0eSBDYXRhbG9nIEFDTHMgYXBwbHkuIGBHRVQgL2luZGV4ZXNgIG5lZWRzIG5vIHVzZXIgc2NvcGUgLSBpdCBqdXN0XG4gICAqIGVjaG9lcyB0aGUgY29uZmlndXJlZCBjYXRhbG9ndWUuXG4gICAqL1xuICBvdmVycmlkZSBpbmplY3RSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwic2VhcmNoXCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogU0VBUkNIX1JPVVRFLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVzcG9uZChyZXMsIFwic2VhcmNoXCIsICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gc2VhcmNoQ29udHJhY3Quc2VhcmNoUmVxdWVzdFNjaGVtYS5wYXJzZShyZXEuYm9keSA/PyB7fSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYXNVc2VyKHJlcSkucnVuU2VhcmNoKHJlcXVlc3QpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwidW5pdmVyc2FsU2VhcmNoXCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogVU5JVkVSU0FMX1JPVVRFLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVzcG9uZChyZXMsIFwidW5pdmVyc2FsU2VhcmNoXCIsICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gc2VhcmNoQ29udHJhY3QudW5pdmVyc2FsU2VhcmNoUmVxdWVzdFNjaGVtYS5wYXJzZShyZXEuYm9keSA/PyB7fSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYXNVc2VyKHJlcSkucnVuVW5pdmVyc2FsU2VhcmNoKHJlcXVlc3QpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiaW5kZXhlc1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogSU5ERVhFU19ST1VURSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChfcmVxLCByZXMpID0+IHtcbiAgICAgICAgcmVzLmpzb24odGhpcy5jbGllbnRDb25maWcoKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImRvY3VtZW50c1wiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IERPQ1VNRU5UU19ST1VURSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCB7IGNvbmZpZyB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgICAgICBpZiAoIWNvbmZpZy5hbGxvd1dyaXRlKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDMpLmpzb24oeyBlcnJvcjogXCJ0aGUgZG9jdW1lbnQgd3JpdGUgc3VyZmFjZSBpcyBkaXNhYmxlZFwiIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlc3BvbmQocmVzLCBcImFkZERvY3VtZW50c1wiLCAoKSA9PlxuICAgICAgICAgIHRoaXMuYXNVc2VyKHJlcSkucnVuQWRkRG9jdW1lbnRzKHJlcS5ib2R5ID8/IHt9KSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiY3JlYXRlSW5kZXhcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBJTkRFWF9ST1VURSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCB7IGNvbmZpZyB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgICAgICBpZiAoIWNvbmZpZy5hbGxvd1dyaXRlKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDMpLmpzb24oeyBlcnJvcjogXCJ0aGUgaW5kZXggd3JpdGUgc3VyZmFjZSBpcyBkaXNhYmxlZFwiIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlc3BvbmQocmVzLCBcImNyZWF0ZUluZGV4XCIsICgpID0+XG4gICAgICAgICAgdGhpcy5hc1VzZXIocmVxKS5ydW5DcmVhdGVJbmRleChyZXEuYm9keSA/PyB7fSksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcInN5bmNJbmRleFwiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IElOREVYX1NZTkNfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICAgICAgaWYgKCFjb25maWcuYWxsb3dXcml0ZSkge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAzKS5qc29uKHsgZXJyb3I6IFwidGhlIGluZGV4IHdyaXRlIHN1cmZhY2UgaXMgZGlzYWJsZWRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJzeW5jSW5kZXhcIiwgKCkgPT4gdGhpcy5hc1VzZXIocmVxKS5ydW5TeW5jSW5kZXgocmVxLmJvZHkgPz8ge30pKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGEgcm91dGUgYm9keSwgdHVybmluZyBhIGZhaWx1cmUgaW50byBhIEpTT04gZXJyb3IgcmVzcG9uc2UuXG4gICAqXG4gICAqIEFwcEtpdCdzIGByb3V0ZSgpYCByZWdpc3RlcnMgdGhlIGhhbmRsZXIgYXMtaXMsIHNvIGEgcmVqZWN0aW9uIGVzY2FwZXMgYXNcbiAgICogYW4gdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIGFuZCB0YWtlcyB0aGUgd2hvbGUgcHJvY2VzcyBkb3duIHJhdGhlciB0aGFuXG4gICAqIGZhaWxpbmcgdGhlIG9uZSByZXF1ZXN0LiBFdmVyeSByb3V0ZSBoZXJlIGdvZXMgdGhyb3VnaCB0aGlzLCBzbyBhIGJhZCBpbmRleFxuICAgKiBuYW1lIG9yIGEgVmVjdG9yIFNlYXJjaCBBUEkgZXJyb3IgcmV0dXJucyA1MDAgd2l0aCBhIG1lc3NhZ2UgaW5zdGVhZCBvZlxuICAgKiBraWxsaW5nIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc3BvbmQoXG4gICAgcmVzOiBQYXJhbWV0ZXJzPFBhcmFtZXRlcnM8SUFwcFJvdXRlcltcInBvc3RcIl0+WzFdPlsxXSxcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBydW46ICgpID0+IFByb21pc2U8dW5rbm93bj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXMuanNvbihhd2FpdCBydW4oKSk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvclV0aWwuZXJyb3JNZXNzYWdlKGNhdXNlKTtcbiAgICAgIGxvZ2dlci53YXJuKFwicm91dGUtZmFpbGVkXCIsIHsgb3BlcmF0aW9uLCBtZXNzYWdlIH0pO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogbWVzc2FnZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogU3VyZmFjZSB0aGUgaW5kZXggY2F0YWxvZ3VlICsgZGVmYXVsdHMgc28gYSBzZWFyY2ggYm94IG5lZWRzIG5vIHJvdW5kLXRyaXAuICovXG4gIG92ZXJyaWRlIGNsaWVudENvbmZpZygpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgeyBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoeyBjb25maWc6IHRoaXMuY29uZmlnIH0pO1xuICAgIGNvbnN0IHBheWxvYWQ6IFNlYXJjaENsaWVudENvbmZpZyA9IHtcbiAgICAgIGluZGV4ZXM6IGNvbmZpZy5pbmRleGVzLm1hcCgoaW5kZXgpID0+ICh7XG4gICAgICAgIG5hbWU6IGluZGV4Lm5hbWUsXG4gICAgICAgIGFsaWFzOiBpbmRleC5hbGlhcyxcbiAgICAgICAgLi4uKGluZGV4LnByaW1hcnlLZXkgPyB7IHByaW1hcnlLZXk6IGluZGV4LnByaW1hcnlLZXkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGluZGV4LmNvbHVtbnMgPyB7IGNvbHVtbnM6IGluZGV4LmNvbHVtbnMgfSA6IHt9KSxcbiAgICAgICAgLi4uKGluZGV4Lm5hbWUgPT09IGNvbmZpZy5kZWZhdWx0SW5kZXggPyB7IGlzRGVmYXVsdDogdHJ1ZSB9IDoge30pLFxuICAgICAgfSkpLFxuICAgICAgLi4uKGNvbmZpZy5kZWZhdWx0SW5kZXggPyB7IGRlZmF1bHRJbmRleDogY29uZmlnLmRlZmF1bHRJbmRleCB9IDoge30pLFxuICAgICAgcGFnZVNpemU6IGNvbmZpZy5wYWdlU2l6ZSxcbiAgICAgIGJhc2VQYXRoOiB0aGlzLmJhc2VQYXRoLFxuICAgIH07XG4gICAgcmV0dXJuIHBheWxvYWQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIC8qKiBBcHBLaXQgYFRvb2xQcm92aWRlcmA6IHRoZSB0b29sIGRlZmluaXRpb25zIG9mZmVyZWQgdG8gYW4gYWdlbnQuICovXG4gIGdldEFnZW50VG9vbHMoKTogQWdlbnRUb29sRGVmaW5pdGlvbltdIHtcbiAgICByZXR1cm4gdG9vbHNGcm9tUmVnaXN0cnkodGhpcy50b29scyk7XG4gIH1cblxuICAvKiogQXBwS2l0IGBUb29sUHJvdmlkZXJgOiBydW4gb25lIHRvb2wgY2FsbCwgdmFsaWRhdGluZyBpbnB1dCBhZ2FpbnN0IGl0cyBzY2hlbWEuICovXG4gIGFzeW5jIGV4ZWN1dGVBZ2VudFRvb2wobmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBleGVjdXRlRnJvbVJlZ2lzdHJ5KHRoaXMudG9vbHMsIG5hbWUsIGFyZ3MsIHNpZ25hbCk7XG4gIH1cblxuICBvdmVycmlkZSBleHBvcnRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvKiogU2VhcmNoIG9uZSBpbmRleCAoZGVmYXVsdCB3aGVuIG9taXR0ZWQpLiBSdW5zIGFzIHRoZSBjdXJyZW50IGNvbnRleHQgdXNlci4gKi9cbiAgICAgIHNlYXJjaDogKHJlcXVlc3Q6IHNlYXJjaENvbnRyYWN0LlNlYXJjaFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1blNlYXJjaChyZXF1ZXN0LCBzaWduYWwpLFxuICAgICAgLyoqIFNlYXJjaCBhY3Jvc3MgZXZlcnkgY29uZmlndXJlZCBpbmRleCBhbmQgbWVyZ2UgdGhlIGhpdHMuICovXG4gICAgICB1bml2ZXJzYWxTZWFyY2g6IChyZXF1ZXN0OiBzZWFyY2hDb250cmFjdC5Vbml2ZXJzYWxTZWFyY2hSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgdGhpcy5ydW5Vbml2ZXJzYWxTZWFyY2gocmVxdWVzdCwgc2lnbmFsKSxcbiAgICAgIC8qKiBBZGQgb3IgdXBkYXRlIGRvY3VtZW50cyBpbiBhIGRpcmVjdC1hY2Nlc3MgaW5kZXggKHRocm93cyB3aGVuIHdyaXRlcyBhcmUgZGlzYWJsZWQpLiAqL1xuICAgICAgYWRkRG9jdW1lbnRzOiAocmVxdWVzdDogeyBpbmRleD86IHN0cmluZzsgZG9jdW1lbnRzOiB1bmtub3duIH0sIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1bkFkZERvY3VtZW50cyhyZXF1ZXN0LCBzaWduYWwpLFxuICAgICAgLyoqIENyZWF0ZSBhIFZlY3RvciBTZWFyY2ggaW5kZXggKHRocm93cyB3aGVuIHdyaXRlcyBhcmUgZGlzYWJsZWQpLiAqL1xuICAgICAgY3JlYXRlSW5kZXg6IChyZXF1ZXN0OiBzZWFyY2hDb250cmFjdC5DcmVhdGVJbmRleFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1bkNyZWF0ZUluZGV4KHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogU3luYyBhIERlbHRhIFN5bmMgaW5kZXggZnJvbSBpdHMgc291cmNlIHRhYmxlICh0aHJvd3Mgd2hlbiB3cml0ZXMgYXJlIGRpc2FibGVkKS4gKi9cbiAgICAgIHN5bmNJbmRleDogKHJlcXVlc3Q6IHNlYXJjaENvbnRyYWN0LlN5bmNJbmRleFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1blN5bmNJbmRleChyZXF1ZXN0LCBzaWduYWwpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1blNlYXJjaChhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBzZWFyY2hDb250cmFjdC5zZWFyY2hSZXF1ZXN0U2NoZW1hLnBhcnNlKGFyZ3MpO1xuICAgIGNvbnN0IHsgY2xpZW50IH0gPSBnZXRTZWFyY2hSdW50aW1lKCk7XG4gICAgcmV0dXJuIGNsaWVudC5zZWFyY2gocmVxdWVzdC5xdWVyeSwge1xuICAgICAgLi4uKHJlcXVlc3QuaW5kZXggPyB7IGluZGV4OiByZXF1ZXN0LmluZGV4IH0gOiB7fSksXG4gICAgICAuLi4ocmVxdWVzdC5saW1pdCA/IHsgbGltaXQ6IHJlcXVlc3QubGltaXQgfSA6IHt9KSxcbiAgICAgIC4uLihyZXF1ZXN0Lm1vZGUgPyB7IG1vZGU6IHJlcXVlc3QubW9kZSB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3QuY29sdW1ucyA/IHsgY29sdW1uczogcmVxdWVzdC5jb2x1bW5zIH0gOiB7fSksXG4gICAgICAuLi4ocmVxdWVzdC5maWx0ZXIgPyB7IGZpbHRlcjogcmVxdWVzdC5maWx0ZXIgfSA6IHt9KSxcbiAgICAgIC4uLihyZXF1ZXN0LnNjb3JlVGhyZXNob2xkICE9PSB1bmRlZmluZWQgPyB7IHNjb3JlVGhyZXNob2xkOiByZXF1ZXN0LnNjb3JlVGhyZXNob2xkIH0gOiB7fSksXG4gICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuVW5pdmVyc2FsU2VhcmNoKGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHNlYXJjaENvbnRyYWN0LnVuaXZlcnNhbFNlYXJjaFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyk7XG4gICAgY29uc3QgeyBjbGllbnQgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICByZXR1cm4gY2xpZW50LnVuaXZlcnNhbFNlYXJjaChyZXF1ZXN0LnF1ZXJ5LCB7XG4gICAgICAuLi4ocmVxdWVzdC5pbmRleGVzID8geyBpbmRleGVzOiByZXF1ZXN0LmluZGV4ZXMgfSA6IHt9KSxcbiAgICAgIC4uLihyZXF1ZXN0LmxpbWl0ID8geyBsaW1pdDogcmVxdWVzdC5saW1pdCB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3QubW9kZSA/IHsgbW9kZTogcmVxdWVzdC5tb2RlIH0gOiB7fSksXG4gICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuQWRkRG9jdW1lbnRzKGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVjb3JkID0gKGFyZ3MgPz8ge30pIGFzIHsgaW5kZXg/OiBzdHJpbmc7IGRvY3VtZW50czogdW5rbm93biB9O1xuICAgIGNvbnN0IHsgY2xpZW50LCBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICBjb25zdCBkb2N1bWVudHMgPSB0b0RvY3VtZW50QXJyYXkocmVjb3JkLmRvY3VtZW50cyk7XG4gICAgY29uc3QgaW5kZXggPSByZWNvcmQuaW5kZXggPz8gY29uZmlnLmRlZmF1bHRJbmRleCA/PyBcIlwiO1xuICAgIHJldHVybiBjbGllbnQuYWRkRG9jdW1lbnRzKGluZGV4LCBkb2N1bWVudHMsIHNpZ25hbCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bkNyZWF0ZUluZGV4KGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHNlYXJjaENvbnRyYWN0LmNyZWF0ZUluZGV4UmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKTtcbiAgICBjb25zdCB7IGNsaWVudCB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgIHJldHVybiBjbGllbnQuY3JlYXRlSW5kZXgocmVxdWVzdC5uYW1lLCB0b0NyZWF0ZUluZGV4T3B0aW9ucyhyZXF1ZXN0LCBzaWduYWwpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuU3luY0luZGV4KGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHNlYXJjaENvbnRyYWN0LnN5bmNJbmRleFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyk7XG4gICAgY29uc3QgeyBjbGllbnQsIGNvbmZpZyB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgIGNvbnN0IGluZGV4ID0gcmVxdWVzdC5pbmRleCA/PyBjb25maWcuZGVmYXVsdEluZGV4ID8/IFwiXCI7XG4gICAgYXdhaXQgY2xpZW50LnN5bmNJbmRleChpbmRleCwgc2lnbmFsKTtcbiAgICByZXR1cm4geyBpbmRleCwgc3luY2VkOiB0cnVlIH07XG4gIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgQUkgU2VhcmNoIHBsdWdpbiB3aXRoIEFwcEtpdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgcGx1Z2luIGFzIHNlYXJjaFBsdWdpbiwgdG9vbCBhcyBzZWFyY2hUb29sTW9kdWxlIH0gZnJvbSBcIkBkYngtdG9vbHMvc2VhcmNoXCI7XG4gKiBpbXBvcnQgeyBhZ2VudHMsIHBsdWdpbiBhcyBtYXN0cmFQbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG4gKlxuICogY29uc3Qgc3VwcG9ydCA9IGFnZW50cy5jcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogXCJBbnN3ZXIgZnJvbSB0aGUgZG9jczsgdXNlIGBzZWFyY2hgIHRvIGZpbmQgdGhlbS5cIixcbiAqICAgdG9vbHM6ICgpID0+ICh7IHNlYXJjaDogc2VhcmNoVG9vbE1vZHVsZS5zZWFyY2hUb29sKCkgfSksXG4gKiB9KTtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgc2VhcmNoUGx1Z2luLnNlYXJjaCh7IGluZGV4OiBcIm1haW4uc3VwcG9ydC5kb2NzXCIgfSksXG4gKiAgICAgbWFzdHJhUGx1Z2luLm1hc3RyYSh7IGFnZW50czogc3VwcG9ydCB9KSxcbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBzZWFyY2ggPSB0b1BsdWdpbihTZWFyY2hQbHVnaW4pO1xuIl19
|
package/lib/src/query.js
CHANGED
|
@@ -106,4 +106,4 @@ export function toDocumentArray(input) {
|
|
|
106
106
|
const list = Array.isArray(value) ? value : [value];
|
|
107
107
|
return list.filter(object.isRecord);
|
|
108
108
|
}
|
|
109
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUVILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVyRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXRELGtGQUFrRjtBQUNsRixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUM7QUFFbEMsa0VBQWtFO0FBQ2xFLE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBZ0I7SUFDMUMsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUM5QyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxNQUEyQztJQUN2RSxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNsRSxNQUFNLFFBQVEsR0FBNEIsRUFBRSxDQUFDO0lBQzdDLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDckQsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0IsS0FBSyxNQUFNLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEQsUUFBUSxDQUFDLEdBQUcsTUFBTSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQ3hDLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLFFBQVEsQ0FB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QUFDLENBQUM7QUFDdEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxLQUFjO0lBQzVDLE1BQU0sS0FBSyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUMvRSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN4QixNQUFNLElBQUksZUFBZSxDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRyYW5zbGF0aW9uIGJldHdlZW4gdGhlIGJyb3dzZXItc2FmZSBzZWFyY2ggY29udHJhY3QgYW5kIHRoZSBEYXRhYnJpY2tzXG4gKiBWZWN0b3IgU2VhcmNoIHF1ZXJ5IEFQSSwga2VwdCBpbiBvbmUgcGxhY2Ugc28gdGhlIGNsaWVudCwgdGhlIHRvb2xzLCBhbmQgdGhlXG4gKiByb3V0ZXMgbmV2ZXIgaGFuZC1yb2xsIGEgYGZpbHRlcnNfanNvbmAgc3RyaW5nIG9yIHVucGFjayBhIGBkYXRhX2FycmF5YCBieVxuICogaGFuZC5cbiAqXG4gKiAgIC0ge0BsaW5rIHRvUXVlcnlUeXBlfSBtYXBzIHRoZSBmcmllbmRseSB7QGxpbmsgU2VhcmNoTW9kZX0gb250byB0aGUgQVBJJ3NcbiAqICAgICBgcXVlcnlfdHlwZWAgKGBIWUJSSURgIC8gYEFOTmApLiBLZXl3b3JkLW9ubHkgc2VhcmNoIHJpZGVzIG9uIGBBTk5gIHdpdGhcbiAqICAgICB0ZXh0IGJ1dCBubyB2ZWN0b3IsIHdoaWNoIERhdGFicmlja3MgYW5zd2VycyB3aXRoIGl0cyBCTTI1IHBhdGguXG4gKiAgIC0ge0BsaW5rIGNvbXBpbGVGaWx0ZXJ9IHR1cm5zIHRoZSBgeyBjb2x1bW46IHZhbHVlIH1gIGZpbHRlciBvYmplY3QgKHdpdGhcbiAqICAgICBvcHRpb25hbCBvcGVyYXRvciBtYXBzIGxpa2UgYHsgXCI+PVwiOiAxMCB9YCkgaW50byB0aGUgYGZpbHRlcnNfanNvbmBcbiAqICAgICBzdHJpbmcgdGhlIEFQSSBleHBlY3RzLCBzbyBhIGNhbGxlciBuZXZlciBsZWFybnMgRGF0YWJyaWNrcycgZmlsdGVyXG4gKiAgICAgc3BlbGxpbmcuXG4gKiAgIC0ge0BsaW5rIHRvSGl0c30gdW5wYWNrcyB0aGUgY29sdW1uYXIgYHsgbWFuaWZlc3QsIHJlc3VsdCB9YCByZXNwb25zZSBpbnRvXG4gKiAgICAgYHsgaWQsIHNjb3JlLCBmaWVsZHMgfWAgaGl0cywgcHVsbGluZyB0aGUgc2NvcmUgb3V0IG9mIHRoZSByZXNlcnZlZFxuICogICAgIGBfX2RiX3Njb3JlYCAvIGBzY29yZWAgY29sdW1uIGFuZCB0aGUgaWQgb3V0IG9mIHRoZSBwcmltYXJ5LWtleSBjb2x1bW4uXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgU2VhcmNoSGl0LCBTZWFyY2hNb2RlIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaFwiO1xuaW1wb3J0IHsganNvbiwgb2JqZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuLyoqIFRoZSBjb2x1bW4gbmFtZSBEYXRhYnJpY2tzIFZlY3RvciBTZWFyY2ggcmV0dXJucyB0aGUgcmVsZXZhbmNlIHNjb3JlIHVuZGVyLiAqL1xuY29uc3QgU0NPUkVfQ09MVU1OID0gXCJfX2RiX3Njb3JlXCI7XG5cbi8qKiBNYXAgYSB7QGxpbmsgU2VhcmNoTW9kZX0gb250byB0aGUgc2VydmluZyBBUEkgYHF1ZXJ5X3R5cGVgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUXVlcnlUeXBlKG1vZGU6IFNlYXJjaE1vZGUpOiBzdHJpbmcge1xuICByZXR1cm4gbW9kZSA9PT0gXCJoeWJyaWRcIiA/IFwiSFlCUklEXCIgOiBcIkFOTlwiO1xufVxuXG4vKipcbiAqIENvbXBpbGUgYSBgeyBjb2x1bW46IHZhbHVlIH1gIGZpbHRlciBvYmplY3QgaW50byB0aGUgYGZpbHRlcnNfanNvbmAgc3RyaW5nXG4gKiB0aGUgcXVlcnkgQVBJIGV4cGVjdHMuIEEgc2NhbGFyIGJlY29tZXMgYW4gZXF1YWxpdHk7IGFuIGFycmF5IGJlY29tZXMgYW5cbiAqIElOLXN0eWxlIG1hdGNoOyBhbiBvcGVyYXRvciBtYXAgKGB7IFwiPj1cIjogMTAsIFwiPFwiOiAyMCB9YCkgZXhwYW5kcyB0byB0aGVcbiAqIGBjb2x1bW4gb3BlcmF0b3JgIGtleXMgRGF0YWJyaWNrcyB1c2VzLiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciBhbiBlbXB0eVxuICogZmlsdGVyIHNvIHRoZSBmaWVsZCBpcyBvbWl0dGVkIHJhdGhlciB0aGFuIHNlbnQgYXMgYHt9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVGaWx0ZXIoZmlsdGVyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZmlsdGVyIHx8IE9iamVjdC5rZXlzKGZpbHRlcikubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBjb21waWxlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBbY29sdW1uLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmlsdGVyKSkge1xuICAgIGlmIChvYmplY3QuaXNSZWNvcmQodmFsdWUpKSB7XG4gICAgICBmb3IgKGNvbnN0IFtvcCwgb3BlcmFuZF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgIGNvbXBpbGVkW2Ake2NvbHVtbn0gJHtvcH1gXSA9IG9wZXJhbmQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBpbGVkW2NvbHVtbl0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNvbXBpbGVkKTtcbn1cblxuLyoqIEEgbWluaW1hbCBzdHJ1Y3R1cmFsIHZpZXcgb2YgdGhlIFZlY3RvciBTZWFyY2ggcXVlcnkgcmVzcG9uc2UuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5UmVzcG9uc2VMaWtlIHtcbiAgbWFuaWZlc3Q/OiB7IGNvbHVtbnM/OiBBcnJheTx7IG5hbWU/OiBzdHJpbmcgfT4gfTtcbiAgcmVzdWx0PzogeyBkYXRhX2FycmF5PzogQXJyYXk8QXJyYXk8dW5rbm93bj4+IH07XG4gIG5leHRfcGFnZV90b2tlbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBVbnBhY2sgYSBjb2x1bW5hciBxdWVyeSByZXNwb25zZSBpbnRvIHtAbGluayBTZWFyY2hIaXR9cy4gVGhlIG1hbmlmZXN0IG5hbWVzXG4gKiB0aGUgY29sdW1ucyBpbiBvcmRlcjsgZWFjaCByb3cgaXMgYSBwb3NpdGlvbmFsIGFycmF5LiBUaGUgc2NvcmUgY29tZXMgZnJvbVxuICogdGhlIHJlc2VydmVkIHNjb3JlIGNvbHVtbiBhbmQgdGhlIGlkIGZyb20gYHByaW1hcnlLZXlgIChmYWxsaW5nIGJhY2sgdG8gdGhlXG4gKiBmaXJzdCBjb2x1bW4gd2hlbiB0aGUga2V5IGlzIHVua25vd24pLiBUaGUgc2NvcmUgY29sdW1uIGlzIHN0cmlwcGVkIGZyb21cbiAqIGBmaWVsZHNgIHNvIGEgaGl0J3MgZmllbGRzIGFyZSBqdXN0IHRoZSBkb2N1bWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSGl0cyhcbiAgcmVzcG9uc2U6IFF1ZXJ5UmVzcG9uc2VMaWtlLFxuICBwcmltYXJ5S2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGluZGV4TmFtZT86IHN0cmluZyxcbik6IFNlYXJjaEhpdFtdIHtcbiAgY29uc3QgY29sdW1ucyA9IChyZXNwb25zZS5tYW5pZmVzdD8uY29sdW1ucyA/PyBbXSkubWFwKChjKSA9PiBjLm5hbWUgPz8gXCJcIik7XG4gIGNvbnN0IHJvd3MgPSByZXNwb25zZS5yZXN1bHQ/LmRhdGFfYXJyYXkgPz8gW107XG4gIGNvbnN0IHNjb3JlSWR4ID0gY29sdW1ucy5pbmRleE9mKFNDT1JFX0NPTFVNTik7XG4gIGNvbnN0IGtleUlkeCA9IHByaW1hcnlLZXkgPyBjb2x1bW5zLmluZGV4T2YocHJpbWFyeUtleSkgOiAtMTtcbiAgcmV0dXJuIHJvd3MubWFwKChyb3csIHJvd0luZGV4KSA9PiB7XG4gICAgY29uc3QgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGNvbHVtbnMuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgICAgaWYgKGkgPT09IHNjb3JlSWR4IHx8ICFuYW1lKSByZXR1cm47XG4gICAgICBmaWVsZHNbbmFtZV0gPSByb3dbaV07XG4gICAgfSk7XG4gICAgY29uc3Qgc2NvcmVSYXcgPSBzY29yZUlkeCA+PSAwID8gTnVtYmVyKHJvd1tzY29yZUlkeF0pIDogTmFOO1xuICAgIGNvbnN0IGlkUmF3ID1cbiAgICAgIGtleUlkeCA+PSAwID8gcm93W2tleUlkeF0gOiBwcmltYXJ5S2V5ID8gZmllbGRzW3ByaW1hcnlLZXldIDogKHJvd1swXSA/PyByb3dJbmRleCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBTdHJpbmcoaWRSYXcgPz8gcm93SW5kZXgpLFxuICAgICAgc2NvcmU6IE51bWJlci5pc0Zpbml0ZShzY29yZVJhdykgPyBzY29yZVJhdyA6IDAsXG4gICAgICBmaWVsZHMsXG4gICAgICAuLi4oaW5kZXhOYW1lID8geyBpbmRleDogaW5kZXhOYW1lIH0gOiB7fSksXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogVGhlIGNvbHVtbnMgdG8gcmVxdWVzdCBmcm9tIGFuIGluZGV4IGZvciBhIHNlYXJjaC4gV2hlbiBuZWl0aGVyIHRoZSByZXF1ZXN0XG4gKiBub3IgdGhlIGluZGV4IGNvbmZpZyBuYW1lcyBjb2x1bW5zLCB0aGUgc2NvcmUgY29sdW1uIGFsb25lIGlzIHJlcXVlc3RlZCBhbmRcbiAqIHRoZSBwcmltYXJ5IGtleSBpcyBhcHBlbmRlZCBzbyBhIGhpdCBhbHdheXMgaGFzIGFuIGlkLiBDYWxsZXJzIHRoYXQgd2FudCB0aGVcbiAqIHdob2xlIGRvY3VtZW50IHNob3VsZCBwYXNzIHRoZSBpbmRleCdzIG93biBjb2x1bW4gbGlzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUmVxdWVzdENvbHVtbnMoXG4gIHJlcXVlc3RlZDogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQsXG4gIGZhbGxiYWNrOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgcHJpbWFyeUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBiYXNlID0gcmVxdWVzdGVkICYmIHJlcXVlc3RlZC5sZW5ndGggPiAwID8gcmVxdWVzdGVkIDogKGZhbGxiYWNrID8/IFtdKTtcbiAgY29uc3QgY29sdW1ucyA9IG5ldyBTZXQ8c3RyaW5nPihiYXNlKTtcbiAgaWYgKHByaW1hcnlLZXkpIGNvbHVtbnMuYWRkKHByaW1hcnlLZXkpO1xuICBpZiAoY29sdW1ucy5zaXplID09PSAwICYmIHByaW1hcnlLZXkpIGNvbHVtbnMuYWRkKHByaW1hcnlLZXkpO1xuICByZXR1cm4gWy4uLmNvbHVtbnNdO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgSlNPTiBkb2N1bWVudCBwYXlsb2FkIHRoZSBtb2RlbCAvIGEgcm91dGUgc3VwcGxpZWQgZm9yIGEgd3JpdGUuXG4gKiBBY2NlcHRzIGFuIGFscmVhZHktcGFyc2VkIGFycmF5L29iamVjdCBvciBhIEpTT04gc3RyaW5nLCBhbmQgYWx3YXlzIHJldHVybnNcbiAqIGFuIGFycmF5IHNvIGEgc2luZ2xlIGRvY3VtZW50IGFuZCBhIGJhdGNoIGFyZSBoYW5kbGVkIHRoZSBzYW1lIHdheS4gVGhyb3dzIGFcbiAqIHtAbGluayBWYWxpZGF0aW9uRXJyb3J9IG9uIHVucGFyc2VhYmxlIGlucHV0IHNvIHRoZSBjYWxsZXIgY2FuIHN1cmZhY2UgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0RvY3VtZW50QXJyYXkoaW5wdXQ6IHVua25vd24pOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCB2YWx1ZSA9IHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIiA/IGpzb24ucGFyc2UoaW5wdXQsIHVuZGVmaW5lZCkgOiBpbnB1dDtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiZG9jdW1lbnRzIG11c3QgYmUgYSBKU09OIG9iamVjdCwgYXJyYXksIG9yIHN0cmluZ1wiKTtcbiAgfVxuICBjb25zdCBsaXN0ID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gIHJldHVybiBsaXN0LmZpbHRlcihvYmplY3QuaXNSZWNvcmQpO1xufVxuIl19
|
|
109
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUVILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR3RELGtGQUFrRjtBQUNsRixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUM7QUFFbEMsa0VBQWtFO0FBQ2xFLE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBZ0I7SUFDMUMsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUM5QyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxNQUEyQztJQUN2RSxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNsRSxNQUFNLFFBQVEsR0FBNEIsRUFBRSxDQUFDO0lBQzdDLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDckQsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0IsS0FBSyxNQUFNLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEQsUUFBUSxDQUFDLEdBQUcsTUFBTSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQ3hDLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLFFBQVEsQ0FB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QUFDLENBQUM7QUFDdEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxLQUFjO0lBQzVDLE1BQU0sS0FBSyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUMvRSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN4QixNQUFNLElBQUksZUFBZSxDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRyYW5zbGF0aW9uIGJldHdlZW4gdGhlIGJyb3dzZXItc2FmZSBzZWFyY2ggY29udHJhY3QgYW5kIHRoZSBEYXRhYnJpY2tzXG4gKiBWZWN0b3IgU2VhcmNoIHF1ZXJ5IEFQSSwga2VwdCBpbiBvbmUgcGxhY2Ugc28gdGhlIGNsaWVudCwgdGhlIHRvb2xzLCBhbmQgdGhlXG4gKiByb3V0ZXMgbmV2ZXIgaGFuZC1yb2xsIGEgYGZpbHRlcnNfanNvbmAgc3RyaW5nIG9yIHVucGFjayBhIGBkYXRhX2FycmF5YCBieVxuICogaGFuZC5cbiAqXG4gKiAgIC0ge0BsaW5rIHRvUXVlcnlUeXBlfSBtYXBzIHRoZSBmcmllbmRseSB7QGxpbmsgU2VhcmNoTW9kZX0gb250byB0aGUgQVBJJ3NcbiAqICAgICBgcXVlcnlfdHlwZWAgKGBIWUJSSURgIC8gYEFOTmApLiBLZXl3b3JkLW9ubHkgc2VhcmNoIHJpZGVzIG9uIGBBTk5gIHdpdGhcbiAqICAgICB0ZXh0IGJ1dCBubyB2ZWN0b3IsIHdoaWNoIERhdGFicmlja3MgYW5zd2VycyB3aXRoIGl0cyBCTTI1IHBhdGguXG4gKiAgIC0ge0BsaW5rIGNvbXBpbGVGaWx0ZXJ9IHR1cm5zIHRoZSBgeyBjb2x1bW46IHZhbHVlIH1gIGZpbHRlciBvYmplY3QgKHdpdGhcbiAqICAgICBvcHRpb25hbCBvcGVyYXRvciBtYXBzIGxpa2UgYHsgXCI+PVwiOiAxMCB9YCkgaW50byB0aGUgYGZpbHRlcnNfanNvbmBcbiAqICAgICBzdHJpbmcgdGhlIEFQSSBleHBlY3RzLCBzbyBhIGNhbGxlciBuZXZlciBsZWFybnMgRGF0YWJyaWNrcycgZmlsdGVyXG4gKiAgICAgc3BlbGxpbmcuXG4gKiAgIC0ge0BsaW5rIHRvSGl0c30gdW5wYWNrcyB0aGUgY29sdW1uYXIgYHsgbWFuaWZlc3QsIHJlc3VsdCB9YCByZXNwb25zZSBpbnRvXG4gKiAgICAgYHsgaWQsIHNjb3JlLCBmaWVsZHMgfWAgaGl0cywgcHVsbGluZyB0aGUgc2NvcmUgb3V0IG9mIHRoZSByZXNlcnZlZFxuICogICAgIGBfX2RiX3Njb3JlYCAvIGBzY29yZWAgY29sdW1uIGFuZCB0aGUgaWQgb3V0IG9mIHRoZSBwcmltYXJ5LWtleSBjb2x1bW4uXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGpzb24sIG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IFNlYXJjaEhpdCwgU2VhcmNoTW9kZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hcIjtcblxuLyoqIFRoZSBjb2x1bW4gbmFtZSBEYXRhYnJpY2tzIFZlY3RvciBTZWFyY2ggcmV0dXJucyB0aGUgcmVsZXZhbmNlIHNjb3JlIHVuZGVyLiAqL1xuY29uc3QgU0NPUkVfQ09MVU1OID0gXCJfX2RiX3Njb3JlXCI7XG5cbi8qKiBNYXAgYSB7QGxpbmsgU2VhcmNoTW9kZX0gb250byB0aGUgc2VydmluZyBBUEkgYHF1ZXJ5X3R5cGVgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUXVlcnlUeXBlKG1vZGU6IFNlYXJjaE1vZGUpOiBzdHJpbmcge1xuICByZXR1cm4gbW9kZSA9PT0gXCJoeWJyaWRcIiA/IFwiSFlCUklEXCIgOiBcIkFOTlwiO1xufVxuXG4vKipcbiAqIENvbXBpbGUgYSBgeyBjb2x1bW46IHZhbHVlIH1gIGZpbHRlciBvYmplY3QgaW50byB0aGUgYGZpbHRlcnNfanNvbmAgc3RyaW5nXG4gKiB0aGUgcXVlcnkgQVBJIGV4cGVjdHMuIEEgc2NhbGFyIGJlY29tZXMgYW4gZXF1YWxpdHk7IGFuIGFycmF5IGJlY29tZXMgYW5cbiAqIElOLXN0eWxlIG1hdGNoOyBhbiBvcGVyYXRvciBtYXAgKGB7IFwiPj1cIjogMTAsIFwiPFwiOiAyMCB9YCkgZXhwYW5kcyB0byB0aGVcbiAqIGBjb2x1bW4gb3BlcmF0b3JgIGtleXMgRGF0YWJyaWNrcyB1c2VzLiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciBhbiBlbXB0eVxuICogZmlsdGVyIHNvIHRoZSBmaWVsZCBpcyBvbWl0dGVkIHJhdGhlciB0aGFuIHNlbnQgYXMgYHt9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVGaWx0ZXIoZmlsdGVyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZmlsdGVyIHx8IE9iamVjdC5rZXlzKGZpbHRlcikubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBjb21waWxlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBbY29sdW1uLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmlsdGVyKSkge1xuICAgIGlmIChvYmplY3QuaXNSZWNvcmQodmFsdWUpKSB7XG4gICAgICBmb3IgKGNvbnN0IFtvcCwgb3BlcmFuZF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgIGNvbXBpbGVkW2Ake2NvbHVtbn0gJHtvcH1gXSA9IG9wZXJhbmQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBpbGVkW2NvbHVtbl0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNvbXBpbGVkKTtcbn1cblxuLyoqIEEgbWluaW1hbCBzdHJ1Y3R1cmFsIHZpZXcgb2YgdGhlIFZlY3RvciBTZWFyY2ggcXVlcnkgcmVzcG9uc2UuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5UmVzcG9uc2VMaWtlIHtcbiAgbWFuaWZlc3Q/OiB7IGNvbHVtbnM/OiBBcnJheTx7IG5hbWU/OiBzdHJpbmcgfT4gfTtcbiAgcmVzdWx0PzogeyBkYXRhX2FycmF5PzogQXJyYXk8QXJyYXk8dW5rbm93bj4+IH07XG4gIG5leHRfcGFnZV90b2tlbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBVbnBhY2sgYSBjb2x1bW5hciBxdWVyeSByZXNwb25zZSBpbnRvIHtAbGluayBTZWFyY2hIaXR9cy4gVGhlIG1hbmlmZXN0IG5hbWVzXG4gKiB0aGUgY29sdW1ucyBpbiBvcmRlcjsgZWFjaCByb3cgaXMgYSBwb3NpdGlvbmFsIGFycmF5LiBUaGUgc2NvcmUgY29tZXMgZnJvbVxuICogdGhlIHJlc2VydmVkIHNjb3JlIGNvbHVtbiBhbmQgdGhlIGlkIGZyb20gYHByaW1hcnlLZXlgIChmYWxsaW5nIGJhY2sgdG8gdGhlXG4gKiBmaXJzdCBjb2x1bW4gd2hlbiB0aGUga2V5IGlzIHVua25vd24pLiBUaGUgc2NvcmUgY29sdW1uIGlzIHN0cmlwcGVkIGZyb21cbiAqIGBmaWVsZHNgIHNvIGEgaGl0J3MgZmllbGRzIGFyZSBqdXN0IHRoZSBkb2N1bWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSGl0cyhcbiAgcmVzcG9uc2U6IFF1ZXJ5UmVzcG9uc2VMaWtlLFxuICBwcmltYXJ5S2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGluZGV4TmFtZT86IHN0cmluZyxcbik6IFNlYXJjaEhpdFtdIHtcbiAgY29uc3QgY29sdW1ucyA9IChyZXNwb25zZS5tYW5pZmVzdD8uY29sdW1ucyA/PyBbXSkubWFwKChjKSA9PiBjLm5hbWUgPz8gXCJcIik7XG4gIGNvbnN0IHJvd3MgPSByZXNwb25zZS5yZXN1bHQ/LmRhdGFfYXJyYXkgPz8gW107XG4gIGNvbnN0IHNjb3JlSWR4ID0gY29sdW1ucy5pbmRleE9mKFNDT1JFX0NPTFVNTik7XG4gIGNvbnN0IGtleUlkeCA9IHByaW1hcnlLZXkgPyBjb2x1bW5zLmluZGV4T2YocHJpbWFyeUtleSkgOiAtMTtcbiAgcmV0dXJuIHJvd3MubWFwKChyb3csIHJvd0luZGV4KSA9PiB7XG4gICAgY29uc3QgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGNvbHVtbnMuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgICAgaWYgKGkgPT09IHNjb3JlSWR4IHx8ICFuYW1lKSByZXR1cm47XG4gICAgICBmaWVsZHNbbmFtZV0gPSByb3dbaV07XG4gICAgfSk7XG4gICAgY29uc3Qgc2NvcmVSYXcgPSBzY29yZUlkeCA+PSAwID8gTnVtYmVyKHJvd1tzY29yZUlkeF0pIDogTmFOO1xuICAgIGNvbnN0IGlkUmF3ID1cbiAgICAgIGtleUlkeCA+PSAwID8gcm93W2tleUlkeF0gOiBwcmltYXJ5S2V5ID8gZmllbGRzW3ByaW1hcnlLZXldIDogKHJvd1swXSA/PyByb3dJbmRleCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBTdHJpbmcoaWRSYXcgPz8gcm93SW5kZXgpLFxuICAgICAgc2NvcmU6IE51bWJlci5pc0Zpbml0ZShzY29yZVJhdykgPyBzY29yZVJhdyA6IDAsXG4gICAgICBmaWVsZHMsXG4gICAgICAuLi4oaW5kZXhOYW1lID8geyBpbmRleDogaW5kZXhOYW1lIH0gOiB7fSksXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogVGhlIGNvbHVtbnMgdG8gcmVxdWVzdCBmcm9tIGFuIGluZGV4IGZvciBhIHNlYXJjaC4gV2hlbiBuZWl0aGVyIHRoZSByZXF1ZXN0XG4gKiBub3IgdGhlIGluZGV4IGNvbmZpZyBuYW1lcyBjb2x1bW5zLCB0aGUgc2NvcmUgY29sdW1uIGFsb25lIGlzIHJlcXVlc3RlZCBhbmRcbiAqIHRoZSBwcmltYXJ5IGtleSBpcyBhcHBlbmRlZCBzbyBhIGhpdCBhbHdheXMgaGFzIGFuIGlkLiBDYWxsZXJzIHRoYXQgd2FudCB0aGVcbiAqIHdob2xlIGRvY3VtZW50IHNob3VsZCBwYXNzIHRoZSBpbmRleCdzIG93biBjb2x1bW4gbGlzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUmVxdWVzdENvbHVtbnMoXG4gIHJlcXVlc3RlZDogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQsXG4gIGZhbGxiYWNrOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgcHJpbWFyeUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBiYXNlID0gcmVxdWVzdGVkICYmIHJlcXVlc3RlZC5sZW5ndGggPiAwID8gcmVxdWVzdGVkIDogKGZhbGxiYWNrID8/IFtdKTtcbiAgY29uc3QgY29sdW1ucyA9IG5ldyBTZXQ8c3RyaW5nPihiYXNlKTtcbiAgaWYgKHByaW1hcnlLZXkpIGNvbHVtbnMuYWRkKHByaW1hcnlLZXkpO1xuICBpZiAoY29sdW1ucy5zaXplID09PSAwICYmIHByaW1hcnlLZXkpIGNvbHVtbnMuYWRkKHByaW1hcnlLZXkpO1xuICByZXR1cm4gWy4uLmNvbHVtbnNdO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgSlNPTiBkb2N1bWVudCBwYXlsb2FkIHRoZSBtb2RlbCAvIGEgcm91dGUgc3VwcGxpZWQgZm9yIGEgd3JpdGUuXG4gKiBBY2NlcHRzIGFuIGFscmVhZHktcGFyc2VkIGFycmF5L29iamVjdCBvciBhIEpTT04gc3RyaW5nLCBhbmQgYWx3YXlzIHJldHVybnNcbiAqIGFuIGFycmF5IHNvIGEgc2luZ2xlIGRvY3VtZW50IGFuZCBhIGJhdGNoIGFyZSBoYW5kbGVkIHRoZSBzYW1lIHdheS4gVGhyb3dzIGFcbiAqIHtAbGluayBWYWxpZGF0aW9uRXJyb3J9IG9uIHVucGFyc2VhYmxlIGlucHV0IHNvIHRoZSBjYWxsZXIgY2FuIHN1cmZhY2UgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0RvY3VtZW50QXJyYXkoaW5wdXQ6IHVua25vd24pOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCB2YWx1ZSA9IHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIiA/IGpzb24ucGFyc2UoaW5wdXQsIHVuZGVmaW5lZCkgOiBpbnB1dDtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiZG9jdW1lbnRzIG11c3QgYmUgYSBKU09OIG9iamVjdCwgYXJyYXksIG9yIHN0cmluZ1wiKTtcbiAgfVxuICBjb25zdCBsaXN0ID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gIHJldHVybiBsaXN0LmZpbHRlcihvYmplY3QuaXNSZWNvcmQpO1xufVxuIl19
|
package/lib/src/schema.js
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
|
-
import { search } from "@dbx-tools/shared-search";
|
|
10
9
|
import { string } from "@dbx-tools/shared-core";
|
|
10
|
+
import { search } from "@dbx-tools/shared-search";
|
|
11
11
|
/** Description the model reads for the `search` tool. */
|
|
12
12
|
export const SEARCH_TOOL_DESCRIPTION = string.toDescription(`
|
|
13
13
|
Search a Databricks AI Search (Vector Search) index for the documents most
|
|
@@ -61,4 +61,4 @@ export const createIndexToolSchema = search.createIndexRequestSchema;
|
|
|
61
61
|
export const indexInfoSchema = search.indexInfoSchema;
|
|
62
62
|
/** Schema for the `sync_index` tool input. */
|
|
63
63
|
export const syncIndexToolSchema = search.syncIndexRequestSchema;
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVsRCx5REFBeUQ7QUFDekQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQzs7Ozs7Ozs7Q0FRM0QsQ0FBQyxDQUFDO0FBRUgsbUVBQW1FO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7Ozs7O0NBS3JFLENBQUMsQ0FBQztBQUVILGdFQUFnRTtBQUNoRSxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDOzs7OztDQUtsRSxDQUFDLENBQUM7QUFFSCwrREFBK0Q7QUFDL0QsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQzs7Ozs7Ozs7O0NBU2pFLENBQUMsQ0FBQztBQUVILDZEQUE2RDtBQUM3RCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDOzs7O0NBSS9ELENBQUMsQ0FBQztBQUVILHNFQUFzRTtBQUN0RSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUM7QUFFM0Qsb0RBQW9EO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQztBQUU3RSxnRUFBZ0U7QUFDaEUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDO0FBRTVELGdEQUFnRDtBQUNoRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUM7QUFFckUsK0VBQStFO0FBQy9FLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDO0FBRXRELDhDQUE4QztBQUM5QyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRvb2wtZmFjaW5nIGRlc2NyaXB0aW9ucyBhbmQgdGhlIHJlcXVlc3Qgc2NoZW1hcyB0aGUgTWFzdHJhIHRvb2xzICsgQXBwS2l0XG4gKiB0b29sIHByb3ZpZGVyIHZhbGlkYXRlIGFnYWluc3QuIFRoZSB3aXJlIHNoYXBlcyB0aGVtc2VsdmVzIGxpdmUgaW5cbiAqIGBAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hgOyB0aGlzIG1vZHVsZSBhZGRzIHRoZSBtb2RlbC1yZWFkYWJsZVxuICogZGVzY3JpcHRpb25zIHNvIGJvdGggaG9zdHMgZGVzY3JpYmUgdGhlIHRvb2xzIGlkZW50aWNhbGx5LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgc2VhcmNoIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaFwiO1xuXG4vKiogRGVzY3JpcHRpb24gdGhlIG1vZGVsIHJlYWRzIGZvciB0aGUgYHNlYXJjaGAgdG9vbC4gKi9cbmV4cG9ydCBjb25zdCBTRUFSQ0hfVE9PTF9ERVNDUklQVElPTiA9IHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgU2VhcmNoIGEgRGF0YWJyaWNrcyBBSSBTZWFyY2ggKFZlY3RvciBTZWFyY2gpIGluZGV4IGZvciB0aGUgZG9jdW1lbnRzIG1vc3RcbiAgcmVsZXZhbnQgdG8gYSBxdWVyeS4gUGFzcyBhIG5hdHVyYWwtbGFuZ3VhZ2UgcXVlc3Rpb24gb3Iga2V5d29yZHM7IGh5YnJpZFxuICBtYXRjaGluZyBjb21iaW5lcyBzZW1hbnRpYyBzaW1pbGFyaXR5IHdpdGgga2V5d29yZCByYW5raW5nLCBzbyBleGFjdCB0ZXJtc1xuICAocHJvZHVjdCBuYW1lcywgZXJyb3IgY29kZXMpIGFuZCBwYXJhcGhyYXNlcyBib3RoIHdvcmsuIE9wdGlvbmFsbHkgbmFtZSBhblxuICBpbmRleCAoZGVmYXVsdHMgdG8gdGhlIGFwcCdzIGNvbmZpZ3VyZWQgaW5kZXgpLCBhIHJlc3VsdCBsaW1pdCwgYW5kIGF0dHJpYnV0ZVxuICBmaWx0ZXJzLiBVc2UgaXQgdG8gbG9vayB1cCBkb2NzLCBrbm93bGVkZ2UtYmFzZSBhcnRpY2xlcywgcHJvZHVjdHMsIG9yIGFueVxuICBpbmRleGVkIGNvbnRlbnQgYmVmb3JlIGFuc3dlcmluZy5cbmApO1xuXG4vKiogRGVzY3JpcHRpb24gdGhlIG1vZGVsIHJlYWRzIGZvciB0aGUgYHVuaXZlcnNhbF9zZWFyY2hgIHRvb2wuICovXG5leHBvcnQgY29uc3QgVU5JVkVSU0FMX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OID0gc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICBTZWFyY2ggYWNyb3NzIGV2ZXJ5IGNvbmZpZ3VyZWQgQUkgU2VhcmNoIGluZGV4IGF0IG9uY2UgYW5kIHJldHVybiB0aGUgYmVzdFxuICBtYXRjaGVzIGZyb20gYWxsIG9mIHRoZW0sIG1lcmdlZCBhbmQgcmFua2VkLiBVc2UgaXQgd2hlbiB0aGUgcmlnaHQgaW5kZXhcbiAgaXNuJ3Qga25vd24gaW4gYWR2YW5jZSBvciB3aGVuIGFuIGFuc3dlciBtYXkgbGl2ZSBpbiBhbnkgb2Ygc2V2ZXJhbFxuICBjb2xsZWN0aW9ucyAoZG9jcywgdGlja2V0cywgcHJvZHVjdHMpLlxuYCk7XG5cbi8qKiBEZXNjcmlwdGlvbiB0aGUgbW9kZWwgcmVhZHMgZm9yIHRoZSBgYWRkX2RvY3VtZW50c2AgdG9vbC4gKi9cbmV4cG9ydCBjb25zdCBBRERfRE9DVU1FTlRTX1RPT0xfREVTQ1JJUFRJT04gPSBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gIEFkZCBvciB1cGRhdGUgZG9jdW1lbnRzIGluIGEgZGlyZWN0LWFjY2VzcyBBSSBTZWFyY2ggaW5kZXguIFBhc3MgYW4gYXJyYXkgb2ZcbiAgZG9jdW1lbnRzIGFzIEpTT04gb2JqZWN0czsgZWFjaCBNVVNUIGluY2x1ZGUgdGhlIGluZGV4J3MgcHJpbWFyeS1rZXkgY29sdW1uLlxuICBPbmx5IGF2YWlsYWJsZSB3aGVuIHRoZSBhcHAgZW5hYmxlcyB0aGUgd3JpdGUgc3VyZmFjZS4gVXNlIGl0IHRvIGluZGV4IG5ld1xuICBjb250ZW50IHRoZSB1c2VyIHByb3ZpZGVzLlxuYCk7XG5cbi8qKiBEZXNjcmlwdGlvbiB0aGUgbW9kZWwgcmVhZHMgZm9yIHRoZSBgY3JlYXRlX2luZGV4YCB0b29sLiAqL1xuZXhwb3J0IGNvbnN0IENSRUFURV9JTkRFWF9UT09MX0RFU0NSSVBUSU9OID0gc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICBDcmVhdGUgYSBEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXguIEZvciB0aGUgY29tbW9uIGNhc2UgcGFzc1xuICBhIERlbHRhIHNvdXJjZSB0YWJsZSAoY2F0YWxvZy5zY2hlbWEudGFibGUpOiBEYXRhYnJpY2tzIGNvbXB1dGVzIGVtYmVkZGluZ3NcbiAgZnJvbSBpdHMgdGV4dCBjb2x1bW4gYW5kIGtlZXBzIHRoZSBpbmRleCBzeW5jZWQuIFRvIGNyZWF0ZSBhIGRpcmVjdC1hY2Nlc3NcbiAgaW5kZXggeW91IHdyaXRlIHZlY3RvcnMgdG8geW91cnNlbGYsIHBhc3MgYW4gZW1iZWRkaW5nIGRpbWVuc2lvbiBpbnN0ZWFkIG9mIGFcbiAgc291cmNlIHRhYmxlLiBUaGUgZW5kcG9pbnQsIGVtYmVkZGluZyBtb2RlbCwgcHJpbWFyeSBrZXksIGFuZCB0ZXh0IGNvbHVtbiBhcmVcbiAgaW5mZXJyZWQgd2hlbiBvbWl0dGVkLiBPbmx5IGF2YWlsYWJsZSB3aGVuIHRoZSBhcHAgZW5hYmxlcyB0aGUgd3JpdGUgc3VyZmFjZS5cbiAgQ3JlYXRpbmcgYW4gaW5kZXggcHJvdmlzaW9ucyBpbmZyYXN0cnVjdHVyZSAtIGRvIHRoaXMgb25seSB3aGVuIHRoZSB1c2VyXG4gIGV4cGxpY2l0bHkgYXNrcyB0byBzZXQgdXAgYSBuZXcgaW5kZXguXG5gKTtcblxuLyoqIERlc2NyaXB0aW9uIHRoZSBtb2RlbCByZWFkcyBmb3IgdGhlIGBzeW5jX2luZGV4YCB0b29sLiAqL1xuZXhwb3J0IGNvbnN0IFNZTkNfSU5ERVhfVE9PTF9ERVNDUklQVElPTiA9IHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgUmVmcmVzaCBhIERlbHRhIFN5bmMgQUkgU2VhcmNoIGluZGV4IGZyb20gaXRzIHNvdXJjZSB0YWJsZSBzbyBuZXdseSBhZGRlZCBvclxuICBjaGFuZ2VkIHJvd3MgYmVjb21lIHNlYXJjaGFibGUuIE9wdGlvbmFsbHkgbmFtZSB0aGUgaW5kZXggKGRlZmF1bHRzIHRvIHRoZVxuICBhcHAncyBkZWZhdWx0IGluZGV4KS4gT25seSBhdmFpbGFibGUgd2hlbiB0aGUgYXBwIGVuYWJsZXMgdGhlIHdyaXRlIHN1cmZhY2UuXG5gKTtcblxuLyoqIFNjaGVtYSBmb3IgdGhlIGBzZWFyY2hgIHRvb2wgaW5wdXQgKHRoZSBzaGFyZWQgcmVxdWVzdCBzY2hlbWEpLiAqL1xuZXhwb3J0IGNvbnN0IHNlYXJjaFRvb2xTY2hlbWEgPSBzZWFyY2guc2VhcmNoUmVxdWVzdFNjaGVtYTtcblxuLyoqIFNjaGVtYSBmb3IgdGhlIGB1bml2ZXJzYWxfc2VhcmNoYCB0b29sIGlucHV0LiAqL1xuZXhwb3J0IGNvbnN0IHVuaXZlcnNhbFNlYXJjaFRvb2xTY2hlbWEgPSBzZWFyY2gudW5pdmVyc2FsU2VhcmNoUmVxdWVzdFNjaGVtYTtcblxuLyoqIFNjaGVtYSBmb3IgdGhlIGBzZWFyY2hgIC8gYHVuaXZlcnNhbF9zZWFyY2hgIHRvb2wgb3V0cHV0LiAqL1xuZXhwb3J0IGNvbnN0IHNlYXJjaFJlc3VsdFNjaGVtYSA9IHNlYXJjaC5zZWFyY2hSZXN1bHRTY2hlbWE7XG5cbi8qKiBTY2hlbWEgZm9yIHRoZSBgY3JlYXRlX2luZGV4YCB0b29sIGlucHV0LiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUluZGV4VG9vbFNjaGVtYSA9IHNlYXJjaC5jcmVhdGVJbmRleFJlcXVlc3RTY2hlbWE7XG5cbi8qKiBTY2hlbWEgZm9yIHRoZSBgY3JlYXRlX2luZGV4YCB0b29sIG91dHB1dCAoYSByZXNvbHZlZCBpbmRleCBkZWZpbml0aW9uKS4gKi9cbmV4cG9ydCBjb25zdCBpbmRleEluZm9TY2hlbWEgPSBzZWFyY2guaW5kZXhJbmZvU2NoZW1hO1xuXG4vKiogU2NoZW1hIGZvciB0aGUgYHN5bmNfaW5kZXhgIHRvb2wgaW5wdXQuICovXG5leHBvcnQgY29uc3Qgc3luY0luZGV4VG9vbFNjaGVtYSA9IHNlYXJjaC5zeW5jSW5kZXhSZXF1ZXN0U2NoZW1hO1xuIl19
|
package/package.json
CHANGED
|
@@ -19,18 +19,18 @@
|
|
|
19
19
|
"@mastra/core": "^1.47.0",
|
|
20
20
|
"pg": "^8.22.0",
|
|
21
21
|
"zod": "4.3.6",
|
|
22
|
-
"@dbx-tools/appkit": "0.6.
|
|
23
|
-
"@dbx-tools/model": "0.6.
|
|
24
|
-
"@dbx-tools/shared-
|
|
25
|
-
"@dbx-tools/shared-
|
|
26
|
-
"@dbx-tools/
|
|
22
|
+
"@dbx-tools/appkit": "0.6.10",
|
|
23
|
+
"@dbx-tools/shared-model": "0.6.10",
|
|
24
|
+
"@dbx-tools/shared-core": "0.6.10",
|
|
25
|
+
"@dbx-tools/shared-search": "0.6.10",
|
|
26
|
+
"@dbx-tools/model": "0.6.10"
|
|
27
27
|
},
|
|
28
28
|
"main": "./lib/index.js",
|
|
29
29
|
"license": "UNLICENSED",
|
|
30
30
|
"publishConfig": {
|
|
31
31
|
"access": "public"
|
|
32
32
|
},
|
|
33
|
-
"version": "0.6.
|
|
33
|
+
"version": "0.6.10",
|
|
34
34
|
"types": "./lib/index.d.ts",
|
|
35
35
|
"type": "module",
|
|
36
36
|
"exports": {
|
package/src/client.ts
CHANGED
|
@@ -32,6 +32,8 @@ import { ExecutionError, getExecutionContext } from "@databricks/appkit";
|
|
|
32
32
|
import { Context } from "@databricks/sdk-experimental";
|
|
33
33
|
import { appkit, databricks } from "@dbx-tools/appkit";
|
|
34
34
|
import { invoke, resolve as modelResolve, serving } from "@dbx-tools/model";
|
|
35
|
+
import { async as asyncUtil, json, log, string } from "@dbx-tools/shared-core";
|
|
36
|
+
import { ModelClass } from "@dbx-tools/shared-model";
|
|
35
37
|
import type {
|
|
36
38
|
SearchDocument,
|
|
37
39
|
SearchHit,
|
|
@@ -39,8 +41,6 @@ import type {
|
|
|
39
41
|
SearchResult,
|
|
40
42
|
UpsertResult,
|
|
41
43
|
} from "@dbx-tools/shared-search";
|
|
42
|
-
import { async as asyncUtil, json, log, string } from "@dbx-tools/shared-core";
|
|
43
|
-
import { ModelClass } from "@dbx-tools/shared-model";
|
|
44
44
|
import {
|
|
45
45
|
DEFAULT_MODE,
|
|
46
46
|
DEFAULT_PAGE_SIZE,
|
|
@@ -49,6 +49,7 @@ import {
|
|
|
49
49
|
resolveIndexName,
|
|
50
50
|
type ResolvedSearchConfig,
|
|
51
51
|
} from "./config.ts";
|
|
52
|
+
import type { LakebaseSearchBackend } from "./lakebase.ts";
|
|
52
53
|
import {
|
|
53
54
|
compileFilter,
|
|
54
55
|
toHits,
|
|
@@ -56,7 +57,6 @@ import {
|
|
|
56
57
|
toRequestColumns,
|
|
57
58
|
type QueryResponseLike,
|
|
58
59
|
} from "./query.ts";
|
|
59
|
-
import type { LakebaseSearchBackend } from "./lakebase.ts";
|
|
60
60
|
|
|
61
61
|
type WorkspaceClientLike = appkit.WorkspaceClientLike;
|
|
62
62
|
const logger = log.logger("search/client");
|
package/src/config.ts
CHANGED
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
25
|
import { ConfigurationError, type BasePluginConfig } from "@databricks/appkit";
|
|
26
|
-
import type { SearchDocument, SearchMode } from "@dbx-tools/shared-search";
|
|
27
26
|
import { object, string } from "@dbx-tools/shared-core";
|
|
27
|
+
import type { SearchDocument, SearchMode } from "@dbx-tools/shared-search";
|
|
28
28
|
import type { JSONSchema7 } from "json-schema";
|
|
29
29
|
|
|
30
30
|
/** The default index, honoring AppKit's standard Vector Search binding name. */
|
package/src/lakebase.ts
CHANGED
|
@@ -2,7 +2,13 @@
|
|
|
2
2
|
* A Lakebase (Postgres) full-text search backend - the FALLBACK used when no
|
|
3
3
|
* Databricks Vector Search endpoint/index is configured but a Lakebase pool is
|
|
4
4
|
* available. It provisions a single table per index, indexes a generated
|
|
5
|
-
* `tsvector`, and answers queries with `
|
|
5
|
+
* `tsvector`, and answers queries with a prefix `to_tsquery` + `ts_rank`.
|
|
6
|
+
*
|
|
7
|
+
* Queries are compiled rather than passed through `websearch_to_tsquery`,
|
|
8
|
+
* because a search box needs two things that function does not give:
|
|
9
|
+
* punctuation-insensitivity (so `store-intelligence` matches the same rows as
|
|
10
|
+
* `store intelligence`) and prefix matching (so `intel` reaches
|
|
11
|
+
* `intelligence`). See {@link toSearchTerms} / {@link toTsQuery}.
|
|
6
12
|
*
|
|
7
13
|
* The whole point is parity: this backend returns the EXACT same
|
|
8
14
|
* `@dbx-tools/shared-search` shapes (`SearchResult` / `SearchHit` /
|
|
@@ -21,19 +27,57 @@
|
|
|
21
27
|
|
|
22
28
|
import { ExecutionError } from "@databricks/appkit";
|
|
23
29
|
import { log, object, string } from "@dbx-tools/shared-core";
|
|
24
|
-
import { Pool, type PoolConfig } from "pg";
|
|
25
30
|
import type {
|
|
26
31
|
SearchDocument,
|
|
27
32
|
SearchHit,
|
|
28
33
|
SearchResult,
|
|
29
34
|
UpsertResult,
|
|
30
35
|
} from "@dbx-tools/shared-search";
|
|
36
|
+
import { Pool, type PoolConfig } from "pg";
|
|
31
37
|
|
|
32
38
|
const logger = log.logger("search/lakebase");
|
|
33
39
|
|
|
34
40
|
/** The internal columns every search table carries, excluded from a hit's `fields`. */
|
|
35
41
|
const RESERVED_COLUMNS = new Set(["id", "search_text", "document", "search_vector"]);
|
|
36
42
|
|
|
43
|
+
/**
|
|
44
|
+
* Split a search-box string into the terms a tsquery is built from, using the
|
|
45
|
+
* shared `@dbx-tools/shared-core` tokenizer so the splitting rules stay
|
|
46
|
+
* consistent with the rest of the toolkit.
|
|
47
|
+
*
|
|
48
|
+
* Splitting on punctuation is what makes `store-intelligence` behave like
|
|
49
|
+
* `store intelligence`. Postgres indexes a hyphenated word as the compound
|
|
50
|
+
* lexeme PLUS each of its parts, but compiles a hyphenated QUERY to the
|
|
51
|
+
* compound alone - so `store-intelligence` demands a `store-intellig` lexeme
|
|
52
|
+
* that a document titled `racetrac-store-intelligence` does not have, and the
|
|
53
|
+
* search silently returns nothing while `store intelligence` returns
|
|
54
|
+
* everything. Same for `.` and `_` in a table reference.
|
|
55
|
+
*
|
|
56
|
+
* `camelCase: false` is load-bearing rather than a default: the camelCase
|
|
57
|
+
* splitter also breaks digit runs, turning `gpt4` into `gpt` + `4` and `s3`
|
|
58
|
+
* into `s` + `3`. Postgres indexes each of those as ONE lexeme, so no lexeme
|
|
59
|
+
* ever starts with the trailing digits and the precise pass could not match
|
|
60
|
+
* them. Keeping punctuation as the only boundary mirrors how the index was
|
|
61
|
+
* built.
|
|
62
|
+
*/
|
|
63
|
+
export function toSearchTerms(query: string): string[] {
|
|
64
|
+
return [
|
|
65
|
+
...string.tokenizeWithOptions({ lowerCase: true, camelCase: false, distinct: true }, query),
|
|
66
|
+
];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Compile terms into a `to_tsquery` input where every term is a PREFIX, so a
|
|
71
|
+
* partially typed word still matches (`intel:*` reaches `intelligence`).
|
|
72
|
+
*
|
|
73
|
+
* Terms carry only letters and digits by construction, so none of tsquery's
|
|
74
|
+
* operators (`& | ! ( ) : *`) can survive from user input into the compiled
|
|
75
|
+
* string.
|
|
76
|
+
*/
|
|
77
|
+
export function toTsQuery(terms: readonly string[], operator: "&" | "|" = "&"): string {
|
|
78
|
+
return terms.map((term) => `${term}:*`).join(` ${operator} `);
|
|
79
|
+
}
|
|
80
|
+
|
|
37
81
|
/** Options for a single-index Lakebase search (mirrors the client's `SearchOptions`). */
|
|
38
82
|
export interface LakebaseSearchOptions {
|
|
39
83
|
limit?: number;
|
|
@@ -41,6 +85,13 @@ export interface LakebaseSearchOptions {
|
|
|
41
85
|
signal?: AbortSignal;
|
|
42
86
|
}
|
|
43
87
|
|
|
88
|
+
/** One raw search row before it is shaped into a {@link SearchHit}. */
|
|
89
|
+
interface SearchRow {
|
|
90
|
+
id: string;
|
|
91
|
+
document: unknown;
|
|
92
|
+
score: number;
|
|
93
|
+
}
|
|
94
|
+
|
|
44
95
|
/** Options for provisioning a Lakebase-backed index. */
|
|
45
96
|
export interface LakebaseProvisionOptions {
|
|
46
97
|
/** Text column embedded into the search vector. Defaults to `text`. */
|
|
@@ -100,25 +151,59 @@ export class LakebaseSearchBackend {
|
|
|
100
151
|
const table = this.tableFor(index);
|
|
101
152
|
const limit = options.limit ?? 10;
|
|
102
153
|
const pool = await this.getPool();
|
|
154
|
+
const terms = toSearchTerms(text);
|
|
103
155
|
|
|
104
|
-
//
|
|
105
|
-
//
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
156
|
+
// An empty (or punctuation-only) box returns rows rather than nothing, so
|
|
157
|
+
// the UI shows content before the user types - as a keyword index would.
|
|
158
|
+
if (terms.length === 0) {
|
|
159
|
+
const { rows } = await this.query<SearchRow>(
|
|
160
|
+
pool,
|
|
161
|
+
`SELECT id, document, 0::float4 AS score FROM ${table} ORDER BY id LIMIT $1`,
|
|
162
|
+
[limit],
|
|
163
|
+
options.signal,
|
|
164
|
+
);
|
|
165
|
+
return this.toResult(text, index, rows, options);
|
|
166
|
+
}
|
|
115
167
|
|
|
116
|
-
|
|
168
|
+
// Precise pass: every term must match, each as a prefix.
|
|
169
|
+
const strict = await this.query<SearchRow>(
|
|
117
170
|
pool,
|
|
118
|
-
|
|
119
|
-
|
|
171
|
+
`SELECT id, document, ts_rank(search_vector, to_tsquery('english', $1)) AS score
|
|
172
|
+
FROM ${table}
|
|
173
|
+
WHERE search_vector @@ to_tsquery('english', $1)
|
|
174
|
+
ORDER BY score DESC
|
|
175
|
+
LIMIT $2`,
|
|
176
|
+
[toTsQuery(terms), limit],
|
|
120
177
|
options.signal,
|
|
121
178
|
);
|
|
179
|
+
if (strict.rows.length > 0) return this.toResult(text, index, strict.rows, options);
|
|
180
|
+
|
|
181
|
+
// Nothing matched EVERY term, so relax rather than return an empty box:
|
|
182
|
+
// any one term is enough, and an `ILIKE` pass additionally catches a
|
|
183
|
+
// fragment that is not a prefix (`telligence`) or a token the text-search
|
|
184
|
+
// parser split differently than expected. Substring matching cannot use
|
|
185
|
+
// the GIN index, which is why it only runs once the indexed pass fails.
|
|
186
|
+
const relaxed = await this.query<SearchRow>(
|
|
187
|
+
pool,
|
|
188
|
+
`SELECT id, document, ts_rank(search_vector, to_tsquery('english', $1)) AS score
|
|
189
|
+
FROM ${table}
|
|
190
|
+
WHERE search_vector @@ to_tsquery('english', $1)
|
|
191
|
+
OR search_text ILIKE ANY($2::text[])
|
|
192
|
+
ORDER BY score DESC
|
|
193
|
+
LIMIT $3`,
|
|
194
|
+
[toTsQuery(terms, "|"), terms.map((term) => `%${term}%`), limit],
|
|
195
|
+
options.signal,
|
|
196
|
+
);
|
|
197
|
+
return this.toResult(text, index, relaxed.rows, options);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/** Shape raw rows into the `SearchResult` both backends return. */
|
|
201
|
+
private toResult(
|
|
202
|
+
query: string,
|
|
203
|
+
index: string,
|
|
204
|
+
rows: SearchRow[],
|
|
205
|
+
options: LakebaseSearchOptions,
|
|
206
|
+
): SearchResult {
|
|
122
207
|
const hits: SearchHit[] = rows
|
|
123
208
|
.map((row) => ({
|
|
124
209
|
id: String(row.id),
|
|
@@ -126,7 +211,7 @@ export class LakebaseSearchBackend {
|
|
|
126
211
|
fields: this.toFields(row.document),
|
|
127
212
|
}))
|
|
128
213
|
.filter((hit) => options.scoreThreshold === undefined || hit.score >= options.scoreThreshold);
|
|
129
|
-
return { query
|
|
214
|
+
return { query, index, hits, count: hits.length };
|
|
130
215
|
}
|
|
131
216
|
|
|
132
217
|
/**
|
package/src/plugin.ts
CHANGED
|
@@ -40,8 +40,8 @@ import {
|
|
|
40
40
|
type ToolRegistry,
|
|
41
41
|
} from "@databricks/appkit/beta";
|
|
42
42
|
import { plugin as pluginLookup } from "@dbx-tools/appkit";
|
|
43
|
-
import { search as searchContract, type SearchClientConfig } from "@dbx-tools/shared-search";
|
|
44
43
|
import { error as errorUtil, log, string } from "@dbx-tools/shared-core";
|
|
44
|
+
import { search as searchContract, type SearchClientConfig } from "@dbx-tools/shared-search";
|
|
45
45
|
import {
|
|
46
46
|
SEARCH_CONFIG_SCHEMA,
|
|
47
47
|
DATABRICKS_INDEX_ENV,
|
|
@@ -50,8 +50,8 @@ import {
|
|
|
50
50
|
resolveSearchConfig,
|
|
51
51
|
type SearchPluginConfig,
|
|
52
52
|
} from "./config.ts";
|
|
53
|
-
import { LakebaseSearchBackend } from "./lakebase.ts";
|
|
54
53
|
import { toCreateIndexOptions } from "./index-tools.ts";
|
|
54
|
+
import { LakebaseSearchBackend } from "./lakebase.ts";
|
|
55
55
|
import { toDocumentArray } from "./query.ts";
|
|
56
56
|
import { getSearchRuntime, resetSearchRuntime } from "./runtime.ts";
|
|
57
57
|
import {
|