tc-ui-toolkit
Version:
React components used to develop tools for the desktop app translationCore
453 lines (415 loc) • 46.9 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _reactBootstrap = require("react-bootstrap");
var _deepEqual = _interopRequireDefault(require("deep-equal"));
var _Checkbox = _interopRequireDefault(require("@material-ui/core/Checkbox"));
var _styles = require("@material-ui/core/styles");
var _FormControlLabel = _interopRequireDefault(require("@material-ui/core/FormControlLabel"));
var _Info = _interopRequireDefault(require("@material-ui/icons/Info"));
var _CheckBoxOutlineBlank = _interopRequireDefault(require("@material-ui/icons/CheckBoxOutlineBlank"));
var _CheckBox = _interopRequireDefault(require("@material-ui/icons/CheckBox"));
var _reactTooltip = _interopRequireDefault(require("react-tooltip"));
var _Bookmark = _interopRequireDefault(require("../../Bookmark"));
require("./ActionsArea.styles.css");
var _Hint = _interopRequireDefault(require("../../Hint/Hint"));
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
var styles = {
formControl: {
margin: '0'
},
label: {
color: 'var(--accent-color-dark)',
fontWeight: 'normal',
fontSize: 14
},
checkBoxRoot: {
'padding': '12px 5px',
'color': 'var(--accent-color-dark)',
'&$checked': {
color: 'var(--accent-color-dark)'
}
},
checked: {},
icon: {
color: 'var(--accent-color-dark)',
verticalAlign: 'middle',
margin: '5px',
width: 30,
height: 30,
cursor: 'pointer'
},
actionButtons: {
width: '140px',
textOverflow: 'ellipsis',
overflow: 'hidden',
whiteSpace: 'nowrap',
paddingRight: '0px'
}
};
var actionButtonStyleRM = _objectSpread(_objectSpread({}, styles.actionButtons), {}, {
marginRight: '5px'
});
var isSelectionsSaveDisable = function isSelectionsSaveDisable(localNothingToSelect, nothingToSelect, newSelections, selections) {
if (newSelections.length > 0 || newSelections.length === 0 && !(0, _deepEqual["default"])(newSelections, selections)) {
return (0, _deepEqual["default"])(newSelections, selections);
}
return localNothingToSelect === nothingToSelect;
};
/* eslint-disable react/prop-types */
var ChangeModeArea = function ChangeModeArea(_ref) {
var translate = _ref.translate,
bookmarkEnabled = _ref.bookmarkEnabled,
toggleBookmark = _ref.toggleBookmark,
changeMode = _ref.changeMode;
var selectText = translate('select');
var editVerseText = translate('edit_verse');
var commentText = translate('comment');
return /*#__PURE__*/_react["default"].createElement("div", {
className: "actions-area"
}, /*#__PURE__*/_react["default"].createElement(_Bookmark["default"], {
value: "bookmark",
color: "primary",
checked: bookmarkEnabled,
label: translate('bookmark'),
onChange: toggleBookmark
}), /*#__PURE__*/_react["default"].createElement("div", {
style: {
display: 'flex',
marginLeft: 'auto'
}
}, /*#__PURE__*/_react["default"].createElement(_Hint["default"], {
position: 'top',
size: "medium",
label: selectText,
enabled: !!selectText,
hintLength: 14
}, /*#__PURE__*/_react["default"].createElement("button", {
style: actionButtonStyleRM,
className: "btn-second",
onClick: function onClick() {
return changeMode('select');
}
}, /*#__PURE__*/_react["default"].createElement(_reactBootstrap.Glyphicon, {
glyph: "ok",
style: {
marginRight: '10px'
}
}), selectText)), /*#__PURE__*/_react["default"].createElement(_Hint["default"], {
position: 'top',
size: "medium",
label: editVerseText,
enabled: !!editVerseText,
hintLength: 14
}, /*#__PURE__*/_react["default"].createElement("button", {
style: actionButtonStyleRM,
className: "btn-second",
onClick: function onClick() {
return changeMode('edit');
}
}, /*#__PURE__*/_react["default"].createElement(_reactBootstrap.Glyphicon, {
glyph: "pencil",
style: {
marginRight: '10px'
}
}), editVerseText)), /*#__PURE__*/_react["default"].createElement(_Hint["default"], {
position: 'top',
size: "medium",
label: commentText,
enabled: !!commentText,
hintLength: 14
}, /*#__PURE__*/_react["default"].createElement("button", {
style: styles.actionButtons,
className: "btn-second",
onClick: function onClick() {
return changeMode('comment');
}
}, /*#__PURE__*/_react["default"].createElement(_reactBootstrap.Glyphicon, {
glyph: "comment",
style: {
marginRight: '10px'
}
}), commentText))));
};
var ConfirmEditVerseArea = function ConfirmEditVerseArea(_ref2) {
var translate = _ref2.translate,
tags = _ref2.tags,
cancelEditVerse = _ref2.cancelEditVerse,
saveEditVerse = _ref2.saveEditVerse;
var cancelText = translate('cancel');
var saveText = translate('save');
return /*#__PURE__*/_react["default"].createElement("div", {
className: "actions-area"
}, /*#__PURE__*/_react["default"].createElement(_Hint["default"], {
position: 'top',
size: "medium",
label: cancelText,
enabled: !!cancelText,
hintLength: 14
}, /*#__PURE__*/_react["default"].createElement("button", {
className: "btn-second",
onClick: cancelEditVerse
}, cancelText)), /*#__PURE__*/_react["default"].createElement(_Hint["default"], {
position: 'top',
size: "medium",
label: saveText,
enabled: !!saveText,
hintLength: 14
}, /*#__PURE__*/_react["default"].createElement("button", {
className: "btn-prime",
disabled: !tags.length,
onClick: saveEditVerse
}, /*#__PURE__*/_react["default"].createElement(_reactBootstrap.Glyphicon, {
glyph: "ok",
style: {
marginRight: '10px'
}
}), saveText)));
};
var ConfirmCommentArea = function ConfirmCommentArea(_ref3) {
var translate = _ref3.translate,
isCommentChanged = _ref3.isCommentChanged,
cancelComment = _ref3.cancelComment,
saveComment = _ref3.saveComment;
var cancelText = translate('cancel');
var saveText = translate('save');
return /*#__PURE__*/_react["default"].createElement("div", {
className: "actions-area"
}, /*#__PURE__*/_react["default"].createElement(_Hint["default"], {
position: 'top',
size: "medium",
label: cancelText,
enabled: !!cancelText,
hintLength: 14
}, /*#__PURE__*/_react["default"].createElement("button", {
className: "btn-second",
onClick: cancelComment
}, cancelText)), /*#__PURE__*/_react["default"].createElement(_Hint["default"], {
position: 'top',
size: "medium",
label: saveText,
enabled: !!saveText,
hintLength: 14
}, /*#__PURE__*/_react["default"].createElement("button", {
className: "btn-prime",
disabled: !isCommentChanged,
onClick: saveComment
}, /*#__PURE__*/_react["default"].createElement(_reactBootstrap.Glyphicon, {
glyph: "ok",
style: {
marginRight: '10px'
}
}), saveText)));
};
var ConfirmSelectionArea = function ConfirmSelectionArea(_ref4) {
var classes = _ref4.classes,
translate = _ref4.translate,
localNothingToSelect = _ref4.localNothingToSelect,
newSelections = _ref4.newSelections,
nothingToSelect = _ref4.nothingToSelect,
selections = _ref4.selections,
toggleNothingToSelect = _ref4.toggleNothingToSelect,
cancelSelection = _ref4.cancelSelection,
clearSelection = _ref4.clearSelection,
saveSelection = _ref4.saveSelection;
var cancelText = translate('cancel');
var clearSelectionText = translate('clear_selection');
var saveText = translate('save');
return /*#__PURE__*/_react["default"].createElement("div", {
className: "selection-actions-area"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "flex-row"
}, /*#__PURE__*/_react["default"].createElement(_FormControlLabel["default"], {
value: "end",
control: /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
checked: localNothingToSelect,
disabled: newSelections && newSelections.length > 0,
color: "primary",
onChange: function onChange(event) {
return toggleNothingToSelect(event.target.checked);
},
value: "nothingToSelect",
classes: {
root: classes.checkBoxRoot,
checked: classes.checked
},
icon: /*#__PURE__*/_react["default"].createElement(_CheckBoxOutlineBlank["default"], {
style: {
fontSize: '24px'
}
}),
checkedIcon: /*#__PURE__*/_react["default"].createElement(_CheckBox["default"], {
style: {
fontSize: '24px'
}
})
}),
label: translate('no_selection_needed'),
classes: {
root: classes.formControl,
label: classes.label
}
}), /*#__PURE__*/_react["default"].createElement("div", {
"data-tip": translate('nothing_to_select_description'),
"data-place": "top",
"data-effect": "float",
"data-type": "dark",
"data-class": "selection-tooltip",
"data-delay-hide": "100",
style: {
verticalAlign: 'super',
fontSize: '0.8em'
}
}, /*#__PURE__*/_react["default"].createElement(_Info["default"], {
classes: {
root: classes.icon
}
}), /*#__PURE__*/_react["default"].createElement(_reactTooltip["default"], null))), /*#__PURE__*/_react["default"].createElement("div", {
style: {
whiteSpace: 'nowrap'
}
}, /*#__PURE__*/_react["default"].createElement(_Hint["default"], {
position: 'top',
size: "medium",
label: cancelText,
enabled: !!cancelText,
hintLength: 14
}, /*#__PURE__*/_react["default"].createElement("button", {
className: "btn-second",
style: _objectSpread(_objectSpread({}, actionButtonStyleRM), {}, {
marginLeft: '0px',
alignSelf: 'flex-start'
}),
onClick: cancelSelection
}, cancelText)), /*#__PURE__*/_react["default"].createElement(_Hint["default"], {
position: 'top',
size: "medium",
label: clearSelectionText,
enabled: !!clearSelectionText,
hintLength: 14
}, /*#__PURE__*/_react["default"].createElement("button", {
className: "btn-second",
style: actionButtonStyleRM,
disabled: newSelections.length > 0 ? false : true,
onClick: clearSelection
}, /*#__PURE__*/_react["default"].createElement(_reactBootstrap.Glyphicon, {
glyph: "erase",
style: {
marginRight: '10px'
}
}), clearSelectionText)), /*#__PURE__*/_react["default"].createElement(_Hint["default"], {
position: 'top',
size: "medium",
label: saveText,
enabled: !!saveText,
hintLength: 14
}, /*#__PURE__*/_react["default"].createElement("button", {
className: "btn-prime",
style: actionButtonStyleRM,
disabled: isSelectionsSaveDisable(localNothingToSelect, nothingToSelect, newSelections, selections),
onClick: saveSelection
}, /*#__PURE__*/_react["default"].createElement(_reactBootstrap.Glyphicon, {
glyph: "ok",
style: {
marginRight: '10px'
}
}), saveText))));
};
/* eslint-enable react/prop-types */
var ActionsArea = function ActionsArea(_ref5) {
var tags = _ref5.tags,
mode = _ref5.mode,
isCommentChanged = _ref5.isCommentChanged,
selections = _ref5.selections,
newSelections = _ref5.newSelections,
bookmarkEnabled = _ref5.bookmarkEnabled,
saveSelection = _ref5.saveSelection,
cancelSelection = _ref5.cancelSelection,
clearSelection = _ref5.clearSelection,
translate = _ref5.translate,
classes = _ref5.classes,
localNothingToSelect = _ref5.localNothingToSelect,
nothingToSelect = _ref5.nothingToSelect,
toggleNothingToSelect = _ref5.toggleNothingToSelect,
toggleBookmark = _ref5.toggleBookmark,
changeMode = _ref5.changeMode,
cancelEditVerse = _ref5.cancelEditVerse,
saveEditVerse = _ref5.saveEditVerse,
cancelComment = _ref5.cancelComment,
saveComment = _ref5.saveComment;
switch (mode) {
case 'edit':
return /*#__PURE__*/_react["default"].createElement(ConfirmEditVerseArea, {
tags: tags,
translate: translate,
cancelEditVerse: cancelEditVerse,
saveEditVerse: saveEditVerse
});
case 'comment':
return /*#__PURE__*/_react["default"].createElement(ConfirmCommentArea, {
translate: translate,
isCommentChanged: isCommentChanged,
cancelComment: cancelComment,
saveComment: saveComment
});
case 'select':
return /*#__PURE__*/_react["default"].createElement(ConfirmSelectionArea, {
classes: classes,
translate: translate,
localNothingToSelect: localNothingToSelect,
newSelections: newSelections,
nothingToSelect: nothingToSelect,
selections: selections,
toggleNothingToSelect: toggleNothingToSelect,
cancelSelection: cancelSelection,
clearSelection: clearSelection,
saveSelection: saveSelection
});
case 'default':
return /*#__PURE__*/_react["default"].createElement(ChangeModeArea, {
translate: translate,
bookmarkEnabled: bookmarkEnabled,
toggleBookmark: toggleBookmark,
changeMode: changeMode
});
default:
return /*#__PURE__*/_react["default"].createElement(ChangeModeArea, {
translate: translate,
bookmarkEnabled: bookmarkEnabled,
toggleBookmark: toggleBookmark,
changeMode: changeMode
});
}
};
ActionsArea.propTypes = {
tags: _propTypes["default"].array.isRequired,
mode: _propTypes["default"].string.isRequired,
isCommentChanged: _propTypes["default"].bool.isRequired,
selections: _propTypes["default"].array.isRequired,
newSelections: _propTypes["default"].array.isRequired,
bookmarkEnabled: _propTypes["default"].bool.isRequired,
classes: _propTypes["default"].object.isRequired,
localNothingToSelect: _propTypes["default"].bool.isRequired,
nothingToSelect: _propTypes["default"].bool.isRequired,
saveSelection: _propTypes["default"].func.isRequired,
cancelSelection: _propTypes["default"].func.isRequired,
clearSelection: _propTypes["default"].func.isRequired,
translate: _propTypes["default"].func.isRequired,
toggleNothingToSelect: _propTypes["default"].func.isRequired,
toggleBookmark: _propTypes["default"].func.isRequired,
changeMode: _propTypes["default"].func.isRequired,
cancelEditVerse: _propTypes["default"].func.isRequired,
saveEditVerse: _propTypes["default"].func.isRequired,
cancelComment: _propTypes["default"].func.isRequired,
saveComment: _propTypes["default"].func.isRequired
};
var _default = (0, _styles.withStyles)(styles)(ActionsArea);
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9WZXJzZUNoZWNrL0FjdGlvbnNBcmVhL2luZGV4LmpzIl0sIm5hbWVzIjpbInN0eWxlcyIsImZvcm1Db250cm9sIiwibWFyZ2luIiwibGFiZWwiLCJjb2xvciIsImZvbnRXZWlnaHQiLCJmb250U2l6ZSIsImNoZWNrQm94Um9vdCIsImNoZWNrZWQiLCJpY29uIiwidmVydGljYWxBbGlnbiIsIndpZHRoIiwiaGVpZ2h0IiwiY3Vyc29yIiwiYWN0aW9uQnV0dG9ucyIsInRleHRPdmVyZmxvdyIsIm92ZXJmbG93Iiwid2hpdGVTcGFjZSIsInBhZGRpbmdSaWdodCIsImFjdGlvbkJ1dHRvblN0eWxlUk0iLCJtYXJnaW5SaWdodCIsImlzU2VsZWN0aW9uc1NhdmVEaXNhYmxlIiwibG9jYWxOb3RoaW5nVG9TZWxlY3QiLCJub3RoaW5nVG9TZWxlY3QiLCJuZXdTZWxlY3Rpb25zIiwic2VsZWN0aW9ucyIsImxlbmd0aCIsIkNoYW5nZU1vZGVBcmVhIiwidHJhbnNsYXRlIiwiYm9va21hcmtFbmFibGVkIiwidG9nZ2xlQm9va21hcmsiLCJjaGFuZ2VNb2RlIiwic2VsZWN0VGV4dCIsImVkaXRWZXJzZVRleHQiLCJjb21tZW50VGV4dCIsImRpc3BsYXkiLCJtYXJnaW5MZWZ0IiwiQ29uZmlybUVkaXRWZXJzZUFyZWEiLCJ0YWdzIiwiY2FuY2VsRWRpdFZlcnNlIiwic2F2ZUVkaXRWZXJzZSIsImNhbmNlbFRleHQiLCJzYXZlVGV4dCIsIkNvbmZpcm1Db21tZW50QXJlYSIsImlzQ29tbWVudENoYW5nZWQiLCJjYW5jZWxDb21tZW50Iiwic2F2ZUNvbW1lbnQiLCJDb25maXJtU2VsZWN0aW9uQXJlYSIsImNsYXNzZXMiLCJ0b2dnbGVOb3RoaW5nVG9TZWxlY3QiLCJjYW5jZWxTZWxlY3Rpb24iLCJjbGVhclNlbGVjdGlvbiIsInNhdmVTZWxlY3Rpb24iLCJjbGVhclNlbGVjdGlvblRleHQiLCJldmVudCIsInRhcmdldCIsInJvb3QiLCJhbGlnblNlbGYiLCJBY3Rpb25zQXJlYSIsIm1vZGUiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJhcnJheSIsImlzUmVxdWlyZWQiLCJzdHJpbmciLCJib29sIiwib2JqZWN0IiwiZnVuYyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQTs7QUFDQTs7Ozs7O0FBRUEsSUFBTUEsTUFBTSxHQUFHO0FBQ2JDLEVBQUFBLFdBQVcsRUFBRTtBQUFFQyxJQUFBQSxNQUFNLEVBQUU7QUFBVixHQURBO0FBRWJDLEVBQUFBLEtBQUssRUFBRTtBQUNMQyxJQUFBQSxLQUFLLEVBQUUsMEJBREY7QUFFTEMsSUFBQUEsVUFBVSxFQUFFLFFBRlA7QUFHTEMsSUFBQUEsUUFBUSxFQUFFO0FBSEwsR0FGTTtBQU9iQyxFQUFBQSxZQUFZLEVBQUU7QUFDWixlQUFXLFVBREM7QUFFWixhQUFTLDBCQUZHO0FBR1osaUJBQWE7QUFBRUgsTUFBQUEsS0FBSyxFQUFFO0FBQVQ7QUFIRCxHQVBEO0FBWWJJLEVBQUFBLE9BQU8sRUFBRSxFQVpJO0FBYWJDLEVBQUFBLElBQUksRUFBRTtBQUNKTCxJQUFBQSxLQUFLLEVBQUUsMEJBREg7QUFFSk0sSUFBQUEsYUFBYSxFQUFFLFFBRlg7QUFHSlIsSUFBQUEsTUFBTSxFQUFFLEtBSEo7QUFJSlMsSUFBQUEsS0FBSyxFQUFFLEVBSkg7QUFLSkMsSUFBQUEsTUFBTSxFQUFFLEVBTEo7QUFNSkMsSUFBQUEsTUFBTSxFQUFFO0FBTkosR0FiTztBQXFCYkMsRUFBQUEsYUFBYSxFQUFFO0FBQ2JILElBQUFBLEtBQUssRUFBRSxPQURNO0FBRWJJLElBQUFBLFlBQVksRUFBRSxVQUZEO0FBR2JDLElBQUFBLFFBQVEsRUFBRSxRQUhHO0FBSWJDLElBQUFBLFVBQVUsRUFBRSxRQUpDO0FBS2JDLElBQUFBLFlBQVksRUFBRTtBQUxEO0FBckJGLENBQWY7O0FBOEJBLElBQU1DLG1CQUFtQixtQ0FDcEJuQixNQUFNLENBQUNjLGFBRGE7QUFFdkJNLEVBQUFBLFdBQVcsRUFBRTtBQUZVLEVBQXpCOztBQUtBLElBQU1DLHVCQUF1QixHQUFHLFNBQTFCQSx1QkFBMEIsQ0FBQ0Msb0JBQUQsRUFBdUJDLGVBQXZCLEVBQXdDQyxhQUF4QyxFQUF1REMsVUFBdkQsRUFBc0U7QUFDcEcsTUFBSUQsYUFBYSxDQUFDRSxNQUFkLEdBQXVCLENBQXZCLElBQTZCRixhQUFhLENBQUNFLE1BQWQsS0FBeUIsQ0FBekIsSUFBOEIsQ0FBQywyQkFBUUYsYUFBUixFQUF1QkMsVUFBdkIsQ0FBaEUsRUFBcUc7QUFDbkcsV0FBTywyQkFBUUQsYUFBUixFQUF1QkMsVUFBdkIsQ0FBUDtBQUNEOztBQUVELFNBQU9ILG9CQUFvQixLQUFLQyxlQUFoQztBQUNELENBTkQ7QUFRQTs7O0FBQ0EsSUFBTUksY0FBYyxHQUFHLFNBQWpCQSxjQUFpQixPQUtqQjtBQUFBLE1BSkpDLFNBSUksUUFKSkEsU0FJSTtBQUFBLE1BSEpDLGVBR0ksUUFISkEsZUFHSTtBQUFBLE1BRkpDLGNBRUksUUFGSkEsY0FFSTtBQUFBLE1BREpDLFVBQ0ksUUFESkEsVUFDSTtBQUNKLE1BQU1DLFVBQVUsR0FBR0osU0FBUyxDQUFDLFFBQUQsQ0FBNUI7QUFDQSxNQUFNSyxhQUFhLEdBQUdMLFNBQVMsQ0FBQyxZQUFELENBQS9CO0FBQ0EsTUFBTU0sV0FBVyxHQUFHTixTQUFTLENBQUMsU0FBRCxDQUE3QjtBQUNBLHNCQUNFO0FBQUssSUFBQSxTQUFTLEVBQUM7QUFBZixrQkFDRSxnQ0FBQyxvQkFBRDtBQUNFLElBQUEsS0FBSyxFQUFDLFVBRFI7QUFFRSxJQUFBLEtBQUssRUFBQyxTQUZSO0FBR0UsSUFBQSxPQUFPLEVBQUVDLGVBSFg7QUFJRSxJQUFBLEtBQUssRUFBRUQsU0FBUyxDQUFDLFVBQUQsQ0FKbEI7QUFLRSxJQUFBLFFBQVEsRUFBRUU7QUFMWixJQURGLGVBT0U7QUFBSyxJQUFBLEtBQUssRUFBRTtBQUFFSyxNQUFBQSxPQUFPLEVBQUUsTUFBWDtBQUFtQkMsTUFBQUEsVUFBVSxFQUFFO0FBQS9CO0FBQVosa0JBQ0UsZ0NBQUMsZ0JBQUQ7QUFDRSxJQUFBLFFBQVEsRUFBRSxLQURaO0FBRUUsSUFBQSxJQUFJLEVBQUMsUUFGUDtBQUdFLElBQUEsS0FBSyxFQUFFSixVQUhUO0FBSUUsSUFBQSxPQUFPLEVBQUUsQ0FBQyxDQUFDQSxVQUpiO0FBS0UsSUFBQSxVQUFVLEVBQUU7QUFMZCxrQkFPRTtBQUNFLElBQUEsS0FBSyxFQUFFYixtQkFEVDtBQUVFLElBQUEsU0FBUyxFQUFDLFlBRlo7QUFHRSxJQUFBLE9BQU8sRUFBRTtBQUFBLGFBQU1ZLFVBQVUsQ0FBQyxRQUFELENBQWhCO0FBQUE7QUFIWCxrQkFLRSxnQ0FBQyx5QkFBRDtBQUFXLElBQUEsS0FBSyxFQUFDLElBQWpCO0FBQXNCLElBQUEsS0FBSyxFQUFFO0FBQUVYLE1BQUFBLFdBQVcsRUFBRTtBQUFmO0FBQTdCLElBTEYsRUFNR1ksVUFOSCxDQVBGLENBREYsZUFpQkUsZ0NBQUMsZ0JBQUQ7QUFDRSxJQUFBLFFBQVEsRUFBRSxLQURaO0FBRUUsSUFBQSxJQUFJLEVBQUMsUUFGUDtBQUdFLElBQUEsS0FBSyxFQUFFQyxhQUhUO0FBSUUsSUFBQSxPQUFPLEVBQUUsQ0FBQyxDQUFDQSxhQUpiO0FBS0UsSUFBQSxVQUFVLEVBQUU7QUFMZCxrQkFPRTtBQUNFLElBQUEsS0FBSyxFQUFFZCxtQkFEVDtBQUVFLElBQUEsU0FBUyxFQUFDLFlBRlo7QUFHRSxJQUFBLE9BQU8sRUFBRTtBQUFBLGFBQU1ZLFVBQVUsQ0FBQyxNQUFELENBQWhCO0FBQUE7QUFIWCxrQkFLRSxnQ0FBQyx5QkFBRDtBQUFXLElBQUEsS0FBSyxFQUFDLFFBQWpCO0FBQTBCLElBQUEsS0FBSyxFQUFFO0FBQUVYLE1BQUFBLFdBQVcsRUFBRTtBQUFmO0FBQWpDLElBTEYsRUFNR2EsYUFOSCxDQVBGLENBakJGLGVBaUNFLGdDQUFDLGdCQUFEO0FBQ0UsSUFBQSxRQUFRLEVBQUUsS0FEWjtBQUVFLElBQUEsSUFBSSxFQUFDLFFBRlA7QUFHRSxJQUFBLEtBQUssRUFBRUMsV0FIVDtBQUlFLElBQUEsT0FBTyxFQUFFLENBQUMsQ0FBQ0EsV0FKYjtBQUtFLElBQUEsVUFBVSxFQUFFO0FBTGQsa0JBT0U7QUFDRSxJQUFBLEtBQUssRUFBRWxDLE1BQU0sQ0FBQ2MsYUFEaEI7QUFFRSxJQUFBLFNBQVMsRUFBQyxZQUZaO0FBR0UsSUFBQSxPQUFPLEVBQUU7QUFBQSxhQUFNaUIsVUFBVSxDQUFDLFNBQUQsQ0FBaEI7QUFBQTtBQUhYLGtCQUtFLGdDQUFDLHlCQUFEO0FBQVcsSUFBQSxLQUFLLEVBQUMsU0FBakI7QUFBMkIsSUFBQSxLQUFLLEVBQUU7QUFBRVgsTUFBQUEsV0FBVyxFQUFFO0FBQWY7QUFBbEMsSUFMRixFQU1HYyxXQU5ILENBUEYsQ0FqQ0YsQ0FQRixDQURGO0FBNERELENBckVEOztBQXVFQSxJQUFNRyxvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQXVCLFFBS3ZCO0FBQUEsTUFKSlQsU0FJSSxTQUpKQSxTQUlJO0FBQUEsTUFISlUsSUFHSSxTQUhKQSxJQUdJO0FBQUEsTUFGSkMsZUFFSSxTQUZKQSxlQUVJO0FBQUEsTUFESkMsYUFDSSxTQURKQSxhQUNJO0FBQ0osTUFBTUMsVUFBVSxHQUFHYixTQUFTLENBQUMsUUFBRCxDQUE1QjtBQUNBLE1BQU1jLFFBQVEsR0FBR2QsU0FBUyxDQUFDLE1BQUQsQ0FBMUI7QUFDQSxzQkFDRTtBQUFLLElBQUEsU0FBUyxFQUFDO0FBQWYsa0JBQ0UsZ0NBQUMsZ0JBQUQ7QUFDRSxJQUFBLFFBQVEsRUFBRSxLQURaO0FBRUUsSUFBQSxJQUFJLEVBQUMsUUFGUDtBQUdFLElBQUEsS0FBSyxFQUFFYSxVQUhUO0FBSUUsSUFBQSxPQUFPLEVBQUUsQ0FBQyxDQUFDQSxVQUpiO0FBS0UsSUFBQSxVQUFVLEVBQUU7QUFMZCxrQkFPRTtBQUNFLElBQUEsU0FBUyxFQUFDLFlBRFo7QUFFRSxJQUFBLE9BQU8sRUFBRUY7QUFGWCxLQUlHRSxVQUpILENBUEYsQ0FERixlQWVFLGdDQUFDLGdCQUFEO0FBQ0UsSUFBQSxRQUFRLEVBQUUsS0FEWjtBQUVFLElBQUEsSUFBSSxFQUFDLFFBRlA7QUFHRSxJQUFBLEtBQUssRUFBRUMsUUFIVDtBQUlFLElBQUEsT0FBTyxFQUFFLENBQUMsQ0FBQ0EsUUFKYjtBQUtFLElBQUEsVUFBVSxFQUFFO0FBTGQsa0JBT0U7QUFBUSxJQUFBLFNBQVMsRUFBQyxXQUFsQjtBQUNFLElBQUEsUUFBUSxFQUFFLENBQUNKLElBQUksQ0FBQ1osTUFEbEI7QUFFRSxJQUFBLE9BQU8sRUFBRWM7QUFGWCxrQkFJRSxnQ0FBQyx5QkFBRDtBQUFXLElBQUEsS0FBSyxFQUFDLElBQWpCO0FBQXNCLElBQUEsS0FBSyxFQUFFO0FBQUVwQixNQUFBQSxXQUFXLEVBQUU7QUFBZjtBQUE3QixJQUpGLEVBS0dzQixRQUxILENBUEYsQ0FmRixDQURGO0FBaUNELENBekNEOztBQTJDQSxJQUFNQyxrQkFBa0IsR0FBRyxTQUFyQkEsa0JBQXFCLFFBS3JCO0FBQUEsTUFKSmYsU0FJSSxTQUpKQSxTQUlJO0FBQUEsTUFISmdCLGdCQUdJLFNBSEpBLGdCQUdJO0FBQUEsTUFGSkMsYUFFSSxTQUZKQSxhQUVJO0FBQUEsTUFESkMsV0FDSSxTQURKQSxXQUNJO0FBQ0osTUFBTUwsVUFBVSxHQUFHYixTQUFTLENBQUMsUUFBRCxDQUE1QjtBQUNBLE1BQU1jLFFBQVEsR0FBR2QsU0FBUyxDQUFDLE1BQUQsQ0FBMUI7QUFDQSxzQkFDRTtBQUFLLElBQUEsU0FBUyxFQUFDO0FBQWYsa0JBQ0UsZ0NBQUMsZ0JBQUQ7QUFDRSxJQUFBLFFBQVEsRUFBRSxLQURaO0FBRUUsSUFBQSxJQUFJLEVBQUMsUUFGUDtBQUdFLElBQUEsS0FBSyxFQUFFYSxVQUhUO0FBSUUsSUFBQSxPQUFPLEVBQUUsQ0FBQyxDQUFDQSxVQUpiO0FBS0UsSUFBQSxVQUFVLEVBQUU7QUFMZCxrQkFPRTtBQUFRLElBQUEsU0FBUyxFQUFDLFlBQWxCO0FBQ0UsSUFBQSxPQUFPLEVBQUVJO0FBRFgsS0FHR0osVUFISCxDQVBGLENBREYsZUFjRSxnQ0FBQyxnQkFBRDtBQUNFLElBQUEsUUFBUSxFQUFFLEtBRFo7QUFFRSxJQUFBLElBQUksRUFBQyxRQUZQO0FBR0UsSUFBQSxLQUFLLEVBQUVDLFFBSFQ7QUFJRSxJQUFBLE9BQU8sRUFBRSxDQUFDLENBQUNBLFFBSmI7QUFLRSxJQUFBLFVBQVUsRUFBRTtBQUxkLGtCQU9FO0FBQVEsSUFBQSxTQUFTLEVBQUMsV0FBbEI7QUFDRSxJQUFBLFFBQVEsRUFBRSxDQUFDRSxnQkFEYjtBQUVFLElBQUEsT0FBTyxFQUFFRTtBQUZYLGtCQUlFLGdDQUFDLHlCQUFEO0FBQVcsSUFBQSxLQUFLLEVBQUMsSUFBakI7QUFBc0IsSUFBQSxLQUFLLEVBQUU7QUFBRTFCLE1BQUFBLFdBQVcsRUFBRTtBQUFmO0FBQTdCLElBSkYsRUFLR3NCLFFBTEgsQ0FQRixDQWRGLENBREY7QUFnQ0QsQ0F4Q0Q7O0FBMENBLElBQU1LLG9CQUFvQixHQUFHLFNBQXZCQSxvQkFBdUIsUUFXdkI7QUFBQSxNQVZKQyxPQVVJLFNBVkpBLE9BVUk7QUFBQSxNQVRKcEIsU0FTSSxTQVRKQSxTQVNJO0FBQUEsTUFSSk4sb0JBUUksU0FSSkEsb0JBUUk7QUFBQSxNQVBKRSxhQU9JLFNBUEpBLGFBT0k7QUFBQSxNQU5KRCxlQU1JLFNBTkpBLGVBTUk7QUFBQSxNQUxKRSxVQUtJLFNBTEpBLFVBS0k7QUFBQSxNQUpKd0IscUJBSUksU0FKSkEscUJBSUk7QUFBQSxNQUhKQyxlQUdJLFNBSEpBLGVBR0k7QUFBQSxNQUZKQyxjQUVJLFNBRkpBLGNBRUk7QUFBQSxNQURKQyxhQUNJLFNBREpBLGFBQ0k7QUFDSixNQUFNWCxVQUFVLEdBQUdiLFNBQVMsQ0FBQyxRQUFELENBQTVCO0FBQ0EsTUFBTXlCLGtCQUFrQixHQUFHekIsU0FBUyxDQUFDLGlCQUFELENBQXBDO0FBQ0EsTUFBTWMsUUFBUSxHQUFHZCxTQUFTLENBQUMsTUFBRCxDQUExQjtBQUNBLHNCQUNFO0FBQUssSUFBQSxTQUFTLEVBQUM7QUFBZixrQkFDRTtBQUFLLElBQUEsU0FBUyxFQUFDO0FBQWYsa0JBQ0UsZ0NBQUMsNEJBQUQ7QUFDRSxJQUFBLEtBQUssRUFBQyxLQURSO0FBRUUsSUFBQSxPQUFPLGVBQ0wsZ0NBQUMsb0JBQUQ7QUFDRSxNQUFBLE9BQU8sRUFBRU4sb0JBRFg7QUFFRSxNQUFBLFFBQVEsRUFBRUUsYUFBYSxJQUFJQSxhQUFhLENBQUNFLE1BQWQsR0FBdUIsQ0FGcEQ7QUFHRSxNQUFBLEtBQUssRUFBQyxTQUhSO0FBSUUsTUFBQSxRQUFRLEVBQUUsa0JBQUE0QixLQUFLO0FBQUEsZUFBSUwscUJBQXFCLENBQUNLLEtBQUssQ0FBQ0MsTUFBTixDQUFhL0MsT0FBZCxDQUF6QjtBQUFBLE9BSmpCO0FBS0UsTUFBQSxLQUFLLEVBQUMsaUJBTFI7QUFNRSxNQUFBLE9BQU8sRUFBRTtBQUNQZ0QsUUFBQUEsSUFBSSxFQUFFUixPQUFPLENBQUN6QyxZQURQO0FBRVBDLFFBQUFBLE9BQU8sRUFBRXdDLE9BQU8sQ0FBQ3hDO0FBRlYsT0FOWDtBQVVFLE1BQUEsSUFBSSxlQUFFLGdDQUFDLGdDQUFEO0FBQXFCLFFBQUEsS0FBSyxFQUFFO0FBQUVGLFVBQUFBLFFBQVEsRUFBRTtBQUFaO0FBQTVCLFFBVlI7QUFXRSxNQUFBLFdBQVcsZUFBRSxnQ0FBQyxvQkFBRDtBQUFjLFFBQUEsS0FBSyxFQUFFO0FBQUVBLFVBQUFBLFFBQVEsRUFBRTtBQUFaO0FBQXJCO0FBWGYsTUFISjtBQWlCRSxJQUFBLEtBQUssRUFBRXNCLFNBQVMsQ0FBQyxxQkFBRCxDQWpCbEI7QUFrQkUsSUFBQSxPQUFPLEVBQUU7QUFDUDRCLE1BQUFBLElBQUksRUFBRVIsT0FBTyxDQUFDL0MsV0FEUDtBQUVQRSxNQUFBQSxLQUFLLEVBQUU2QyxPQUFPLENBQUM3QztBQUZSO0FBbEJYLElBREYsZUF3QkU7QUFDRSxnQkFBVXlCLFNBQVMsQ0FBQywrQkFBRCxDQURyQjtBQUVFLGtCQUFXLEtBRmI7QUFHRSxtQkFBWSxPQUhkO0FBSUUsaUJBQVUsTUFKWjtBQUtFLGtCQUFXLG1CQUxiO0FBTUUsdUJBQWdCLEtBTmxCO0FBT0UsSUFBQSxLQUFLLEVBQUU7QUFBRWxCLE1BQUFBLGFBQWEsRUFBRSxPQUFqQjtBQUEwQkosTUFBQUEsUUFBUSxFQUFFO0FBQXBDO0FBUFQsa0JBU0UsZ0NBQUMsZ0JBQUQ7QUFBVSxJQUFBLE9BQU8sRUFBRTtBQUFFa0QsTUFBQUEsSUFBSSxFQUFFUixPQUFPLENBQUN2QztBQUFoQjtBQUFuQixJQVRGLGVBVUUsZ0NBQUMsd0JBQUQsT0FWRixDQXhCRixDQURGLGVBc0NFO0FBQUssSUFBQSxLQUFLLEVBQUU7QUFBRVEsTUFBQUEsVUFBVSxFQUFFO0FBQWQ7QUFBWixrQkFDRSxnQ0FBQyxnQkFBRDtBQUNFLElBQUEsUUFBUSxFQUFFLEtBRFo7QUFFRSxJQUFBLElBQUksRUFBQyxRQUZQO0FBR0UsSUFBQSxLQUFLLEVBQUV3QixVQUhUO0FBSUUsSUFBQSxPQUFPLEVBQUUsQ0FBQyxDQUFDQSxVQUpiO0FBS0UsSUFBQSxVQUFVLEVBQUU7QUFMZCxrQkFPRTtBQUNFLElBQUEsU0FBUyxFQUFDLFlBRFo7QUFFRSxJQUFBLEtBQUssa0NBQ0F0QixtQkFEQTtBQUNxQmlCLE1BQUFBLFVBQVUsRUFBRSxLQURqQztBQUN3Q3FCLE1BQUFBLFNBQVMsRUFBRTtBQURuRCxNQUZQO0FBS0UsSUFBQSxPQUFPLEVBQUVQO0FBTFgsS0FPR1QsVUFQSCxDQVBGLENBREYsZUFrQkUsZ0NBQUMsZ0JBQUQ7QUFDRSxJQUFBLFFBQVEsRUFBRSxLQURaO0FBRUUsSUFBQSxJQUFJLEVBQUMsUUFGUDtBQUdFLElBQUEsS0FBSyxFQUFFWSxrQkFIVDtBQUlFLElBQUEsT0FBTyxFQUFFLENBQUMsQ0FBQ0Esa0JBSmI7QUFLRSxJQUFBLFVBQVUsRUFBRTtBQUxkLGtCQU9FO0FBQ0UsSUFBQSxTQUFTLEVBQUMsWUFEWjtBQUVFLElBQUEsS0FBSyxFQUFFbEMsbUJBRlQ7QUFHRSxJQUFBLFFBQVEsRUFBRUssYUFBYSxDQUFDRSxNQUFkLEdBQXVCLENBQXZCLEdBQTJCLEtBQTNCLEdBQW1DLElBSC9DO0FBSUUsSUFBQSxPQUFPLEVBQUV5QjtBQUpYLGtCQU1FLGdDQUFDLHlCQUFEO0FBQVcsSUFBQSxLQUFLLEVBQUMsT0FBakI7QUFBeUIsSUFBQSxLQUFLLEVBQUU7QUFBRS9CLE1BQUFBLFdBQVcsRUFBRTtBQUFmO0FBQWhDLElBTkYsRUFPR2lDLGtCQVBILENBUEYsQ0FsQkYsZUFtQ0UsZ0NBQUMsZ0JBQUQ7QUFDRSxJQUFBLFFBQVEsRUFBRSxLQURaO0FBRUUsSUFBQSxJQUFJLEVBQUMsUUFGUDtBQUdFLElBQUEsS0FBSyxFQUFFWCxRQUhUO0FBSUUsSUFBQSxPQUFPLEVBQUUsQ0FBQyxDQUFDQSxRQUpiO0FBS0UsSUFBQSxVQUFVLEVBQUU7QUFMZCxrQkFPRTtBQUNFLElBQUEsU0FBUyxFQUFDLFdBRFo7QUFFRSxJQUFBLEtBQUssRUFBRXZCLG1CQUZUO0FBR0UsSUFBQSxRQUFRLEVBQUVFLHVCQUF1QixDQUFDQyxvQkFBRCxFQUF1QkMsZUFBdkIsRUFBd0NDLGFBQXhDLEVBQXVEQyxVQUF2RCxDQUhuQztBQUlFLElBQUEsT0FBTyxFQUFFMkI7QUFKWCxrQkFNRSxnQ0FBQyx5QkFBRDtBQUFXLElBQUEsS0FBSyxFQUFDLElBQWpCO0FBQXNCLElBQUEsS0FBSyxFQUFFO0FBQUVoQyxNQUFBQSxXQUFXLEVBQUU7QUFBZjtBQUE3QixJQU5GLEVBT0dzQixRQVBILENBUEYsQ0FuQ0YsQ0F0Q0YsQ0FERjtBQThGRCxDQTdHRDtBQThHQTs7O0FBRUEsSUFBTWdCLFdBQVcsR0FBRyxTQUFkQSxXQUFjLFFBcUJkO0FBQUEsTUFwQkpwQixJQW9CSSxTQXBCSkEsSUFvQkk7QUFBQSxNQW5CSnFCLElBbUJJLFNBbkJKQSxJQW1CSTtBQUFBLE1BbEJKZixnQkFrQkksU0FsQkpBLGdCQWtCSTtBQUFBLE1BakJKbkIsVUFpQkksU0FqQkpBLFVBaUJJO0FBQUEsTUFoQkpELGFBZ0JJLFNBaEJKQSxhQWdCSTtBQUFBLE1BZkpLLGVBZUksU0FmSkEsZUFlSTtBQUFBLE1BZEp1QixhQWNJLFNBZEpBLGFBY0k7QUFBQSxNQWJKRixlQWFJLFNBYkpBLGVBYUk7QUFBQSxNQVpKQyxjQVlJLFNBWkpBLGNBWUk7QUFBQSxNQVhKdkIsU0FXSSxTQVhKQSxTQVdJO0FBQUEsTUFWSm9CLE9BVUksU0FWSkEsT0FVSTtBQUFBLE1BVEoxQixvQkFTSSxTQVRKQSxvQkFTSTtBQUFBLE1BUkpDLGVBUUksU0FSSkEsZUFRSTtBQUFBLE1BUEowQixxQkFPSSxTQVBKQSxxQkFPSTtBQUFBLE1BTkpuQixjQU1JLFNBTkpBLGNBTUk7QUFBQSxNQUxKQyxVQUtJLFNBTEpBLFVBS0k7QUFBQSxNQUpKUSxlQUlJLFNBSkpBLGVBSUk7QUFBQSxNQUhKQyxhQUdJLFNBSEpBLGFBR0k7QUFBQSxNQUZKSyxhQUVJLFNBRkpBLGFBRUk7QUFBQSxNQURKQyxXQUNJLFNBREpBLFdBQ0k7O0FBQ0osVUFBUWEsSUFBUjtBQUNBLFNBQUssTUFBTDtBQUNFLDBCQUNFLGdDQUFDLG9CQUFEO0FBQ0UsUUFBQSxJQUFJLEVBQUVyQixJQURSO0FBRUUsUUFBQSxTQUFTLEVBQUVWLFNBRmI7QUFHRSxRQUFBLGVBQWUsRUFBRVcsZUFIbkI7QUFJRSxRQUFBLGFBQWEsRUFBRUM7QUFKakIsUUFERjs7QUFRRixTQUFLLFNBQUw7QUFDRSwwQkFDRSxnQ0FBQyxrQkFBRDtBQUNFLFFBQUEsU0FBUyxFQUFFWixTQURiO0FBRUUsUUFBQSxnQkFBZ0IsRUFBRWdCLGdCQUZwQjtBQUdFLFFBQUEsYUFBYSxFQUFFQyxhQUhqQjtBQUlFLFFBQUEsV0FBVyxFQUFFQztBQUpmLFFBREY7O0FBUUYsU0FBSyxRQUFMO0FBQ0UsMEJBQ0UsZ0NBQUMsb0JBQUQ7QUFDRSxRQUFBLE9BQU8sRUFBRUUsT0FEWDtBQUVFLFFBQUEsU0FBUyxFQUFFcEIsU0FGYjtBQUdFLFFBQUEsb0JBQW9CLEVBQUVOLG9CQUh4QjtBQUlFLFFBQUEsYUFBYSxFQUFFRSxhQUpqQjtBQUtFLFFBQUEsZUFBZSxFQUFFRCxlQUxuQjtBQU1FLFFBQUEsVUFBVSxFQUFFRSxVQU5kO0FBT0UsUUFBQSxxQkFBcUIsRUFBRXdCLHFCQVB6QjtBQVFFLFFBQUEsZUFBZSxFQUFFQyxlQVJuQjtBQVNFLFFBQUEsY0FBYyxFQUFFQyxjQVRsQjtBQVVFLFFBQUEsYUFBYSxFQUFFQztBQVZqQixRQURGOztBQWNGLFNBQUssU0FBTDtBQUNFLDBCQUNFLGdDQUFDLGNBQUQ7QUFDRSxRQUFBLFNBQVMsRUFBRXhCLFNBRGI7QUFFRSxRQUFBLGVBQWUsRUFBRUMsZUFGbkI7QUFHRSxRQUFBLGNBQWMsRUFBRUMsY0FIbEI7QUFJRSxRQUFBLFVBQVUsRUFBRUM7QUFKZCxRQURGOztBQVFGO0FBQ0UsMEJBQ0UsZ0NBQUMsY0FBRDtBQUNFLFFBQUEsU0FBUyxFQUFFSCxTQURiO0FBRUUsUUFBQSxlQUFlLEVBQUVDLGVBRm5CO0FBR0UsUUFBQSxjQUFjLEVBQUVDLGNBSGxCO0FBSUUsUUFBQSxVQUFVLEVBQUVDO0FBSmQsUUFERjtBQTVDRjtBQXFERCxDQTNFRDs7QUE2RUEyQixXQUFXLENBQUNFLFNBQVosR0FBd0I7QUFDdEJ0QixFQUFBQSxJQUFJLEVBQUV1QixzQkFBVUMsS0FBVixDQUFnQkMsVUFEQTtBQUV0QkosRUFBQUEsSUFBSSxFQUFFRSxzQkFBVUcsTUFBVixDQUFpQkQsVUFGRDtBQUd0Qm5CLEVBQUFBLGdCQUFnQixFQUFFaUIsc0JBQVVJLElBQVYsQ0FBZUYsVUFIWDtBQUl0QnRDLEVBQUFBLFVBQVUsRUFBRW9DLHNCQUFVQyxLQUFWLENBQWdCQyxVQUpOO0FBS3RCdkMsRUFBQUEsYUFBYSxFQUFFcUMsc0JBQVVDLEtBQVYsQ0FBZ0JDLFVBTFQ7QUFNdEJsQyxFQUFBQSxlQUFlLEVBQUVnQyxzQkFBVUksSUFBVixDQUFlRixVQU5WO0FBT3RCZixFQUFBQSxPQUFPLEVBQUVhLHNCQUFVSyxNQUFWLENBQWlCSCxVQVBKO0FBUXRCekMsRUFBQUEsb0JBQW9CLEVBQUV1QyxzQkFBVUksSUFBVixDQUFlRixVQVJmO0FBU3RCeEMsRUFBQUEsZUFBZSxFQUFFc0Msc0JBQVVJLElBQVYsQ0FBZUYsVUFUVjtBQVV0QlgsRUFBQUEsYUFBYSxFQUFFUyxzQkFBVU0sSUFBVixDQUFlSixVQVZSO0FBV3RCYixFQUFBQSxlQUFlLEVBQUVXLHNCQUFVTSxJQUFWLENBQWVKLFVBWFY7QUFZdEJaLEVBQUFBLGNBQWMsRUFBRVUsc0JBQVVNLElBQVYsQ0FBZUosVUFaVDtBQWF0Qm5DLEVBQUFBLFNBQVMsRUFBRWlDLHNCQUFVTSxJQUFWLENBQWVKLFVBYko7QUFjdEJkLEVBQUFBLHFCQUFxQixFQUFFWSxzQkFBVU0sSUFBVixDQUFlSixVQWRoQjtBQWV0QmpDLEVBQUFBLGNBQWMsRUFBRStCLHNCQUFVTSxJQUFWLENBQWVKLFVBZlQ7QUFnQnRCaEMsRUFBQUEsVUFBVSxFQUFFOEIsc0JBQVVNLElBQVYsQ0FBZUosVUFoQkw7QUFpQnRCeEIsRUFBQUEsZUFBZSxFQUFFc0Isc0JBQVVNLElBQVYsQ0FBZUosVUFqQlY7QUFrQnRCdkIsRUFBQUEsYUFBYSxFQUFFcUIsc0JBQVVNLElBQVYsQ0FBZUosVUFsQlI7QUFtQnRCbEIsRUFBQUEsYUFBYSxFQUFFZ0Isc0JBQVVNLElBQVYsQ0FBZUosVUFuQlI7QUFvQnRCakIsRUFBQUEsV0FBVyxFQUFFZSxzQkFBVU0sSUFBVixDQUFlSjtBQXBCTixDQUF4Qjs7ZUF1QmUsd0JBQVcvRCxNQUFYLEVBQW1CMEQsV0FBbkIsQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgR2x5cGhpY29uIH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2RlZXAtZXF1YWwnO1xuaW1wb3J0IENoZWNrYm94IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL0NoZWNrYm94JztcbmltcG9ydCB7IHdpdGhTdHlsZXMgfSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9zdHlsZXMnO1xuaW1wb3J0IEZvcm1Db250cm9sTGFiZWwgZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvRm9ybUNvbnRyb2xMYWJlbCc7XG5pbXBvcnQgSW5mb0ljb24gZnJvbSAnQG1hdGVyaWFsLXVpL2ljb25zL0luZm8nO1xuaW1wb3J0IENoZWNrQm94T3V0bGluZUljb24gZnJvbSAnQG1hdGVyaWFsLXVpL2ljb25zL0NoZWNrQm94T3V0bGluZUJsYW5rJztcbmltcG9ydCBDaGVja0JveEljb24gZnJvbSAnQG1hdGVyaWFsLXVpL2ljb25zL0NoZWNrQm94JztcbmltcG9ydCBSZWFjdFRvb2x0aXAgZnJvbSAncmVhY3QtdG9vbHRpcCc7XG4vLyBjb21wb25lbnRzXG5pbXBvcnQgQm9va21hcmsgZnJvbSAnLi4vLi4vQm9va21hcmsnO1xuLy8gY3NzXG5pbXBvcnQgJy4vQWN0aW9uc0FyZWEuc3R5bGVzLmNzcyc7XG5pbXBvcnQgSGludCBmcm9tICcuLi8uLi9IaW50L0hpbnQnO1xuXG5jb25zdCBzdHlsZXMgPSB7XG4gIGZvcm1Db250cm9sOiB7IG1hcmdpbjogJzAnIH0sXG4gIGxhYmVsOiB7XG4gICAgY29sb3I6ICd2YXIoLS1hY2NlbnQtY29sb3ItZGFyayknLFxuICAgIGZvbnRXZWlnaHQ6ICdub3JtYWwnLFxuICAgIGZvbnRTaXplOiAxNCxcbiAgfSxcbiAgY2hlY2tCb3hSb290OiB7XG4gICAgJ3BhZGRpbmcnOiAnMTJweCA1cHgnLFxuICAgICdjb2xvcic6ICd2YXIoLS1hY2NlbnQtY29sb3ItZGFyayknLFxuICAgICcmJGNoZWNrZWQnOiB7IGNvbG9yOiAndmFyKC0tYWNjZW50LWNvbG9yLWRhcmspJyB9LFxuICB9LFxuICBjaGVja2VkOiB7fSxcbiAgaWNvbjoge1xuICAgIGNvbG9yOiAndmFyKC0tYWNjZW50LWNvbG9yLWRhcmspJyxcbiAgICB2ZXJ0aWNhbEFsaWduOiAnbWlkZGxlJyxcbiAgICBtYXJnaW46ICc1cHgnLFxuICAgIHdpZHRoOiAzMCxcbiAgICBoZWlnaHQ6IDMwLFxuICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICB9LFxuICBhY3Rpb25CdXR0b25zOiB7XG4gICAgd2lkdGg6ICcxNDBweCcsXG4gICAgdGV4dE92ZXJmbG93OiAnZWxsaXBzaXMnLFxuICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJyxcbiAgICBwYWRkaW5nUmlnaHQ6ICcwcHgnLFxuICB9LFxufTtcblxuY29uc3QgYWN0aW9uQnV0dG9uU3R5bGVSTSA9IHtcbiAgLi4uc3R5bGVzLmFjdGlvbkJ1dHRvbnMsXG4gIG1hcmdpblJpZ2h0OiAnNXB4Jyxcbn07XG5cbmNvbnN0IGlzU2VsZWN0aW9uc1NhdmVEaXNhYmxlID0gKGxvY2FsTm90aGluZ1RvU2VsZWN0LCBub3RoaW5nVG9TZWxlY3QsIG5ld1NlbGVjdGlvbnMsIHNlbGVjdGlvbnMpID0+IHtcbiAgaWYgKG5ld1NlbGVjdGlvbnMubGVuZ3RoID4gMCB8fCAobmV3U2VsZWN0aW9ucy5sZW5ndGggPT09IDAgJiYgIWlzRXF1YWwobmV3U2VsZWN0aW9ucywgc2VsZWN0aW9ucykpKSB7XG4gICAgcmV0dXJuIGlzRXF1YWwobmV3U2VsZWN0aW9ucywgc2VsZWN0aW9ucyk7XG4gIH1cblxuICByZXR1cm4gbG9jYWxOb3RoaW5nVG9TZWxlY3QgPT09IG5vdGhpbmdUb1NlbGVjdDtcbn07XG5cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L3Byb3AtdHlwZXMgKi9cbmNvbnN0IENoYW5nZU1vZGVBcmVhID0gKHtcbiAgdHJhbnNsYXRlLFxuICBib29rbWFya0VuYWJsZWQsXG4gIHRvZ2dsZUJvb2ttYXJrLFxuICBjaGFuZ2VNb2RlLFxufSkgPT4ge1xuICBjb25zdCBzZWxlY3RUZXh0ID0gdHJhbnNsYXRlKCdzZWxlY3QnKTtcbiAgY29uc3QgZWRpdFZlcnNlVGV4dCA9IHRyYW5zbGF0ZSgnZWRpdF92ZXJzZScpO1xuICBjb25zdCBjb21tZW50VGV4dCA9IHRyYW5zbGF0ZSgnY29tbWVudCcpO1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPSdhY3Rpb25zLWFyZWEnPlxuICAgICAgPEJvb2ttYXJrXG4gICAgICAgIHZhbHVlPSdib29rbWFyaydcbiAgICAgICAgY29sb3I9J3ByaW1hcnknXG4gICAgICAgIGNoZWNrZWQ9e2Jvb2ttYXJrRW5hYmxlZH1cbiAgICAgICAgbGFiZWw9e3RyYW5zbGF0ZSgnYm9va21hcmsnKX1cbiAgICAgICAgb25DaGFuZ2U9e3RvZ2dsZUJvb2ttYXJrfSAvPlxuICAgICAgPGRpdiBzdHlsZT17eyBkaXNwbGF5OiAnZmxleCcsIG1hcmdpbkxlZnQ6ICdhdXRvJyB9fT5cbiAgICAgICAgPEhpbnRcbiAgICAgICAgICBwb3NpdGlvbj17J3RvcCd9XG4gICAgICAgICAgc2l6ZT0nbWVkaXVtJ1xuICAgICAgICAgIGxhYmVsPXtzZWxlY3RUZXh0fVxuICAgICAgICAgIGVuYWJsZWQ9eyEhc2VsZWN0VGV4dH1cbiAgICAgICAgICBoaW50TGVuZ3RoPXsxNH1cbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHN0eWxlPXthY3Rpb25CdXR0b25TdHlsZVJNfVxuICAgICAgICAgICAgY2xhc3NOYW1lPSdidG4tc2Vjb25kJ1xuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gY2hhbmdlTW9kZSgnc2VsZWN0Jyl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEdseXBoaWNvbiBnbHlwaD0nb2snIHN0eWxlPXt7IG1hcmdpblJpZ2h0OiAnMTBweCcgfX0gLz5cbiAgICAgICAgICAgIHtzZWxlY3RUZXh0fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L0hpbnQ+XG4gICAgICAgIDxIaW50XG4gICAgICAgICAgcG9zaXRpb249eyd0b3AnfVxuICAgICAgICAgIHNpemU9J21lZGl1bSdcbiAgICAgICAgICBsYWJlbD17ZWRpdFZlcnNlVGV4dH1cbiAgICAgICAgICBlbmFibGVkPXshIWVkaXRWZXJzZVRleHR9XG4gICAgICAgICAgaGludExlbmd0aD17MTR9XG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBzdHlsZT17YWN0aW9uQnV0dG9uU3R5bGVSTX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT0nYnRuLXNlY29uZCdcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGNoYW5nZU1vZGUoJ2VkaXQnKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPSdwZW5jaWwnIHN0eWxlPXt7IG1hcmdpblJpZ2h0OiAnMTBweCcgfX0gLz5cbiAgICAgICAgICAgIHtlZGl0VmVyc2VUZXh0fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L0hpbnQ+XG4gICAgICAgIDxIaW50XG4gICAgICAgICAgcG9zaXRpb249eyd0b3AnfVxuICAgICAgICAgIHNpemU9J21lZGl1bSdcbiAgICAgICAgICBsYWJlbD17Y29tbWVudFRleHR9XG4gICAgICAgICAgZW5hYmxlZD17ISFjb21tZW50VGV4dH1cbiAgICAgICAgICBoaW50TGVuZ3RoPXsxNH1cbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHN0eWxlPXtzdHlsZXMuYWN0aW9uQnV0dG9uc31cbiAgICAgICAgICAgIGNsYXNzTmFtZT0nYnRuLXNlY29uZCdcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGNoYW5nZU1vZGUoJ2NvbW1lbnQnKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPSdjb21tZW50JyBzdHlsZT17eyBtYXJnaW5SaWdodDogJzEwcHgnIH19IC8+XG4gICAgICAgICAgICB7Y29tbWVudFRleHR9XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvSGludD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuY29uc3QgQ29uZmlybUVkaXRWZXJzZUFyZWEgPSAoe1xuICB0cmFuc2xhdGUsXG4gIHRhZ3MsXG4gIGNhbmNlbEVkaXRWZXJzZSxcbiAgc2F2ZUVkaXRWZXJzZSxcbn0pID0+IHtcbiAgY29uc3QgY2FuY2VsVGV4dCA9IHRyYW5zbGF0ZSgnY2FuY2VsJyk7XG4gIGNvbnN0IHNhdmVUZXh0ID0gdHJhbnNsYXRlKCdzYXZlJyk7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9J2FjdGlvbnMtYXJlYSc+XG4gICAgICA8SGludFxuICAgICAgICBwb3NpdGlvbj17J3RvcCd9XG4gICAgICAgIHNpemU9J21lZGl1bSdcbiAgICAgICAgbGFiZWw9e2NhbmNlbFRleHR9XG4gICAgICAgIGVuYWJsZWQ9eyEhY2FuY2VsVGV4dH1cbiAgICAgICAgaGludExlbmd0aD17MTR9XG4gICAgICA+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzc05hbWU9J2J0bi1zZWNvbmQnXG4gICAgICAgICAgb25DbGljaz17Y2FuY2VsRWRpdFZlcnNlfVxuICAgICAgICA+XG4gICAgICAgICAge2NhbmNlbFRleHR9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9IaW50PlxuICAgICAgPEhpbnRcbiAgICAgICAgcG9zaXRpb249eyd0b3AnfVxuICAgICAgICBzaXplPSdtZWRpdW0nXG4gICAgICAgIGxhYmVsPXtzYXZlVGV4dH1cbiAgICAgICAgZW5hYmxlZD17ISFzYXZlVGV4dH1cbiAgICAgICAgaGludExlbmd0aD17MTR9XG4gICAgICA+XG4gICAgICAgIDxidXR0b24gY2xhc3NOYW1lPSdidG4tcHJpbWUnXG4gICAgICAgICAgZGlzYWJsZWQ9eyF0YWdzLmxlbmd0aH1cbiAgICAgICAgICBvbkNsaWNrPXtzYXZlRWRpdFZlcnNlfVxuICAgICAgICA+XG4gICAgICAgICAgPEdseXBoaWNvbiBnbHlwaD0nb2snIHN0eWxlPXt7IG1hcmdpblJpZ2h0OiAnMTBweCcgfX0gLz5cbiAgICAgICAgICB7c2F2ZVRleHR9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9IaW50PlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuY29uc3QgQ29uZmlybUNvbW1lbnRBcmVhID0gKHtcbiAgdHJhbnNsYXRlLFxuICBpc0NvbW1lbnRDaGFuZ2VkLFxuICBjYW5jZWxDb21tZW50LFxuICBzYXZlQ29tbWVudCxcbn0pID0+IHtcbiAgY29uc3QgY2FuY2VsVGV4dCA9IHRyYW5zbGF0ZSgnY2FuY2VsJyk7XG4gIGNvbnN0IHNhdmVUZXh0ID0gdHJhbnNsYXRlKCdzYXZlJyk7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9J2FjdGlvbnMtYXJlYSc+XG4gICAgICA8SGludFxuICAgICAgICBwb3NpdGlvbj17J3RvcCd9XG4gICAgICAgIHNpemU9J21lZGl1bSdcbiAgICAgICAgbGFiZWw9e2NhbmNlbFRleHR9XG4gICAgICAgIGVuYWJsZWQ9eyEhY2FuY2VsVGV4dH1cbiAgICAgICAgaGludExlbmd0aD17MTR9XG4gICAgICA+XG4gICAgICAgIDxidXR0b24gY2xhc3NOYW1lPSdidG4tc2Vjb25kJ1xuICAgICAgICAgIG9uQ2xpY2s9e2NhbmNlbENvbW1lbnR9XG4gICAgICAgID5cbiAgICAgICAgICB7Y2FuY2VsVGV4dH1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L0hpbnQ+XG4gICAgICA8SGludFxuICAgICAgICBwb3NpdGlvbj17J3RvcCd9XG4gICAgICAgIHNpemU9J21lZGl1bSdcbiAgICAgICAgbGFiZWw9e3NhdmVUZXh0fVxuICAgICAgICBlbmFibGVkPXshIXNhdmVUZXh0fVxuICAgICAgICBoaW50TGVuZ3RoPXsxNH1cbiAgICAgID5cbiAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9J2J0bi1wcmltZSdcbiAgICAgICAgICBkaXNhYmxlZD17IWlzQ29tbWVudENoYW5nZWR9XG4gICAgICAgICAgb25DbGljaz17c2F2ZUNvbW1lbnR9XG4gICAgICAgID5cbiAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPSdvaycgc3R5bGU9e3sgbWFyZ2luUmlnaHQ6ICcxMHB4JyB9fS8+XG4gICAgICAgICAge3NhdmVUZXh0fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvSGludD5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmNvbnN0IENvbmZpcm1TZWxlY3Rpb25BcmVhID0gKHtcbiAgY2xhc3NlcyxcbiAgdHJhbnNsYXRlLFxuICBsb2NhbE5vdGhpbmdUb1NlbGVjdCxcbiAgbmV3U2VsZWN0aW9ucyxcbiAgbm90aGluZ1RvU2VsZWN0LFxuICBzZWxlY3Rpb25zLFxuICB0b2dnbGVOb3RoaW5nVG9TZWxlY3QsXG4gIGNhbmNlbFNlbGVjdGlvbixcbiAgY2xlYXJTZWxlY3Rpb24sXG4gIHNhdmVTZWxlY3Rpb24sXG59KSA9PiB7XG4gIGNvbnN0IGNhbmNlbFRleHQgPSB0cmFuc2xhdGUoJ2NhbmNlbCcpO1xuICBjb25zdCBjbGVhclNlbGVjdGlvblRleHQgPSB0cmFuc2xhdGUoJ2NsZWFyX3NlbGVjdGlvbicpO1xuICBjb25zdCBzYXZlVGV4dCA9IHRyYW5zbGF0ZSgnc2F2ZScpO1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPSdzZWxlY3Rpb24tYWN0aW9ucy1hcmVhJz5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdmbGV4LXJvdyc+XG4gICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgdmFsdWU9XCJlbmRcIlxuICAgICAgICAgIGNvbnRyb2w9e1xuICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgIGNoZWNrZWQ9e2xvY2FsTm90aGluZ1RvU2VsZWN0fVxuICAgICAgICAgICAgICBkaXNhYmxlZD17bmV3U2VsZWN0aW9ucyAmJiBuZXdTZWxlY3Rpb25zLmxlbmd0aCA+IDB9XG4gICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXtldmVudCA9PiB0b2dnbGVOb3RoaW5nVG9TZWxlY3QoZXZlbnQudGFyZ2V0LmNoZWNrZWQpfVxuICAgICAgICAgICAgICB2YWx1ZT1cIm5vdGhpbmdUb1NlbGVjdFwiXG4gICAgICAgICAgICAgIGNsYXNzZXM9e3tcbiAgICAgICAgICAgICAgICByb290OiBjbGFzc2VzLmNoZWNrQm94Um9vdCxcbiAgICAgICAgICAgICAgICBjaGVja2VkOiBjbGFzc2VzLmNoZWNrZWQsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIGljb249ezxDaGVja0JveE91dGxpbmVJY29uIHN0eWxlPXt7IGZvbnRTaXplOiAnMjRweCcgfX0vPn1cbiAgICAgICAgICAgICAgY2hlY2tlZEljb249ezxDaGVja0JveEljb24gc3R5bGU9e3sgZm9udFNpemU6ICcyNHB4JyB9fS8+fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgbGFiZWw9e3RyYW5zbGF0ZSgnbm9fc2VsZWN0aW9uX25lZWRlZCcpfVxuICAgICAgICAgIGNsYXNzZXM9e3tcbiAgICAgICAgICAgIHJvb3Q6IGNsYXNzZXMuZm9ybUNvbnRyb2wsXG4gICAgICAgICAgICBsYWJlbDogY2xhc3Nlcy5sYWJlbCxcbiAgICAgICAgICB9fVxuICAgICAgICAvPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgZGF0YS10aXA9e3RyYW5zbGF0ZSgnbm90aGluZ190b19zZWxlY3RfZGVzY3JpcHRpb24nKX1cbiAgICAgICAgICBkYXRhLXBsYWNlPVwidG9wXCJcbiAgICAgICAgICBkYXRhLWVmZmVjdD1cImZsb2F0XCJcbiAgICAgICAgICBkYXRhLXR5cGU9XCJkYXJrXCJcbiAgICAgICAgICBkYXRhLWNsYXNzPVwic2VsZWN0aW9uLXRvb2x0aXBcIlxuICAgICAgICAgIGRhdGEtZGVsYXktaGlkZT1cIjEwMFwiXG4gICAgICAgICAgc3R5bGU9e3sgdmVydGljYWxBbGlnbjogJ3N1cGVyJywgZm9udFNpemU6ICcwLjhlbScgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxJbmZvSWNvbiBjbGFzc2VzPXt7IHJvb3Q6IGNsYXNzZXMuaWNvbiB9fS8+XG4gICAgICAgICAgPFJlYWN0VG9vbHRpcC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPXt7IHdoaXRlU3BhY2U6ICdub3dyYXAnIH19PlxuICAgICAgICA8SGludFxuICAgICAgICAgIHBvc2l0aW9uPXsndG9wJ31cbiAgICAgICAgICBzaXplPSdtZWRpdW0nXG4gICAgICAgICAgbGFiZWw9e2NhbmNlbFRleHR9XG4gICAgICAgICAgZW5hYmxlZD17ISFjYW5jZWxUZXh0fVxuICAgICAgICAgIGhpbnRMZW5ndGg9ezE0fVxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3NOYW1lPSdidG4tc2Vjb25kJ1xuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgLi4uYWN0aW9uQnV0dG9uU3R5bGVSTSwgbWFyZ2luTGVmdDogJzBweCcsIGFsaWduU2VsZjogJ2ZsZXgtc3RhcnQnLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIG9uQ2xpY2s9e2NhbmNlbFNlbGVjdGlvbn1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7Y2FuY2VsVGV4dH1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9IaW50PlxuICAgICAgICA8SGludFxuICAgICAgICAgIHBvc2l0aW9uPXsndG9wJ31cbiAgICAgICAgICBzaXplPSdtZWRpdW0nXG4gICAgICAgICAgbGFiZWw9e2NsZWFyU2VsZWN0aW9uVGV4dH1cbiAgICAgICAgICBlbmFibGVkPXshIWNsZWFyU2VsZWN0aW9uVGV4dH1cbiAgICAgICAgICBoaW50TGVuZ3RoPXsxNH1cbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzTmFtZT0nYnRuLXNlY29uZCdcbiAgICAgICAgICAgIHN0eWxlPXthY3Rpb25CdXR0b25TdHlsZVJNfVxuICAgICAgICAgICAgZGlzYWJsZWQ9e25ld1NlbGVjdGlvbnMubGVuZ3RoID4gMCA/IGZhbHNlIDogdHJ1ZX1cbiAgICAgICAgICAgIG9uQ2xpY2s9e2NsZWFyU2VsZWN0aW9ufVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxHbHlwaGljb24gZ2x5cGg9J2VyYXNlJyBzdHlsZT17eyBtYXJnaW5SaWdodDogJzEwcHgnIH19Lz5cbiAgICAgICAgICAgIHtjbGVhclNlbGVjdGlvblRleHR9XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvSGludD5cbiAgICAgICAgPEhpbnRcbiAgICAgICAgICBwb3NpdGlvbj17J3RvcCd9XG4gICAgICAgICAgc2l6ZT0nbWVkaXVtJ1xuICAgICAgICAgIGxhYmVsPXtzYXZlVGV4dH1cbiAgICAgICAgICBlbmFibGVkPXshIXNhdmVUZXh0fVxuICAgICAgICAgIGhpbnRMZW5ndGg9ezE0fVxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3NOYW1lPSdidG4tcHJpbWUnXG4gICAgICAgICAgICBzdHlsZT17YWN0aW9uQnV0dG9uU3R5bGVSTX1cbiAgICAgICAgICAgIGRpc2FibGVkPXtpc1NlbGVjdGlvbnNTYXZlRGlzYWJsZShsb2NhbE5vdGhpbmdUb1NlbGVjdCwgbm90aGluZ1RvU2VsZWN0LCBuZXdTZWxlY3Rpb25zLCBzZWxlY3Rpb25zKX1cbiAgICAgICAgICAgIG9uQ2xpY2s9e3NhdmVTZWxlY3Rpb259XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEdseXBoaWNvbiBnbHlwaD0nb2snIHN0eWxlPXt7IG1hcmdpblJpZ2h0OiAnMTBweCcgfX0vPlxuICAgICAgICAgICAge3NhdmVUZXh0fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L0hpbnQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG4vKiBlc2xpbnQtZW5hYmxlIHJlYWN0L3Byb3AtdHlwZXMgKi9cblxuY29uc3QgQWN0aW9uc0FyZWEgPSAoe1xuICB0YWdzLFxuICBtb2RlLFxuICBpc0NvbW1lbnRDaGFuZ2VkLFxuICBzZWxlY3Rpb25zLFxuICBuZXdTZWxlY3Rpb25zLFxuICBib29rbWFya0VuYWJsZWQsXG4gIHNhdmVTZWxlY3Rpb24sXG4gIGNhbmNlbFNlbGVjdGlvbixcbiAgY2xlYXJTZWxlY3Rpb24sXG4gIHRyYW5zbGF0ZSxcbiAgY2xhc3NlcyxcbiAgbG9jYWxOb3RoaW5nVG9TZWxlY3QsXG4gIG5vdGhpbmdUb1NlbGVjdCxcbiAgdG9nZ2xlTm90aGluZ1RvU2VsZWN0LFxuICB0b2dnbGVCb29rbWFyayxcbiAgY2hhbmdlTW9kZSxcbiAgY2FuY2VsRWRpdFZlcnNlLFxuICBzYXZlRWRpdFZlcnNlLFxuICBjYW5jZWxDb21tZW50LFxuICBzYXZlQ29tbWVudCxcbn0pID0+IHtcbiAgc3dpdGNoIChtb2RlKSB7XG4gIGNhc2UgJ2VkaXQnOlxuICAgIHJldHVybiAoXG4gICAgICA8Q29uZmlybUVkaXRWZXJzZUFyZWFcbiAgICAgICAgdGFncz17dGFnc31cbiAgICAgICAgdHJhbnNsYXRlPXt0cmFuc2xhdGV9XG4gICAgICAgIGNhbmNlbEVkaXRWZXJzZT17Y2FuY2VsRWRpdFZlcnNlfVxuICAgICAgICBzYXZlRWRpdFZlcnNlPXtzYXZlRWRpdFZlcnNlfVxuICAgICAgLz5cbiAgICApO1xuICBjYXNlICdjb21tZW50JzpcbiAgICByZXR1cm4gKFxuICAgICAgPENvbmZpcm1Db21tZW50QXJlYVxuICAgICAgICB0cmFuc2xhdGU9e3RyYW5zbGF0ZX1cbiAgICAgICAgaXNDb21tZW50Q2hhbmdlZD17aXNDb21tZW50Q2hhbmdlZH1cbiAgICAgICAgY2FuY2VsQ29tbWVudD17Y2FuY2VsQ29tbWVudH1cbiAgICAgICAgc2F2ZUNvbW1lbnQ9e3NhdmVDb21tZW50fVxuICAgICAgLz5cbiAgICApO1xuICBjYXNlICdzZWxlY3QnOlxuICAgIHJldHVybiAoXG4gICAgICA8Q29uZmlybVNlbGVjdGlvbkFyZWFcbiAgICAgICAgY2xhc3Nlcz17Y2xhc3Nlc31cbiAgICAgICAgdHJhbnNsYXRlPXt0cmFuc2xhdGV9XG4gICAgICAgIGxvY2FsTm90aGluZ1RvU2VsZWN0PXtsb2NhbE5vdGhpbmdUb1NlbGVjdH1cbiAgICAgICAgbmV3U2VsZWN0aW9ucz17bmV3U2VsZWN0aW9uc31cbiAgICAgICAgbm90aGluZ1RvU2VsZWN0PXtub3RoaW5nVG9TZWxlY3R9XG4gICAgICAgIHNlbGVjdGlvbnM9e3NlbGVjdGlvbnN9XG4gICAgICAgIHRvZ2dsZU5vdGhpbmdUb1NlbGVjdD17dG9nZ2xlTm90aGluZ1RvU2VsZWN0fVxuICAgICAgICBjYW5jZWxTZWxlY3Rpb249e2NhbmNlbFNlbGVjdGlvbn1cbiAgICAgICAgY2xlYXJTZWxlY3Rpb249e2NsZWFyU2VsZWN0aW9ufVxuICAgICAgICBzYXZlU2VsZWN0aW9uPXtzYXZlU2VsZWN0aW9ufVxuICAgICAgLz5cbiAgICApO1xuICBjYXNlICdkZWZhdWx0JzpcbiAgICByZXR1cm4gKFxuICAgICAgPENoYW5nZU1vZGVBcmVhXG4gICAgICAgIHRyYW5zbGF0ZT17dHJhbnNsYXRlfVxuICAgICAgICBib29rbWFya0VuYWJsZWQ9e2Jvb2ttYXJrRW5hYmxlZH1cbiAgICAgICAgdG9nZ2xlQm9va21hcms9e3RvZ2dsZUJvb2ttYXJrfVxuICAgICAgICBjaGFuZ2VNb2RlPXtjaGFuZ2VNb2RlfVxuICAgICAgLz5cbiAgICApO1xuICBkZWZhdWx0OlxuICAgIHJldHVybiAoXG4gICAgICA8Q2hhbmdlTW9kZUFyZWFcbiAgICAgICAgdHJhbnNsYXRlPXt0cmFuc2xhdGV9XG4gICAgICAgIGJvb2ttYXJrRW5hYmxlZD17Ym9va21hcmtFbmFibGVkfVxuICAgICAgICB0b2dnbGVCb29rbWFyaz17dG9nZ2xlQm9va21hcmt9XG4gICAgICAgIGNoYW5nZU1vZGU9e2NoYW5nZU1vZGV9XG4gICAgICAvPlxuICAgICk7XG4gIH1cbn07XG5cbkFjdGlvbnNBcmVhLnByb3BUeXBlcyA9IHtcbiAgdGFnczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gIG1vZGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgaXNDb21tZW50Q2hhbmdlZDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgc2VsZWN0aW9uczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gIG5ld1NlbGVjdGlvbnM6IFByb3BUeXBlcy5hcnJheS5pc1JlcXVpcmVkLFxuICBib29rbWFya0VuYWJsZWQ6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgbG9jYWxOb3RoaW5nVG9TZWxlY3Q6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gIG5vdGhpbmdUb1NlbGVjdDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgc2F2ZVNlbGVjdGlvbjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgY2FuY2VsU2VsZWN0aW9uOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBjbGVhclNlbGVjdGlvbjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgdHJhbnNsYXRlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICB0b2dnbGVOb3RoaW5nVG9TZWxlY3Q6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHRvZ2dsZUJvb2ttYXJrOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBjaGFuZ2VNb2RlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBjYW5jZWxFZGl0VmVyc2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHNhdmVFZGl0VmVyc2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGNhbmNlbENvbW1lbnQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHNhdmVDb21tZW50OiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMpKEFjdGlvbnNBcmVhKTtcbiJdfQ==