react-planner-viewer
Version:
react-planner-viewer is a React Component for view plans builded with react-planner in 2D mode
228 lines (177 loc) • 23.7 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = function (state, action) {
switch (action.type) {
case _constants.SELECT_ITEM:
return selectItem(state, action.layerID, action.itemID);
case _constants.SELECT_TOOL_DRAWING_ITEM:
return selectToolDrawingItem(state, action.sceneComponentType);
case _constants.UPDATE_DRAWING_ITEM:
return updateDrawingItem(state, action.layerID, action.x, action.y);
case _constants.END_DRAWING_ITEM:
return endDrawingItem(state, action.layerID, action.x, action.y);
case _constants.BEGIN_DRAGGING_ITEM:
return beginDraggingItem(state, action.layerID, action.itemID, action.x, action.y);
case _constants.UPDATE_DRAGGING_ITEM:
return updateDraggingItem(state, action.x, action.y);
case _constants.END_DRAGGING_ITEM:
return endDraggingItem(state, action.x, action.y);
case _constants.BEGIN_ROTATING_ITEM:
return beginRotatingItem(state, action.layerID, action.itemID, action.x, action.y);
case _constants.UPDATE_ROTATING_ITEM:
return updateRotatingItem(state, action.x, action.y);
case _constants.END_ROTATING_ITEM:
return endRotatingItem(state, action.x, action.y);
default:
return state;
}
};
var _immutable = require('immutable');
var _constants = require('../constants');
var _layerOperations = require('../utils/layer-operations');
var _geometry = require('../utils/geometry');
var Geometry = _interopRequireWildcard(_geometry);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function selectToolDrawingItem(state, sceneComponentType) {
return state.merge({
mode: _constants.MODE_DRAWING_ITEM,
drawingSupport: (0, _immutable.Map)({
type: sceneComponentType
})
});
}
/** holes operations **/
function updateDrawingItem(state, layerID, x, y) {
var drawingSupport = state.drawingSupport,
catalog = state.catalog;
var scene = state.scene.updateIn(['layers', layerID], function (layer) {
return layer.withMutations(function (layer) {
if (drawingSupport.has('currentID')) {
layer.updateIn(['items', drawingSupport.get('currentID')], function (item) {
return item.merge({ x: x, y: y });
});
} else {
var _addItem = (0, _layerOperations.addItem)(layer, drawingSupport.get('type'), x, y, 200, 100, 0, catalog),
item = _addItem.item;
(0, _layerOperations.select)(layer, 'items', item.id);
drawingSupport = drawingSupport.set('currentID', item.id);
}
});
});
return state.merge({
scene: scene,
drawingSupport: drawingSupport
});
}
function endDrawingItem(state, layerID, x, y) {
var catalog = state.catalog;
state = updateDrawingItem(state, layerID, x, y, catalog);
var scene = state.scene.updateIn(['layers', layerID], function (layer) {
return (0, _layerOperations.unselectAll)(layer);
});
return state.merge({
scene: scene,
sceneHistory: state.sceneHistory.push(scene),
drawingSupport: (0, _immutable.Map)({
type: state.drawingSupport.get('type')
})
});
}
function beginDraggingItem(state, layerID, itemID, x, y) {
var item = state.getIn(['scene', 'layers', layerID, 'items', itemID]);
return state.merge({
mode: _constants.MODE_DRAGGING_ITEM,
draggingSupport: (0, _immutable.Map)({
layerID: layerID,
itemID: itemID,
startPointX: x,
startPointY: y,
originalX: item.x,
originalY: item.y
})
});
}
function updateDraggingItem(state, x, y) {
var draggingSupport = state.draggingSupport,
scene = state.scene;
var layerID = draggingSupport.get('layerID');
var itemID = draggingSupport.get('itemID');
var startPointX = draggingSupport.get('startPointX');
var startPointY = draggingSupport.get('startPointY');
var originalX = draggingSupport.get('originalX');
var originalY = draggingSupport.get('originalY');
var diffX = startPointX - x;
var diffY = startPointY - y;
var item = scene.getIn(['layers', layerID, 'items', itemID]);
item = item.merge({
x: originalX - diffX,
y: originalY - diffY
});
return state.merge({
scene: scene.mergeIn(['layers', layerID, 'items', itemID], item)
});
}
function endDraggingItem(state, x, y) {
state = updateDraggingItem(state, x, y);
return state.merge({
mode: _constants.MODE_IDLE,
sceneHistory: state.sceneHistory.push(state.scene)
});
}
function beginRotatingItem(state, layerID, itemID, x, y) {
var item = state.getIn(['scene', 'layers', layerID, 'items', itemID]);
return state.merge({
mode: _constants.MODE_ROTATING_ITEM,
rotatingSupport: (0, _immutable.Map)({
layerID: layerID,
itemID: itemID
})
});
}
function updateRotatingItem(state, x, y) {
var rotatingSupport = state.rotatingSupport,
scene = state.scene;
var layerID = rotatingSupport.get('layerID');
var itemID = rotatingSupport.get('itemID');
var item = state.getIn(['scene', 'layers', layerID, 'items', itemID]);
var deltaX = x - item.x;
var deltaY = y - item.y;
var rotation = Math.atan2(deltaY, deltaX) * 180 / Math.PI - 90;
if (-5 < rotation && rotation < 5) rotation = 0;
if (-95 < rotation && rotation < -85) rotation = -90;
if (-185 < rotation && rotation < -175) rotation = -180;
if (85 < rotation && rotation < 90) rotation = 90;
if (-270 < rotation && rotation < -265) rotation = 90;
item = item.merge({
rotation: rotation
});
return state.merge({
scene: scene.mergeIn(['layers', layerID, 'items', itemID], item)
});
}
function endRotatingItem(state, x, y) {
state = updateRotatingItem(state, x, y);
return state.merge({
mode: _constants.MODE_IDLE,
sceneHistory: state.sceneHistory.push(state.scene)
});
}
function selectItem(state, layerID, itemID) {
var scene = state.scene;
scene = scene.merge({
layers: scene.layers.map(_layerOperations.unselectAll),
selectedLayer: layerID
});
scene = scene.updateIn(['layers', layerID], function (layer) {
return layer.withMutations(function (layer) {
(0, _layerOperations.select)(layer, 'items', itemID);
});
});
return state.merge({
scene: scene,
sceneHistory: state.sceneHistory.push(scene)
});
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZWR1Y2Vycy9pdGVtcy1yZWR1Y2VyLmpzIl0sIm5hbWVzIjpbInN0YXRlIiwiYWN0aW9uIiwidHlwZSIsInNlbGVjdEl0ZW0iLCJsYXllcklEIiwiaXRlbUlEIiwic2VsZWN0VG9vbERyYXdpbmdJdGVtIiwic2NlbmVDb21wb25lbnRUeXBlIiwidXBkYXRlRHJhd2luZ0l0ZW0iLCJ4IiwieSIsImVuZERyYXdpbmdJdGVtIiwiYmVnaW5EcmFnZ2luZ0l0ZW0iLCJ1cGRhdGVEcmFnZ2luZ0l0ZW0iLCJlbmREcmFnZ2luZ0l0ZW0iLCJiZWdpblJvdGF0aW5nSXRlbSIsInVwZGF0ZVJvdGF0aW5nSXRlbSIsImVuZFJvdGF0aW5nSXRlbSIsIkdlb21ldHJ5IiwibWVyZ2UiLCJtb2RlIiwiZHJhd2luZ1N1cHBvcnQiLCJjYXRhbG9nIiwic2NlbmUiLCJ1cGRhdGVJbiIsImxheWVyIiwid2l0aE11dGF0aW9ucyIsImhhcyIsImdldCIsIml0ZW0iLCJpZCIsInNldCIsInNjZW5lSGlzdG9yeSIsInB1c2giLCJnZXRJbiIsImRyYWdnaW5nU3VwcG9ydCIsInN0YXJ0UG9pbnRYIiwic3RhcnRQb2ludFkiLCJvcmlnaW5hbFgiLCJvcmlnaW5hbFkiLCJkaWZmWCIsImRpZmZZIiwibWVyZ2VJbiIsInJvdGF0aW5nU3VwcG9ydCIsImRlbHRhWCIsImRlbHRhWSIsInJvdGF0aW9uIiwiTWF0aCIsImF0YW4yIiwiUEkiLCJsYXllcnMiLCJtYXAiLCJzZWxlY3RlZExheWVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7a0JBdUJlLFVBQVVBLEtBQVYsRUFBaUJDLE1BQWpCLEVBQXlCO0FBQ3RDLFVBQVFBLE9BQU9DLElBQWY7QUFDRTtBQUNFLGFBQU9DLFdBQVdILEtBQVgsRUFBa0JDLE9BQU9HLE9BQXpCLEVBQWtDSCxPQUFPSSxNQUF6QyxDQUFQOztBQUVGO0FBQ0UsYUFBT0Msc0JBQXNCTixLQUF0QixFQUE2QkMsT0FBT00sa0JBQXBDLENBQVA7O0FBRUY7QUFD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aEMsTUFBTWdDLFlBQU4sQ0FBbUJDLElBQW5CLENBQXdCakMsTUFBTXVCLEtBQTlCO0FBRkcsR0FBWixDQUFQO0FBSUQ7O0FBRUQsU0FBU3BCLFVBQVQsQ0FBb0JILEtBQXBCLEVBQTJCSSxPQUEzQixFQUFvQ0MsTUFBcEMsRUFBNEM7QUFDMUMsTUFBSWtCLFFBQVF2QixNQUFNdUIsS0FBbEI7O0FBRUFBLFVBQVFBLE1BQU1KLEtBQU4sQ0FBWTtBQUNsQitCLFlBQVEzQixNQUFNMkIsTUFBTixDQUFhQyxHQUFiLDhCQURVO0FBRWxCQyxtQkFBZWhEO0FBRkcsR0FBWixDQUFSOztBQUtBbUIsVUFBUUEsTUFBTUMsUUFBTixDQUFlLENBQUMsUUFBRCxFQUFXcEIsT0FBWCxDQUFmLEVBQW9DO0FBQUEsV0FBU3FCLE1BQU1DLGFBQU4sQ0FBb0IsaUJBQVM7QUFDOUUsbUNBQU9ELEtBQVAsRUFBYyxPQUFkLEVBQXVCcEIsTUFBdkI7QUFDRCxLQUZrRCxDQUFUO0FBQUEsR0FBcEMsQ0FBUjs7QUFLQSxTQUFPTCxNQUFNbUIsS0FBTixDQUFZO0FBQ2pCSSxnQkFEaUI7QUFFakJTLGtCQUFjaEMsTUFBTWdDLFlBQU4sQ0FBbUJDLElBQW5CLENBQXdCVixLQUF4QjtBQUZHLEdBQVosQ0FBUDtBQUlEIiwiZmlsZSI6Iml0ZW1zLXJlZHVjZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xpc3QsIE1hcH0gZnJvbSAnaW1tdXRhYmxlJztcblxuaW1wb3J0IHtcbiAgU0VMRUNUX1RPT0xfRFJBV0lOR19JVEVNLFxuICBVUERBVEVfRFJBV0lOR19JVEVNLFxuICBFTkRfRFJBV0lOR19JVEVNLFxuICBCRUdJTl9EUkFHR0lOR19JVEVNLFxuICBVUERBVEVfRFJBR0dJTkdfSVRFTSxcbiAgRU5EX0RSQUdHSU5HX0lURU0sXG4gIEJFR0lOX1JPVEFUSU5HX0lURU0sXG4gIFVQREFURV9ST1RBVElOR19JVEVNLFxuICBFTkRfUk9UQVRJTkdfSVRFTSxcbiAgU0VMRUNUX0lURU0sXG5cbiAgTU9ERV9JRExFLFxuICBNT0RFX0RSQVdJTkdfSVRFTSxcbiAgTU9ERV9EUkFHR0lOR19JVEVNLFxuICBNT0RFX1JPVEFUSU5HX0lURU1cbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuaW1wb3J0IHthZGRJdGVtLCByZW1vdmVJdGVtLCB1bnNlbGVjdCwgc2VsZWN0LCB1bnNlbGVjdEFsbH0gZnJvbSAnLi4vdXRpbHMvbGF5ZXItb3BlcmF0aW9ucyc7XG5pbXBvcnQgKiBhcyBHZW9tZXRyeSBmcm9tICcuLi91dGlscy9nZW9tZXRyeSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIFNFTEVDVF9JVEVNOlxuICAgICAgcmV0dXJuIHNlbGVjdEl0ZW0oc3RhdGUsIGFjdGlvbi5sYXllcklELCBhY3Rpb24uaXRlbUlEKTtcblxuICAgIGNhc2UgU0VMRUNUX1RPT0xfRFJBV0lOR19JVEVNOlxuICAgICAgcmV0dXJuIHNlbGVjdFRvb2xEcmF3aW5nSXRlbShzdGF0ZSwgYWN0aW9uLnNjZW5lQ29tcG9uZW50VHlwZSk7XG5cbiAgICBjYXNlIFVQREFURV9EUkFXSU5HX0lURU06XG4gICAgICByZXR1cm4gdXBkYXRlRHJhd2luZ0l0ZW0oc3RhdGUsIGFjdGlvbi5sYXllcklELCBhY3Rpb24ueCwgYWN0aW9uLnkpO1xuXG4gICAgY2FzZSBFTkRfRFJBV0lOR19JVEVNOlxuICAgICAgcmV0dXJuIGVuZERyYXdpbmdJdGVtKHN0YXRlLCBhY3Rpb24ubGF5ZXJJRCwgYWN0aW9uLngsIGFjdGlvbi55KTtcblxuICAgIGNhc2UgQkVHSU5fRFJBR0dJTkdfSVRFTTpcbiAgICAgIHJldHVybiBiZWdpbkRyYWdnaW5nSXRlbShzdGF0ZSwgYWN0aW9uLmxheWVySUQsIGFjdGlvbi5pdGVtSUQsIGFjdGlvbi54LCBhY3Rpb24ueSk7XG5cbiAgICBjYXNlIFVQREFURV9EUkFHR0lOR19JVEVNOlxuICAgICAgcmV0dXJuIHVwZGF0ZURyYWdnaW5nSXRlbShzdGF0ZSwgYWN0aW9uLngsIGFjdGlvbi55KTtcblxuICAgIGNhc2UgRU5EX0RSQUdHSU5HX0lURU06XG4gICAgICByZXR1cm4gZW5kRHJhZ2dpbmdJdGVtKHN0YXRlLCBhY3Rpb24ueCwgYWN0aW9uLnkpO1xuXG4gICAgY2FzZSBCRUdJTl9ST1RBVElOR19JVEVNOlxuICAgICAgcmV0dXJuIGJlZ2luUm90YXRpbmdJdGVtKHN0YXRlLCBhY3Rpb24ubGF5ZXJJRCwgYWN0aW9uLml0ZW1JRCwgYWN0aW9uLngsIGFjdGlvbi55KTtcblxuICAgIGNhc2UgVVBEQVRFX1JPVEFUSU5HX0lURU06XG4gICAgICByZXR1cm4gdXBkYXRlUm90YXRpbmdJdGVtKHN0YXRlLCBhY3Rpb24ueCwgYWN0aW9uLnkpO1xuXG4gICAgY2FzZSBFTkRfUk9UQVRJTkdfSVRFTTpcbiAgICAgIHJldHVybiBlbmRSb3RhdGluZ0l0ZW0oc3RhdGUsIGFjdGlvbi54LCBhY3Rpb24ueSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlbGVjdFRvb2xEcmF3aW5nSXRlbShzdGF0ZSwgc2NlbmVDb21wb25lbnRUeXBlKSB7XG4gIHJldHVybiBzdGF0ZS5tZXJnZSh7XG4gICAgbW9kZTogTU9ERV9EUkFXSU5HX0lURU0sXG4gICAgZHJhd2luZ1N1cHBvcnQ6IE1hcCh7XG4gICAgICB0eXBlOiBzY2VuZUNvbXBvbmVudFR5cGVcbiAgICB9KVxuICB9KTtcbn1cblxuLyoqIGhvbGVzIG9wZXJhdGlvbnMgKiovXG5mdW5jdGlvbiB1cGRhdGVEcmF3aW5nSXRlbShzdGF0ZSwgbGF5ZXJJRCwgeCwgeSkge1xuICBsZXQge2RyYXdpbmdTdXBwb3J0LCBjYXRhbG9nfSA9IHN0YXRlO1xuXG4gIGxldCBzY2VuZSA9IHN0YXRlLnNjZW5lLnVwZGF0ZUluKFsnbGF5ZXJzJywgbGF5ZXJJRF0sIGxheWVyID0+IGxheWVyLndpdGhNdXRhdGlvbnMobGF5ZXIgPT4ge1xuXG4gICAgaWYgKGRyYXdpbmdTdXBwb3J0LmhhcygnY3VycmVudElEJykpIHtcbiAgICAgIGxheWVyLnVwZGF0ZUluKFsnaXRlbXMnLCBkcmF3aW5nU3VwcG9ydC5nZXQoJ2N1cnJlbnRJRCcpXSwgaXRlbSA9PiBpdGVtLm1lcmdlKHt4LCB5fSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQge2l0ZW19ID0gYWRkSXRlbShsYXllciwgZHJhd2luZ1N1cHBvcnQuZ2V0KCd0eXBlJyksIHgsIHksIDIwMCwgMTAwLCAwLCBjYXRhbG9nKTtcbiAgICAgIHNlbGVjdChsYXllciwgJ2l0ZW1zJywgaXRlbS5pZCk7XG4gICAgICBkcmF3aW5nU3VwcG9ydCA9IGRyYXdpbmdTdXBwb3J0LnNldCgnY3VycmVudElEJywgaXRlbS5pZCk7XG4gICAgfVxuICB9KSk7XG5cbiAgcmV0dXJuIHN0YXRlLm1lcmdlKHtcbiAgICBzY2VuZSxcbiAgICBkcmF3aW5nU3VwcG9ydFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZW5kRHJhd2luZ0l0ZW0oc3RhdGUsIGxheWVySUQsIHgsIHkpIHtcbiAgbGV0IGNhdGFsb2cgPSBzdGF0ZS5jYXRhbG9nO1xuICBzdGF0ZSA9IHVwZGF0ZURyYXdpbmdJdGVtKHN0YXRlLCBsYXllcklELCB4LCB5LCBjYXRhbG9nKTtcbiAgbGV0IHNjZW5lID0gc3RhdGUuc2NlbmUudXBkYXRlSW4oWydsYXllcnMnLCBsYXllcklEXSwgbGF5ZXIgPT4gdW5zZWxlY3RBbGwobGF5ZXIpKTtcbiAgcmV0dXJuIHN0YXRlLm1lcmdlKHtcbiAgICBzY2VuZSxcbiAgICBzY2VuZUhpc3Rvcnk6IHN0YXRlLnNjZW5lSGlzdG9yeS5wdXNoKHNjZW5lKSxcbiAgICBkcmF3aW5nU3VwcG9ydDogTWFwKHtcbiAgICAgIHR5cGU6IHN0YXRlLmRyYXdpbmdTdXBwb3J0LmdldCgndHlwZScpXG4gICAgfSlcbiAgfSk7XG5cbn1cblxuZnVuY3Rpb24gYmVnaW5EcmFnZ2luZ0l0ZW0oc3RhdGUsIGxheWVySUQsIGl0ZW1JRCwgeCwgeSkge1xuXG4gIGxldCBpdGVtID0gc3RhdGUuZ2V0SW4oWydzY2VuZScsICdsYXllcnMnLCBsYXllcklELCAnaXRlbXMnLCBpdGVtSURdKTtcblxuICByZXR1cm4gc3RhdGUubWVyZ2Uoe1xuICAgIG1vZGU6IE1PREVfRFJBR0dJTkdfSVRFTSxcbiAgICBkcmFnZ2luZ1N1cHBvcnQ6IE1hcCh7XG4gICAgICBsYXllcklELFxuICAgICAgaXRlbUlELFxuICAgICAgc3RhcnRQb2ludFg6IHgsXG4gICAgICBzdGFydFBvaW50WTogeSxcbiAgICAgIG9yaWdpbmFsWDogaXRlbS54LFxuICAgICAgb3JpZ2luYWxZOiBpdGVtLnlcbiAgICB9KVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRHJhZ2dpbmdJdGVtKHN0YXRlLCB4LCB5KSB7XG4gIGxldCB7ZHJhZ2dpbmdTdXBwb3J0LCBzY2VuZX0gPSBzdGF0ZTtcblxuICBsZXQgbGF5ZXJJRCA9IGRyYWdnaW5nU3VwcG9ydC5nZXQoJ2xheWVySUQnKTtcbiAgbGV0IGl0ZW1JRCA9IGRyYWdnaW5nU3VwcG9ydC5nZXQoJ2l0ZW1JRCcpO1xuICBsZXQgc3RhcnRQb2ludFggPSBkcmFnZ2luZ1N1cHBvcnQuZ2V0KCdzdGFydFBvaW50WCcpO1xuICBsZXQgc3RhcnRQb2ludFkgPSBkcmFnZ2luZ1N1cHBvcnQuZ2V0KCdzdGFydFBvaW50WScpO1xuICBsZXQgb3JpZ2luYWxYID0gZHJhZ2dpbmdTdXBwb3J0LmdldCgnb3JpZ2luYWxYJyk7XG4gIGxldCBvcmlnaW5hbFkgPSBkcmFnZ2luZ1N1cHBvcnQuZ2V0KCdvcmlnaW5hbFknKTtcblxuICBsZXQgZGlmZlggPSBzdGFydFBvaW50WCAtIHg7XG4gIGxldCBkaWZmWSA9IHN0YXJ0UG9pbnRZIC0geTtcblxuICBsZXQgaXRlbSA9IHNjZW5lLmdldEluKFsnbGF5ZXJzJywgbGF5ZXJJRCwgJ2l0ZW1zJywgaXRlbUlEXSk7XG4gIGl0ZW0gPSBpdGVtLm1lcmdlKHtcbiAgICB4OiBvcmlnaW5hbFggLSBkaWZmWCxcbiAgICB5OiBvcmlnaW5hbFkgLSBkaWZmWVxuICB9KTtcblxuICByZXR1cm4gc3RhdGUubWVyZ2Uoe1xuICAgIHNjZW5lOiBzY2VuZS5tZXJnZUluKFsnbGF5ZXJzJywgbGF5ZXJJRCwgJ2l0ZW1zJywgaXRlbUlEXSwgaXRlbSlcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVuZERyYWdnaW5nSXRlbShzdGF0ZSwgeCwgeSkge1xuICBzdGF0ZSA9IHVwZGF0ZURyYWdnaW5nSXRlbShzdGF0ZSwgeCwgeSk7XG4gIHJldHVybiBzdGF0ZS5tZXJnZSh7XG4gICAgbW9kZTogTU9ERV9JRExFLFxuICAgIHNjZW5lSGlzdG9yeTogc3RhdGUuc2NlbmVIaXN0b3J5LnB1c2goc3RhdGUuc2NlbmUpXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBiZWdpblJvdGF0aW5nSXRlbShzdGF0ZSwgbGF5ZXJJRCwgaXRlbUlELCB4LCB5KSB7XG5cbiAgbGV0IGl0ZW0gPSBzdGF0ZS5nZXRJbihbJ3NjZW5lJywgJ2xheWVycycsIGxheWVySUQsICdpdGVtcycsIGl0ZW1JRF0pO1xuXG4gIHJldHVybiBzdGF0ZS5tZXJnZSh7XG4gICAgbW9kZTogTU9ERV9ST1RBVElOR19JVEVNLFxuICAgIHJvdGF0aW5nU3VwcG9ydDogTWFwKHtcbiAgICAgIGxheWVySUQsXG4gICAgICBpdGVtSURcbiAgICB9KVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUm90YXRpbmdJdGVtKHN0YXRlLCB4LCB5KSB7XG4gIGxldCB7cm90YXRpbmdTdXBwb3J0LCBzY2VuZX0gPSBzdGF0ZTtcblxuICBsZXQgbGF5ZXJJRCA9IHJvdGF0aW5nU3VwcG9ydC5nZXQoJ2xheWVySUQnKTtcbiAgbGV0IGl0ZW1JRCA9IHJvdGF0aW5nU3VwcG9ydC5nZXQoJ2l0ZW1JRCcpO1xuICBsZXQgaXRlbSA9IHN0YXRlLmdldEluKFsnc2NlbmUnLCAnbGF5ZXJzJywgbGF5ZXJJRCwgJ2l0ZW1zJywgaXRlbUlEXSk7XG5cbiAgbGV0IGRlbHRhWCA9IHggLSBpdGVtLng7XG4gIGxldCBkZWx0YVkgPSB5IC0gaXRlbS55O1xuICBsZXQgcm90YXRpb24gPSBNYXRoLmF0YW4yKGRlbHRhWSwgZGVsdGFYKSAqIDE4MCAvIE1hdGguUEkgLSA5MDtcblxuICBpZiAoLTUgPCByb3RhdGlvbiAmJiByb3RhdGlvbiA8IDUpIHJvdGF0aW9uID0gMDtcbiAgaWYgKC05NSA8IHJvdGF0aW9uICYmIHJvdGF0aW9uIDwgLTg1KSByb3RhdGlvbiA9IC05MDtcbiAgaWYgKC0xODUgPCByb3RhdGlvbiAmJiByb3RhdGlvbiA8IC0xNzUpIHJvdGF0aW9uID0gLTE4MDtcbiAgaWYgKDg1IDwgcm90YXRpb24gJiYgcm90YXRpb24gPCA5MCkgcm90YXRpb24gPSA5MDtcbiAgaWYgKC0yNzAgPCByb3RhdGlvbiAmJiByb3RhdGlvbiA8IC0yNjUpIHJvdGF0aW9uID0gOTA7XG5cbiAgaXRlbSA9IGl0ZW0ubWVyZ2Uoe1xuICAgIHJvdGF0aW9uLFxuICB9KTtcblxuICByZXR1cm4gc3RhdGUubWVyZ2Uoe1xuICAgIHNjZW5lOiBzY2VuZS5tZXJnZUluKFsnbGF5ZXJzJywgbGF5ZXJJRCwgJ2l0ZW1zJywgaXRlbUlEXSwgaXRlbSlcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVuZFJvdGF0aW5nSXRlbShzdGF0ZSwgeCwgeSkge1xuICBzdGF0ZSA9IHVwZGF0ZVJvdGF0aW5nSXRlbShzdGF0ZSwgeCwgeSk7XG4gIHJldHVybiBzdGF0ZS5tZXJnZSh7XG4gICAgbW9kZTogTU9ERV9JRExFLFxuICAgIHNjZW5lSGlzdG9yeTogc3RhdGUuc2NlbmVIaXN0b3J5LnB1c2goc3RhdGUuc2NlbmUpXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RJdGVtKHN0YXRlLCBsYXllcklELCBpdGVtSUQpIHtcbiAgbGV0IHNjZW5lID0gc3RhdGUuc2NlbmU7XG5cbiAgc2NlbmUgPSBzY2VuZS5tZXJnZSh7XG4gICAgbGF5ZXJzOiBzY2VuZS5sYXllcnMubWFwKHVuc2VsZWN0QWxsKSxcbiAgICBzZWxlY3RlZExheWVyOiBsYXllcklEXG4gIH0pO1xuXG4gIHNjZW5lID0gc2NlbmUudXBkYXRlSW4oWydsYXllcnMnLCBsYXllcklEXSwgbGF5ZXIgPT4gbGF5ZXIud2l0aE11dGF0aW9ucyhsYXllciA9PiB7XG4gICAgICBzZWxlY3QobGF5ZXIsICdpdGVtcycsIGl0ZW1JRCk7XG4gICAgfSlcbiAgKTtcblxuICByZXR1cm4gc3RhdGUubWVyZ2Uoe1xuICAgIHNjZW5lLFxuICAgIHNjZW5lSGlzdG9yeTogc3RhdGUuc2NlbmVIaXN0b3J5LnB1c2goc2NlbmUpXG4gIH0pXG59XG4iXX0=