@kepler.gl/mcp 0.0.0-stage → 3.3.0-alpha.19
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/dist/cjs/commands/add-column-command.js +192 -0
- package/dist/cjs/commands/basemap-command.js +80 -0
- package/dist/cjs/commands/boundary-command.js +81 -0
- package/dist/cjs/commands/command-wrappers.js +122 -0
- package/dist/cjs/commands/dataset-context-command.js +87 -0
- package/dist/cjs/commands/index.js +230 -0
- package/dist/cjs/commands/layer-creation-command.js +534 -0
- package/dist/cjs/commands/layer-style-command.js +136 -0
- package/dist/cjs/commands/load-data-command.js +270 -0
- package/dist/cjs/commands/save-data-command.js +118 -0
- package/dist/cjs/commands/split-view-command.js +261 -0
- package/dist/cjs/commands/table-command.js +199 -0
- package/dist/cjs/commands/time-filter-command.js +289 -0
- package/dist/cjs/commands/toggle-time-filter-command.js +155 -0
- package/dist/cjs/commands/types.js +6 -0
- package/dist/cjs/commands/utils.js +536 -0
- package/dist/cjs/commands/view-mode-command.js +94 -0
- package/dist/cjs/index.js +39 -0
- package/dist/cjs/map-contract.js +6 -0
- package/dist/cjs/server/bridge-server.js +435 -0
- package/dist/cjs/server/index.js +31 -0
- package/dist/cjs/server/stdio.js +201 -0
- package/dist/cjs/types.js +30 -0
- package/dist/commands/add-column-command.d.ts +4 -0
- package/dist/commands/basemap-command.d.ts +4 -0
- package/dist/commands/boundary-command.d.ts +4 -0
- package/dist/commands/command-wrappers.d.ts +52 -0
- package/dist/commands/dataset-context-command.d.ts +4 -0
- package/dist/commands/index.d.ts +31 -0
- package/dist/commands/layer-creation-command.d.ts +8 -0
- package/dist/commands/layer-style-command.d.ts +4 -0
- package/dist/commands/load-data-command.d.ts +4 -0
- package/dist/commands/save-data-command.d.ts +4 -0
- package/dist/commands/split-view-command.d.ts +4 -0
- package/dist/commands/table-command.d.ts +4 -0
- package/dist/commands/time-filter-command.d.ts +13 -0
- package/dist/commands/toggle-time-filter-command.d.ts +4 -0
- package/dist/commands/types.d.ts +132 -0
- package/dist/commands/utils.d.ts +138 -0
- package/dist/commands/view-mode-command.d.ts +4 -0
- package/dist/esm/commands/add-column-command.js +185 -0
- package/dist/esm/commands/basemap-command.js +72 -0
- package/dist/esm/commands/boundary-command.js +73 -0
- package/dist/esm/commands/command-wrappers.js +114 -0
- package/dist/esm/commands/dataset-context-command.js +79 -0
- package/dist/esm/commands/index.js +51 -0
- package/dist/esm/commands/layer-creation-command.js +527 -0
- package/dist/esm/commands/layer-style-command.js +130 -0
- package/dist/esm/commands/load-data-command.js +264 -0
- package/dist/esm/commands/save-data-command.js +112 -0
- package/dist/esm/commands/split-view-command.js +255 -0
- package/dist/esm/commands/table-command.js +194 -0
- package/dist/esm/commands/time-filter-command.js +280 -0
- package/dist/esm/commands/toggle-time-filter-command.js +147 -0
- package/dist/esm/commands/types.js +3 -0
- package/dist/esm/commands/utils.js +521 -0
- package/dist/esm/commands/view-mode-command.js +86 -0
- package/dist/esm/index.js +20 -0
- package/dist/esm/map-contract.js +3 -0
- package/dist/esm/server/bridge-server.js +428 -0
- package/dist/esm/server/index.js +13 -0
- package/dist/esm/server/stdio.js +198 -0
- package/dist/esm/types.js +24 -0
- package/dist/index.d.ts +15 -0
- package/dist/map-contract.d.ts +31 -0
- package/dist/server/bridge-server.d.ts +53 -0
- package/dist/server/index.d.ts +9 -0
- package/dist/server/stdio.d.ts +2 -0
- package/dist/types.d.ts +24 -0
- package/package.json +84 -4
- package/skill/kepler/SKILL.md +438 -0
- package/skill/kepler/skill.yaml +4 -0
- package/README.md +0 -3
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.addColumnCommandId = void 0;
|
|
8
|
+
exports.getAddColumnCommand = getAddColumnCommand;
|
|
9
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
10
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
11
|
+
var _zod = require("zod");
|
|
12
|
+
var _actions = require("@kepler.gl/actions");
|
|
13
|
+
var _utils = require("./utils");
|
|
14
|
+
// SPDX-License-Identifier: MIT
|
|
15
|
+
// Copyright contributors to the kepler.gl project
|
|
16
|
+
|
|
17
|
+
var addColumnCommandId = exports.addColumnCommandId = 'map.add-column';
|
|
18
|
+
function getAddColumnCommand(ctx) {
|
|
19
|
+
return {
|
|
20
|
+
id: addColumnCommandId,
|
|
21
|
+
name: 'Add a column to an existing map dataset',
|
|
22
|
+
group: 'Map',
|
|
23
|
+
description: "Add a NEW column to an existing kepler.gl dataset (table), in place. The dataset keeps its name, id, color and layers; existing columns are untouched, so layers, filters and tooltips keep working unchanged.\nThe new column's values come from exactly ONE of two sources:\n- copyFromColumn \u2014 copy the values of an existing column. This is how you \"rename\" a column in place: to rename \"fare\" to \"fare_amount\", add a new column \"fare_amount\" that copies \"fare\" (the original \"fare\" column stays \u2014 this command never removes columns).\n- expression \u2014 an SQL expression computed in DuckDB against the dataset's rows, e.g. a z-score: \"(HR60 - AVG(HR60) OVER()) / STDDEV(HR60) OVER()\" adds HR60_Z holding the standardized value of HR60. The expression may reference existing columns and window functions; it must produce exactly one value per row.\nCHANGING A COLUMN'S TYPE: use expression to add a NEW column that casts the original, e.g. to turn \"NOSOUTH\" (numeric) into a string, add a new column with expression \"NOSOUTH::VARCHAR\" (or \"CAST(NOSOUTH AS VARCHAR)\"). The values become strings; the original column stays. Name the new column clearly (e.g. \"NOSOUTH_str\") or as the user requests.\nIMPORTANT: this command only ADDS columns. It cannot delete or rename-in-place an existing column, and it never changes the type OF an existing column in place \u2014 a type change is achieved by adding a NEW column holding the cast values. If you need to remove columns or rebuild the whole table, use map.create-table (which creates a NEW dataset; the original is untouched).",
|
|
24
|
+
metadata: {
|
|
25
|
+
readOnly: false,
|
|
26
|
+
riskLevel: 'medium',
|
|
27
|
+
idempotent: false
|
|
28
|
+
},
|
|
29
|
+
inputSchema: _zod.z.object({
|
|
30
|
+
datasetName: _zod.z.string().min(1).describe('The name (label) or id of the dataset to add the column to'),
|
|
31
|
+
newColumnName: _zod.z.string().min(1).describe('The name of the new column to add. Must not already exist in the dataset.'),
|
|
32
|
+
copyFromColumn: _zod.z.string().min(1).optional().describe('The name of an EXISTING column whose values the new column will copy. Mutually exclusive with `expression` — provide exactly one.'),
|
|
33
|
+
expression: _zod.z.string().min(1).optional().describe('An SQL expression computed in DuckDB against the dataset rows; the result becomes the new column. e.g. z-score: "(HR60 - AVG(HR60) OVER()) / STDDEV(HR60) OVER()". Mutually exclusive with `copyFromColumn` — provide exactly one.')
|
|
34
|
+
}).superRefine(function (data, ctx) {
|
|
35
|
+
var provided = [data.copyFromColumn, data.expression].filter(function (v) {
|
|
36
|
+
return v != null;
|
|
37
|
+
}).length;
|
|
38
|
+
if (provided !== 1) {
|
|
39
|
+
ctx.addIssue({
|
|
40
|
+
code: _zod.z.ZodIssueCode.custom,
|
|
41
|
+
message: 'Provide exactly one of copyFromColumn or expression.'
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}),
|
|
45
|
+
execute: function () {
|
|
46
|
+
var _execute = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(_execCtx, input) {
|
|
47
|
+
var _ref, datasetName, newColumnName, copyFromColumn, expression, provided, visState, datasets, dataId, fieldNames, dbTableName, db, escapeIdent, appendedSql, arrowResult, _buildAddColumnPayloa, rows, fields, previewRows, valueSource;
|
|
48
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
49
|
+
while (1) switch (_context.prev = _context.next) {
|
|
50
|
+
case 0:
|
|
51
|
+
_ref = input !== null && input !== void 0 ? input : {}, datasetName = _ref.datasetName, newColumnName = _ref.newColumnName, copyFromColumn = _ref.copyFromColumn, expression = _ref.expression;
|
|
52
|
+
_context.prev = 1;
|
|
53
|
+
// Runtime guard: the bridge/webMCP call execute without zod parsing, so
|
|
54
|
+
// the superRefine "exactly one of copyFromColumn/expression" constraint
|
|
55
|
+
// is not enforced. Without it, both-missing would build
|
|
56
|
+
// `(undefined) AS ...` and produce a confusing DuckDB error.
|
|
57
|
+
provided = [copyFromColumn, expression].filter(function (v) {
|
|
58
|
+
return v != null;
|
|
59
|
+
}).length;
|
|
60
|
+
if (!(provided !== 1)) {
|
|
61
|
+
_context.next = 5;
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
throw new Error('Provide exactly one of copyFromColumn or expression.');
|
|
65
|
+
case 5:
|
|
66
|
+
if (!(typeof datasetName !== 'string' || datasetName.length === 0)) {
|
|
67
|
+
_context.next = 7;
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
throw new Error('datasetName must be a non-empty string.');
|
|
71
|
+
case 7:
|
|
72
|
+
if (!(typeof newColumnName !== 'string' || newColumnName.length === 0)) {
|
|
73
|
+
_context.next = 9;
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
throw new Error('newColumnName must be a non-empty string.');
|
|
77
|
+
case 9:
|
|
78
|
+
if (!(copyFromColumn != null && (typeof copyFromColumn !== 'string' || copyFromColumn.length === 0))) {
|
|
79
|
+
_context.next = 11;
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
throw new Error('copyFromColumn must be a non-empty string.');
|
|
83
|
+
case 11:
|
|
84
|
+
if (!(expression != null && (typeof expression !== 'string' || expression.length === 0))) {
|
|
85
|
+
_context.next = 13;
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
throw new Error('expression must be a non-empty string.');
|
|
89
|
+
case 13:
|
|
90
|
+
visState = ctx.getVisState();
|
|
91
|
+
datasets = visState.datasets;
|
|
92
|
+
dataId = Object.keys(datasets).find(function (id) {
|
|
93
|
+
return id === datasetName || datasets[id].label === datasetName;
|
|
94
|
+
});
|
|
95
|
+
if (dataId) {
|
|
96
|
+
_context.next = 18;
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
throw new Error("Dataset \"".concat(datasetName, "\" not found."));
|
|
100
|
+
case 18:
|
|
101
|
+
fieldNames = datasets[dataId].fields.map(function (f) {
|
|
102
|
+
return f.name;
|
|
103
|
+
});
|
|
104
|
+
if (!(copyFromColumn != null && !fieldNames.includes(copyFromColumn))) {
|
|
105
|
+
_context.next = 21;
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
throw new Error("Column \"".concat(copyFromColumn, "\" does not exist in dataset \"").concat(datasetName, "\". ") + "Existing columns: ".concat(fieldNames.join(', '), "."));
|
|
109
|
+
case 21:
|
|
110
|
+
if (!fieldNames.includes(newColumnName)) {
|
|
111
|
+
_context.next = 23;
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
throw new Error("Column \"".concat(newColumnName, "\" already exists in dataset \"").concat(datasetName, "\". Choose a different name."));
|
|
115
|
+
case 23:
|
|
116
|
+
// Derive the DuckDB table name from the resolved dataset id, not the
|
|
117
|
+
// user-provided label: different labels can sanitize to the same table
|
|
118
|
+
// name (e.g. "A-B" vs "A B"), which would clobber another dataset's
|
|
119
|
+
// temp table inside DuckDB and run the SQL against unintended data.
|
|
120
|
+
dbTableName = (0, _utils.datasetNameToTableName)(dataId); // Pass the user-provided datasetName (label or id) to
|
|
121
|
+
// loadTableIntoDuckDB — the documented KeplerContext contract — not
|
|
122
|
+
// the resolved id.
|
|
123
|
+
_context.next = 26;
|
|
124
|
+
return ctx.loadTableIntoDuckDB(datasetName, fieldNames, dbTableName);
|
|
125
|
+
case 26:
|
|
126
|
+
db = _context.sent;
|
|
127
|
+
// Add-only: compute ONLY the new column in DuckDB. Existing columns are
|
|
128
|
+
// never round-tripped through DuckDB/Arrow — `tableFromArrays` infers a
|
|
129
|
+
// single Arrow type for `_geojson`, and a dataset mixing Polygon and
|
|
130
|
+
// MultiPolygon features gets the shallower type, so the MultiPolygon
|
|
131
|
+
// coordinates come back as nulls and the geometry disappears.
|
|
132
|
+
// `buildAddColumnPayload` rebuilds the payload from the original kepler
|
|
133
|
+
// values instead, appending the new column from this single-column result.
|
|
134
|
+
// Escape double quotes in identifier names before embedding them in
|
|
135
|
+
// quoted SQL identifiers — a `"` in copyFromColumn/newColumnName would
|
|
136
|
+
// otherwise break the query or enable SQL injection into DuckDB. (The
|
|
137
|
+
// `expression` is user-provided SQL by design, so it is not escaped.)
|
|
138
|
+
escapeIdent = function escapeIdent(name) {
|
|
139
|
+
return name.replace(/"/g, '""');
|
|
140
|
+
};
|
|
141
|
+
appendedSql = copyFromColumn != null ? "\"".concat(escapeIdent(copyFromColumn), "\" AS \"").concat(escapeIdent(newColumnName), "\"") : "(".concat(expression, ") AS \"").concat(escapeIdent(newColumnName), "\"");
|
|
142
|
+
_context.next = 31;
|
|
143
|
+
return db.query("SELECT ".concat(appendedSql, " FROM \"").concat(dbTableName, "\""));
|
|
144
|
+
case 31:
|
|
145
|
+
arrowResult = _context.sent;
|
|
146
|
+
_buildAddColumnPayloa = (0, _utils.buildAddColumnPayload)(datasets, visState.layers, datasetName, newColumnName, arrowResult), rows = _buildAddColumnPayloa.rows, fields = _buildAddColumnPayloa.fields;
|
|
147
|
+
ctx.dispatch((0, _actions.updateDataset)(dataId, {
|
|
148
|
+
rows: rows,
|
|
149
|
+
fields: fields
|
|
150
|
+
}));
|
|
151
|
+
|
|
152
|
+
// LLM-facing preview: first 5 rows of the full (original + new) payload.
|
|
153
|
+
previewRows = rows.slice(0, 5).map(function (r) {
|
|
154
|
+
return Object.fromEntries(fields.map(function (f, i) {
|
|
155
|
+
return [f.name, r[i]];
|
|
156
|
+
}));
|
|
157
|
+
});
|
|
158
|
+
valueSource = copyFromColumn != null ? "copied from \"".concat(copyFromColumn, "\"") : "computed";
|
|
159
|
+
return _context.abrupt("return", {
|
|
160
|
+
success: true,
|
|
161
|
+
commandId: addColumnCommandId,
|
|
162
|
+
data: {
|
|
163
|
+
details: "Added column \"".concat(newColumnName, "\" to dataset \"").concat(datasetName, "\" (").concat(valueSource, ", ").concat(rows.length, " rows)."),
|
|
164
|
+
addedColumns: [newColumnName],
|
|
165
|
+
firstFiveRows: (0, _utils.tableToLLMResult)(previewRows)
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
case 39:
|
|
169
|
+
_context.prev = 39;
|
|
170
|
+
_context.t0 = _context["catch"](1);
|
|
171
|
+
return _context.abrupt("return", {
|
|
172
|
+
success: false,
|
|
173
|
+
commandId: addColumnCommandId,
|
|
174
|
+
error: _context.t0 instanceof Error ? _context.t0.message : String(_context.t0),
|
|
175
|
+
data: {
|
|
176
|
+
instruction: 'Please explain the error and give a plan to fix it. Then try again.'
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
case 42:
|
|
180
|
+
case "end":
|
|
181
|
+
return _context.stop();
|
|
182
|
+
}
|
|
183
|
+
}, _callee, null, [[1, 39]]);
|
|
184
|
+
}));
|
|
185
|
+
function execute(_x, _x2) {
|
|
186
|
+
return _execute.apply(this, arguments);
|
|
187
|
+
}
|
|
188
|
+
return execute;
|
|
189
|
+
}()
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfem9kIiwicmVxdWlyZSIsIl9hY3Rpb25zIiwiX3V0aWxzIiwiYWRkQ29sdW1uQ29tbWFuZElkIiwiZXhwb3J0cyIsImdldEFkZENvbHVtbkNvbW1hbmQiLCJjdHgiLCJpZCIsIm5hbWUiLCJncm91cCIsImRlc2NyaXB0aW9uIiwibWV0YWRhdGEiLCJyZWFkT25seSIsInJpc2tMZXZlbCIsImlkZW1wb3RlbnQiLCJpbnB1dFNjaGVtYSIsInoiLCJvYmplY3QiLCJkYXRhc2V0TmFtZSIsInN0cmluZyIsIm1pbiIsImRlc2NyaWJlIiwibmV3Q29sdW1uTmFtZSIsImNvcHlGcm9tQ29sdW1uIiwib3B0aW9uYWwiLCJleHByZXNzaW9uIiwic3VwZXJSZWZpbmUiLCJkYXRhIiwicHJvdmlkZWQiLCJmaWx0ZXIiLCJ2IiwibGVuZ3RoIiwiYWRkSXNzdWUiLCJjb2RlIiwiWm9kSXNzdWVDb2RlIiwiY3VzdG9tIiwibWVzc2FnZSIsImV4ZWN1dGUiLCJfZXhlY3V0ZSIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiX2V4ZWNDdHgiLCJpbnB1dCIsIl9yZWYiLCJ2aXNTdGF0ZSIsImRhdGFzZXRzIiwiZGF0YUlkIiwiZmllbGROYW1lcyIsImRiVGFibGVOYW1lIiwiZGIiLCJlc2NhcGVJZGVudCIsImFwcGVuZGVkU3FsIiwiYXJyb3dSZXN1bHQiLCJfYnVpbGRBZGRDb2x1bW5QYXlsb2EiLCJyb3dzIiwiZmllbGRzIiwicHJldmlld1Jvd3MiLCJ2YWx1ZVNvdXJjZSIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJFcnJvciIsImdldFZpc1N0YXRlIiwiT2JqZWN0Iiwia2V5cyIsImZpbmQiLCJsYWJlbCIsImNvbmNhdCIsIm1hcCIsImYiLCJpbmNsdWRlcyIsImpvaW4iLCJkYXRhc2V0TmFtZVRvVGFibGVOYW1lIiwibG9hZFRhYmxlSW50b0R1Y2tEQiIsInNlbnQiLCJyZXBsYWNlIiwicXVlcnkiLCJidWlsZEFkZENvbHVtblBheWxvYWQiLCJsYXllcnMiLCJkaXNwYXRjaCIsInVwZGF0ZURhdGFzZXQiLCJzbGljZSIsInIiLCJmcm9tRW50cmllcyIsImkiLCJhYnJ1cHQiLCJzdWNjZXNzIiwiY29tbWFuZElkIiwiZGV0YWlscyIsImFkZGVkQ29sdW1ucyIsImZpcnN0Rml2ZVJvd3MiLCJ0YWJsZVRvTExNUmVzdWx0IiwidDAiLCJlcnJvciIsIlN0cmluZyIsImluc3RydWN0aW9uIiwic3RvcCIsIl94IiwiX3gyIiwiYXBwbHkiLCJhcmd1bWVudHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbWFuZHMvYWRkLWNvbHVtbi1jb21tYW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB0eXBlIHtSb29tQ29tbWFuZH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5pbXBvcnQge3VwZGF0ZURhdGFzZXR9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQgdHlwZSB7S2VwbGVyQ29udGV4dH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge2J1aWxkQWRkQ29sdW1uUGF5bG9hZH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge2RhdGFzZXROYW1lVG9UYWJsZU5hbWUsIHRhYmxlVG9MTE1SZXN1bHR9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgYWRkQ29sdW1uQ29tbWFuZElkID0gJ21hcC5hZGQtY29sdW1uJyBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFkZENvbHVtbkNvbW1hbmQoY3R4OiBLZXBsZXJDb250ZXh0KTogUm9vbUNvbW1hbmQge1xuICByZXR1cm4ge1xuICAgIGlkOiBhZGRDb2x1bW5Db21tYW5kSWQsXG4gICAgbmFtZTogJ0FkZCBhIGNvbHVtbiB0byBhbiBleGlzdGluZyBtYXAgZGF0YXNldCcsXG4gICAgZ3JvdXA6ICdNYXAnLFxuICAgIGRlc2NyaXB0aW9uOiBgQWRkIGEgTkVXIGNvbHVtbiB0byBhbiBleGlzdGluZyBrZXBsZXIuZ2wgZGF0YXNldCAodGFibGUpLCBpbiBwbGFjZS4gVGhlIGRhdGFzZXQga2VlcHMgaXRzIG5hbWUsIGlkLCBjb2xvciBhbmQgbGF5ZXJzOyBleGlzdGluZyBjb2x1bW5zIGFyZSB1bnRvdWNoZWQsIHNvIGxheWVycywgZmlsdGVycyBhbmQgdG9vbHRpcHMga2VlcCB3b3JraW5nIHVuY2hhbmdlZC5cblRoZSBuZXcgY29sdW1uJ3MgdmFsdWVzIGNvbWUgZnJvbSBleGFjdGx5IE9ORSBvZiB0d28gc291cmNlczpcbi0gY29weUZyb21Db2x1bW4g4oCUIGNvcHkgdGhlIHZhbHVlcyBvZiBhbiBleGlzdGluZyBjb2x1bW4uIFRoaXMgaXMgaG93IHlvdSBcInJlbmFtZVwiIGEgY29sdW1uIGluIHBsYWNlOiB0byByZW5hbWUgXCJmYXJlXCIgdG8gXCJmYXJlX2Ftb3VudFwiLCBhZGQgYSBuZXcgY29sdW1uIFwiZmFyZV9hbW91bnRcIiB0aGF0IGNvcGllcyBcImZhcmVcIiAodGhlIG9yaWdpbmFsIFwiZmFyZVwiIGNvbHVtbiBzdGF5cyDigJQgdGhpcyBjb21tYW5kIG5ldmVyIHJlbW92ZXMgY29sdW1ucykuXG4tIGV4cHJlc3Npb24g4oCUIGFuIFNRTCBleHByZXNzaW9uIGNvbXB1dGVkIGluIER1Y2tEQiBhZ2FpbnN0IHRoZSBkYXRhc2V0J3Mgcm93cywgZS5nLiBhIHotc2NvcmU6IFwiKEhSNjAgLSBBVkcoSFI2MCkgT1ZFUigpKSAvIFNURERFVihIUjYwKSBPVkVSKClcIiBhZGRzIEhSNjBfWiBob2xkaW5nIHRoZSBzdGFuZGFyZGl6ZWQgdmFsdWUgb2YgSFI2MC4gVGhlIGV4cHJlc3Npb24gbWF5IHJlZmVyZW5jZSBleGlzdGluZyBjb2x1bW5zIGFuZCB3aW5kb3cgZnVuY3Rpb25zOyBpdCBtdXN0IHByb2R1Y2UgZXhhY3RseSBvbmUgdmFsdWUgcGVyIHJvdy5cbkNIQU5HSU5HIEEgQ09MVU1OJ1MgVFlQRTogdXNlIGV4cHJlc3Npb24gdG8gYWRkIGEgTkVXIGNvbHVtbiB0aGF0IGNhc3RzIHRoZSBvcmlnaW5hbCwgZS5nLiB0byB0dXJuIFwiTk9TT1VUSFwiIChudW1lcmljKSBpbnRvIGEgc3RyaW5nLCBhZGQgYSBuZXcgY29sdW1uIHdpdGggZXhwcmVzc2lvbiBcIk5PU09VVEg6OlZBUkNIQVJcIiAob3IgXCJDQVNUKE5PU09VVEggQVMgVkFSQ0hBUilcIikuIFRoZSB2YWx1ZXMgYmVjb21lIHN0cmluZ3M7IHRoZSBvcmlnaW5hbCBjb2x1bW4gc3RheXMuIE5hbWUgdGhlIG5ldyBjb2x1bW4gY2xlYXJseSAoZS5nLiBcIk5PU09VVEhfc3RyXCIpIG9yIGFzIHRoZSB1c2VyIHJlcXVlc3RzLlxuSU1QT1JUQU5UOiB0aGlzIGNvbW1hbmQgb25seSBBRERTIGNvbHVtbnMuIEl0IGNhbm5vdCBkZWxldGUgb3IgcmVuYW1lLWluLXBsYWNlIGFuIGV4aXN0aW5nIGNvbHVtbiwgYW5kIGl0IG5ldmVyIGNoYW5nZXMgdGhlIHR5cGUgT0YgYW4gZXhpc3RpbmcgY29sdW1uIGluIHBsYWNlIOKAlCBhIHR5cGUgY2hhbmdlIGlzIGFjaGlldmVkIGJ5IGFkZGluZyBhIE5FVyBjb2x1bW4gaG9sZGluZyB0aGUgY2FzdCB2YWx1ZXMuIElmIHlvdSBuZWVkIHRvIHJlbW92ZSBjb2x1bW5zIG9yIHJlYnVpbGQgdGhlIHdob2xlIHRhYmxlLCB1c2UgbWFwLmNyZWF0ZS10YWJsZSAod2hpY2ggY3JlYXRlcyBhIE5FVyBkYXRhc2V0OyB0aGUgb3JpZ2luYWwgaXMgdW50b3VjaGVkKS5gLFxuICAgIG1ldGFkYXRhOiB7cmVhZE9ubHk6IGZhbHNlLCByaXNrTGV2ZWw6ICdtZWRpdW0nLCBpZGVtcG90ZW50OiBmYWxzZX0sXG4gICAgaW5wdXRTY2hlbWE6IHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICBkYXRhc2V0TmFtZTogelxuICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgIC5taW4oMSlcbiAgICAgICAgICAuZGVzY3JpYmUoJ1RoZSBuYW1lIChsYWJlbCkgb3IgaWQgb2YgdGhlIGRhdGFzZXQgdG8gYWRkIHRoZSBjb2x1bW4gdG8nKSxcbiAgICAgICAgbmV3Q29sdW1uTmFtZTogelxuICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgIC5taW4oMSlcbiAgICAgICAgICAuZGVzY3JpYmUoJ1RoZSBuYW1lIG9mIHRoZSBuZXcgY29sdW1uIHRvIGFkZC4gTXVzdCBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgZGF0YXNldC4nKSxcbiAgICAgICAgY29weUZyb21Db2x1bW46IHpcbiAgICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgICAubWluKDEpXG4gICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgICAnVGhlIG5hbWUgb2YgYW4gRVhJU1RJTkcgY29sdW1uIHdob3NlIHZhbHVlcyB0aGUgbmV3IGNvbHVtbiB3aWxsIGNvcHkuIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBleHByZXNzaW9uYCDigJQgcHJvdmlkZSBleGFjdGx5IG9uZS4nXG4gICAgICAgICAgKSxcbiAgICAgICAgZXhwcmVzc2lvbjogelxuICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgIC5taW4oMSlcbiAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICAgICdBbiBTUUwgZXhwcmVzc2lvbiBjb21wdXRlZCBpbiBEdWNrREIgYWdhaW5zdCB0aGUgZGF0YXNldCByb3dzOyB0aGUgcmVzdWx0IGJlY29tZXMgdGhlIG5ldyBjb2x1bW4uIGUuZy4gei1zY29yZTogXCIoSFI2MCAtIEFWRyhIUjYwKSBPVkVSKCkpIC8gU1REREVWKEhSNjApIE9WRVIoKVwiLiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgY29weUZyb21Db2x1bW5gIOKAlCBwcm92aWRlIGV4YWN0bHkgb25lLidcbiAgICAgICAgICApXG4gICAgICB9KVxuICAgICAgLnN1cGVyUmVmaW5lKChkYXRhLCBjdHgpID0+IHtcbiAgICAgICAgY29uc3QgcHJvdmlkZWQgPSBbZGF0YS5jb3B5RnJvbUNvbHVtbiwgZGF0YS5leHByZXNzaW9uXS5maWx0ZXIodiA9PiB2ICE9IG51bGwpLmxlbmd0aDtcbiAgICAgICAgaWYgKHByb3ZpZGVkICE9PSAxKSB7XG4gICAgICAgICAgY3R4LmFkZElzc3VlKHtcbiAgICAgICAgICAgIGNvZGU6IHouWm9kSXNzdWVDb2RlLmN1c3RvbSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdQcm92aWRlIGV4YWN0bHkgb25lIG9mIGNvcHlGcm9tQ29sdW1uIG9yIGV4cHJlc3Npb24uJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KSBhcyBhbnksXG4gICAgZXhlY3V0ZTogYXN5bmMgKF9leGVjQ3R4LCBpbnB1dCkgPT4ge1xuICAgICAgY29uc3Qge2RhdGFzZXROYW1lLCBuZXdDb2x1bW5OYW1lLCBjb3B5RnJvbUNvbHVtbiwgZXhwcmVzc2lvbn0gPSAoaW5wdXQgPz8ge30pIGFzIHtcbiAgICAgICAgZGF0YXNldE5hbWU6IHN0cmluZztcbiAgICAgICAgbmV3Q29sdW1uTmFtZTogc3RyaW5nO1xuICAgICAgICBjb3B5RnJvbUNvbHVtbj86IHN0cmluZztcbiAgICAgICAgZXhwcmVzc2lvbj86IHN0cmluZztcbiAgICAgIH07XG4gICAgICB0cnkge1xuICAgICAgICAvLyBSdW50aW1lIGd1YXJkOiB0aGUgYnJpZGdlL3dlYk1DUCBjYWxsIGV4ZWN1dGUgd2l0aG91dCB6b2QgcGFyc2luZywgc29cbiAgICAgICAgLy8gdGhlIHN1cGVyUmVmaW5lIFwiZXhhY3RseSBvbmUgb2YgY29weUZyb21Db2x1bW4vZXhwcmVzc2lvblwiIGNvbnN0cmFpbnRcbiAgICAgICAgLy8gaXMgbm90IGVuZm9yY2VkLiBXaXRob3V0IGl0LCBib3RoLW1pc3Npbmcgd291bGQgYnVpbGRcbiAgICAgICAgLy8gYCh1bmRlZmluZWQpIEFTIC4uLmAgYW5kIHByb2R1Y2UgYSBjb25mdXNpbmcgRHVja0RCIGVycm9yLlxuICAgICAgICBjb25zdCBwcm92aWRlZCA9IFtjb3B5RnJvbUNvbHVtbiwgZXhwcmVzc2lvbl0uZmlsdGVyKHYgPT4gdiAhPSBudWxsKS5sZW5ndGg7XG4gICAgICAgIGlmIChwcm92aWRlZCAhPT0gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvdmlkZSBleGFjdGx5IG9uZSBvZiBjb3B5RnJvbUNvbHVtbiBvciBleHByZXNzaW9uLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YXNldE5hbWUgIT09ICdzdHJpbmcnIHx8IGRhdGFzZXROYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZGF0YXNldE5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuZXdDb2x1bW5OYW1lICE9PSAnc3RyaW5nJyB8fCBuZXdDb2x1bW5OYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbmV3Q29sdW1uTmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy4nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnJpZGdlL3dlYk1DUCBwYXRoIHNraXBzIHpvZCwgc28gYW4gZW1wdHkgY29weUZyb21Db2x1bW4vZXhwcmVzc2lvblxuICAgICAgICAvLyB3b3VsZCBzbGlwIHRocm91Z2ggYW5kIGJ1aWxkIGAoKSBBUyAuLi5gIC8gYFwiXCIgQVMgLi4uYCDigJQgYSBjb25mdXNpbmdcbiAgICAgICAgLy8gRHVja0RCIGVycm9yIGluc3RlYWQgb2YgYW4gYWN0aW9uYWJsZSBvbmUuIEVuZm9yY2Ugbm9uLWVtcHR5IHN0cmluZ3NcbiAgICAgICAgLy8gZm9yIHdoaWNoZXZlciBzb3VyY2UgaXMgc2VsZWN0ZWQuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBjb3B5RnJvbUNvbHVtbiAhPSBudWxsICYmXG4gICAgICAgICAgKHR5cGVvZiBjb3B5RnJvbUNvbHVtbiAhPT0gJ3N0cmluZycgfHwgY29weUZyb21Db2x1bW4ubGVuZ3RoID09PSAwKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvcHlGcm9tQ29sdW1uIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChleHByZXNzaW9uICE9IG51bGwgJiYgKHR5cGVvZiBleHByZXNzaW9uICE9PSAnc3RyaW5nJyB8fCBleHByZXNzaW9uLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cHJlc3Npb24gbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2aXNTdGF0ZSA9IGN0eC5nZXRWaXNTdGF0ZSgpO1xuICAgICAgICBjb25zdCBkYXRhc2V0cyA9IHZpc1N0YXRlLmRhdGFzZXRzO1xuICAgICAgICBjb25zdCBkYXRhSWQgPSBPYmplY3Qua2V5cyhkYXRhc2V0cykuZmluZChcbiAgICAgICAgICBpZCA9PiBpZCA9PT0gZGF0YXNldE5hbWUgfHwgZGF0YXNldHNbaWRdLmxhYmVsID09PSBkYXRhc2V0TmFtZVxuICAgICAgICApO1xuICAgICAgICBpZiAoIWRhdGFJZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0YXNldCBcIiR7ZGF0YXNldE5hbWV9XCIgbm90IGZvdW5kLmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpZWxkTmFtZXMgPSBkYXRhc2V0c1tkYXRhSWRdLmZpZWxkcy5tYXAoKGY6IGFueSkgPT4gZi5uYW1lKTtcbiAgICAgICAgaWYgKGNvcHlGcm9tQ29sdW1uICE9IG51bGwgJiYgIWZpZWxkTmFtZXMuaW5jbHVkZXMoY29weUZyb21Db2x1bW4pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENvbHVtbiBcIiR7Y29weUZyb21Db2x1bW59XCIgZG9lcyBub3QgZXhpc3QgaW4gZGF0YXNldCBcIiR7ZGF0YXNldE5hbWV9XCIuIGAgK1xuICAgICAgICAgICAgICBgRXhpc3RpbmcgY29sdW1uczogJHtmaWVsZE5hbWVzLmpvaW4oJywgJyl9LmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWVsZE5hbWVzLmluY2x1ZGVzKG5ld0NvbHVtbk5hbWUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENvbHVtbiBcIiR7bmV3Q29sdW1uTmFtZX1cIiBhbHJlYWR5IGV4aXN0cyBpbiBkYXRhc2V0IFwiJHtkYXRhc2V0TmFtZX1cIi4gQ2hvb3NlIGEgZGlmZmVyZW50IG5hbWUuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZXJpdmUgdGhlIER1Y2tEQiB0YWJsZSBuYW1lIGZyb20gdGhlIHJlc29sdmVkIGRhdGFzZXQgaWQsIG5vdCB0aGVcbiAgICAgICAgLy8gdXNlci1wcm92aWRlZCBsYWJlbDogZGlmZmVyZW50IGxhYmVscyBjYW4gc2FuaXRpemUgdG8gdGhlIHNhbWUgdGFibGVcbiAgICAgICAgLy8gbmFtZSAoZS5nLiBcIkEtQlwiIHZzIFwiQSBCXCIpLCB3aGljaCB3b3VsZCBjbG9iYmVyIGFub3RoZXIgZGF0YXNldCdzXG4gICAgICAgIC8vIHRlbXAgdGFibGUgaW5zaWRlIER1Y2tEQiBhbmQgcnVuIHRoZSBTUUwgYWdhaW5zdCB1bmludGVuZGVkIGRhdGEuXG4gICAgICAgIGNvbnN0IGRiVGFibGVOYW1lID0gZGF0YXNldE5hbWVUb1RhYmxlTmFtZShkYXRhSWQpO1xuICAgICAgICAvLyBQYXNzIHRoZSB1c2VyLXByb3ZpZGVkIGRhdGFzZXROYW1lIChsYWJlbCBvciBpZCkgdG9cbiAgICAgICAgLy8gbG9hZFRhYmxlSW50b0R1Y2tEQiDigJQgdGhlIGRvY3VtZW50ZWQgS2VwbGVyQ29udGV4dCBjb250cmFjdCDigJQgbm90XG4gICAgICAgIC8vIHRoZSByZXNvbHZlZCBpZC5cbiAgICAgICAgY29uc3QgZGIgPSBhd2FpdCBjdHgubG9hZFRhYmxlSW50b0R1Y2tEQihkYXRhc2V0TmFtZSwgZmllbGROYW1lcywgZGJUYWJsZU5hbWUpO1xuXG4gICAgICAgIC8vIEFkZC1vbmx5OiBjb21wdXRlIE9OTFkgdGhlIG5ldyBjb2x1bW4gaW4gRHVja0RCLiBFeGlzdGluZyBjb2x1bW5zIGFyZVxuICAgICAgICAvLyBuZXZlciByb3VuZC10cmlwcGVkIHRocm91Z2ggRHVja0RCL0Fycm93IOKAlCBgdGFibGVGcm9tQXJyYXlzYCBpbmZlcnMgYVxuICAgICAgICAvLyBzaW5nbGUgQXJyb3cgdHlwZSBmb3IgYF9nZW9qc29uYCwgYW5kIGEgZGF0YXNldCBtaXhpbmcgUG9seWdvbiBhbmRcbiAgICAgICAgLy8gTXVsdGlQb2x5Z29uIGZlYXR1cmVzIGdldHMgdGhlIHNoYWxsb3dlciB0eXBlLCBzbyB0aGUgTXVsdGlQb2x5Z29uXG4gICAgICAgIC8vIGNvb3JkaW5hdGVzIGNvbWUgYmFjayBhcyBudWxscyBhbmQgdGhlIGdlb21ldHJ5IGRpc2FwcGVhcnMuXG4gICAgICAgIC8vIGBidWlsZEFkZENvbHVtblBheWxvYWRgIHJlYnVpbGRzIHRoZSBwYXlsb2FkIGZyb20gdGhlIG9yaWdpbmFsIGtlcGxlclxuICAgICAgICAvLyB2YWx1ZXMgaW5zdGVhZCwgYXBwZW5kaW5nIHRoZSBuZXcgY29sdW1uIGZyb20gdGhpcyBzaW5nbGUtY29sdW1uIHJlc3VsdC5cbiAgICAgICAgLy8gRXNjYXBlIGRvdWJsZSBxdW90ZXMgaW4gaWRlbnRpZmllciBuYW1lcyBiZWZvcmUgZW1iZWRkaW5nIHRoZW0gaW5cbiAgICAgICAgLy8gcXVvdGVkIFNRTCBpZGVudGlmaWVycyDigJQgYSBgXCJgIGluIGNvcHlGcm9tQ29sdW1uL25ld0NvbHVtbk5hbWUgd291bGRcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGJyZWFrIHRoZSBxdWVyeSBvciBlbmFibGUgU1FMIGluamVjdGlvbiBpbnRvIER1Y2tEQi4gKFRoZVxuICAgICAgICAvLyBgZXhwcmVzc2lvbmAgaXMgdXNlci1wcm92aWRlZCBTUUwgYnkgZGVzaWduLCBzbyBpdCBpcyBub3QgZXNjYXBlZC4pXG4gICAgICAgIGNvbnN0IGVzY2FwZUlkZW50ID0gKG5hbWU6IHN0cmluZykgPT4gbmFtZS5yZXBsYWNlKC9cIi9nLCAnXCJcIicpO1xuICAgICAgICBjb25zdCBhcHBlbmRlZFNxbCA9XG4gICAgICAgICAgY29weUZyb21Db2x1bW4gIT0gbnVsbFxuICAgICAgICAgICAgPyBgXCIke2VzY2FwZUlkZW50KGNvcHlGcm9tQ29sdW1uKX1cIiBBUyBcIiR7ZXNjYXBlSWRlbnQobmV3Q29sdW1uTmFtZSl9XCJgXG4gICAgICAgICAgICA6IGAoJHtleHByZXNzaW9ufSkgQVMgXCIke2VzY2FwZUlkZW50KG5ld0NvbHVtbk5hbWUpfVwiYDtcbiAgICAgICAgY29uc3QgYXJyb3dSZXN1bHQgPSBhd2FpdCBkYi5xdWVyeShgU0VMRUNUICR7YXBwZW5kZWRTcWx9IEZST00gXCIke2RiVGFibGVOYW1lfVwiYCk7XG5cbiAgICAgICAgY29uc3Qge3Jvd3MsIGZpZWxkc30gPSBidWlsZEFkZENvbHVtblBheWxvYWQoXG4gICAgICAgICAgZGF0YXNldHMsXG4gICAgICAgICAgdmlzU3RhdGUubGF5ZXJzLFxuICAgICAgICAgIGRhdGFzZXROYW1lLFxuICAgICAgICAgIG5ld0NvbHVtbk5hbWUsXG4gICAgICAgICAgYXJyb3dSZXN1bHRcbiAgICAgICAgKTtcbiAgICAgICAgY3R4LmRpc3BhdGNoKHVwZGF0ZURhdGFzZXQoZGF0YUlkLCB7cm93cywgZmllbGRzfSBhcyBhbnkpKTtcblxuICAgICAgICAvLyBMTE0tZmFjaW5nIHByZXZpZXc6IGZpcnN0IDUgcm93cyBvZiB0aGUgZnVsbCAob3JpZ2luYWwgKyBuZXcpIHBheWxvYWQuXG4gICAgICAgIGNvbnN0IHByZXZpZXdSb3dzID0gcm93c1xuICAgICAgICAgIC5zbGljZSgwLCA1KVxuICAgICAgICAgIC5tYXAociA9PiBPYmplY3QuZnJvbUVudHJpZXMoZmllbGRzLm1hcCgoZiwgaSkgPT4gW2YubmFtZSwgcltpXV0pKSk7XG4gICAgICAgIGNvbnN0IHZhbHVlU291cmNlID0gY29weUZyb21Db2x1bW4gIT0gbnVsbCA/IGBjb3BpZWQgZnJvbSBcIiR7Y29weUZyb21Db2x1bW59XCJgIDogYGNvbXB1dGVkYDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIGNvbW1hbmRJZDogYWRkQ29sdW1uQ29tbWFuZElkLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGRldGFpbHM6IGBBZGRlZCBjb2x1bW4gXCIke25ld0NvbHVtbk5hbWV9XCIgdG8gZGF0YXNldCBcIiR7ZGF0YXNldE5hbWV9XCIgKCR7dmFsdWVTb3VyY2V9LCAke3Jvd3MubGVuZ3RofSByb3dzKS5gLFxuICAgICAgICAgICAgYWRkZWRDb2x1bW5zOiBbbmV3Q29sdW1uTmFtZV0sXG4gICAgICAgICAgICBmaXJzdEZpdmVSb3dzOiB0YWJsZVRvTExNUmVzdWx0KHByZXZpZXdSb3dzKVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgY29tbWFuZElkOiBhZGRDb2x1bW5Db21tYW5kSWQsXG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBpbnN0cnVjdGlvbjogJ1BsZWFzZSBleHBsYWluIHRoZSBlcnJvciBhbmQgZ2l2ZSBhIHBsYW4gdG8gZml4IGl0LiBUaGVuIHRy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
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.basemapCommandId = void 0;
|
|
8
|
+
exports.getBasemapCommand = getBasemapCommand;
|
|
9
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
10
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
11
|
+
var _zod = require("zod");
|
|
12
|
+
var _constants = require("@kepler.gl/constants");
|
|
13
|
+
var _actions = require("@kepler.gl/actions");
|
|
14
|
+
// SPDX-License-Identifier: MIT
|
|
15
|
+
// Copyright contributors to the kepler.gl project
|
|
16
|
+
|
|
17
|
+
var basemapCommandId = exports.basemapCommandId = 'map.set-basemap';
|
|
18
|
+
function getBasemapCommand(ctx) {
|
|
19
|
+
return {
|
|
20
|
+
id: basemapCommandId,
|
|
21
|
+
name: 'Set basemap',
|
|
22
|
+
group: 'Map',
|
|
23
|
+
description: 'Change the basemap style of the kepler.gl map.',
|
|
24
|
+
metadata: {
|
|
25
|
+
readOnly: false,
|
|
26
|
+
riskLevel: 'low',
|
|
27
|
+
idempotent: true
|
|
28
|
+
},
|
|
29
|
+
inputSchema: _zod.z.object({
|
|
30
|
+
styleType: _zod.z["enum"](['no_map', 'dark-matter', 'positron', 'voyager', 'satellite', 'dark', 'light', 'muted', 'muted_night'])
|
|
31
|
+
}),
|
|
32
|
+
execute: function () {
|
|
33
|
+
var _execute = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(_execCtx, input) {
|
|
34
|
+
var _ref, styleType;
|
|
35
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
36
|
+
while (1) switch (_context.prev = _context.next) {
|
|
37
|
+
case 0:
|
|
38
|
+
_ref = input !== null && input !== void 0 ? input : {}, styleType = _ref.styleType;
|
|
39
|
+
_context.prev = 1;
|
|
40
|
+
if (_constants.DEFAULT_MAP_STYLES.find(function (style) {
|
|
41
|
+
return style.id === styleType;
|
|
42
|
+
})) {
|
|
43
|
+
_context.next = 4;
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
throw new Error("Invalid basemap style: ".concat(styleType, "."));
|
|
47
|
+
case 4:
|
|
48
|
+
ctx.dispatch((0, _actions.mapStyleChange)(styleType));
|
|
49
|
+
return _context.abrupt("return", {
|
|
50
|
+
success: true,
|
|
51
|
+
commandId: basemapCommandId,
|
|
52
|
+
data: {
|
|
53
|
+
details: "Basemap style changed to ".concat(styleType, ".")
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
case 8:
|
|
57
|
+
_context.prev = 8;
|
|
58
|
+
_context.t0 = _context["catch"](1);
|
|
59
|
+
return _context.abrupt("return", {
|
|
60
|
+
success: false,
|
|
61
|
+
commandId: basemapCommandId,
|
|
62
|
+
error: _context.t0 instanceof Error ? _context.t0.message : 'Unknown error',
|
|
63
|
+
data: {
|
|
64
|
+
instruction: 'Try to fix the error. If the error persists, ask the user to try with a different basemap style.'
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
case 11:
|
|
68
|
+
case "end":
|
|
69
|
+
return _context.stop();
|
|
70
|
+
}
|
|
71
|
+
}, _callee, null, [[1, 8]]);
|
|
72
|
+
}));
|
|
73
|
+
function execute(_x, _x2) {
|
|
74
|
+
return _execute.apply(this, arguments);
|
|
75
|
+
}
|
|
76
|
+
return execute;
|
|
77
|
+
}()
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfem9kIiwicmVxdWlyZSIsIl9jb25zdGFudHMiLCJfYWN0aW9ucyIsImJhc2VtYXBDb21tYW5kSWQiLCJleHBvcnRzIiwiZ2V0QmFzZW1hcENvbW1hbmQiLCJjdHgiLCJpZCIsIm5hbWUiLCJncm91cCIsImRlc2NyaXB0aW9uIiwibWV0YWRhdGEiLCJyZWFkT25seSIsInJpc2tMZXZlbCIsImlkZW1wb3RlbnQiLCJpbnB1dFNjaGVtYSIsInoiLCJvYmplY3QiLCJzdHlsZVR5cGUiLCJleGVjdXRlIiwiX2V4ZWN1dGUiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsIl9leGVjQ3R4IiwiaW5wdXQiLCJfcmVmIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsIkRFRkFVTFRfTUFQX1NUWUxFUyIsImZpbmQiLCJzdHlsZSIsIkVycm9yIiwiY29uY2F0IiwiZGlzcGF0Y2giLCJtYXBTdHlsZUNoYW5nZSIsImFicnVwdCIsInN1Y2Nlc3MiLCJjb21tYW5kSWQiLCJkYXRhIiwiZGV0YWlscyIsInQwIiwiZXJyb3IiLCJtZXNzYWdlIiwiaW5zdHJ1Y3Rpb24iLCJzdG9wIiwiX3giLCJfeDIiLCJhcHBseSIsImFyZ3VtZW50cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9iYXNlbWFwLWNvbW1hbmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHR5cGUge1Jvb21Db21tYW5kfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7en0gZnJvbSAnem9kJztcbmltcG9ydCB7REVGQVVMVF9NQVBfU1RZTEVTfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge21hcFN0eWxlQ2hhbmdlfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHR5cGUge0tlcGxlckNvbnRleHR9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgYmFzZW1hcENvbW1hbmRJZCA9ICdtYXAuc2V0LWJhc2VtYXAnIGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QmFzZW1hcENvbW1hbmQoY3R4OiBLZXBsZXJDb250ZXh0KTogUm9vbUNvbW1hbmQge1xuICByZXR1cm4ge1xuICAgIGlkOiBiYXNlbWFwQ29tbWFuZElkLFxuICAgIG5hbWU6ICdTZXQgYmFzZW1hcCcsXG4gICAgZ3JvdXA6ICdNYXAnLFxuICAgIGRlc2NyaXB0aW9uOiAnQ2hhbmdlIHRoZSBiYXNlbWFwIHN0eWxlIG9mIHRoZSBrZXBsZXIuZ2wgbWFwLicsXG4gICAgbWV0YWRhdGE6IHtyZWFkT25seTogZmFsc2UsIHJpc2tMZXZlbDogJ2xvdycsIGlkZW1wb3RlbnQ6IHRydWV9LFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBzdHlsZVR5cGU6IHouZW51bShbXG4gICAgICAgICdub19tYXAnLFxuICAgICAgICAnZGFyay1tYXR0ZXInLFxuICAgICAgICAncG9zaXRyb24nLFxuICAgICAgICAndm95YWdlcicsXG4gICAgICAgICdzYXRlbGxpdGUnLFxuICAgICAgICAnZGFyaycsXG4gICAgICAgICdsaWdodCcsXG4gICAgICAgICdtdXRlZCcsXG4gICAgICAgICdtdXRlZF9uaWdodCdcbiAgICAgIF0pXG4gICAgfSkgYXMgYW55LFxuICAgIGV4ZWN1dGU6IGFzeW5jIChfZXhlY0N0eCwgaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IHtzdHlsZVR5cGV9ID0gKGlucHV0ID8/IHt9KSBhcyB7c3R5bGVUeXBlOiBzdHJpbmd9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFERUZBVUxUX01BUF9TVFlMRVMuZmluZChzdHlsZSA9PiBzdHlsZS5pZCA9PT0gc3R5bGVUeXBlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBiYXNlbWFwIHN0eWxlOiAke3N0eWxlVHlwZX0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LmRpc3BhdGNoKG1hcFN0eWxlQ2hhbmdlKHN0eWxlVHlwZSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgY29tbWFuZElkOiBiYXNlbWFwQ29tbWFuZElkLFxuICAgICAgICAgIGRhdGE6IHtkZXRhaWxzOiBgQmFzZW1hcCBzdHlsZSBjaGFuZ2VkIHRvICR7c3R5bGVUeXBlfS5gfVxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBjb21tYW5kSWQ6IGJhc2VtYXBDb21tYW5kSWQsXG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGluc3RydWN0aW9uOlxuICAgICAgICAgICAgICAnVHJ5IHRvIGZpeCB0aGUgZXJyb3IuIElmIHRoZSBlcnJvciBwZXJzaXN0cywgYXNrIHRoZSB1c2VyIHRvIHRyeSB3aXRoIGEgZGlmZmVyZW50IGJhc2VtYXAgc3R5bGUuJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFJQSxJQUFBQSxJQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxVQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxRQUFBLEdBQUFGLE9BQUE7QUFOQTtBQUNBOztBQVFPLElBQU1HLGdCQUFnQixHQUFBQyxPQUFBLENBQUFELGdCQUFBLEdBQUcsaUJBQTBCO0FBRW5ELFNBQVNFLGlCQUFpQkEsQ0FBQ0MsR0FBa0IsRUFBZTtFQUNqRSxPQUFPO0lBQ0xDLEVB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
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.getMapBoundaryCommand = getMapBoundaryCommand;
|
|
8
|
+
exports.mapBoundaryCommandId = void 0;
|
|
9
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
10
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
11
|
+
var _zod = require("zod");
|
|
12
|
+
// SPDX-License-Identifier: MIT
|
|
13
|
+
// Copyright contributors to the kepler.gl project
|
|
14
|
+
|
|
15
|
+
var mapBoundaryCommandId = exports.mapBoundaryCommandId = 'map.get-boundary';
|
|
16
|
+
function getMapBoundaryCommand(ctx) {
|
|
17
|
+
return {
|
|
18
|
+
id: mapBoundaryCommandId,
|
|
19
|
+
name: 'Get map boundary',
|
|
20
|
+
group: 'Map',
|
|
21
|
+
description: 'Get the boundary of the map. Northwest and Southeast coordinates in [longitude, latitude] format.',
|
|
22
|
+
metadata: {
|
|
23
|
+
readOnly: true,
|
|
24
|
+
riskLevel: 'low',
|
|
25
|
+
idempotent: true
|
|
26
|
+
},
|
|
27
|
+
inputSchema: _zod.z.object({}),
|
|
28
|
+
execute: function () {
|
|
29
|
+
var _execute = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
30
|
+
var boundary;
|
|
31
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
32
|
+
while (1) switch (_context.prev = _context.next) {
|
|
33
|
+
case 0:
|
|
34
|
+
_context.prev = 0;
|
|
35
|
+
boundary = ctx.getMapBoundary();
|
|
36
|
+
if (boundary) {
|
|
37
|
+
_context.next = 4;
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
return _context.abrupt("return", {
|
|
41
|
+
success: false,
|
|
42
|
+
commandId: mapBoundaryCommandId,
|
|
43
|
+
error: 'Map boundary not available.',
|
|
44
|
+
data: {
|
|
45
|
+
instruction: 'Please ensure the kepler.gl map is properly loaded and try again.'
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
case 4:
|
|
49
|
+
return _context.abrupt("return", {
|
|
50
|
+
success: true,
|
|
51
|
+
commandId: mapBoundaryCommandId,
|
|
52
|
+
data: {
|
|
53
|
+
details: "Map boundary retrieved. NW: [".concat(boundary.nw[0], ", ").concat(boundary.nw[1], "], SE: [").concat(boundary.se[0], ", ").concat(boundary.se[1], "]"),
|
|
54
|
+
boundary: boundary
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
case 7:
|
|
58
|
+
_context.prev = 7;
|
|
59
|
+
_context.t0 = _context["catch"](0);
|
|
60
|
+
return _context.abrupt("return", {
|
|
61
|
+
success: false,
|
|
62
|
+
commandId: mapBoundaryCommandId,
|
|
63
|
+
error: _context.t0 instanceof Error ? _context.t0.message : 'Unknown error',
|
|
64
|
+
data: {
|
|
65
|
+
instruction: 'Please ensure the kepler.gl map is properly loaded and try again.'
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
case 10:
|
|
69
|
+
case "end":
|
|
70
|
+
return _context.stop();
|
|
71
|
+
}
|
|
72
|
+
}, _callee, null, [[0, 7]]);
|
|
73
|
+
}));
|
|
74
|
+
function execute() {
|
|
75
|
+
return _execute.apply(this, arguments);
|
|
76
|
+
}
|
|
77
|
+
return execute;
|
|
78
|
+
}()
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfem9kIiwicmVxdWlyZSIsIm1hcEJvdW5kYXJ5Q29tbWFuZElkIiwiZXhwb3J0cyIsImdldE1hcEJvdW5kYXJ5Q29tbWFuZCIsImN0eCIsImlkIiwibmFtZSIsImdyb3VwIiwiZGVzY3JpcHRpb24iLCJtZXRhZGF0YSIsInJlYWRPbmx5Iiwicmlza0xldmVsIiwiaWRlbXBvdGVudCIsImlucHV0U2NoZW1hIiwieiIsIm9iamVjdCIsImV4ZWN1dGUiLCJfZXhlY3V0ZSIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiYm91bmRhcnkiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiZ2V0TWFwQm91bmRhcnkiLCJhYnJ1cHQiLCJzdWNjZXNzIiwiY29tbWFuZElkIiwiZXJyb3IiLCJkYXRhIiwiaW5zdHJ1Y3Rpb24iLCJkZXRhaWxzIiwiY29uY2F0IiwibnciLCJzZSIsInQwIiwiRXJyb3IiLCJtZXNzYWdlIiwic3RvcCIsImFwcGx5IiwiYXJndW1lbnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2JvdW5kYXJ5LWNvbW1hbmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHR5cGUge1Jvb21Db21tYW5kfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7en0gZnJvbSAnem9kJztcbmltcG9ydCB0eXBlIHtLZXBsZXJDb250ZXh0fSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IG1hcEJvdW5kYXJ5Q29tbWFuZElkID0gJ21hcC5nZXQtYm91bmRhcnknIGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFwQm91bmRhcnlDb21tYW5kKGN0eDogS2VwbGVyQ29udGV4dCk6IFJvb21Db21tYW5kIHtcbiAgcmV0dXJuIHtcbiAgICBpZDogbWFwQm91bmRhcnlDb21tYW5kSWQsXG4gICAgbmFtZTogJ0dldCBtYXAgYm91bmRhcnknLFxuICAgIGdyb3VwOiAnTWFwJyxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdHZXQgdGhlIGJvdW5kYXJ5IG9mIHRoZSBtYXAuIE5vcnRod2VzdCBhbmQgU291dGhlYXN0IGNvb3JkaW5hdGVzIGluIFtsb25naXR1ZGUsIGxhdGl0dWRlXSBmb3JtYXQuJyxcbiAgICBtZXRhZGF0YToge3JlYWRPbmx5OiB0cnVlLCByaXNrTGV2ZWw6ICdsb3cnLCBpZGVtcG90ZW50OiB0cnVlfSxcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe30pIGFzIGFueSxcbiAgICBleGVjdXRlOiBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBib3VuZGFyeSA9IGN0eC5nZXRNYXBCb3VuZGFyeSgpO1xuICAgICAgICBpZiAoIWJvdW5kYXJ5KSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgY29tbWFuZElkOiBtYXBCb3VuZGFyeUNvbW1hbmRJZCxcbiAgICAgICAgICAgIGVycm9yOiAnTWFwIGJvdW5kYXJ5IG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb246ICdQbGVhc2UgZW5zdXJlIHRoZSBrZXBsZXIuZ2wgbWFwIGlzIHByb3Blcmx5IGxvYWRlZCBhbmQgdHJ5IGFnYWluLidcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBjb21tYW5kSWQ6IG1hcEJvdW5kYXJ5Q29tbWFuZElkLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGRldGFpbHM6IGBNYXAgYm91bmRhcnkgcmV0cmlldmVkLiBOVzogWyR7Ym91bmRhcnkubndbMF19LCAke2JvdW5kYXJ5Lm53WzFdfV0sIFNFOiBbJHtib3VuZGFyeS5zZVswXX0sICR7Ym91bmRhcnkuc2VbMV19XWAsXG4gICAgICAgICAgICBib3VuZGFyeVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgY29tbWFuZElkOiBtYXBCb3VuZGFyeUNvbW1hbmRJZCxcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgaW5zdHJ1Y3Rpb246ICdQbGVhc2UgZW5zdXJlIHRoZSBrZXBsZXIuZ2wgbWFwIGlzIHByb3Blcmx5IGxvYWRlZCBhbmQgdHJ5IGFnYWluLidcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBSUEsSUFBQUEsSUFBQSxHQUFBQyxPQUFBO0FBSkE7QUFDQTs7QUFNTyxJQUFNQyxvQkFBb0IsR0FBQUMsT0FBQSxDQUFBRCxvQkFBQSxHQUFHLGtCQUEyQjtBQUV4RCxTQUFTRSxxQkFBcUJBLENBQUNDLEdBQWtCLEVBQWU7RUFDckUsT0FBTztJQUNMQyxFQUFFLEVBQUVKLG9CQUFvQjtJQUN4QkssSUFBSSxFQUFFLGtCQUFrQjtJQUN4QkMsS0FBSyxFQUFFLEtBQUs7SUFDWkMsV0FBVyxFQUNULG1HQUFtRztJQUNyR0MsUUFBUSxFQUFFO01BQUNDLFFBQVEsRUFBRSxJQUFJO01BQUVDLFNBQVMsRUFBRSxLQUFLO01BQUVDLFVBQVUsRUFBRTtJQUFJLENBQUM7SUFDOURDLFdBQVcsRUFBRUMsTUFBQyxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQVE7SUFDaENDLE9BQU87TUFBQSxJQUFBQyxRQUFBLE9BQUFDLGtCQUFBLDBCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBRSxTQUFBQyxRQUFBO1FBQUEsSUFBQUMsUUFBQTtRQUFBLE9BQUFILFlBQUEsWUFBQUksSUFBQSxVQUFBQyxTQUFBQyxRQUFBO1VBQUEsa0JBQUFBLFFBQUEsQ0FBQUMsSUFBQSxHQUFBRCxRQUFBLENBQUFFLElBQUE7WUFBQTtjQUFBRixRQUFBLENBQUFDLElBQUE7Y0FFQ0osUUFBUSxHQUFHbEIsR0FBRyxDQUFDd0IsY0FBYyxDQUFDLENBQUM7Y0FBQSxJQUNoQ04sUUFBUTtnQkFBQUcsUUFBQSxDQUFBRSxJQUFBO2dCQUFBO2NBQUE7Y0FBQSxPQUFBRixRQUFBLENBQUFJLE1BQUEsV0FDSjtnQkFDTEMsT0FBTyxFQUFFLEtBQUs7Z0JBQ2RDLFNBQVMsRUFBRTlCLG9CQUFvQjtnQkFDL0IrQixLQUFLLEVBQUUsNkJBQTZCO2dCQUNwQ0MsSUFBSSxFQUFFO2tCQUNKQyxXQUFXLEVBQUU7Z0JBQ2Y7Y0FDRixDQUFDO1lBQUE7Y0FBQSxPQUFBVCxRQUFBLENBQUFJLE1BQUEsV0FFSTtnQkFDTEMsT0FBTyxFQUFFLElBQUk7Z0JBQ2JDLFNBQVMsRUFBRTlCLG9CQUFvQjtnQkFDL0JnQyxJQUFJLEVBQUU7a0JBQ0pFLE9BQU8sa0NBQUFDLE1BQUEsQ0FBa0NkLFFBQVEsQ0FBQ2UsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFBRCxNQUFBLENBQUtkLFFBQVEsQ0FBQ2UsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFBRCxNQUFBLENBQVdkLFFBQVEsQ0FBQ2dCLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBQUYsTUFBQSxDQUFLZCxRQUFRLENBQUNnQixFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQUc7a0JBQ3pIaEIsUUFBUSxFQUFSQTtnQkFDRjtjQUNGLENBQUM7WUFBQTtjQUFBRyxRQUFBLENBQUFDLElBQUE7Y0FBQUQsUUFBQSxDQUFBYyxFQUFBLEdBQUFkLFFBQUE7Y0FBQSxPQUFBQSxRQUFBLENBQUFJLE1BQUEsV0FFTTtnQkFDTEMsT0FBTyxFQUFFLEtBQUs7Z0JBQ2RDLFNBQVMsRUFBRTlCLG9CQUFvQjtnQkFDL0IrQixLQUFLLEVBQUVQLFFBQUEsQ0FBQWMsRUFBQSxZQUFpQkMsS0FBSyxHQUFHZixRQUFBLENBQUFjLEVBQUEsQ0FBTUUsT0FBTyxHQUFHLGVBQWU7Z0JBQy9EUixJQUFJLEVBQUU7a0JBQ0pDLFdBQVcsRUFBRTtnQkFDZjtjQUNGLENBQUM7WUFBQTtZQUFBO2NBQUEsT0FBQVQsUUFBQSxDQUFBaUIsSUFBQTtVQUFBO1FBQUEsR0FBQXJCLE9BQUE7TUFBQSxDQUVKO01BQUEsU0EvQkRMLE9BQU9BLENBQUE7UUFBQSxPQUFBQyxRQUFBLENBQUEwQixLQUFBLE9BQUFDLFNBQUE7TUFBQTtNQUFBLE9BQVA1QixPQUFPO0lBQUE7RUFnQ1QsQ0FBQztBQUNIIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.asInputSchema = asInputSchema;
|
|
8
|
+
exports.toolToCommand = toolToCommand;
|
|
9
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
10
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
11
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
12
|
+
// SPDX-License-Identifier: MIT
|
|
13
|
+
// Copyright contributors to the kepler.gl project
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Generic utility for converting an existing AI SDK tool into a sqlrooms
|
|
17
|
+
* `RoomCommand`. Kept dependency-light (only `zod` + `RoomCommand` type) so it
|
|
18
|
+
* can be reused by any in-browser skill system that wants to expose its
|
|
19
|
+
* existing AI SDK tools as commands without rewriting them.
|
|
20
|
+
*
|
|
21
|
+
* The demo-app's own command factories return `RoomCommand` directly (preferred
|
|
22
|
+
* when you own the command — see `basemap-command.ts` for the reference shape). This
|
|
23
|
+
* wrapper is the fallback path for hosts that cannot rewrite their tools:
|
|
24
|
+
* it folds the tool's `execute`, `inputSchema`, and `toModelOutput` (the
|
|
25
|
+
* token-trim logic the AI SDK applies between tool call and model) into a
|
|
26
|
+
* single `RoomCommand.execute` so the registry-stored result already carries
|
|
27
|
+
* the model-facing subset.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
/** A built AI SDK tool, treated loosely for dynamic dispatch. */
|
|
31
|
+
|
|
32
|
+
/** Metadata that the AI SDK tool does not carry but a `RoomCommand` requires. */
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Cast a concrete zod schema (e.g. `z.object({...})`, which is `ZodObject<...>`)
|
|
36
|
+
* to the `ZodType<unknown>` that `RoomCommand.inputSchema` expects. The
|
|
37
|
+
* installed zod `ZodObject` is not structurally assignable to sqlrooms'
|
|
38
|
+
* `ZodType<unknown>` (covariance on the output type), so a cast is required at
|
|
39
|
+
* the assignment site. This helper centralizes that cast.
|
|
40
|
+
*/
|
|
41
|
+
function asInputSchema(schema) {
|
|
42
|
+
return schema;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Wrap an existing AI SDK tool as a sqlrooms `RoomCommand`. The command's
|
|
47
|
+
* `execute` calls the tool's `execute` and then applies the tool's
|
|
48
|
+
* `toModelOutput` (if any) so the trimmed, model-facing shape is what the
|
|
49
|
+
* registry stores and downstream surfaces (AI skill, palette, CLI, MCP) see.
|
|
50
|
+
*/
|
|
51
|
+
function toolToCommand(tool, meta) {
|
|
52
|
+
return {
|
|
53
|
+
id: meta.id,
|
|
54
|
+
name: meta.name,
|
|
55
|
+
description: tool.description,
|
|
56
|
+
group: meta.group,
|
|
57
|
+
keywords: meta.keywords,
|
|
58
|
+
inputSchema: tool.inputSchema,
|
|
59
|
+
execute: function () {
|
|
60
|
+
var _execute = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(ctx, input) {
|
|
61
|
+
var _rawOutput$success, _ref, _ref2, rawOutput, trimmed;
|
|
62
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
63
|
+
while (1) switch (_context.prev = _context.next) {
|
|
64
|
+
case 0:
|
|
65
|
+
if (!(!tool.execute || typeof tool.execute !== 'function')) {
|
|
66
|
+
_context.next = 2;
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
return _context.abrupt("return", {
|
|
70
|
+
success: false,
|
|
71
|
+
commandId: meta.id,
|
|
72
|
+
error: 'Tool has no execute function.'
|
|
73
|
+
});
|
|
74
|
+
case 2:
|
|
75
|
+
_context.prev = 2;
|
|
76
|
+
_context.next = 5;
|
|
77
|
+
return tool.execute(input !== null && input !== void 0 ? input : {}, {
|
|
78
|
+
toolCallId: meta.id,
|
|
79
|
+
signal: ctx.signal
|
|
80
|
+
});
|
|
81
|
+
case 5:
|
|
82
|
+
rawOutput = _context.sent;
|
|
83
|
+
trimmed = typeof tool.toModelOutput === 'function' ? tool.toModelOutput({
|
|
84
|
+
output: rawOutput,
|
|
85
|
+
toolCallId: meta.id
|
|
86
|
+
}) : rawOutput;
|
|
87
|
+
return _context.abrupt("return", {
|
|
88
|
+
success: (_rawOutput$success = rawOutput === null || rawOutput === void 0 ? void 0 : rawOutput.success) !== null && _rawOutput$success !== void 0 ? _rawOutput$success : true,
|
|
89
|
+
commandId: meta.id,
|
|
90
|
+
// A structured failure (success:false) that didn't throw must still
|
|
91
|
+
// carry an error message — otherwise callers see {success:false,
|
|
92
|
+
// error:undefined} and downstream formatters misreport it as a
|
|
93
|
+
// success. Many tool/result shapes (including RoomCommandResult)
|
|
94
|
+
// carry the failure in a `message` field rather than `error`, so
|
|
95
|
+
// fall back to that before the generic message.
|
|
96
|
+
error: (rawOutput === null || rawOutput === void 0 ? void 0 : rawOutput.success) === false ? (_ref = (_ref2 = rawOutput === null || rawOutput === void 0 ? void 0 : rawOutput.error) !== null && _ref2 !== void 0 ? _ref2 : rawOutput === null || rawOutput === void 0 ? void 0 : rawOutput.message) !== null && _ref !== void 0 ? _ref : 'Tool execution failed.' : undefined,
|
|
97
|
+
data: (0, _typeof2["default"])(trimmed) === 'object' && trimmed !== null ? trimmed : {
|
|
98
|
+
details: trimmed
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
case 10:
|
|
102
|
+
_context.prev = 10;
|
|
103
|
+
_context.t0 = _context["catch"](2);
|
|
104
|
+
return _context.abrupt("return", {
|
|
105
|
+
success: false,
|
|
106
|
+
commandId: meta.id,
|
|
107
|
+
error: _context.t0 instanceof Error ? _context.t0.message : String(_context.t0)
|
|
108
|
+
});
|
|
109
|
+
case 13:
|
|
110
|
+
case "end":
|
|
111
|
+
return _context.stop();
|
|
112
|
+
}
|
|
113
|
+
}, _callee, null, [[2, 10]]);
|
|
114
|
+
}));
|
|
115
|
+
function execute(_x, _x2) {
|
|
116
|
+
return _execute.apply(this, arguments);
|
|
117
|
+
}
|
|
118
|
+
return execute;
|
|
119
|
+
}()
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc0lucHV0U2NoZW1hIiwic2NoZW1hIiwidG9vbFRvQ29tbWFuZCIsInRvb2wiLCJtZXRhIiwiaWQiLCJuYW1lIiwiZGVzY3JpcHRpb24iLCJncm91cCIsImtleXdvcmRzIiwiaW5wdXRTY2hlbWEiLCJleGVjdXRlIiwiX2V4ZWN1dGUiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsImN0eCIsImlucHV0IiwiX3Jhd091dHB1dCRzdWNjZXNzIiwiX3JlZiIsIl9yZWYyIiwicmF3T3V0cHV0IiwidHJpbW1lZCIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJhYnJ1cHQiLCJzdWNjZXNzIiwiY29tbWFuZElkIiwiZXJyb3IiLCJ0b29sQ2FsbElkIiwic2lnbmFsIiwic2VudCIsInRvTW9kZWxPdXRwdXQiLCJvdXRwdXQiLCJtZXNzYWdlIiwidW5kZWZpbmVkIiwiZGF0YSIsIl90eXBlb2YyIiwiZGV0YWlscyIsInQwIiwiRXJyb3IiLCJTdHJpbmciLCJzdG9wIiwiX3giLCJfeDIiLCJhcHBseSIsImFyZ3VtZW50cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9jb21tYW5kLXdyYXBwZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbi8qKlxuICogR2VuZXJpYyB1dGlsaXR5IGZvciBjb252ZXJ0aW5nIGFuIGV4aXN0aW5nIEFJIFNESyB0b29sIGludG8gYSBzcWxyb29tc1xuICogYFJvb21Db21tYW5kYC4gS2VwdCBkZXBlbmRlbmN5LWxpZ2h0IChvbmx5IGB6b2RgICsgYFJvb21Db21tYW5kYCB0eXBlKSBzbyBpdFxuICogY2FuIGJlIHJldXNlZCBieSBhbnkgaW4tYnJvd3NlciBza2lsbCBzeXN0ZW0gdGhhdCB3YW50cyB0byBleHBvc2UgaXRzXG4gKiBleGlzdGluZyBBSSBTREsgdG9vbHMgYXMgY29tbWFuZHMgd2l0aG91dCByZXdyaXRpbmcgdGhlbS5cbiAqXG4gKiBUaGUgZGVtby1hcHAncyBvd24gY29tbWFuZCBmYWN0b3JpZXMgcmV0dXJuIGBSb29tQ29tbWFuZGAgZGlyZWN0bHkgKHByZWZlcnJlZFxuICogd2hlbiB5b3Ugb3duIHRoZSBjb21tYW5kIOKAlCBzZWUgYGJhc2VtYXAtY29tbWFuZC50c2AgZm9yIHRoZSByZWZlcmVuY2Ugc2hhcGUpLiBUaGlzXG4gKiB3cmFwcGVyIGlzIHRoZSBmYWxsYmFjayBwYXRoIGZvciBob3N0cyB0aGF0IGNhbm5vdCByZXdyaXRlIHRoZWlyIHRvb2xzOlxuICogaXQgZm9sZHMgdGhlIHRvb2wncyBgZXhlY3V0ZWAsIGBpbnB1dFNjaGVtYWAsIGFuZCBgdG9Nb2RlbE91dHB1dGAgKHRoZVxuICogdG9rZW4tdHJpbSBsb2dpYyB0aGUgQUkgU0RLIGFwcGxpZXMgYmV0d2VlbiB0b29sIGNhbGwgYW5kIG1vZGVsKSBpbnRvIGFcbiAqIHNpbmdsZSBgUm9vbUNvbW1hbmQuZXhlY3V0ZWAgc28gdGhlIHJlZ2lzdHJ5LXN0b3JlZCByZXN1bHQgYWxyZWFkeSBjYXJyaWVzXG4gKiB0aGUgbW9kZWwtZmFjaW5nIHN1YnNldC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7Um9vbUNvbW1hbmR9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHR5cGUge1pvZFR5cGV9IGZyb20gJ3pvZCc7XG5cbi8qKiBBIGJ1aWx0IEFJIFNESyB0b29sLCB0cmVhdGVkIGxvb3NlbHkgZm9yIGR5bmFtaWMgZGlzcGF0Y2guICovXG5leHBvcnQgdHlwZSBBbnlUb29sID0ge1xuICBleGVjdXRlPzogKGFyZ3M6IGFueSwgb3B0aW9uczogYW55KSA9PiBQcm9taXNlPGFueT47XG4gIHRvTW9kZWxPdXRwdXQ/OiAocGFyYW1zOiB7b3V0cHV0OiBhbnk7IHRvb2xDYWxsSWQ/OiBzdHJpbmd9KSA9PiBhbnk7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBpbnB1dFNjaGVtYT86IFpvZFR5cGU7XG59O1xuXG4vKiogTWV0YWRhdGEgdGhhdCB0aGUgQUkgU0RLIHRvb2wgZG9lcyBub3QgY2FycnkgYnV0IGEgYFJvb21Db21tYW5kYCByZXF1aXJlcy4gKi9cbmV4cG9ydCB0eXBlIENvbW1hbmRNZXRhID0ge1xuICAvKiogU3RhYmxlLCBuYW1lc3BhY2VkIGNvbW1hbmQgaWQsIGUuZy4gYG1hcC5zZXQtYmFzZW1hcGAuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBuYW1lIHNob3duIGluIHRoZSBjb21tYW5kIHBhbGV0dGUgLyBsaXN0aW5ncy4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgZ3JvdXBpbmcgbGFiZWwsIGUuZy4gYE1hcGAsIGBEYXRhYCwgYEdlb0RhYC4gKi9cbiAgZ3JvdXA/OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBzZWFyY2gga2V5d29yZHMuICovXG4gIGtleXdvcmRzPzogc3RyaW5nW107XG59O1xuXG4vKipcbiAqIENhc3QgYSBjb25jcmV0ZSB6b2Qgc2NoZW1hIChlLmcuIGB6Lm9iamVjdCh7Li4ufSlgLCB3aGljaCBpcyBgWm9kT2JqZWN0PC4uLj5gKVxuICogdG8gdGhlIGBab2RUeXBlPHVua25vd24+YCB0aGF0IGBSb29tQ29tbWFuZC5pbnB1dFNjaGVtYWAgZXhwZWN0cy4gVGhlXG4gKiBpbnN0YWxsZWQgem9kIGBab2RPYmplY3RgIGlzIG5vdCBzdHJ1Y3R1cmFsbHkgYXNzaWduYWJsZSB0byBzcWxyb29tcydcbiAqIGBab2RUeXBlPHVua25vd24+YCAoY292YXJpYW5jZSBvbiB0aGUgb3V0cHV0IHR5cGUpLCBzbyBhIGNhc3QgaXMgcmVxdWlyZWQgYXRcbiAqIHRoZSBhc3NpZ25tZW50IHNpdGUuIFRoaXMgaGVscGVyIGNlbnRyYWxpemVzIHRoYXQgY2FzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzSW5wdXRTY2hlbWEoc2NoZW1hOiBab2RUeXBlKTogWm9kVHlwZTx1bmtub3duPiB7XG4gIHJldHVybiBzY2hlbWEgYXMgdW5rbm93biBhcyBab2RUeXBlPHVua25vd24+O1xufVxuXG4vKipcbiAqIFdyYXAgYW4gZXhpc3RpbmcgQUkgU0RLIHRvb2wgYXMgYSBzcWxyb29tcyBgUm9vbUNvbW1hbmRgLiBUaGUgY29tbWFuZCdzXG4gKiBgZXhlY3V0ZWAgY2FsbHMgdGhlIHRvb2wncyBgZXhlY3V0ZWAgYW5kIHRoZW4gYXBwbGllcyB0aGUgdG9vbCdzXG4gKiBgdG9Nb2RlbE91dHB1dGAgKGlmIGFueSkgc28gdGhlIHRyaW1tZWQsIG1vZGVsLWZhY2luZyBzaGFwZSBpcyB3aGF0IHRoZVxuICogcmVnaXN0cnkgc3RvcmVzIGFuZCBkb3duc3RyZWFtIHN1cmZhY2VzIChBSSBza2lsbCwgcGFsZXR0ZSwgQ0xJLCBNQ1ApIHNlZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvb2xUb0NvbW1hbmQodG9vbDogQW55VG9vbCwgbWV0YTogQ29tbWFuZE1ldGEpOiBSb29tQ29tbWFuZCB7XG4gIHJldHVybiB7XG4gICAgaWQ6IG1ldGEuaWQsXG4gICAgbmFtZTogbWV0YS5uYW1lLFxuICAgIGRlc2NyaXB0aW9uOiB0b29sLmRlc2NyaXB0aW9uLFxuICAgIGdyb3VwOiBtZXRhLmdyb3VwLFxuICAgIGtleXdvcmRzOiBtZXRhLmtleXdvcmRzLFxuICAgIGlucHV0U2NoZW1hOiB0b29sLmlucHV0U2NoZW1hIGFzIGFueSxcbiAgICBleGVjdXRlOiBhc3luYyAoY3R4LCBpbnB1dCkgPT4ge1xuICAgICAgaWYgKCF0b29sLmV4ZWN1dGUgfHwgdHlwZW9mIHRvb2wuZXhlY3V0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGNvbW1hbmRJZDogbWV0YS5pZCxcbiAgICAgICAgICBlcnJvcjogJ1Rvb2wgaGFzIG5vIGV4ZWN1dGUgZnVuY3Rpb24uJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhyZWFkIHRoZSBjYWxsZXIncyBBYm9ydFNpZ25hbCB0aHJvdWdoIHNvIGhvc3RzIChXZWJNQ1AgLyBicmlkZ2UpXG4gICAgICAgIC8vIGNhbiBjYW5jZWwgbG9uZy1ydW5uaW5nIHdyYXBwZWQgdG9vbHMgd2hlbiB0aGUgYWdlbnQgYWJvcnRzLiBUb29sc1xuICAgICAgICAvLyB0aGF0IGRvbid0IHVzZSBhIHNpZ25hbCBpZ25vcmUgaXQuXG4gICAgICAgIGNvbnN0IHJhd091dHB1dCA9IGF3YWl0IHRvb2wuZXhlY3V0ZShpbnB1dCA/PyB7fSwge1xuICAgICAgICAgIHRvb2xDYWxsSWQ6IG1ldGEuaWQsXG4gICAgICAgICAgc2lnbmFsOiBjdHguc2lnbmFsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0cmltbWVkID1cbiAgICAgICAgICB0eXBlb2YgdG9vbC50b01vZGVsT3V0cHV0ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHRvb2wudG9Nb2RlbE91dHB1dCh7b3V0cHV0OiByYXdPdXRwdXQsIHRvb2xDYWxsSWQ6IG1ldGEuaWR9KVxuICAgICAgICAgICAgOiByYXdPdXRwdXQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogcmF3T3V0cHV0Py5zdWNjZXNzID8/IHRydWUsXG4gICAgICAgICAgY29tbWFuZElkOiBtZXRhLmlkLFxuICAgICAgICAgIC8vIEEgc3RydWN0dXJlZCBmYWlsdXJlIChzdWNjZXNzOmZhbHNlKSB0aGF0IGRpZG4ndCB0aHJvdyBtdXN0IHN0aWxsXG4gICAgICAgICAgLy8gY2FycnkgYW4gZXJyb3IgbWVzc2FnZSDigJQgb3RoZXJ3aXNlIGNhbGxlcnMgc2VlIHtzdWNjZXNzOmZhbHNlLFxuICAgICAgICAgIC8vIGVycm9yOnVuZGVmaW5lZH0gYW5kIGRvd25zdHJlYW0gZm9ybWF0dGVycyBtaXNyZXBvcnQgaXQgYXMgYVxuICAgICAgICAgIC8vIHN1Y2Nlc3MuIE1hbnkgdG9vbC9yZXN1bHQgc2hhcGVzIChpbmNsdWRpbmcgUm9vbUNvbW1hbmRSZXN1bHQpXG4gICAgICAgICAgLy8gY2FycnkgdGhlIGZhaWx1cmUgaW4gYSBgbWVzc2FnZWAgZmllbGQgcmF0aGVyIHRoYW4gYGVycm9yYCwgc29cbiAgICAgICAgICAvLyBmYWxsIGJhY2sgdG8gdGhhdCBiZWZvcmUgdGhlIGdlbmVyaWMgbWVzc2FnZS5cbiAgICAgICAgICBlcnJvcjpcbiAgICAgICAgICAgIHJhd091dHB1dD8uc3VjY2VzcyA9PT0gZmFsc2VcbiAgICAgICAgICAgICAgPyAocmF3T3V0cHV0Py5lcnJvciBhcyBzdHJpbmcgfCB1bmRlZmluZWQpID8/XG4gICAgICAgICAgICAgICAgKHJhd091dHB1dD8ubWVzc2FnZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpID8/XG4gICAgICAgICAgICAgICAgJ1Rvb2wgZXhlY3V0aW9uIGZhaWxlZC4nXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGRhdGE6IHR5cGVvZiB0cmltbWVkID09PSAnb2JqZWN0JyAmJiB0cmltbWVkICE9PSBudWxsID8gdHJpbW1lZCA6IHtkZXRhaWxzOiB0cmltbWVkfVxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBjb21tYW5kSWQ6IG1ldGEuaWQsXG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBS0E7O0FBUUE7O0FBWUE7QUFD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
|