kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
182 lines (180 loc) • 21.3 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.loadUrlFunctionDefinition = loadUrlFunctionDefinition;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _processors = require("@kepler.gl/processors");
var _react = _interopRequireWildcard(require("react"));
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
// SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
function loadUrlFunctionDefinition(context) {
return {
name: 'loadUrl',
description: 'load data from a remote URL',
properties: {
url: {
type: 'string',
description: 'The URL to load data from'
}
},
required: ['url'],
callbackFunction: loadUrlCallback,
callbackFunctionContext: context,
callbackMessage: customLoadUrlMessageCallback
};
}
function loadUrlCallback(_x) {
return _loadUrlCallback.apply(this, arguments);
}
function _loadUrlCallback() {
_loadUrlCallback = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(_ref) {
var functionName, functionArgs, functionContext, _ref3, url, _ref4, addDataToMap, loaders, loadOptions, response, blob, fileName, fileObj, batches, result, content, parsedData, data, columnNameAndType;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
functionName = _ref.functionName, functionArgs = _ref.functionArgs, functionContext = _ref.functionContext;
_ref3 = functionArgs, url = _ref3.url;
_ref4 = functionContext, addDataToMap = _ref4.addDataToMap, loaders = _ref4.loaders, loadOptions = _ref4.loadOptions; // check url is valid
_context.prev = 3;
new URL(url);
_context.next = 10;
break;
case 7:
_context.prev = 7;
_context.t0 = _context["catch"](3);
return _context.abrupt("return", {
type: 'loadUrl',
name: functionName,
result: {
success: false,
details: 'Invalid URL'
}
});
case 10:
_context.next = 12;
return fetch(url);
case 12:
response = _context.sent;
_context.next = 15;
return response.blob();
case 15:
blob = _context.sent;
// get file name from url
fileName = url.split('/').pop();
if (fileName) {
_context.next = 19;
break;
}
return _context.abrupt("return", {
type: 'loadUrl',
name: functionName,
result: {
success: false,
details: 'Failed to get file name from url'
}
});
case 19:
// Note: we don't use loadFiles([new File([outputData.blob], outputData.fileName)])
// because we need the metadata e.g. column names of the data to send to the LLM as context
fileObj = new File([blob], fileName);
_context.next = 22;
return (0, _processors.readFileInBatches)({
file: fileObj,
fileCache: [],
loaders: loaders !== null && loaders !== void 0 ? loaders : [],
loadOptions: loadOptions !== null && loadOptions !== void 0 ? loadOptions : {}
});
case 22:
batches = _context.sent;
_context.next = 25;
return batches.next();
case 25:
result = _context.sent;
content = {
data: [],
fileName: ''
};
parsedData = [];
case 28:
if (result.done) {
_context.next = 40;
break;
}
// get progress
// totalRowCount += result.value.progress.rowCountInBatch;
content = result.value;
_context.next = 32;
return batches.next();
case 32:
result = _context.sent;
if (!result.done) {
_context.next = 38;
break;
}
_context.next = 36;
return (0, _processors.processFileData)({
content: content,
fileCache: []
});
case 36:
parsedData = _context.sent;
return _context.abrupt("break", 40);
case 38:
_context.next = 28;
break;
case 40:
data = parsedData[0].data;
columnNameAndType = data.fields.map(function (field) {
return {
name: field.name,
type: field.type
};
});
return _context.abrupt("return", {
type: 'loadUrl',
name: functionName,
result: {
success: true,
details: "Data loaded successfully from ".concat(url),
datasetName: fileName,
columnNameAndType: JSON.stringify(columnNameAndType)
},
data: {
blob: blob,
fileName: fileName,
addDataToMap: addDataToMap,
parsedData: parsedData
}
});
case 43:
case "end":
return _context.stop();
}
}, _callee, null, [[3, 7]]);
}));
return _loadUrlCallback.apply(this, arguments);
}
function LoadUrlMessage(_ref2) {
var output = _ref2.output;
var outputData = output.data;
(0, _react.useEffect)(function () {
outputData.addDataToMap({
datasets: outputData.parsedData,
options: {
autoCreateLayers: true,
centerMap: true
}
});
}, [outputData]);
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null);
}
function customLoadUrlMessageCallback(props) {
return /*#__PURE__*/_react["default"].createElement(LoadUrlMessage, props);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcHJvY2Vzc29ycyIsInJlcXVpcmUiLCJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsImxvYWRVcmxGdW5jdGlvbkRlZmluaXRpb24iLCJjb250ZXh0IiwibmFtZSIsImRlc2NyaXB0aW9uIiwicHJvcGVydGllcyIsInVybCIsInR5cGUiLCJyZXF1aXJlZCIsImNhbGxiYWNrRnVuY3Rpb24iLCJsb2FkVXJsQ2FsbGJhY2siLCJjYWxsYmFja0Z1bmN0aW9uQ29udGV4dCIsImNhbGxiYWNrTWVzc2FnZSIsImN1c3RvbUxvYWRVcmxNZXNzYWdlQ2FsbGJhY2siLCJfeCIsIl9sb2FkVXJsQ2FsbGJhY2siLCJhcHBseSIsImFyZ3VtZW50cyIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiX3JlZiIsImZ1bmN0aW9uTmFtZSIsImZ1bmN0aW9uQXJncyIsImZ1bmN0aW9uQ29udGV4dCIsIl9yZWYzIiwiX3JlZjQiLCJhZGREYXRhVG9NYXAiLCJsb2FkZXJzIiwibG9hZE9wdGlvbnMiLCJyZXNwb25zZSIsImJsb2IiLCJmaWxlTmFtZSIsImZpbGVPYmoiLCJiYXRjaGVzIiwicmVzdWx0IiwiY29udGVudCIsInBhcnNlZERhdGEiLCJkYXRhIiwiY29sdW1uTmFtZUFuZFR5cGUiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiVVJMIiwidDAiLCJhYnJ1cHQiLCJzdWNjZXNzIiwiZGV0YWlscyIsImZldGNoIiwic2VudCIsInNwbGl0IiwicG9wIiwiRmlsZSIsInJlYWRGaWxlSW5CYXRjaGVzIiwiZmlsZSIsImZpbGVDYWNoZSIsImRvbmUiLCJ2YWx1ZSIsInByb2Nlc3NGaWxlRGF0YSIsImZpZWxkcyIsIm1hcCIsImZpZWxkIiwiY29uY2F0IiwiZGF0YXNldE5hbWUiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RvcCIsIkxvYWRVcmxNZXNzYWdlIiwiX3JlZjIiLCJvdXRwdXQiLCJvdXRwdXREYXRhIiwidXNlRWZmZWN0IiwiZGF0YXNldHMiLCJvcHRpb25zIiwiYXV0b0NyZWF0ZUxheWVycyIsImNlbnRlck1hcCIsImNyZWF0ZUVsZW1lbnQiLCJGcmFnbWVudCIsInByb3BzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rvb2xzL2xvYWR1cmwtZnVuY3Rpb24udHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7YWRkRGF0YVRvTWFwLCBsb2FkRmlsZXN9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge0FjdGlvbkhhbmRsZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge1xuICBGaWxlQ2FjaGVJdGVtLFxuICBwcm9jZXNzRmlsZURhdGEsXG4gIFByb2Nlc3NGaWxlRGF0YUNvbnRlbnQsXG4gIHJlYWRGaWxlSW5CYXRjaGVzXG59IGZyb20gJ0BrZXBsZXIuZ2wvcHJvY2Vzc29ycyc7XG5pbXBvcnQge0xvYWRlcn0gZnJvbSAnQGxvYWRlcnMuZ2wvbG9hZGVyLXV0aWxzJztcbmltcG9ydCBSZWFjdCwge1JlYWN0Tm9kZSwgdXNlRWZmZWN0fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1xuICBDYWxsYmFja0Z1bmN0aW9uUHJvcHMsXG4gIEN1c3RvbUZ1bmN0aW9uQ2FsbCxcbiAgQ3VzdG9tRnVuY3Rpb25Db250ZXh0LFxuICBDdXN0b21GdW5jdGlvbk91dHB1dFByb3BzLFxuICBFcnJvckNhbGxiYWNrUmVzdWx0LFxuICBSZWdpc3RlckZ1bmN0aW9uQ2FsbGluZ1Byb3BzXG59IGZyb20gJ0BvcGVuYXNzaXN0YW50L2NvcmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gbG9hZFVybEZ1bmN0aW9uRGVmaW5pdGlvbihcbiAgY29udGV4dDogQ3VzdG9tRnVuY3Rpb25Db250ZXh0PEFjdGlvbkhhbmRsZXI8dHlwZW9mIGxvYWRGaWxlcz4gfCBMb2FkZXJbXSB8IG9iamVjdD5cbik6IFJlZ2lzdGVyRnVuY3Rpb25DYWxsaW5nUHJvcHMge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdsb2FkVXJsJyxcbiAgICBkZXNjcmlwdGlvbjogJ2xvYWQgZGF0YSBmcm9tIGEgcmVtb3RlIFVSTCcsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgdXJsOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBVUkwgdG8gbG9hZCBkYXRhIGZyb20nXG4gICAgICB9XG4gICAgfSxcbiAgICByZXF1aXJlZDogWyd1cmwnXSxcbiAgICBjYWxsYmFja0Z1bmN0aW9uOiBsb2FkVXJsQ2FsbGJhY2ssXG4gICAgY2FsbGJhY2tGdW5jdGlvbkNvbnRleHQ6IGNvbnRleHQsXG4gICAgY2FsbGJhY2tNZXNzYWdlOiBjdXN0b21Mb2FkVXJsTWVzc2FnZUNhbGxiYWNrXG4gIH07XG59XG5cbnR5cGUgTG9hZFVybENhbGxiYWNrUmVzdWx0ID0ge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBkZXRhaWxzOiBzdHJpbmc7XG4gIGRhdGFzZXROYW1lOiBzdHJpbmc7XG4gIGNvbHVtbk5hbWVBbmRUeXBlOiBzdHJpbmc7XG59O1xuXG50eXBlIExvYWRVcmxDYWxsYmFja0NvbnRleHQgPSB7XG4gIGFkZERhdGFUb01hcDogQWN0aW9uSGFuZGxlcjx0eXBlb2YgYWRkRGF0YVRvTWFwPjtcbiAgYmxvYjogQmxvYjtcbiAgZmlsZU5hbWU6IHN0cmluZztcbiAgbG9hZGVycz86IExvYWRlcltdO1xuICBsb2FkT3B0aW9ucz86IG9iamVjdDtcbn07XG5cbnR5cGUgT3V0cHV0UmVzdWx0UHJvcHMgPSBMb2FkVXJsQ2FsbGJhY2tSZXN1bHQgfCBFcnJvckNhbGxiYWNrUmVzdWx0O1xudHlwZSBPdXRwdXREYXRhUHJvcHMgPSBMb2FkVXJsQ2FsbGJhY2tDb250ZXh0ICYge1xuICBwYXJzZWREYXRhOiBGaWxlQ2FjaGVJdGVtW107XG59O1xuXG50eXBlIExvYWRVcmxDYWxsYmFja091dHB1dCA9IEN1c3RvbUZ1bmN0aW9uT3V0cHV0UHJvcHM8T3V0cHV0UmVzdWx0UHJvcHMsIE91dHB1dERhdGFQcm9wcz47XG5cbnR5cGUgTG9hZFVybENhbGxiYWNrQXJncyA9IHtcbiAgdXJsOiBzdHJpbmc7XG59O1xuXG5hc3luYyBmdW5jdGlvbiBsb2FkVXJsQ2FsbGJhY2soe1xuICBmdW5jdGlvbk5hbWUsXG4gIGZ1bmN0aW9uQXJncyxcbiAgZnVuY3Rpb25Db250ZXh0XG59OiBDYWxsYmFja0Z1bmN0aW9uUHJvcHMpOiBQcm9taXNlPExvYWRVcmxDYWxsYmFja091dHB1dD4ge1xuICBjb25zdCB7dXJsfSA9IGZ1bmN0aW9uQXJncyBhcyBMb2FkVXJsQ2FsbGJhY2tBcmdzO1xuICBjb25zdCB7YWRkRGF0YVRvTWFwLCBsb2FkZXJzLCBsb2FkT3B0aW9uc30gPSBmdW5jdGlvbkNvbnRleHQgYXMgTG9hZFVybENhbGxiYWNrQ29udGV4dDtcblxuICAvLyBjaGVjayB1cmwgaXMgdmFsaWRcbiAgdHJ5IHtcbiAgICBuZXcgVVJMKHVybCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2xvYWRVcmwnLFxuICAgICAgbmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgcmVzdWx0OiB7c3VjY2VzczogZmFsc2UsIGRldGFpbHM6ICdJbnZhbGlkIFVSTCd9XG4gICAgfTtcbiAgfVxuXG4gIC8vIGZldGNoIGRhdGEgZnJvbSB1cmxcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICBjb25zdCBibG9iID0gYXdhaXQgcmVzcG9uc2UuYmxvYigpO1xuXG4gIC8vIGdldCBmaWxlIG5hbWUgZnJvbSB1cmxcbiAgY29uc3QgZmlsZU5hbWUgPSB1cmwuc3BsaXQoJy8nKS5wb3AoKTtcblxuICBpZiAoIWZpbGVOYW1lKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdsb2FkVXJsJyxcbiAgICAgIG5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgIHJlc3VsdDoge3N1Y2Nlc3M6IGZhbHNlLCBkZXRhaWxzOiAnRmFpbGVkIHRvIGdldCBmaWxlIG5hbWUgZnJvbSB1cmwnfVxuICAgIH07XG4gIH1cblxuICAvLyBOb3RlOiB3ZSBkb24ndCB1c2UgbG9hZEZpbGVzKFtuZXcgRmlsZShbb3V0cHV0RGF0YS5ibG9iXSwgb3V0cHV0RGF0YS5maWxlTmFtZSldKVxuICAvLyBiZWNhdXNlIHdlIG5lZWQgdGhlIG1ldGFkYXRhIGUuZy4gY29sdW1uIG5hbWVzIG9mIHRoZSBkYXRhIHRvIHNlbmQgdG8gdGhlIExMTSBhcyBjb250ZXh0XG4gIGNvbnN0IGZpbGVPYmogPSBuZXcgRmlsZShbYmxvYl0sIGZpbGVOYW1lKTtcbiAgY29uc3QgYmF0Y2hlcyA9IGF3YWl0IHJlYWRGaWxlSW5CYXRjaGVzKHtcbiAgICBmaWxlOiBmaWxlT2JqLFxuICAgIGZpbGVDYWNoZTogW10sXG4gICAgbG9hZGVyczogbG9hZGVycyA/PyBbXSxcbiAgICBsb2FkT3B0aW9uczogbG9hZE9wdGlvbnMgPz8ge31cbiAgfSk7XG5cbiAgbGV0IHJlc3VsdCA9IGF3YWl0IGJhdGNoZXMubmV4dCgpO1xuICBsZXQgY29udGVudDogUHJvY2Vzc0ZpbGVEYXRhQ29udGVudCA9IHtkYXRhOiBbXSwgZmlsZU5hbWU6ICcnfTtcbiAgbGV0IHBhcnNlZERhdGE6IEZpbGVDYWNoZUl0ZW1bXSA9IFtdO1xuXG4gIHdoaWxlICghcmVzdWx0LmRvbmUpIHtcbiAgICAvLyBnZXQgcHJvZ3Jlc3NcbiAgICAvLyB0b3RhbFJvd0NvdW50ICs9IHJlc3VsdC52YWx1ZS5wcm9ncmVzcy5yb3dDb3VudEluQmF0Y2g7XG4gICAgY29udGVudCA9IHJlc3VsdC52YWx1ZSBhcyBQcm9jZXNzRmlsZURhdGFDb250ZW50O1xuICAgIHJlc3VsdCA9IGF3YWl0IGJhdGNoZXMubmV4dCgpO1xuICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgcGFyc2VkRGF0YSA9IGF3YWl0IHByb2Nlc3NGaWxlRGF0YSh7XG4gICAgICAgIGNvbnRlbnQsXG4gICAgICAgIGZpbGVDYWNoZTogW11cbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZGF0YSA9IHBhcnNlZERhdGFbMF0uZGF0YTtcbiAgY29uc3QgY29sdW1uTmFtZUFuZFR5cGUgPSBkYXRhLmZpZWxkcy5tYXAoZmllbGQgPT4gKHtuYW1lOiBmaWVsZC5uYW1lLCB0eXBlOiBmaWVsZC50eXBlfSkpO1xuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ2xvYWRVcmwnLFxuICAgIG5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICByZXN1bHQ6IHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBkZXRhaWxzOiBgRGF0YSBsb2FkZWQgc3VjY2Vzc2Z1bGx5IGZyb20gJHt1cmx9YCxcbiAgICAgIGRhdGFzZXROYW1lOiBmaWxlTmFtZSxcbiAgICAgIGNvbHVtbk5hbWVBbmRUeXBlOiBKU09OLnN0cmluZ2lmeShjb2x1bW5OYW1lQW5kVHlwZSlcbiAgICB9LFxuICAgIGRhdGE6IHtibG9iLCBmaWxlTmFtZSwgYWRkRGF0YVRvTWFwLCBwYXJzZWREYXRhfVxuICB9O1xufVxuXG5mdW5jdGlvbiBMb2FkVXJsTWVzc2FnZSh7b3V0cHV0fTogQ3VzdG9tRnVuY3Rpb25DYWxsKSB7XG4gIGNvbnN0IG91dHB1dERhdGEgPSBvdXRwdXQuZGF0YSBhcyBPdXRwdXREYXRhUHJvcHM7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvdXRwdXREYXRhLmFkZERhdGFUb01hcCh7XG4gICAgICBkYXRhc2V0czogb3V0cHV0RGF0YS5wYXJzZWREYXRhLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBhdXRvQ3JlYXRlTGF5ZXJzOiB0cnVlLFxuICAgICAgICBjZW50ZXJNYXA6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgW291dHB1dERhdGFdKTtcblxuICByZXR1cm4gPD48Lz47XG59XG5cbmZ1bmN0aW9uIGN1c3RvbUxvYWRVcmxNZXNzYWdlQ2FsbGJhY2socHJvcHM6IEN1c3RvbUZ1bmN0aW9uQ2FsbCk6IFJlYWN0Tm9kZSB8IG51bGwge1xuICByZXR1cm4gPExvYWRVcmxNZXNzYWdlIHsuLi5wcm9wc30gLz47XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFLQSxJQUFBQSxXQUFBLEdBQUFDLE9BQUE7QUFPQSxJQUFBQyxNQUFBLEdBQUFDLHVCQUFBLENBQUFGLE9BQUE7QUFBa0QsU0FBQUcseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFGLHdCQUFBRSxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JBQUFLLE9BQUEsQ0FBQUwsQ0FBQSwwQkFBQUEsQ0FBQSxzQkFBQUEsQ0FBQSxRQUFBRyxDQUFBLEdBQUFKLHdCQUFBLENBQUFHLENBQUEsT0FBQUMsQ0FBQSxJQUFBQSxDQUFBLENBQUFHLEdBQUEsQ0FBQU4sQ0FBQSxVQUFBRyxDQUFBLENBQUFJLEdBQUEsQ0FBQVAsQ0FBQSxPQUFBUSxDQUFBLEtBQUFDLFNBQUEsVUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLGNBQUEsSUFBQUQsTUFB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
;