kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
476 lines (429 loc) • 36.2 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.layerConfigChange = layerConfigChange;
exports.updateLayerData = updateLayerData;
exports.axiosAPICAll = axiosAPICAll;
exports.layerTypeChange = layerTypeChange;
exports.layerVisualChannelConfigChange = layerVisualChannelConfigChange;
exports.layerVisConfigChange = layerVisConfigChange;
exports.widgetConfigChange = widgetConfigChange;
exports.widgetTypeChange = widgetTypeChange;
exports.widgetVisualChannelConfigChange = widgetVisualChannelConfigChange;
exports.widgetVisConfigChange = widgetVisConfigChange;
exports.updateLayerBlending = updateLayerBlending;
exports.interactionConfigChange = interactionConfigChange;
exports.setFilter = setFilter;
exports.addFilter = addFilter;
exports.addLayer = addLayer;
exports.addWidget = addWidget;
exports.reorderWidget = reorderWidget;
exports.reorderLayer = reorderLayer;
exports.removeFilter = removeFilter;
exports.removeLayer = removeLayer;
exports.removeWidget = removeWidget;
exports.removeDataset = removeDataset;
exports.showDatasetTable = showDatasetTable;
exports.updateVisData = updateVisData;
exports.toggleAnimation = toggleAnimation;
exports.updateAnimationSpeed = updateAnimationSpeed;
exports.enlargeFilter = enlargeFilter;
exports.onLayerHover = onLayerHover;
exports.onLayerClick = onLayerClick;
exports.onWidgetHover = onWidgetHover;
exports.onWidgetClick = onWidgetClick;
exports.onMapClick = onMapClick;
exports.toggleLayerForMap = toggleLayerForMap;
exports.toggleWidgetForMap = toggleWidgetForMap;
exports.setVisibleLayersForMap = setVisibleLayersForMap;
exports.setVisibleWidgetsForMap = setVisibleWidgetsForMap;
exports.setFilterPlot = setFilterPlot;
exports.loadFiles = loadFiles;
exports.loadFilesErr = loadFilesErr;
var _actionTypes = _interopRequireDefault(require("../constants/action-types"));
// Copyright (c) 2019 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
// vis-state-reducer
function layerConfigChange(oldLayer, newConfig) {
// console.log(
// 'layerConfigChange',
// 'oldLayer',
// oldLayer,
// 'newConfig',
// newConfig
// );
return {
type: _actionTypes["default"].LAYER_CONFIG_CHANGE,
oldLayer: oldLayer,
newConfig: newConfig
};
}
function updateLayerData(layer, collected) {
return {
type: _actionTypes["default"].UPDATE_STATE_LAYER_DATA,
layer: layer,
collected: collected
};
}
function axiosAPICAll(layer) {
return {
type: _actionTypes["default"].ASYNC_API_CALL,
layer: layer
};
}
function layerTypeChange(oldLayer, newType) {
// console.log('layerTypeChange', 'oldLayer', oldLayer, 'newType', newType);
return {
type: _actionTypes["default"].LAYER_TYPE_CHANGE,
oldLayer: oldLayer,
newType: newType
};
}
function layerVisualChannelConfigChange(oldLayer, newConfig, channel) {
// console.log(
// 'layerVisualChannelConfigChange',
// 'oldLayer',
// oldLayer,
// 'newConfig',
// newConfig,
// channel
// );
return {
type: _actionTypes["default"].LAYER_VISUAL_CHANNEL_CHANGE,
oldLayer: oldLayer,
newConfig: newConfig,
channel: channel
};
}
function layerVisConfigChange(oldLayer, newVisConfig) {
// console.log(
// 'layerVisConfigChange',
// 'oldLayer',
// oldLayer,
// 'newVisConfig',
// newVisConfig
// );
return {
type: _actionTypes["default"].LAYER_VIS_CONFIG_CHANGE,
oldLayer: oldLayer,
newVisConfig: newVisConfig
};
}
function widgetConfigChange(oldWidget, newConfig) {
return {
type: _actionTypes["default"].WIDGET_CONFIG_CHANGE,
oldWidget: oldWidget,
newConfig: newConfig
};
}
function widgetTypeChange(oldWidget, newType) {
// console.log('widgetTypeChange', 'oldWidget', oldWidget, 'newType', newType);
return {
type: _actionTypes["default"].WIDGET_TYPE_CHANGE,
oldWidget: oldWidget,
newType: newType
};
}
function widgetVisualChannelConfigChange(oldWidget, newConfig, channel) {
// console.log(
// 'widgetVisualChannelConfigChange',
// 'oldWidget',
// oldWidget,
// 'newConfig',
// newConfig,
// 'channel',
// channel
// );
return {
type: _actionTypes["default"].WIDGET_VISUAL_CHANNEL_CHANGE,
oldWidget: oldWidget,
newConfig: newConfig,
channel: channel
};
}
function widgetVisConfigChange(oldWidget, newVisConfig) {
// console.log(
// 'widgetVisConfigChange',
// 'oldWidget',
// oldWidget,
// 'newVisConfig',
// newVisConfig
// );
return {
type: _actionTypes["default"].WIDGET_VIS_CONFIG_CHANGE,
oldWidget: oldWidget,
newVisConfig: newVisConfig
};
}
function updateLayerBlending(mode) {
// console.log('updateLayerBlending', 'mode', mode);
return {
type: _actionTypes["default"].UPDATE_LAYER_BLENDING,
mode: mode
};
}
function interactionConfigChange(config) {
// console.log('interactionConfigChange', 'config', config);
return {
type: _actionTypes["default"].INTERACTION_CONFIG_CHANGE,
config: config
};
}
function setFilter(idx, prop, value) {
// console.log('setFilter', 'idx', idx, 'prop', prop, 'value', value);
return {
type: _actionTypes["default"].SET_FILTER,
idx: idx,
prop: prop,
value: value
};
}
function addFilter(dataId) {
// console.log('addFilter', 'dataID', dataId);
return {
type: _actionTypes["default"].ADD_FILTER,
dataId: dataId
};
}
function addLayer(props) {
// console.log('addLayer', 'props', props);
return {
type: _actionTypes["default"].ADD_LAYER,
props: props
};
}
function addWidget(props) {
// console.log('addWidget', 'props', props);
return {
type: _actionTypes["default"].ADD_WIDGET,
props: props
};
}
function reorderWidget(order) {
// console.log('reorderWidget', 'order', order);
return {
type: _actionTypes["default"].REORDER_WIDGET,
order: order
};
}
function reorderLayer(order) {
// console.log('reorderLayer', 'order', order);
return {
type: _actionTypes["default"].REORDER_LAYER,
order: order
};
}
function removeFilter(idx) {
// console.log('removeFilter', 'idx', idx);
return {
type: _actionTypes["default"].REMOVE_FILTER,
idx: idx
};
}
function removeLayer(idx) {
// console.log('removeLayer', 'idx', idx);
return {
type: _actionTypes["default"].REMOVE_LAYER,
idx: idx
};
}
function removeWidget(idx) {
// console.log('removeWidget', 'idx', idx);
return {
type: _actionTypes["default"].REMOVE_WIDGET,
idx: idx
};
}
function removeDataset(key) {
// console.log('removeDataset', 'key', key);
return {
type: _actionTypes["default"].REMOVE_DATASET,
key: key
};
}
function showDatasetTable(dataId) {
// console.log('showDatasetTable', 'dataId', dataId);
return {
type: _actionTypes["default"].SHOW_DATASET_TABLE,
dataId: dataId
};
}
/**
*
* @param datasets - Array of datasets :
* {info: {id: '', color: hex, label: '']}, data: {fields: [], rows: []}}
* @param options {centerMap, readOnly}
* @param config {visState, mapState, mapStyle}
* @returns {{type: null, datasets: *, options: *}}
*/
function updateVisData(datasets, options, config) {
// console.log(
// 'updateVisData',
// 'datasets',
// datasets,
// 'options',
// options,
// 'config',
// config
// );
return {
type: _actionTypes["default"].UPDATE_VIS_DATA,
datasets: datasets,
options: options,
config: config
};
}
function toggleAnimation(idx) {
// console.log('toggleAnimation', 'idx', idx);
return {
type: _actionTypes["default"].TOGGLE_FILTER_ANIMATION,
idx: idx
};
}
function updateAnimationSpeed(idx, speed) {
// console.log('updateAnimation', 'idx', idx, 'speed', speed);
return {
type: _actionTypes["default"].UPDATE_FILTER_ANIMATION_SPEED,
idx: idx,
speed: speed
};
}
function enlargeFilter(idx) {
// console.log('enlargeFilter', 'idx', idx);
return {
type: _actionTypes["default"].ENLARGE_FILTER,
idx: idx
};
}
function onLayerHover(info) {
// console.log('onLayerHover', info);
return {
type: _actionTypes["default"].LAYER_HOVER,
info: info
};
}
function onLayerClick(info) {
// console.log('onLayerClick', info);
return {
type: _actionTypes["default"].LAYER_CLICK,
info: info
};
}
function onWidgetHover(info) {
// console.log('onWidgetHover', info);
return {
type: _actionTypes["default"].WIDGET_HOVER,
info: info
};
}
function onWidgetClick(info) {
// console.log('onWidgetClick', info);
return {
type: _actionTypes["default"].WIDGET_CLICK,
info: info
};
}
function onMapClick() {
// console.log('onMapClick');
return {
type: _actionTypes["default"].MAP_CLICK
};
}
/**
* Toggle a single layer for a give map
* @param mapIndex
* @param layerId
* @returns {{type: *, mapIndex: *, layerId: *}}
*/
function toggleLayerForMap(mapIndex, layerId) {
// console.log('toggleLAyerForMap', 'mapIndex', mapIndex, 'layerId', layerId);
return {
type: _actionTypes["default"].TOGGLE_LAYER_FOR_MAP,
mapIndex: mapIndex,
layerId: layerId
};
}
/**
* Toggle a single widget for a give map
* @param mapIndex
* @param widgetId
* @returns {{type: *, mapIndex: *, widgetId: *}}
*/
function toggleWidgetForMap(mapIndex, widgetId) {
// console.log('toggleWidgetForMap', mapIndex, widgetId);
return {
type: _actionTypes["default"].TOGGLE_WIDGET_FOR_MAP,
mapIndex: mapIndex,
widgetId: widgetId
};
}
/**
* Toggle layer visibility on split views
* @param layerIndex the layer we want to toggle visibility on
* @param mapIndex the map index
* @returns {{type: null, layerIndex: *, mapIndex: *}}
*/
function setVisibleLayersForMap(mapIndex, layerIds) {
// console.log('setVisibleLayersForMap', mapIndex, layerIds);
return {
type: _actionTypes["default"].SET_VISIBLE_LAYERS_FOR_MAP,
mapIndex: mapIndex,
layerIds: layerIds
};
}
/**
* Toggle widget visibility on split views
* @param widgetIndex the widget we want to toggle visibility on
* @param mapIndex the map index
* @returns {{type: null, widgetIndex: *, mapIndex: *}}
*/
function setVisibleWidgetsForMap(mapIndex, widgetIds) {
// console.log('setVisibleWidgetsForMap', mapIndex, widgetIds);
return {
type: _actionTypes["default"].SET_VISIBLE_WIDGETS_FOR_MAP,
mapIndex: mapIndex,
widgetIds: widgetIds
};
}
function setFilterPlot(idx, newProp) {
// console.log('setFilterPlot', idx, newProp);
return {
type: _actionTypes["default"].SET_FILTER_PLOT,
idx: idx,
newProp: newProp
};
}
function loadFiles(files) {
// console.log('loadFiles', files);
return {
type: _actionTypes["default"].LOAD_FILES,
files: files
};
}
function loadFilesErr(error) {
// console.log('loadFilesErr', error);
return {
type: _actionTypes["default"].LOAD_FILES_ERR,
error: error
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY3Rpb25zL3Zpcy1zdGF0ZS1hY3Rpb25zLmpzIl0sIm5hbWVzIjpbImxheWVyQ29uZmlnQ2hhbmdlIiwib2xkTGF5ZXIiLCJuZXdDb25maWciLCJ0eXBlIiwiQWN0aW9uVHlwZXMiLCJMQVlFUl9DT05GSUdfQ0hBTkdFIiwidXBkYXRlTGF5ZXJEYXRhIiwibGF5ZXIiLCJjb2xsZWN0ZWQiLCJVUERBVEVfU1RBVEVfTEFZRVJfREFUQSIsImF4aW9zQVBJQ0FsbCIsIkFTWU5DX0FQSV9DQUxMIiwibGF5ZXJUeXBlQ2hhbmdlIiwibmV3VHlwZSIsIkxBWUVSX1RZUEVfQ0hBTkdFIiwibGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlIiwiY2hhbm5lbCIsIkxBWUVSX1ZJU1VBTF9DSEFOTkVMX0NIQU5HRSIsImxheWVyVmlzQ29uZmlnQ2hhbmdlIiwibmV3VmlzQ29uZmlnIiwiTEFZRVJfVklTX0NPTkZJR19DSEFOR0UiLCJ3aWRnZXRDb25maWdDaGFuZ2UiLCJvbGRXaWRnZXQiLCJXSURHRVRfQ09ORklHX0NIQU5HRSIsIndpZGdldFR5cGVDaGFuZ2UiLCJXSURHRVRfVFlQRV9DSEFOR0UiLCJ3aWRnZXRWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlIiwiV0lER0VUX1ZJU1VBTF9DSEFOTkVMX0NIQU5HRSIsIndpZGdldFZpc0NvbmZpZ0NoYW5nZSIsIldJREdFVF9WSVNfQ09ORklHX0NIQU5HRSIsInVwZGF0ZUxheWVyQmxlbmRpbmciLCJtb2RlIiwiVVBEQVRFX0xBWUVSX0JMRU5ESU5HIiwiaW50ZXJhY3Rpb25Db25maWdDaGFuZ2UiLCJjb25maWciLCJJTlRFUkFDVElPTl9DT05GSUdfQ0hBTkdFIiwic2V0RmlsdGVyIiwiaWR4IiwicHJvcCIsInZhbHVlIiwiU0VUX0ZJTFRFUiIsImFkZEZpbHRlciIsImRhdGFJZCIsIkFERF9GSUxURVIiLCJhZGRMYXllciIsInByb3BzIiwiQUREX0xBWUVSIiwiYWRkV2lkZ2V0IiwiQUREX1dJREdFVCIsInJlb3JkZXJXaWRnZXQiLCJvcmRlciIsIlJFT1JERVJfV0lER0VUIiwicmVvcmRlckxheWVyIiwiUkVPUkRFUl9MQVlFUiIsInJlbW92ZUZpbHRlciIsIlJFTU9WRV9GSUxURVIiLCJyZW1vdmVMYXllciIsIlJFTU9WRV9MQVlFUiIsInJlbW92ZVdpZGdldCIsIlJFTU9WRV9XSURHRVQiLCJyZW1vdmVEYXRhc2V0Iiwia2V5IiwiUkVNT1ZFX0RBVEFTRVQiLCJzaG93RGF0YXNldFRhYmxlIiwiU0hPV19EQVRBU0VUX1RBQkxFIiwidXBkYXRlVmlzRGF0YSIsImRhdGFzZXRzIiwib3B0aW9ucyIsIlVQREFURV9WSVNfREFUQSIsInRvZ2dsZUFuaW1hdGlvbiIsIlRPR0dMRV9GSUxURVJfQU5JTUFUSU9OIiwidXBkYXRlQW5pbWF0aW9uU3BlZWQiLCJzcGVlZCIsIlVQREFURV9GSUxURVJfQU5JTUFUSU9OX1NQRUVEIiwiZW5sYXJnZUZpbHRlciIsIkVOTEFSR0VfRklMVEVSIiwib25MYXllckhvdmVyIiwiaW5mbyIsIkxBWUVSX0hPVkVSIiwib25MYXllckNsaWNrIiwiTEFZRVJfQ0xJQ0siLCJvbldpZGdldEhvdmVyIiwiV0lER0VUX0hPVkVSIiwib25XaWRnZXRDbGljayIsIldJREdFVF9DTElDSyIsIm9uTWFwQ2xpY2siLCJNQVBfQ0xJQ0siLCJ0b2dnbGVMYXllckZvck1hcCIsIm1hcEluZGV4IiwibGF5ZXJJZCIsIlRPR0dMRV9MQVlFUl9GT1JfTUFQIiwidG9nZ2xlV2lkZ2V0Rm9yTWFwIiwid2lkZ2V0SWQiLCJUT0dHTEVfV0lER0VUX0ZPUl9NQVAiLCJzZXRWaXNpYmxlTGF5ZXJzRm9yTWFwIiwibGF5ZXJJZHMiLCJTRVRfVklTSUJMRV9MQVlFUlNfRk9SX01BUCIsInNldFZpc2libGVXaWRnZXRzRm9yTWFwIiwid2lkZ2V0SWRzIiwiU0VUX1ZJU0lCTEVfV0lER0VUU19GT1JfTUFQIiwic2V0RmlsdGVyUGxvdCIsIm5ld1Byb3AiLCJTRVRfRklMVEVSX1BMT1QiLCJsb2FkRmlsZXMiLCJmaWxlcyIsIkxPQURfRklMRVMiLCJsb2FkRmlsZXNFcnIiLCJlcnJvciIsIkxPQURfRklMRVNfRVJSIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCQTs7QUFyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdPLFNBQVNBLGlCQUFULENBQTJCQyxRQUEzQixFQUFxQ0MsU0FBckMsRUFBZ0Q7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFPO0FBQ0xDLElBQUFBLElBQUksRUFBRUMsd0JBQVlDLG1CQURiO0FBRUxKLElBQUFBLFFBQVEsRUFBUkEsUUFGSztBQUdMQyxJQUFBQSxTQUFTLEVBQVRBO0FBSEssR0FBUDtBQUtEOztBQUVNLFNBQVNJLGVBQVQsQ0FBeUJDLEtBQXpCLEVBQWdDQyxTQUFoQyxFQUEyQztBQUNoRCxTQUFPO0FBQ0xMLElBQUFBLElBQUksRUFBRUMsd0JBQVlLLHVCQURiO0FBRUxGLElBQUFBLEtBQUssRUFBTEEsS0FGSztBQUdMQyxJQUFBQSxTQUFTLEVBQVRBO0FBSEssR0FBUDtBQUtEOztBQUVNLFNBQVNFLFlBQVQsQ0FBc0JILEtBQXRCLEVBQTZCO0FBQ2xDLFNBQU87QUFDTEosSUFBQUEsSUFBSSxFQUFFQyx3QkFBWU8sY0FEYjtBQUVMSixJQUFBQSxLQUFLLEVBQUxBO0FBRkssR0FBUDtBQUlEOztBQUVNLFNBQVNLLGVBQVQsQ0FBeUJYLFFBQXpCLEVBQW1DWSxPQUFuQyxFQUE0QztBQUNqRDtBQUNBLFNBQU87QUFDTFYsSUFBQUEsSUFBSSxFQUFFQyx3QkFBWVUsaUJBRGI7QUFFTGIsSUFBQUEsUUFBUSxFQUFSQSxRQUZLO0FBR0xZLElBQUFBLE9BQU8sRUFBUEE7QUFISyxHQUFQO0FBS0Q7O0FBRU0sU0FBU0UsOEJBQVQsQ0FB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LEdBQVA7QUFJRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAxOSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbi8vIHZpcy1zdGF0ZS1yZWR1Y2VyXG5pbXBvcnQgQWN0aW9uVHlwZXMgZnJvbSAnY29uc3RhbnRzL2FjdGlvbi10eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsYXllckNvbmZpZ0NoYW5nZShvbGRMYXllciwgbmV3Q29uZmlnKSB7XG4gIC8vIGNvbnNvbGUubG9nKFxuICAvLyAgICdsYXllckNvbmZpZ0NoYW5nZScsXG4gIC8vICAgJ29sZExheWVyJyxcbiAgLy8gICBvbGRMYXllcixcbiAgLy8gICAnbmV3Q29uZmlnJyxcbiAgLy8gICBuZXdDb25maWdcbiAgLy8gKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5MQVlFUl9DT05GSUdfQ0hBTkdFLFxuICAgIG9sZExheWVyLFxuICAgIG5ld0NvbmZpZ1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTGF5ZXJEYXRhKGxheWVyLCBjb2xsZWN0ZWQpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5VUERBVEVfU1RBVEVfTEFZRVJfREFUQSxcbiAgICBsYXllcixcbiAgICBjb2xsZWN0ZWRcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF4aW9zQVBJQ0FsbChsYXllcikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkFTWU5DX0FQSV9DQUxMLFxuICAgIGxheWVyXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsYXllclR5cGVDaGFuZ2Uob2xkTGF5ZXIsIG5ld1R5cGUpIHtcbiAgLy8gY29uc29sZS5sb2coJ2xheWVyVHlwZUNoYW5nZScsICdvbGRMYXllcicsIG9sZExheWVyLCAnbmV3VHlwZScsIG5ld1R5cGUpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkxBWUVSX1RZUEVfQ0hBTkdFLFxuICAgIG9sZExheWVyLFxuICAgIG5ld1R5cGVcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZShvbGRMYXllciwgbmV3Q29uZmlnLCBjaGFubmVsKSB7XG4gIC8vIGNvbnNvbGUubG9nKFxuICAvLyAgICdsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2UnLFxuICAvLyAgICdvbGRMYXllcicsXG4gIC8vICAgb2xkTGF5ZXIsXG4gIC8vICAgJ25ld0NvbmZpZycsXG4gIC8vICAgbmV3Q29uZmlnLFxuICAvLyAgIGNoYW5uZWxcbiAgLy8gKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5MQVlFUl9WSVNVQUxfQ0hBTk5FTF9DSEFOR0UsXG4gICAgb2xkTGF5ZXIsXG4gICAgbmV3Q29uZmlnLFxuICAgIGNoYW5uZWxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxheWVyVmlzQ29uZmlnQ2hhbmdlKG9sZExheWVyLCBuZXdWaXNDb25maWcpIHtcbiAgLy8gY29uc29sZS5sb2coXG4gIC8vICAgJ2xheWVyVmlzQ29uZmlnQ2hhbmdlJyxcbiAgLy8gICAnb2xkTGF5ZXInLFxuICAvLyAgIG9sZExheWVyLFxuICAvLyAgICduZXdWaXNDb25maWcnLFxuICAvLyAgIG5ld1Zpc0NvbmZpZ1xuICAvLyApO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkxBWUVSX1ZJU19DT05GSUdfQ0hBTkdFLFxuICAgIG9sZExheWVyLFxuICAgIG5ld1Zpc0NvbmZpZ1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2lkZ2V0Q29uZmlnQ2hhbmdlKG9sZFdpZGdldCwgbmV3Q29uZmlnKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuV0lER0VUX0NPTkZJR19DSEFOR0UsXG4gICAgb2xkV2lkZ2V0LFxuICAgIG5ld0NvbmZpZ1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2lkZ2V0VHlwZUNoYW5nZShvbGRXaWRnZXQsIG5ld1R5cGUpIHtcbiAgLy8gY29uc29sZS5sb2coJ3dpZGdldFR5cGVDaGFuZ2UnLCAnb2xkV2lkZ2V0Jywgb2xkV2lkZ2V0LCAnbmV3VHlwZScsIG5ld1R5cGUpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLldJREdFVF9UWVBFX0NIQU5HRSxcbiAgICBvbGRXaWRnZXQsXG4gICAgbmV3VHlwZVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2lkZ2V0VmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZShvbGRXaWRnZXQsIG5ld0NvbmZpZywgY2hhbm5lbCkge1xuICAvLyBjb25zb2xlLmxvZyhcbiAgLy8gICAnd2lkZ2V0VmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZScsXG4gIC8vICAgJ29sZFdpZGdldCcsXG4gIC8vICAgb2xkV2lkZ2V0LFxuICAvLyAgICduZXdDb25maWcnLFxuICAvLyAgIG5ld0NvbmZpZyxcbiAgLy8gICAnY2hhbm5lbCcsXG4gIC8vICAgY2hhbm5lbFxuICAvLyApO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLldJREdFVF9WSVNVQUxfQ0hBTk5FTF9DSEFOR0UsXG4gICAgb2xkV2lkZ2V0LFxuICAgIG5ld0NvbmZpZyxcbiAgICBjaGFubmVsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aWRnZXRWaXNDb25maWdDaGFuZ2Uob2xkV2lkZ2V0LCBuZXdWaXNDb25maWcpIHtcbiAgLy8gY29uc29sZS5sb2coXG4gIC8vICAgJ3dpZGdldFZpc0NvbmZpZ0NoYW5nZScsXG4gIC8vICAgJ29sZFdpZGdldCcsXG4gIC8vICAgb2xkV2lkZ2V0LFxuICAvLyAgICduZXdWaXNDb25maWcnLFxuICAvLyAgIG5ld1Zpc0NvbmZpZ1xuICAvLyApO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLldJREdFVF9WSVNfQ09ORklHX0NIQU5HRSxcbiAgICBvbGRXaWRnZXQsXG4gICAgbmV3VmlzQ29uZmlnXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVMYXllckJsZW5kaW5nKG1vZGUpIHtcbiAgLy8gY29uc29sZS5sb2coJ3VwZGF0ZUxheWVyQmxlbmRpbmcnLCAnbW9kZScsIG1vZGUpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlVQREFURV9MQVlFUl9CTEVORElORyxcbiAgICBtb2RlXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcmFjdGlvbkNvbmZpZ0NoYW5nZShjb25maWcpIHtcbiAgLy8gY29uc29sZS5sb2coJ2ludGVyYWN0aW9uQ29uZmlnQ2hhbmdlJywgJ2NvbmZpZycsIGNvbmZpZyk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuSU5URVJBQ1RJT05fQ09ORklHX0NIQU5HRSxcbiAgICBjb25maWdcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEZpbHRlcihpZHgsIHByb3AsIHZhbHVlKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdzZXRGaWx0ZXInLCAnaWR4JywgaWR4LCAncHJvcCcsIHByb3AsICd2YWx1ZScsIHZhbHVlKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5TRVRfRklMVEVSLFxuICAgIGlkeCxcbiAgICBwcm9wLFxuICAgIHZhbHVlXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRGaWx0ZXIoZGF0YUlkKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdhZGRGaWx0ZXInLCAnZGF0YUlEJywgZGF0YUlkKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5BRERfRklMVEVSLFxuICAgIGRhdGFJZFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkTGF5ZXIocHJvcHMpIHtcbiAgLy8gY29uc29sZS5sb2coJ2FkZExheWVyJywgJ3Byb3BzJywgcHJvcHMpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkFERF9MQVlFUixcbiAgICBwcm9wc1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkV2lkZ2V0KHByb3BzKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdhZGRXaWRnZXQnLCAncHJvcHMnLCBwcm9wcyk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuQUREX1dJREdFVCxcbiAgICBwcm9wc1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVvcmRlcldpZGdldChvcmRlcikge1xuICAvLyBjb25zb2xlLmxvZygncmVvcmRlcldpZGdldCcsICdvcmRlcicsIG9yZGVyKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5SRU9SREVSX1dJREdFVCxcbiAgICBvcmRlclxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVvcmRlckxheWVyKG9yZGVyKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdyZW9yZGVyTGF5ZXInLCAnb3JkZXInLCBvcmRlcik7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuUkVPUkRFUl9MQVlFUixcbiAgICBvcmRlclxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRmlsdGVyKGlkeCkge1xuICAvLyBjb25zb2xlLmxvZygncmVtb3ZlRmlsdGVyJywgJ2lkeCcsIGlkeCk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuUkVNT1ZFX0ZJTFRFUixcbiAgICBpZHhcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUxheWVyKGlkeCkge1xuICAvLyBjb25zb2xlLmxvZygncmVtb3ZlTGF5ZXInLCAnaWR4JywgaWR4KTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5SRU1PVkVfTEFZRVIsXG4gICAgaWR4XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVXaWRnZXQoaWR4KSB7XG4gIC8vIGNvbnNvbGUubG9nKCdyZW1vdmVXaWRnZXQnLCAnaWR4JywgaWR4KTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5SRU1PVkVfV0lER0VULFxuICAgIGlkeFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRGF0YXNldChrZXkpIHtcbiAgLy8gY29uc29sZS5sb2coJ3JlbW92ZURhdGFzZXQnLCAna2V5Jywga2V5KTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5SRU1PVkVfREFUQVNFVCxcbiAgICBrZXlcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3dEYXRhc2V0VGFibGUoZGF0YUlkKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdzaG93RGF0YXNldFRhYmxlJywgJ2RhdGFJZCcsIGRhdGFJZCk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuU0hPV19EQVRBU0VUX1RBQkxFLFxuICAgIGRhdGFJZFxuICB9O1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gZGF0YXNldHMgLSBBcnJheSBvZiBkYXRhc2V0cyA6XG4gKiB7aW5mbzoge2lkOiAnJywgY29sb3I6IGhleCwgbGFiZWw6ICcnXX0sIGRhdGE6IHtmaWVsZHM6IFtdLCByb3dzOiBbXX19XG4gKiBAcGFyYW0gb3B0aW9ucyB7Y2VudGVyTWFwLCByZWFkT25seX1cbiAqIEBwYXJhbSBjb25maWcge3Zpc1N0YXRlLCBtYXBTdGF0ZSwgbWFwU3R5bGV9XG4gKiBAcmV0dXJucyB7e3R5cGU6IG51bGwsIGRhdGFzZXRzOiAqLCBvcHRpb25zOiAqfX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZpc0RhdGEoZGF0YXNldHMsIG9wdGlvbnMsIGNvbmZpZykge1xuICAvLyBjb25zb2xlLmxvZyhcbiAgLy8gICAndXBkYXRlVmlzRGF0YScsXG4gIC8vICAgJ2RhdGFzZXRzJyxcbiAgLy8gICBkYXRhc2V0cyxcbiAgLy8gICAnb3B0aW9ucycsXG4gIC8vICAgb3B0aW9ucyxcbiAgLy8gICAnY29uZmlnJyxcbiAgLy8gICBjb25maWdcbiAgLy8gKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5VUERBVEVfVklTX0RBVEEsXG4gICAgZGF0YXNldHMsXG4gICAgb3B0aW9ucyxcbiAgICBjb25maWdcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZUFuaW1hdGlvbihpZHgpIHtcbiAgLy8gY29uc29sZS5sb2coJ3RvZ2dsZUFuaW1hdGlvbicsICdpZHgnLCBpZHgpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlRPR0dMRV9GSUxURVJfQU5JTUFUSU9OLFxuICAgIGlkeFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQW5pbWF0aW9uU3BlZWQoaWR4LCBzcGVlZCkge1xuICAvLyBjb25zb2xlLmxvZygndXBkYXRlQW5pbWF0aW9uJywgJ2lkeCcsIGlkeCwgJ3NwZWVkJywgc3BlZWQpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlVQREFURV9GSUxURVJfQU5JTUFUSU9OX1NQRUVELFxuICAgIGlkeCxcbiAgICBzcGVlZFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5sYXJnZUZpbHRlcihpZHgpIHtcbiAgLy8gY29uc29sZS5sb2coJ2VubGFyZ2VGaWx0ZXInLCAnaWR4JywgaWR4KTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5FTkxBUkdFX0ZJTFRFUixcbiAgICBpZHhcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uTGF5ZXJIb3ZlcihpbmZvKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdvbkxheWVySG92ZXInLCBpbmZvKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5MQVlFUl9IT1ZFUixcbiAgICBpbmZvXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvbkxheWVyQ2xpY2soaW5mbykge1xuICAvLyBjb25zb2xlLmxvZygnb25MYXllckNsaWNrJywgaW5mbyk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuTEFZRVJfQ0xJQ0ssXG4gICAgaW5mb1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb25XaWRnZXRIb3ZlcihpbmZvKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdvbldpZGdldEhvdmVyJywgaW5mbyk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuV0lER0VUX0hPVkVSLFxuICAgIGluZm9cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uV2lkZ2V0Q2xpY2soaW5mbykge1xuICAvLyBjb25zb2xlLmxvZygnb25XaWRnZXRDbGljaycsIGluZm8pO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLldJREdFVF9DTElDSyxcbiAgICBpbmZvXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvbk1hcENsaWNrKCkge1xuICAvLyBjb25zb2xlLmxvZygnb25NYXBDbGljaycpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLk1BUF9DTElDS1xuICB9O1xufVxuXG4vKipcbiAqIFRvZ2dsZSBhIHNpbmdsZSBsYXllciBmb3IgYSBnaXZlIG1hcFxuICogQHBhcmFtIG1hcEluZGV4XG4gKiBAcGFyYW0gbGF5ZXJJZFxuICogQHJldHVybnMge3t0eXBlOiAqLCBtYXBJbmRleDogKiwgbGF5ZXJJZDogKn19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2dnbGVMYXllckZvck1hcChtYXBJbmRleCwgbGF5ZXJJZCkge1xuICAvLyBjb25zb2xlLmxvZygndG9nZ2xlTEF5ZXJGb3JNYXAnLCAnbWFwSW5kZXgnLCBtYXBJbmRleCwgJ2xheWVySWQnLCBsYXllcklkKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5UT0dHTEVfTEFZRVJfRk9SX01BUCxcbiAgICBtYXBJbmRleCxcbiAgICBsYXllcklkXG4gIH07XG59XG5cbi8qKlxuICogVG9nZ2xlIGEgc2luZ2xlIHdpZGdldCBmb3IgYSBnaXZlIG1hcFxuICogQHBhcmFtIG1hcEluZGV4XG4gKiBAcGFyYW0gd2lkZ2V0SWRcbiAqIEByZXR1cm5zIHt7dHlwZTogKiwgbWFwSW5kZXg6ICosIHdpZGdldElkOiAqfX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZVdpZGdldEZvck1hcChtYXBJbmRleCwgd2lkZ2V0SWQpIHtcbiAgLy8gY29uc29sZS5sb2coJ3RvZ2dsZVdpZGdldEZvck1hcCcsIG1hcEluZGV4LCB3aWRnZXRJZCk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuVE9HR0xFX1dJREdFVF9GT1JfTUFQLFxuICAgIG1hcEluZGV4LFxuICAgIHdpZGdldElkXG4gIH07XG59XG5cbi8qKlxuICogVG9nZ2xlIGxheWVyIHZpc2liaWxpdHkgb24gc3BsaXQgdmlld3NcbiAqIEBwYXJhbSBsYXllckluZGV4IHRoZSBsYXllciB3ZSB3YW50IHRvIHRvZ2dsZSB2aXNpYmlsaXR5IG9uXG4gKiBAcGFyYW0gbWFwSW5kZXggdGhlIG1hcCBpbmRleFxuICogQHJldHVybnMge3t0eXBlOiBudWxsLCBsYXllckluZGV4OiAqLCBtYXBJbmRleDogKn19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRWaXNpYmxlTGF5ZXJzRm9yTWFwKG1hcEluZGV4LCBsYXllcklkcykge1xuICAvLyBjb25zb2xlLmxvZygnc2V0VmlzaWJsZUxheWVyc0Zvck1hcCcsIG1hcEluZGV4LCBsYXllcklkcyk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuU0VUX1ZJU0lCTEVfTEFZRVJTX0ZPUl9NQVAsXG4gICAgbWFwSW5kZXgsXG4gICAgbGF5ZXJJZHNcbiAgfTtcbn1cblxuLyoqXG4gKiBUb2dnbGUgd2lkZ2V0IHZpc2liaWxpdHkgb24gc3BsaXQgdmlld3NcbiAqIEBwYXJhbSB3aWRnZXRJbmRleCB0aGUgd2lkZ2V0IHdlIHdhbnQgdG8gdG9nZ2xlIHZpc2liaWxpdHkgb25cbiAqIEBwYXJhbSBtYXBJbmRleCB0aGUgbWFwIGluZGV4XG4gKiBAcmV0dXJucyB7e3R5cGU6IG51bGwsIHdpZGdldEluZGV4OiAqLCBtYXBJbmRleDogKn19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRWaXNpYmxlV2lkZ2V0c0Zvck1hcChtYXBJbmRleCwgd2lkZ2V0SWRzKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdzZXRWaXNpYmxlV2lkZ2V0c0Zvck1hcCcsIG1hcEluZGV4LCB3aWRnZXRJZHMpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlNFVF9WSVNJQkxFX1dJREdFVFNfRk9SX01BUCxcbiAgICBtYXBJbmRleCxcbiAgICB3aWRnZXRJZHNcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEZpbHRlclBsb3QoaWR4LCBuZXdQcm9wKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdzZXRGaWx0ZXJQbG90JywgaWR4LCBuZXdQcm9wKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5TRVRfRklMVEVSX1BMT1QsXG4gICAgaWR4LFxuICAgIG5ld1Byb3BcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRGaWxlcyhmaWxlcykge1xuICAvLyBjb25zb2xlLmxvZygnbG9hZEZpbGVzJywgZmlsZXMpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkxPQURfRklMRVMsXG4gICAgZmlsZXNcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRGaWxlc0VycihlcnJvcikge1xuICAvLyBjb25zb2xlLmxvZygnbG9hZEZpbGVzRXJyJywgZXJyb3IpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkxPQURfRklMRVNfRVJSLFxuICAgIGVycm9yXG4gIH07XG59XG4iXX0=