@pie-lib/math-input 6.31.2-next.11 → 6.31.3-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/CHANGELOG.md +6 -64
  2. package/lib/__tests__/math-input-test.js +56 -0
  3. package/lib/horizontal-keypad.js +17 -45
  4. package/lib/horizontal-keypad.js.map +1 -1
  5. package/lib/index.js +4 -26
  6. package/lib/index.js.map +1 -1
  7. package/lib/keypad/__tests__/index.test.js +28 -0
  8. package/lib/keypad/__tests__/keys-layout.test.js +13 -0
  9. package/lib/keypad/index.js +255 -333
  10. package/lib/keypad/index.js.map +1 -1
  11. package/lib/keypad/keys-layout.js +3 -13
  12. package/lib/keypad/keys-layout.js.map +1 -1
  13. package/lib/keys/__tests__/utils.test.js +49 -0
  14. package/lib/keys/basic-operators.js +6 -14
  15. package/lib/keys/basic-operators.js.map +1 -1
  16. package/lib/keys/chars.js +6 -11
  17. package/lib/keys/chars.js.map +1 -1
  18. package/lib/keys/comparison.js +7 -17
  19. package/lib/keys/comparison.js.map +1 -1
  20. package/lib/keys/constants.js +5 -11
  21. package/lib/keys/constants.js.map +1 -1
  22. package/lib/keys/digits.js +2 -8
  23. package/lib/keys/digits.js.map +1 -1
  24. package/lib/keys/edit.js +2 -5
  25. package/lib/keys/edit.js.map +1 -1
  26. package/lib/keys/exponent.js +5 -11
  27. package/lib/keys/exponent.js.map +1 -1
  28. package/lib/keys/fractions.js +4 -9
  29. package/lib/keys/fractions.js.map +1 -1
  30. package/lib/keys/geometry.js +26 -55
  31. package/lib/keys/geometry.js.map +1 -1
  32. package/lib/keys/grades.js +11 -47
  33. package/lib/keys/grades.js.map +1 -1
  34. package/lib/keys/index.js +14 -33
  35. package/lib/keys/index.js.map +1 -1
  36. package/lib/keys/log.js +4 -9
  37. package/lib/keys/log.js.map +1 -1
  38. package/lib/keys/logic.js +3 -7
  39. package/lib/keys/logic.js.map +1 -1
  40. package/lib/keys/matrices.js +3 -7
  41. package/lib/keys/matrices.js.map +1 -1
  42. package/lib/keys/misc.js +11 -23
  43. package/lib/keys/misc.js.map +1 -1
  44. package/lib/keys/navigation.js +3 -8
  45. package/lib/keys/navigation.js.map +1 -1
  46. package/lib/keys/operators.js +2 -5
  47. package/lib/keys/operators.js.map +1 -1
  48. package/lib/keys/statistics.js +6 -13
  49. package/lib/keys/statistics.js.map +1 -1
  50. package/lib/keys/sub-sup.js +3 -7
  51. package/lib/keys/sub-sup.js.map +1 -1
  52. package/lib/keys/trigonometry.js +7 -15
  53. package/lib/keys/trigonometry.js.map +1 -1
  54. package/lib/keys/utils.js +8 -41
  55. package/lib/keys/utils.js.map +1 -1
  56. package/lib/keys/vars.js +4 -9
  57. package/lib/keys/vars.js.map +1 -1
  58. package/lib/math-input.js +53 -104
  59. package/lib/math-input.js.map +1 -1
  60. package/lib/mq/__tests__/input.test.js +49 -0
  61. package/lib/mq/__tests__/static.test.js +43 -0
  62. package/lib/mq/common-mq-styles.js +8 -19
  63. package/lib/mq/common-mq-styles.js.map +1 -1
  64. package/lib/mq/custom-elements.js +2 -5
  65. package/lib/mq/custom-elements.js.map +1 -1
  66. package/lib/mq/index.js +1 -5
  67. package/lib/mq/index.js.map +1 -1
  68. package/lib/mq/input.js +23 -76
  69. package/lib/mq/input.js.map +1 -1
  70. package/lib/mq/static.js +35 -93
  71. package/lib/mq/static.js.map +1 -1
  72. package/lib/shared/constants.js +4 -7
  73. package/lib/updateSpans.js +2 -6
  74. package/lib/updateSpans.js.map +1 -1
  75. package/package.json +10 -18
  76. package/src/__tests__/math-input-test.jsx +31 -71
  77. package/src/keypad/__tests__/index.test.jsx +18 -17
  78. package/src/keypad/index.jsx +172 -169
  79. package/src/math-input.jsx +35 -44
  80. package/src/mq/__tests__/input.test.jsx +26 -78
  81. package/src/mq/__tests__/static.test.jsx +14 -38
  82. package/src/mq/input.jsx +9 -9
  83. package/src/mq/static.jsx +3 -0
  84. package/esm/index.css +0 -847
  85. package/esm/index.js +0 -44393
  86. package/esm/index.js.map +0 -1
  87. package/esm/package.json +0 -3
  88. package/src/__tests__/__snapshots__/math-input-test.jsx.snap +0 -152
  89. package/src/keypad/__tests__/__snapshots__/index.test.jsx.snap +0 -193
  90. package/src/mq/__tests__/__snapshots__/input.test.jsx.snap +0 -9
@@ -1,193 +1,161 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  var _typeof = require("@babel/runtime/helpers/typeof");
6
-
7
5
  Object.defineProperty(exports, "__esModule", {
8
6
  value: true
9
7
  });
10
8
  exports["default"] = exports.KeyPad = void 0;
11
-
12
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
-
14
10
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
15
-
16
11
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
17
-
18
12
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
19
-
20
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
21
-
22
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
23
-
24
13
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
25
-
26
14
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
27
-
15
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
28
16
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
29
-
30
17
  var _react = _interopRequireDefault(require("react"));
31
-
32
18
  var _propTypes = _interopRequireDefault(require("prop-types"));
33
-
34
- var _Button = _interopRequireDefault(require("@material-ui/core/Button"));
35
-
36
- var _IconButton = _interopRequireDefault(require("@material-ui/core/IconButton"));
37
-
38
- var _styles = require("@material-ui/core/styles");
39
-
40
- var _classnames = _interopRequireDefault(require("classnames"));
41
-
42
- var _colorManipulator = require("@material-ui/core/styles/colorManipulator");
43
-
44
- var _green = _interopRequireDefault(require("@material-ui/core/colors/green"));
45
-
19
+ var _Button = _interopRequireDefault(require("@mui/material/Button"));
20
+ var _IconButton = _interopRequireDefault(require("@mui/material/IconButton"));
21
+ var _styles = require("@mui/material/styles");
46
22
  var _debug = _interopRequireDefault(require("debug"));
47
-
48
23
  var _lodash = _interopRequireDefault(require("lodash"));
49
-
50
24
  var _mathquill = _interopRequireDefault(require("@pie-framework/mathquill"));
51
-
52
25
  var mq = _interopRequireWildcard(require("../mq"));
53
-
54
26
  var _keys = require("../keys");
55
-
56
27
  var _constants = _interopRequireDefault(require("./../shared/constants"));
57
-
58
28
  var _commonMqStyles = require("../mq/common-mq-styles");
59
-
60
29
  var _keysLayout = require("./keys-layout");
61
-
62
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
63
-
64
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
65
-
66
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
67
-
68
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
69
-
70
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
71
-
72
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
73
-
30
+ var _colors = require("@mui/material/colors");
31
+ var _renderUi = require("@pie-lib/render-ui");
32
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
33
+ function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
34
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
35
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
36
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
74
37
  var log = (0, _debug["default"])('pie-lib:math-inline:keypad');
75
- var LatexButton = (0, _styles.withStyles)(function (theme) {
38
+ var StyledLatexButton = (0, _styles.styled)(_Button["default"])(function () {
76
39
  return {
77
- root: {
78
- textTransform: 'none',
79
- padding: 0,
80
- margin: 0,
81
- fontSize: '110% !important'
40
+ textTransform: 'none',
41
+ padding: 0,
42
+ margin: 0,
43
+ fontSize: '110% !important'
44
+ };
45
+ });
46
+ var LatexButtonContent = (0, _styles.styled)(mq.Static)(function (_ref) {
47
+ var latex = _ref.latex;
48
+ var baseStyles = {
49
+ pointerEvents: 'none',
50
+ textTransform: 'none !important',
51
+ color: _renderUi.color.text(),
52
+ '& .mq-scaled.mq-sqrt-prefix': {
53
+ transform: 'scale(1, 0.9) !important'
82
54
  },
83
- latexButton: {
84
- pointerEvents: 'none',
85
- textTransform: 'none !important',
86
- '& .mq-scaled.mq-sqrt-prefix': {
87
- transform: 'scale(1, 0.9) !important'
88
- },
89
- '& .mq-sup-only .mq-sup': {
90
- marginBottom: '0.9px !important'
91
- },
92
- '& .mq-empty': {
93
- backgroundColor: "".concat((0, _colorManipulator.fade)(theme.palette.secondary.main, 0.4), " !important")
94
- },
95
- '& .mq-overline .mq-overline-inner': {
96
- borderTop: '2px solid black'
97
- },
98
- '& .mq-non-leaf.mq-overline': {
99
- borderTop: 'none !important' // fixing PD-4873 - in OT, it has border-top 1px and adds extra line
100
-
101
- },
102
- '& .mq-overarrow': {
103
- width: '30px',
104
- marginTop: '0 !important',
105
- borderTop: '2px solid black',
106
- fontFamily: 'Roboto, Helvetica, Arial, sans-serif !important',
107
- '&.mq-arrow-both': {
108
- top: '0px !important',
109
- '& *': {
110
- lineHeight: '1 !important',
111
- borderTop: 'none !important' // fixing PD-4873 - in OT, it has border-top 1px and adds extra line,
112
-
113
- },
114
- '&:before': {
115
- fontSize: '80%',
116
- left: 'calc(-13%) !important',
117
- top: '-0.31em !important'
118
- },
119
- '&:after': {
120
- fontSize: '80% !important',
121
- right: 'calc(-13%) !important',
122
- top: '-1.5em'
123
- },
124
- '&.mq-empty:before': {
125
- fontSize: '80%',
126
- left: 'calc(-13%)',
127
- top: '-0.26em'
128
- },
129
- '&.mq-empty:after': {
130
- fontSize: '80%',
131
- right: 'calc(-13%)',
132
- top: '-0.26em'
133
- },
134
- '&.mq-empty': {
135
- minHeight: '1.4em'
136
- }
55
+ '& .mq-sup-only .mq-sup': {
56
+ marginBottom: '0.9px !important'
57
+ },
58
+ '& .mq-empty': {
59
+ backgroundColor: "".concat((0, _styles.alpha)(_colors.pink[300], 0.4), " !important")
60
+ },
61
+ '& .mq-overline .mq-overline-inner': {
62
+ borderTop: '2px solid black'
63
+ },
64
+ '& .mq-non-leaf.mq-overline': {
65
+ borderTop: 'none !important'
66
+ },
67
+ '& .mq-overarrow': {
68
+ width: '30px',
69
+ marginTop: '0 !important',
70
+ borderTop: '2px solid black',
71
+ fontFamily: 'Roboto, Helvetica, Arial, sans-serif !important',
72
+ '&.mq-arrow-both': {
73
+ top: '0px !important',
74
+ '& *': {
75
+ lineHeight: '1 !important',
76
+ borderTop: 'none !important'
137
77
  },
138
- '&.mq-arrow-right:before': {
78
+ '&:before': {
139
79
  fontSize: '80%',
80
+ left: 'calc(-13%) !important',
81
+ top: '-0.31em !important'
82
+ },
83
+ '&:after': {
84
+ fontSize: '80% !important',
140
85
  right: 'calc(-13%) !important',
141
- top: '-0.26em !important'
86
+ top: '-1.5em'
142
87
  },
143
- '& .mq-overarrow-inner': {
144
- border: 'none !important'
88
+ '&.mq-empty:before': {
89
+ fontSize: '80%',
90
+ left: 'calc(-13%)',
91
+ top: '-0.26em'
145
92
  },
146
- '& .mq-overarrow-inner .mq-overarrow-inner-right': {
147
- display: 'none !important'
93
+ '&.mq-empty:after': {
94
+ fontSize: '80%',
95
+ right: 'calc(-13%)',
96
+ top: '-0.26em'
97
+ },
98
+ '&.mq-empty': {
99
+ minHeight: '1.4em'
148
100
  }
149
101
  },
150
- '& .mq-root-block': {
151
- padding: '5px !important'
152
- },
153
- '& .mq-overarrow.mq-arrow-both.mq-empty:after': {
154
- right: '-6px',
155
- fontSize: '80% !important',
156
- top: '-3px'
157
- },
158
- '& .mq-overarrow.mq-arrow-right.mq-empty:before': {
159
- right: '-5px',
160
- fontSize: '80% !important',
161
- top: '-3px'
162
- },
163
- '& .mq-overarrow.mq-arrow-both.mq-empty:before': {
164
- left: '-6px',
165
- fontSize: '80% !important',
166
- top: '-3px'
167
- },
168
- '& .mq-longdiv-inner': {
169
- borderTop: '1px solid !important',
170
- paddingTop: '1.5px !important'
102
+ '&.mq-arrow-right:before': {
103
+ fontSize: '80%',
104
+ right: 'calc(-13%) !important',
105
+ top: '-0.26em !important'
171
106
  },
172
- '& .mq-parallelogram': {
173
- lineHeight: 0.85
107
+ '& .mq-overarrow-inner': {
108
+ border: 'none !important'
174
109
  },
175
- '& .mq-overarc': {
176
- borderTop: '2px solid black !important',
177
- '& .mq-overline': {
178
- borderTop: 'none !important' // fixing PD-4873 - in OT, it has border-top 1px and adds extra line
179
-
180
- },
181
- '& .mq-overline-inner': {
182
- borderTop: 'none !important',
183
- paddingTop: '0 !important'
184
- }
110
+ '& .mq-overarrow-inner .mq-overarrow-inner-right': {
111
+ display: 'none !important'
185
112
  }
186
113
  },
187
- parallelButton: {
188
- fontStyle: 'italic !important'
114
+ '& .mq-root-block': {
115
+ padding: '5px !important'
116
+ },
117
+ '& .mq-overarrow.mq-arrow-both.mq-empty:after': {
118
+ right: '-6px',
119
+ fontSize: '80% !important',
120
+ top: '-3px'
121
+ },
122
+ '& .mq-overarrow.mq-arrow-right.mq-empty:before': {
123
+ right: '-5px',
124
+ fontSize: '80% !important',
125
+ top: '-3px'
126
+ },
127
+ '& .mq-overarrow.mq-arrow-both.mq-empty:before': {
128
+ left: '-6px',
129
+ fontSize: '80% !important',
130
+ top: '-3px'
131
+ },
132
+ '& .mq-longdiv-inner': {
133
+ borderTop: '1px solid !important',
134
+ paddingTop: '1.5px !important'
189
135
  },
190
- leftRightArrowButton: {
136
+ '& .mq-parallelogram': {
137
+ lineHeight: 0.85
138
+ },
139
+ '& .mq-overarc': {
140
+ borderTop: '2px solid black !important',
141
+ '& .mq-overline': {
142
+ borderTop: 'none !important'
143
+ },
144
+ '& .mq-overline-inner': {
145
+ borderTop: 'none !important',
146
+ paddingTop: '0 !important'
147
+ }
148
+ }
149
+ };
150
+
151
+ // Add specific styles based on latex content
152
+ if (latex === '\\parallel') {
153
+ return _objectSpread(_objectSpread({}, baseStyles), {}, {
154
+ fontStyle: 'italic !important'
155
+ });
156
+ }
157
+ if (latex === '\\overleftrightarrow{\\overline{}}') {
158
+ return _objectSpread(_objectSpread({}, baseStyles), {}, {
191
159
  '& .mq-overarrow.mq-arrow-both': {
192
160
  '& .mq-overline-inner': {
193
161
  borderTop: 'none !important',
@@ -198,41 +166,15 @@ var LatexButton = (0, _styles.withStyles)(function (theme) {
198
166
  top: '0px !important'
199
167
  }
200
168
  }
201
- }
202
- };
203
- })(function (props) {
204
- var buttonClass;
205
-
206
- if (props.latex === '\\parallel') {
207
- buttonClass = (0, _classnames["default"])(props.classes.latexButton, props.mqClassName, props.classes.parallelButton);
208
- } else if (props.latex === '\\overleftrightarrow{\\overline{}}') {
209
- buttonClass = (0, _classnames["default"])(props.classes.latexButton, props.mqClassName, props.classes.leftRightArrowButton);
210
- } else {
211
- buttonClass = (0, _classnames["default"])(props.classes.latexButton, props.mqClassName);
212
- }
213
-
214
- try {
215
- var MQ = _mathquill["default"].getInterface(2);
216
-
217
- var span = document.createElement('span');
218
- span.innerHTML = '';
219
- var mathField = MQ.StaticMath(span);
220
- mathField.parseLatex(props.latex);
221
- mathField.latex(props.latex);
222
- } catch (e) {
223
- // received latex has errors - do not create button
224
- return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null);
169
+ });
225
170
  }
226
-
227
- return /*#__PURE__*/_react["default"].createElement(_Button["default"], {
228
- className: (0, _classnames["default"])(props.classes.root, props.className),
229
- onClick: props.onClick,
230
- "aria-label": props.ariaLabel
231
- }, /*#__PURE__*/_react["default"].createElement(mq.Static, {
232
- className: buttonClass,
233
- latex: props.latex
234
- }));
171
+ return baseStyles;
235
172
  });
173
+ LatexButtonContent.propTypes = {
174
+ latex: _propTypes["default"].string.isRequired
175
+ };
176
+
177
+ // LatexButton component removed - LatexButtonContent is used directly instead
236
178
 
237
179
  var createCustomLayout = function createCustomLayout(layoutObj) {
238
180
  if (layoutObj) {
@@ -242,72 +184,140 @@ var createCustomLayout = function createCustomLayout(layoutObj) {
242
184
  gridAutoFlow: 'initial'
243
185
  };
244
186
  }
245
-
246
187
  return {};
247
188
  };
248
-
249
- var KeyPad = /*#__PURE__*/function (_React$Component) {
250
- (0, _inherits2["default"])(KeyPad, _React$Component);
251
-
252
- var _super = _createSuper(KeyPad);
253
-
189
+ var KeyPadContainer = (0, _styles.styled)('div')(function () {
190
+ return _objectSpread(_objectSpread({}, _commonMqStyles.commonMqKeyboardStyles), {}, {
191
+ width: '100%',
192
+ display: 'grid',
193
+ gridTemplateRows: 'repeat(5, minmax(40px, 60px))',
194
+ gridRowGap: '0px',
195
+ gridColumnGap: '0px',
196
+ gridAutoFlow: 'column',
197
+ '&.character': {
198
+ textTransform: 'initial !important',
199
+ gridTemplateRows: 'repeat(5, minmax(40px, 50px)) !important'
200
+ },
201
+ '&.language': {
202
+ gridTemplateRows: 'repeat(4, minmax(40px, 50px)) !important',
203
+ '& *': {
204
+ fontFamily: 'Roboto, Helvetica, Arial, sans-serif !important'
205
+ }
206
+ }
207
+ });
208
+ });
209
+ var StyledButton = (0, _styles.styled)(_Button["default"])(function (_ref2) {
210
+ var category = _ref2.category,
211
+ isDelete = _ref2.isDelete,
212
+ isComma = _ref2.isComma,
213
+ isDot = _ref2.isDot;
214
+ return _objectSpread({
215
+ minWidth: 'auto',
216
+ fontSize: isComma || isDot ? '200% !important' : '140% !important',
217
+ lineHeight: isComma || isDot ? '100%' : 'normal',
218
+ color: _renderUi.color.text(),
219
+ backgroundColor: category === 'operators' ? (0, _styles.lighten)(_colors.pink[300], 0.5) :
220
+ // this code with green seems to not be applied to current implementation, so I commented it out, but left it here just in case
221
+ // category === 'comparison' ? lighten(green[500], 0.5) :
222
+ (0, _styles.lighten)(_colors.indigo[300], 0.5),
223
+ '&:hover': {
224
+ backgroundColor: category === 'operators' ? (0, _styles.lighten)(_colors.pink[300], 0.7) :
225
+ // category === 'comparison' ? lighten(green[500], 0.7) :
226
+ (0, _styles.lighten)(_colors.indigo[300], 0.7)
227
+ },
228
+ borderRadius: 0
229
+ }, isDelete && {
230
+ '& > span': {
231
+ fontFamily: 'Roboto, Helvetica, Arial, sans-serif !important'
232
+ }
233
+ });
234
+ });
235
+ var StyledLatexButtonWrapper = (0, _styles.styled)(_Button["default"])(function (_ref3) {
236
+ var category = _ref3.category;
237
+ return {
238
+ minWidth: 'auto',
239
+ borderRadius: 0,
240
+ backgroundColor: category === 'operators' ? (0, _styles.lighten)(_colors.pink[300], 0.5) :
241
+ // category === 'comparison' ? lighten(green[500], 0.5) :
242
+ (0, _styles.lighten)(_colors.indigo[300], 0.5),
243
+ '&:hover': {
244
+ backgroundColor: category === 'operators' ? (0, _styles.lighten)(_colors.pink[300], 0.7) :
245
+ // category === 'comparison' ? lighten(green[500], 0.7) :
246
+ (0, _styles.lighten)(_colors.indigo[300], 0.7)
247
+ }
248
+ };
249
+ });
250
+ var StyledIconButton = (0, _styles.styled)(_IconButton["default"])(function (_ref4) {
251
+ var category = _ref4.category;
252
+ return {
253
+ minWidth: 'auto',
254
+ backgroundColor: category === 'operators' ? (0, _styles.lighten)(_colors.pink[300], 0.5) :
255
+ // category === 'comparison' ? lighten(green[500], 0.5) :
256
+ (0, _styles.lighten)(_colors.indigo[300], 0.5),
257
+ '&:hover': {
258
+ backgroundColor: category === 'operators' ? (0, _styles.lighten)(_colors.pink[300], 0.7) :
259
+ // category === 'comparison' ? lighten(green[500], 0.7) :
260
+ (0, _styles.lighten)(_colors.indigo[300], 0.7)
261
+ },
262
+ borderRadius: 0,
263
+ '& .icon': {
264
+ height: '30px'
265
+ }
266
+ };
267
+ });
268
+ var KeyPad = exports.KeyPad = /*#__PURE__*/function (_React$Component) {
254
269
  function KeyPad(props) {
255
270
  var _this;
256
-
257
271
  (0, _classCallCheck2["default"])(this, KeyPad);
258
- _this = _super.call(this, props);
259
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleKeypadInteraction", function () {
272
+ _this = _callSuper(this, KeyPad, [props]);
273
+ (0, _defineProperty2["default"])(_this, "handleKeypadInteraction", function () {
260
274
  // Check if the setKeypadInteraction prop is available, which is used for both
261
275
  // the language keypad and the special characters keypad
262
276
  if (_this.props.setKeypadInteraction) {
263
277
  _this.props.setKeypadInteraction(true);
264
278
  }
265
279
  });
266
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "buttonClick", function (key) {
280
+ (0, _defineProperty2["default"])(_this, "buttonClick", function (key) {
267
281
  log('[buttonClick]', key);
268
282
  var onPress = _this.props.onPress;
269
283
  onPress(key);
270
284
  });
271
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "flowKeys", function (base, extras) {
285
+ (0, _defineProperty2["default"])(_this, "flowKeys", function (base, extras) {
272
286
  var transposed = [].concat((0, _toConsumableArray2["default"])((0, _keysLayout.sortKeys)(base)), (0, _toConsumableArray2["default"])((0, _keysLayout.sortKeys)(extras)));
273
287
  return _lodash["default"].flatten(transposed);
274
288
  });
275
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "keyIsNotAllowed", function (key) {
289
+ (0, _defineProperty2["default"])(_this, "keyIsNotAllowed", function (key) {
276
290
  var noDecimal = _this.props.noDecimal;
277
-
278
291
  if ((key.write === '.' && key.label === '.' || key.write === ',' && key.label === ',') && noDecimal) {
279
292
  return true;
280
293
  }
281
-
282
294
  return false;
283
295
  });
284
296
  _this.keypadRef = /*#__PURE__*/_react["default"].createRef();
285
297
  return _this;
286
298
  }
287
-
288
- (0, _createClass2["default"])(KeyPad, [{
299
+ (0, _inherits2["default"])(KeyPad, _React$Component);
300
+ return (0, _createClass2["default"])(KeyPad, [{
289
301
  key: "componentDidMount",
290
302
  value: function componentDidMount() {
291
303
  var _this$keypadRef;
292
-
293
304
  var keyPadElement = (_this$keypadRef = this.keypadRef) === null || _this$keypadRef === void 0 ? void 0 : _this$keypadRef.current;
294
305
  var mainContainer = keyPadElement === null || keyPadElement === void 0 ? void 0 : keyPadElement.closest(".".concat(_constants["default"].MAIN_CONTAINER_CLASS));
295
- var currentToolbar = keyPadElement === null || keyPadElement === void 0 ? void 0 : keyPadElement.closest('.pie-toolbar'); // need only for math keyboard so we need also controlledKeypadMode
306
+ var currentToolbar = keyPadElement === null || keyPadElement === void 0 ? void 0 : keyPadElement.closest('.pie-toolbar');
296
307
 
308
+ // need only for math keyboard so we need also controlledKeypadMode
297
309
  if (this.props.controlledKeypadMode && mainContainer && currentToolbar) {
298
310
  var mainContainerPosition = mainContainer.getBoundingClientRect();
299
311
  var currentToolbarPosition = currentToolbar.getBoundingClientRect();
300
312
  var difference = mainContainerPosition.top + mainContainerPosition.height - (currentToolbarPosition.top + currentToolbarPosition.height);
301
-
302
313
  if (difference < 0) {
303
- var totalHeight = mainContainerPosition.height + mainContainerPosition.top - difference; // increase the height of the main container if keyboard needs it
304
-
314
+ var totalHeight = mainContainerPosition.height + mainContainerPosition.top - difference;
315
+ // increase the height of the main container if keyboard needs it
305
316
  if (mainContainer) {
306
317
  mainContainer.style.height = "".concat(totalHeight, "px");
307
318
  }
308
319
  }
309
320
  }
310
-
311
321
  if (keyPadElement) {
312
322
  keyPadElement.addEventListener('touchstart', this.handleKeypadInteraction, true);
313
323
  keyPadElement.addEventListener('mousedown', this.handleKeypadInteraction, true);
@@ -317,17 +327,14 @@ var KeyPad = /*#__PURE__*/function (_React$Component) {
317
327
  key: "componentWillUnmount",
318
328
  value: function componentWillUnmount() {
319
329
  var _this$keypadRef2;
320
-
321
- var keyPadElement = (_this$keypadRef2 = this.keypadRef) === null || _this$keypadRef2 === void 0 ? void 0 : _this$keypadRef2.current; // need only for math keyboard
322
-
330
+ var keyPadElement = (_this$keypadRef2 = this.keypadRef) === null || _this$keypadRef2 === void 0 ? void 0 : _this$keypadRef2.current;
331
+ // need only for math keyboard
323
332
  if (this.props.controlledKeypadMode && keyPadElement) {
324
333
  var mainContainer = keyPadElement.closest(".".concat(_constants["default"].MAIN_CONTAINER_CLASS));
325
-
326
334
  if (mainContainer) {
327
335
  mainContainer.style.height = 'unset';
328
336
  }
329
337
  }
330
-
331
338
  if (keyPadElement) {
332
339
  keyPadElement.removeEventListener('touchstart', this.handleKeypadInteraction, true);
333
340
  keyPadElement.removeEventListener('mousedown', this.handleKeypadInteraction, true);
@@ -337,82 +344,77 @@ var KeyPad = /*#__PURE__*/function (_React$Component) {
337
344
  key: "render",
338
345
  value: function render() {
339
346
  var _this2 = this;
340
-
341
347
  var _this$props = this.props,
342
- classes = _this$props.classes,
343
- className = _this$props.className,
344
- baseSet = _this$props.baseSet,
345
- additionalKeys = _this$props.additionalKeys,
346
- layoutForKeyPad = _this$props.layoutForKeyPad,
347
- onFocus = _this$props.onFocus,
348
- mode = _this$props.mode;
348
+ className = _this$props.className,
349
+ baseSet = _this$props.baseSet,
350
+ additionalKeys = _this$props.additionalKeys,
351
+ layoutForKeyPad = _this$props.layoutForKeyPad,
352
+ onFocus = _this$props.onFocus,
353
+ mode = _this$props.mode;
349
354
  var noBaseSet = ['non-negative-integers', 'integers', 'decimals', 'fractions', 'item-authoring', 'language'];
350
355
  var keysWithoutBaseSet = noBaseSet.includes(mode);
351
- var allKeys = keysWithoutBaseSet ? this.flowKeys([], additionalKeys || []) : this.flowKeys(baseSet, additionalKeys || []); //, ...sortKeys(additionalKeys)];
352
-
356
+ var allKeys = keysWithoutBaseSet ? this.flowKeys([], additionalKeys || []) : this.flowKeys(baseSet, additionalKeys || []);
353
357
  var shift = allKeys.length % 5 ? 1 : 0;
354
-
355
358
  var style = _objectSpread({
356
359
  gridTemplateColumns: "repeat(".concat(Math.floor(allKeys.length / 5) + shift, ", minmax(min-content, 150px))")
357
360
  }, createCustomLayout(layoutForKeyPad));
358
-
359
- return /*#__PURE__*/_react["default"].createElement("div", {
361
+ return /*#__PURE__*/_react["default"].createElement(KeyPadContainer, {
360
362
  ref: this.keypadRef,
361
- className: (0, _classnames["default"])(classes.keys, className, classes[mode]),
363
+ className: [className, mode].filter(Boolean).join(' '),
362
364
  style: style,
363
365
  onFocus: onFocus
364
366
  }, allKeys.map(function (k, index) {
365
367
  var onClick = _this2.buttonClick.bind(_this2, k);
366
-
367
368
  if (!k) {
368
369
  return /*#__PURE__*/_react["default"].createElement("span", {
369
370
  key: "empty-".concat(index)
370
371
  });
371
372
  }
372
-
373
373
  var common = _objectSpread(_objectSpread({
374
374
  onClick: onClick,
375
- className: (0, _classnames["default"])(classes.labelButton, !keysWithoutBaseSet && classes[k.category], classes[k.extraClass], k.label === ',' && classes.comma, k.label === '.' && classes.dot),
376
375
  disabled: _this2.keyIsNotAllowed(k),
377
376
  key: "".concat(k.label || k.latex || k.command, "-").concat(index)
378
377
  }, k.actions || {}), k.extraProps || {});
379
-
380
378
  if (k.latex) {
381
- return /*#__PURE__*/_react["default"].createElement(LatexButton, (0, _extends2["default"])({
382
- latex: k.latex,
383
- key: index
384
- }, common, {
385
- className: classes.latexButton,
386
- ariaLabel: k.ariaLabel ? k.ariaLabel : k.name || k.label
379
+ return /*#__PURE__*/_react["default"].createElement(StyledLatexButtonWrapper, (0, _extends2["default"])({
380
+ key: common.key,
381
+ onClick: common.onClick,
382
+ disabled: common.disabled,
383
+ category: !keysWithoutBaseSet ? k.category : undefined,
384
+ "aria-label": k.ariaLabel ? k.ariaLabel : k.name || k.label
385
+ }, k.actions || {}, k.extraProps || {}), /*#__PURE__*/_react["default"].createElement(LatexButtonContent, {
386
+ latex: k.latex
387
387
  }));
388
388
  }
389
-
390
389
  if (k.label) {
391
- return /*#__PURE__*/_react["default"].createElement(_Button["default"], (0, _extends2["default"])({
392
- key: index
393
- }, common, {
394
- className: (0, _classnames["default"])(common.className, (0, _defineProperty2["default"])({}, classes.deleteButton, k.label === '⌫')),
390
+ return /*#__PURE__*/_react["default"].createElement(StyledButton, (0, _extends2["default"])({
391
+ key: common.key,
392
+ onClick: common.onClick,
393
+ disabled: common.disabled,
394
+ category: !keysWithoutBaseSet ? k.category : undefined,
395
+ isDelete: k.label === '⌫',
396
+ isComma: k.label === ',',
397
+ isDot: k.label === '.',
395
398
  "aria-label": k.ariaLabel ? k.ariaLabel : k.name || k.label
396
- }), k.label);
399
+ }, k.actions || {}, k.extraProps || {}), k.label);
397
400
  } else {
398
401
  var Icon = k.icon ? k.icon : 'div';
399
- return /*#__PURE__*/_react["default"].createElement(_IconButton["default"], (0, _extends2["default"])({
400
- tabIndex: '-1'
401
- }, common, {
402
- key: index
403
- }), /*#__PURE__*/_react["default"].createElement(Icon, {
404
- className: classes.icon
402
+ return /*#__PURE__*/_react["default"].createElement(StyledIconButton, (0, _extends2["default"])({
403
+ key: common.key,
404
+ tabIndex: '-1',
405
+ onClick: common.onClick,
406
+ disabled: common.disabled,
407
+ category: !keysWithoutBaseSet ? k.category : undefined,
408
+ size: "large"
409
+ }, k.actions || {}, k.extraProps || {}), /*#__PURE__*/_react["default"].createElement(Icon, {
410
+ className: "icon"
405
411
  }));
406
412
  }
407
413
  }));
408
414
  }
409
415
  }]);
410
- return KeyPad;
411
416
  }(_react["default"].Component);
412
-
413
- exports.KeyPad = KeyPad;
414
417
  (0, _defineProperty2["default"])(KeyPad, "propTypes", {
415
- classes: _propTypes["default"].object.isRequired,
416
418
  className: _propTypes["default"].string,
417
419
  controlledKeypadMode: _propTypes["default"].bool,
418
420
  baseSet: _propTypes["default"].array,
@@ -428,85 +430,5 @@ exports.KeyPad = KeyPad;
428
430
  baseSet: _keys.baseSet,
429
431
  noDecimal: false
430
432
  });
431
-
432
- var styles = function styles(theme) {
433
- return {
434
- keys: _objectSpread(_objectSpread({}, _commonMqStyles.commonMqKeyboardStyles), {}, {
435
- width: '100%',
436
- display: 'grid',
437
- gridTemplateRows: 'repeat(5, minmax(40px, 60px))',
438
- gridRowGap: '0px',
439
- gridColumnGap: '0px',
440
- gridAutoFlow: 'column'
441
- }),
442
- character: {
443
- textTransform: 'initial !important',
444
- gridTemplateRows: 'repeat(5, minmax(40px, 50px)) !important'
445
- },
446
- language: {
447
- gridTemplateRows: 'repeat(4, minmax(40px, 50px)) !important',
448
- '& *': {
449
- fontFamily: 'Roboto, Helvetica, Arial, sans-serif !important'
450
- }
451
- },
452
- holder: {
453
- position: 'relative',
454
- width: '100%',
455
- height: '100%',
456
- backgroundColor: '#cef',
457
- borderRadius: 0,
458
- padding: "".concat(theme.spacing.unit, "px 0 ").concat(theme.spacing.unit, "px 0")
459
- },
460
- labelButton: {
461
- minWidth: 'auto',
462
- fontSize: '140% !important',
463
- backgroundColor: (0, _colorManipulator.lighten)(theme.palette.primary.light, 0.5),
464
- '&:hover': {
465
- backgroundColor: (0, _colorManipulator.lighten)(theme.palette.primary.light, 0.7)
466
- },
467
- borderRadius: 0
468
- },
469
- latexButton: {
470
- minWidth: 'auto',
471
- borderRadius: 0,
472
- backgroundColor: (0, _colorManipulator.lighten)(theme.palette.primary.light, 0.5),
473
- '&:hover': {
474
- backgroundColor: (0, _colorManipulator.lighten)(theme.palette.primary.light, 0.7)
475
- }
476
- },
477
- deleteButton: {
478
- '& > span': {
479
- fontFamily: 'Roboto, Helvetica, Arial, sans-serif !important'
480
- }
481
- },
482
- base: {},
483
- operators: {
484
- backgroundColor: (0, _colorManipulator.lighten)(theme.palette.secondary.light, 0.5),
485
- '&:hover': {
486
- backgroundColor: (0, _colorManipulator.lighten)(theme.palette.secondary.light, 0.7)
487
- }
488
- },
489
- comparison: {
490
- backgroundColor: (0, _colorManipulator.lighten)(_green["default"][500], 0.5),
491
- '&:hover': {
492
- backgroundColor: (0, _colorManipulator.lighten)(_green["default"][500], 0.7)
493
- }
494
- },
495
- comma: {
496
- fontSize: '200% !important',
497
- lineHeight: '100%'
498
- },
499
- dot: {
500
- fontSize: '200% !important',
501
- lineHeight: '100%'
502
- },
503
- icon: {
504
- height: '30px'
505
- }
506
- };
507
- };
508
-
509
- var _default = (0, _styles.withStyles)(styles)(KeyPad);
510
-
511
- exports["default"] = _default;
512
- //# sourceMappingURL=index.js.map
433
+ var _default = exports["default"] = KeyPad;
434
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9wcm9wVHlwZXMiLCJfQnV0dG9uIiwiX0ljb25CdXR0b24iLCJfc3R5bGVzIiwiX2RlYnVnIiwiX2xvZGFzaCIsIl9tYXRocXVpbGwiLCJtcSIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX2tleXMiLCJfY29uc3RhbnRzIiwiX2NvbW1vbk1xU3R5bGVzIiwiX2tleXNMYXlvdXQiLCJfY29sb3JzIiwiX3JlbmRlclVpIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiX3R5cGVvZiIsImhhcyIsImdldCIsInNldCIsIl90IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJfY2FsbFN1cGVyIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJhcHBseSIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwibG9nIiwiZGVidWciLCJTdHlsZWRMYXRleEJ1dHRvbiIsInN0eWxlZCIsIkJ1dHRvbiIsInRleHRUcmFuc2Zvcm0iLCJwYWRkaW5nIiwibWFyZ2luIiwiZm9udFNpemUiLCJMYXRleEJ1dHRvbkNvbnRlbnQiLCJTdGF0aWMiLCJfcmVmIiwibGF0ZXgiLCJiYXNlU3R5bGVzIiwicG9pbnRlckV2ZW50cyIsImNvbG9yIiwidGV4dCIsInRyYW5zZm9ybSIsIm1hcmdpbkJvdHRvbSIsImJhY2tncm91bmRDb2xvciIsImNvbmNhdCIsImFscGhhIiwicGluayIsImJvcmRlclRvcCIsIndpZHRoIiwibWFyZ2luVG9wIiwiZm9udEZhbWlseSIsInRvcCIsImxpbmVIZWlnaHQiLCJsZWZ0IiwicmlnaHQiLCJtaW5IZWlnaHQiLCJib3JkZXIiLCJkaXNwbGF5IiwicGFkZGluZ1RvcCIsImZvbnRTdHlsZSIsInBvc2l0aW9uIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwic3RyaW5nIiwiaXNSZXF1aXJlZCIsImNyZWF0ZUN1c3RvbUxheW91dCIsImxheW91dE9iaiIsImdyaWRUZW1wbGF0ZUNvbHVtbnMiLCJjb2x1bW5zIiwiZ3JpZFRlbXBsYXRlUm93cyIsInJvd3MiLCJncmlkQXV0b0Zsb3ciLCJLZXlQYWRDb250YWluZXIiLCJjb21tb25NcUtleWJvYXJkU3R5bGVzIiwiZ3JpZFJvd0dhcCIsImdyaWRDb2x1bW5HYXAiLCJTdHlsZWRCdXR0b24iLCJfcmVmMiIsImNhdGVnb3J5IiwiaXNEZWxldGUiLCJpc0NvbW1hIiwiaXNEb3QiLCJtaW5XaWR0aCIsImxpZ2h0ZW4iLCJpbmRpZ28iLCJib3JkZXJSYWRpdXMiLCJTdHlsZWRMYXRleEJ1dHRvbldyYXBwZXIiLCJfcmVmMyIsIlN0eWxlZEljb25CdXR0b24iLCJJY29uQnV0dG9uIiwiX3JlZjQiLCJoZWlnaHQiLCJLZXlQYWQiLCJleHBvcnRzIiwiX1JlYWN0JENvbXBvbmVudCIsInByb3BzIiwiX3RoaXMiLCJfY2xhc3NDYWxsQ2hlY2syIiwic2V0S2V5cGFkSW50ZXJhY3Rpb24iLCJrZXkiLCJvblByZXNzIiwiYmFzZSIsImV4dHJhcyIsInRyYW5zcG9zZWQiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwic29ydEtleXMiLCJfIiwiZmxhdHRlbiIsIm5vRGVjaW1hbCIsIndyaXRlIiwibGFiZWwiLCJrZXlwYWRSZWYiLCJSZWFjdCIsImNyZWF0ZVJlZiIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwidmFsdWUiLCJjb21wb25lbnREaWRNb3VudCIsIl90aGlzJGtleXBhZFJlZiIsImtleVBhZEVsZW1lbnQiLCJjdXJyZW50IiwibWFpbkNvbnRhaW5lciIsImNsb3Nlc3QiLCJlZGl0YWJsZUh0bWxDb25zdGFudHMiLCJNQUlOX0NPTlRBSU5FUl9DTEFTUyIsImN1cnJlbnRUb29sYmFyIiwiY29udHJvbGxlZEtleXBhZE1vZGUiLCJtYWluQ29udGFpbmVyUG9zaXRpb24iLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJjdXJyZW50VG9vbGJhclBvc2l0aW9uIiwiZGlmZmVyZW5jZSIsInRvdGFsSGVpZ2h0Iiwic3R5bGUiLCJhZGRFdmVudExpc3RlbmVyIiwiaGFuZGxlS2V5cGFkSW50ZXJhY3Rpb24iLCJjb21wb25lbnRXaWxsVW5tb3VudCIsIl90aGlzJGtleXBhZFJlZjIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwicmVuZGVyIiwiX3RoaXMyIiwiX3RoaXMkcHJvcHMiLCJjbGFzc05hbWUiLCJiYXNlU2V0IiwiYWRkaXRpb25hbEtleXMiLCJsYXlvdXRGb3JLZXlQYWQiLCJvbkZvY3VzIiwibW9kZSIsIm5vQmFzZVNldCIsImtleXNXaXRob3V0QmFzZVNldCIsImluY2x1ZGVzIiwiYWxsS2V5cyIsImZsb3dLZXlzIiwic2hpZnQiLCJNYXRoIiwiZmxvb3IiLCJjcmVhdGVFbGVtZW50IiwicmVmIiwiam9pbiIsIm1hcCIsImsiLCJpbmRleCIsIm9uQ2xpY2siLCJidXR0b25DbGljayIsImJpbmQiLCJjb21tb24iLCJkaXNhYmxlZCIsImtleUlzTm90QWxsb3dlZCIsImNvbW1hbmQiLCJhY3Rpb25zIiwiZXh0cmFQcm9wcyIsIl9leHRlbmRzMiIsInVuZGVmaW5lZCIsImFyaWFMYWJlbCIsIm5hbWUiLCJJY29uIiwiaWNvbiIsInRhYkluZGV4Iiwic2l6ZSIsIkNvbXBvbmVudCIsImJvb2wiLCJhcnJheSIsIm9iamVjdCIsImZ1bmMiLCJvbmVPZlR5cGUiLCJudW1iZXIiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9rZXlwYWQvaW5kZXguanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdAbXVpL21hdGVyaWFsL0J1dHRvbic7XG5pbXBvcnQgSWNvbkJ1dHRvbiBmcm9tICdAbXVpL21hdGVyaWFsL0ljb25CdXR0b24nO1xuaW1wb3J0IHsgbGlnaHRlbiwgYWxwaGEsIHN0eWxlZCB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvc3R5bGVzJztcbmltcG9ydCBkZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IE1hdGhRdWlsbCBmcm9tICdAcGllLWZyYW1ld29yay9tYXRocXVpbGwnO1xuaW1wb3J0ICogYXMgbXEgZnJvbSAnLi4vbXEnO1xuXG5pbXBvcnQgeyBiYXNlU2V0IH0gZnJvbSAnLi4va2V5cyc7XG5pbXBvcnQgZWRpdGFibGVIdG1sQ29uc3RhbnRzIGZyb20gJy4uLy4uLy4uL2VkaXRhYmxlLWh0bWwvc3JjL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBjb21tb25NcUtleWJvYXJkU3R5bGVzIH0gZnJvbSAnLi4vbXEvY29tbW9uLW1xLXN0eWxlcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4va2V5cy1sYXlvdXQnO1xuaW1wb3J0IHsgaW5kaWdvLCBwaW5rIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9jb2xvcnMnO1xuaW1wb3J0IHsgY29sb3IgfSBmcm9tICdAcGllLWxpYi9yZW5kZXItdWknO1xuXG5jb25zdCBsb2cgPSBkZWJ1ZygncGllLWxpYjptYXRoLWlubGluZTprZXlwYWQnKTtcblxuY29uc3QgU3R5bGVkTGF0ZXhCdXR0b24gPSBzdHlsZWQoQnV0dG9uKSgoKSA9PiAoe1xuICB0ZXh0VHJhbnNmb3JtOiAnbm9uZScsXG4gIHBhZGRpbmc6IDAsXG4gIG1hcmdpbjogMCxcbiAgZm9udFNpemU6ICcxMTAlICFpbXBvcnRhbnQnLFxufSkpO1xuXG5jb25zdCBMYXRleEJ1dHRvbkNvbnRlbnQgPSBzdHlsZWQobXEuU3RhdGljKSgoeyBsYXRleCB9KSA9PiB7XG4gIGNvbnN0IGJhc2VTdHlsZXMgPSB7XG4gICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgIHRleHRUcmFuc2Zvcm06ICdub25lICFpbXBvcnRhbnQnLFxuICAgIGNvbG9yOiBjb2xvci50ZXh0KCksXG4gICAgJyYgLm1xLXNjYWxlZC5tcS1zcXJ0LXByZWZpeCc6IHtcbiAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEsIDAuOSkgIWltcG9ydGFudCcsXG4gICAgfSxcbiAgICAnJiAubXEtc3VwLW9ubHkgLm1xLXN1cCc6IHtcbiAgICAgIG1hcmdpbkJvdHRvbTogJzAuOXB4ICFpbXBvcnRhbnQnLFxuICAgIH0sXG4gICAgJyYgLm1xLWVtcHR5Jzoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiBgJHthbHBoYShwaW5rWzMwMF0sIDAuNCl9ICFpbXBvcnRhbnRgLFxuICAgIH0sXG4gICAgJyYgLm1xLW92ZXJsaW5lIC5tcS1vdmVybGluZS1pbm5lcic6IHtcbiAgICAgIGJvcmRlclRvcDogJzJweCBzb2xpZCBibGFjaycsXG4gICAgfSxcbiAgICAnJiAubXEtbm9uLWxlYWYubXEtb3ZlcmxpbmUnOiB7XG4gICAgICBib3JkZXJUb3A6ICdub25lICFpbXBvcnRhbnQnLFxuICAgIH0sXG4gICAgJyYgLm1xLW92ZXJhcnJvdyc6IHtcbiAgICAgIHdpZHRoOiAnMzBweCcsXG4gICAgICBtYXJnaW5Ub3A6ICcwICFpbXBvcnRhbnQnLFxuICAgICAgYm9yZGVyVG9wOiAnMnB4IHNvbGlkIGJsYWNrJyxcbiAgICAgIGZvbnRGYW1pbHk6ICdSb2JvdG8sIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYgIWltcG9ydGFudCcsXG4gICAgICAnJi5tcS1hcnJvdy1ib3RoJzoge1xuICAgICAgICB0b3A6ICcwcHggIWltcG9ydGFudCcsXG4gICAgICAgICcmIConOiB7XG4gICAgICAgICAgbGluZUhlaWdodDogJzEgIWltcG9ydGFudCcsXG4gICAgICAgICAgYm9yZGVyVG9wOiAnbm9uZSAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyY6YmVmb3JlJzoge1xuICAgICAgICAgIGZvbnRTaXplOiAnODAlJyxcbiAgICAgICAgICBsZWZ0OiAnY2FsYygtMTMlKSAhaW1wb3J0YW50JyxcbiAgICAgICAgICB0b3A6ICctMC4zMWVtICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJjphZnRlcic6IHtcbiAgICAgICAgICBmb250U2l6ZTogJzgwJSAhaW1wb3J0YW50JyxcbiAgICAgICAgICByaWdodDogJ2NhbGMoLTEzJSkgIWltcG9ydGFudCcsXG4gICAgICAgICAgdG9wOiAnLTEuNWVtJyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYubXEtZW1wdHk6YmVmb3JlJzoge1xuICAgICAgICAgIGZvbnRTaXplOiAnODAlJyxcbiAgICAgICAgICBsZWZ0OiAnY2FsYygtMTMlKScsXG4gICAgICAgICAgdG9wOiAnLTAuMjZlbScsXG4gICAgICAgIH0sXG4gICAgICAgICcmLm1xLWVtcHR5OmFmdGVyJzoge1xuICAgICAgICAgIGZvbnRTaXplOiAnODAlJyxcbiAgICAgICAgICByaWdodDogJ2NhbGMoLTEzJSknLFxuICAgICAgICAgIHRvcDogJy0wLjI2ZW0nLFxuICAgICAgICB9LFxuICAgICAgICAnJi5tcS1lbXB0eSc6IHtcbiAgICAgICAgICBtaW5IZWlnaHQ6ICcxLjRlbScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgJyYubXEtYXJyb3ctcmlnaHQ6YmVmb3JlJzoge1xuICAgICAgICBmb250U2l6ZTogJzgwJScsXG4gICAgICAgIHJpZ2h0OiAnY2FsYygtMTMlKSAhaW1wb3J0YW50JyxcbiAgICAgICAgdG9wOiAnLTAuMjZlbSAhaW1wb3J0YW50JyxcbiAgICAgIH0sXG4gICAgICAnJiAubXEtb3ZlcmFycm93LWlubmVyJzoge1xuICAgICAgICBib3JkZXI6ICdub25lICFpbXBvcnRhbnQnLFxuICAgICAgfSxcbiAgICAgICcmIC5tcS1vdmVyYXJyb3ctaW5uZXIgLm1xLW92ZXJhcnJvdy1pbm5lci1yaWdodCc6IHtcbiAgICAgICAgZGlzcGxheTogJ25vbmUgIWltcG9ydGFudCcsXG4gICAgICB9LFxuICAgIH0sXG4gICAgJyYgLm1xLXJvb3QtYmxvY2snOiB7XG4gICAgICBwYWRkaW5nOiAnNXB4ICFpbXBvcnRhbnQnLFxuICAgIH0sXG4gICAgJyYgLm1xLW92ZXJhcnJvdy5tcS1hcnJvdy1ib3RoLm1xLWVtcHR5OmFmdGVyJzoge1xuICAgICAgcmlnaHQ6ICctNnB4JyxcbiAgICAgIGZvbnRTaXplOiAnODAlICFpbXBvcnRhbnQnLFxuICAgICAgdG9wOiAnLTNweCcsXG4gICAgfSxcbiAgICAnJiAubXEtb3ZlcmFycm93Lm1xLWFycm93LXJpZ2h0Lm1xLWVtcHR5OmJlZm9yZSc6IHtcbiAgICAgIHJpZ2h0OiAnLTVweCcsXG4gICAgICBmb250U2l6ZTogJzgwJSAhaW1wb3J0YW50JyxcbiAgICAgIHRvcDogJy0zcHgnLFxuICAgIH0sXG4gICAgJyYgLm1xLW92ZXJhcnJvdy5tcS1hcnJvdy1ib3RoLm1xLWVtcHR5OmJlZm9yZSc6IHtcbiAgICAgIGxlZnQ6ICctNnB4JyxcbiAgICAgIGZvbnRTaXplOiAnODAlICFpbXBvcnRhbnQnLFxuICAgICAgdG9wOiAnLTNweCcsXG4gICAgfSxcbiAgICAnJiAubXEtbG9uZ2Rpdi1pbm5lcic6IHtcbiAgICAgIGJvcmRlclRvcDogJzFweCBzb2xpZCAhaW1wb3J0YW50JyxcbiAgICAgIHBhZGRpbmdUb3A6ICcxLjVweCAhaW1wb3J0YW50JyxcbiAgICB9LFxuICAgICcmIC5tcS1wYXJhbGxlbG9ncmFtJzoge1xuICAgICAgbGluZUhlaWdodDogMC44NSxcbiAgICB9LFxuICAgICcmIC5tcS1vdmVyYXJjJzoge1xuICAgICAgYm9yZGVyVG9wOiAnMnB4IHNvbGlkIGJsYWNrICFpbXBvcnRhbnQnLFxuICAgICAgJyYgLm1xLW92ZXJsaW5lJzoge1xuICAgICAgICBib3JkZXJUb3A6ICdub25lICFpbXBvcnRhbnQnLFxuICAgICAgfSxcbiAgICAgICcmIC5tcS1vdmVybGluZS1pbm5lcic6IHtcbiAgICAgICAgYm9yZGVyVG9wOiAnbm9uZSAhaW1wb3J0YW50JyxcbiAgICAgICAgcGFkZGluZ1RvcDogJzAgIWltcG9ydGFudCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgLy8gQWRkIHNwZWNpZmljIHN0eWxlcyBiYXNlZCBvbiBsYXRleCBjb250ZW50XG4gIGlmIChsYXRleCA9PT0gJ1xcXFxwYXJhbGxlbCcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uYmFzZVN0eWxlcyxcbiAgICAgIGZvbnRTdHlsZTogJ2l0YWxpYyAhaW1wb3J0YW50JyxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGxhdGV4ID09PSAnXFxcXG92ZXJsZWZ0cmlnaHRhcnJvd3tcXFxcb3ZlcmxpbmV7fX0nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmJhc2VTdHlsZXMsXG4gICAgICAnJiAubXEtb3ZlcmFycm93Lm1xLWFycm93LWJvdGgnOiB7XG4gICAgICAgICcmIC5tcS1vdmVybGluZS1pbm5lcic6IHtcbiAgICAgICAgICBib3JkZXJUb3A6ICdub25lICFpbXBvcnRhbnQnLFxuICAgICAgICAgIHBhZGRpbmdUb3A6ICcwICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJjphZnRlcic6IHtcbiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlICFpbXBvcnRhbnQnLFxuICAgICAgICAgIHRvcDogJzBweCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBiYXNlU3R5bGVzO1xufSk7XG5cbkxhdGV4QnV0dG9uQ29udGVudC5wcm9wVHlwZXMgPSB7XG4gIGxhdGV4OiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG59O1xuXG4vLyBMYXRleEJ1dHRvbiBjb21wb25lbnQgcmVtb3ZlZCAtIExhdGV4QnV0dG9uQ29udGVudCBpcyB1c2VkIGRpcmVjdGx5IGluc3RlYWRcblxuY29uc3QgY3JlYXRlQ3VzdG9tTGF5b3V0ID0gKGxheW91dE9iaikgPT4ge1xuICBpZiAobGF5b3V0T2JqKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdyaWRUZW1wbGF0ZUNvbHVtbnM6IGByZXBlYXQoJHtsYXlvdXRPYmouY29sdW1uc30sIG1pbm1heChtaW4tY29udGVudCwgMTUwcHgpKWAsXG4gICAgICBncmlkVGVtcGxhdGVSb3dzOiBgcmVwZWF0KCR7bGF5b3V0T2JqLnJvd3N9LCBtaW5tYXgoNDBweCwgNjBweCkpYCxcbiAgICAgIGdyaWRBdXRvRmxvdzogJ2luaXRpYWwnLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge307XG59O1xuXG5jb25zdCBLZXlQYWRDb250YWluZXIgPSBzdHlsZWQoJ2RpdicpKCgpID0+ICh7XG4gIC4uLmNvbW1vbk1xS2V5Ym9hcmRTdHlsZXMsXG4gIHdpZHRoOiAnMTAwJScsXG4gIGRpc3BsYXk6ICdncmlkJyxcbiAgZ3JpZFRlbXBsYXRlUm93czogJ3JlcGVhdCg1LCBtaW5tYXgoNDBweCwgNjBweCkpJyxcbiAgZ3JpZFJvd0dhcDogJzBweCcsXG4gIGdyaWRDb2x1bW5HYXA6ICcwcHgnLFxuICBncmlkQXV0b0Zsb3c6ICdjb2x1bW4nLFxuICAnJi5jaGFyYWN0ZXInOiB7XG4gICAgdGV4dFRyYW5zZm9ybTogJ2luaXRpYWwgIWltcG9ydGFudCcsXG4gICAgZ3JpZFRlbXBsYXRlUm93czogJ3JlcGVhdCg1LCBtaW5tYXgoNDBweCwgNTBweCkpICFpbXBvcnRhbnQnLFxuICB9LFxuICAnJi5sYW5ndWFnZSc6IHtcbiAgICBncmlkVGVtcGxhdGVSb3dzOiAncmVwZWF0KDQsIG1pbm1heCg0MHB4LCA1MHB4KSkgIWltcG9ydGFudCcsXG4gICAgJyYgKic6IHtcbiAgICAgIGZvbnRGYW1pbHk6ICdSb2JvdG8sIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYgIWltcG9ydGFudCcsXG4gICAgfSxcbiAgfSxcbn0pKTtcblxuY29uc3QgU3R5bGVkQnV0dG9uID0gc3R5bGVkKEJ1dHRvbikoKHsgY2F0ZWdvcnksIGlzRGVsZXRlLCBpc0NvbW1hLCBpc0RvdCB9KSA9PiAoe1xuICBtaW5XaWR0aDogJ2F1dG8nLFxuICBmb250U2l6ZTogaXNDb21tYSB8fCBpc0RvdCA/ICcyMDAlICFpbXBvcnRhbnQnIDogJzE0MCUgIWltcG9ydGFudCcsXG4gIGxpbmVIZWlnaHQ6IGlzQ29tbWEgfHwgaXNEb3QgPyAnMTAwJScgOiAnbm9ybWFsJyxcbiAgY29sb3I6IGNvbG9yLnRleHQoKSxcblxuICBiYWNrZ3JvdW5kQ29sb3I6XG4gICAgY2F0ZWdvcnkgPT09ICdvcGVyYXRvcnMnXG4gICAgICA/IGxpZ2h0ZW4ocGlua1szMDBdLCAwLjUpXG4gICAgICA6IC8vIHRoaXMgY29kZSB3aXRoIGdyZWVuIHNlZW1zIHRvIG5vdCBiZSBhcHBsaWVkIHRvIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHNvIEkgY29tbWVudGVkIGl0IG91dCwgYnV0IGxlZnQgaXQgaGVyZSBqdXN0IGluIGNhc2VcbiAgICAgICAgLy8gY2F0ZWdvcnkgPT09ICdjb21wYXJpc29uJyA/IGxpZ2h0ZW4oZ3JlZW5bNTAwXSwgMC41KSA6XG4gICAgICAgIGxpZ2h0ZW4oaW5kaWdvWzMwMF0sIDAuNSksXG4gICcmOmhvdmVyJzoge1xuICAgIGJhY2tncm91bmRDb2xvcjpcbiAgICAgIGNhdGVnb3J5ID09PSAnb3BlcmF0b3JzJ1xuICAgICAgICA/IGxpZ2h0ZW4ocGlua1szMDBdLCAwLjcpXG4gICAgICAgIDogLy8gY2F0ZWdvcnkgPT09ICdjb21wYXJpc29uJyA/IGxpZ2h0ZW4oZ3JlZW5bNTAwXSwgMC43KSA6XG4gICAgICAgICAgbGlnaHRlbihpbmRpZ29bMzAwXSwgMC43KSxcbiAgfSxcbiAgYm9yZGVyUmFkaXVzOiAwLFxuICAuLi4oaXNEZWxldGUgJiYge1xuICAgICcmID4gc3Bhbic6IHtcbiAgICAgIGZvbnRGYW1pbHk6ICdSb2JvdG8sIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYgIWltcG9ydGFudCcsXG4gICAgfSxcbiAgfSksXG59KSk7XG5cbmNvbnN0IFN0eWxlZExhdGV4QnV0dG9uV3JhcHBlciA9IHN0eWxlZChCdXR0b24pKCh7IGNhdGVnb3J5IH0pID0+ICh7XG4gIG1pbldpZHRoOiAnYXV0bycsXG4gIGJvcmRlclJhZGl1czogMCxcbiAgYmFja2dyb3VuZENvbG9yOlxuICAgIGNhdGVnb3J5ID09PSAnb3BlcmF0b3JzJ1xuICAgICAgPyBsaWdodGVuKHBpbmtbMzAwXSwgMC41KVxuICAgICAgOiAvLyBjYXRlZ29yeSA9PT0gJ2NvbXBhcmlzb24nID8gbGlnaHRlbihncmVlbls1MDBdLCAwLjUpIDpcbiAgICAgICAgbGlnaHRlbihpbmRpZ29bMzAwXSwgMC41KSxcbiAgJyY6aG92ZXInOiB7XG4gICAgYmFja2dyb3VuZENvbG9yOlxuICAgICAgY2F0ZWdvcnkgPT09ICdvcGVyYXRvcnMnXG4gICAgICAgID8gbGlnaHRlbihwaW5rWzMwMF0sIDAuNylcbiAgICAgICAgOiAvLyBjYXRlZ29yeSA9PT0gJ2NvbXBhcmlzb24nID8gbGlnaHRlbihncmVlbls1MDBdLCAwLjcpIDpcbiAgICAgICAgICBsaWdodGVuKGluZGlnb1szMDBdLCAwLjcpLFxuICB9LFxufSkpO1xuXG5jb25zdCBTdHlsZWRJY29uQnV0dG9uID0gc3R5bGVkKEljb25CdXR0b24pKCh7IGNhdGVnb3J5IH0pID0+ICh7XG4gIG1pbldpZHRoOiAnYXV0bycsXG4gIGJhY2tncm91bmRDb2xvcjpcbiAgICBjYXRlZ29yeSA9PT0gJ29wZXJhdG9ycydcbiAgICAgID8gbGlnaHRlbihwaW5rWzMwMF0sIDAuNSlcbiAgICAgIDogLy8gY2F0ZWdvcnkgPT09ICdjb21wYXJpc29uJyA/IGxpZ2h0ZW4oZ3JlZW5bNTAwXSwgMC41KSA6XG4gICAgICAgIGxpZ2h0ZW4oaW5kaWdvWzMwMF0sIDAuNSksXG4gICcmOmhvdmVyJzoge1xuICAgIGJhY2tncm91bmRDb2xvcjpcbiAgICAgIGNhdGVnb3J5ID09PSAnb3BlcmF0b3JzJ1xuICAgICAgICA/IGxpZ2h0ZW4ocGlua1szMDBdLCAwLjcpXG4gICAgICAgIDogLy8gY2F0ZWdvcnkgPT09ICdjb21wYXJpc29uJyA/IGxpZ2h0ZW4oZ3JlZW5bNTAwXSwgMC43KSA6XG4gICAgICAgICAgbGlnaHRlbihpbmRpZ29bMzAwXSwgMC43KSxcbiAgfSxcbiAgYm9yZGVyUmFkaXVzOiAwLFxuICAnJiAuaWNvbic6IHtcbiAgICBoZWlnaHQ6ICczMHB4JyxcbiAgfSxcbn0pKTtcblxuZXhwb3J0IGNsYXNzIEtleVBhZCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGNvbnRyb2xsZWRLZXlwYWRNb2RlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBiYXNlU2V0OiBQcm9wVHlwZXMuYXJyYXksXG4gICAgYWRkaXRpb25hbEtleXM6IFByb3BUeXBlcy5hcnJheSxcbiAgICBsYXlvdXRGb3JLZXlQYWQ6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgb25QcmVzczogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBvbkZvY3VzOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBub0RlY2ltYWw6IFByb3BUeXBlcy5ib29sLFxuICAgIHNldEtleXBhZEludGVyYWN0aW9uOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBtb2RlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSksXG4gIH07XG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgYmFzZVNldDogYmFzZVNldCxcbiAgICBub0RlY2ltYWw6IGZhbHNlLFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMua2V5cGFkUmVmID0gUmVhY3QuY3JlYXRlUmVmKCk7XG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBjb25zdCBrZXlQYWRFbGVtZW50ID0gdGhpcy5rZXlwYWRSZWY/LmN1cnJlbnQ7XG4gICAgY29uc3QgbWFpbkNvbnRhaW5lciA9IGtleVBhZEVsZW1lbnQ/LmNsb3Nlc3QoYC4ke2VkaXRhYmxlSHRtbENvbnN0YW50cy5NQUlOX0NPTlRBSU5FUl9DTEFTU31gKTtcbiAgICBjb25zdCBjdXJyZW50VG9vbGJhciA9IGtleVBhZEVsZW1lbnQ/LmNsb3Nlc3QoJy5waWUtdG9vbGJhcicpO1xuXG4gICAgLy8gbmVlZCBvbmx5IGZvciBtYXRoIGtleWJvYXJkIHNvIHdlIG5lZWQgYWxzbyBjb250cm9sbGVkS2V5cGFkTW9kZVxuICAgIGlmICh0aGlzLnByb3BzLmNvbnRyb2xsZWRLZXlwYWRNb2RlICYmIG1haW5Db250YWluZXIgJiYgY3VycmVudFRvb2xiYXIpIHtcbiAgICAgIGNvbnN0IG1haW5Db250YWluZXJQb3NpdGlvbiA9IG1haW5Db250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBjdXJyZW50VG9vbGJhclBvc2l0aW9uID0gY3VycmVudFRvb2xiYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBkaWZmZXJlbmNlID1cbiAgICAgICAgbWFpbkNvbnRhaW5lclBvc2l0aW9uLnRvcCArXG4gICAgICAgIG1haW5Db250YWluZXJQb3NpdGlvbi5oZWlnaHQgLVxuICAgICAgICAoY3VycmVudFRvb2xiYXJQb3NpdGlvbi50b3AgKyBjdXJyZW50VG9vbGJhclBvc2l0aW9uLmhlaWdodCk7XG4gICAgICBpZiAoZGlmZmVyZW5jZSA8IDApIHtcbiAgICAgICAgY29uc3QgdG90YWxIZWlnaHQgPSBtYWluQ29udGFpbmVyUG9zaXRpb24uaGVpZ2h0ICsgbWFpbkNvbnRhaW5lclBvc2l0aW9uLnRvcCAtIGRpZmZlcmVuY2U7XG4gICAgICAgIC8vIGluY3JlYXNlIHRoZSBoZWlnaHQgb2YgdGhlIG1haW4gY29udGFpbmVyIGlmIGtleWJvYXJkIG5lZWRzIGl0XG4gICAgICAgIGlmIChtYWluQ29udGFpbmVyKSB7XG4gICAgICAgICAgbWFpbkNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBgJHt0b3RhbEhlaWdodH1weGA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoa2V5UGFkRWxlbWVudCkge1xuICAgICAga2V5UGFkRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVLZXlwYWRJbnRlcmFjdGlvbiwgdHJ1ZSk7XG4gICAgICBrZXlQYWRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlS2V5cGFkSW50ZXJhY3Rpb24sIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGNvbnN0IGtleVBhZEVsZW1lbnQgPSB0aGlzLmtleXBhZFJlZj8uY3VycmVudDtcbiAgICAvLyBuZWVkIG9ubHkgZm9yIG1hdGgga2V5Ym9hcmRcbiAgICBpZiAodGhpcy5wcm9wcy5jb250cm9sbGVkS2V5cGFkTW9kZSAmJiBrZXlQYWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBtYWluQ29udGFpbmVyID0ga2V5UGFkRWxlbWVudC5jbG9zZXN0KGAuJHtlZGl0YWJsZUh0bWxDb25zdGFudHMuTUFJTl9DT05UQUlORVJfQ0xBU1N9YCk7XG5cbiAgICAgIGlmIChtYWluQ29udGFpbmVyKSB7XG4gICAgICAgIG1haW5Db250YWluZXIuc3R5bGUuaGVpZ2h0ID0gJ3Vuc2V0JztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoa2V5UGFkRWxlbWVudCkge1xuICAgICAga2V5UGFkRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVLZXlwYWRJbnRlcmFjdGlvbiwgdHJ1ZSk7XG4gICAgICBrZXlQYWRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlS2V5cGFkSW50ZXJhY3Rpb24sIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUtleXBhZEludGVyYWN0aW9uID0gKCkgPT4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSBzZXRLZXlwYWRJbnRlcmFjdGlvbiBwcm9wIGlzIGF2YWlsYWJsZSwgd2hpY2ggaXMgdXNlZCBmb3IgYm90aFxuICAgIC8vIHRoZSBsYW5ndWFnZSBrZXlwYWQgYW5kIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMga2V5cGFkXG4gICAgaWYgKHRoaXMucHJvcHMuc2V0S2V5cGFkSW50ZXJhY3Rpb24pIHtcbiAgICAgIHRoaXMucHJvcHMuc2V0S2V5cGFkSW50ZXJhY3Rpb24odHJ1ZSk7XG4gICAgfVxuICB9O1xuXG4gIGJ1dHRvbkNsaWNrID0gKGtleSkgPT4ge1xuICAgIGxvZygnW2J1dHRvbkNsaWNrXScsIGtleSk7XG4gICAgY29uc3QgeyBvblByZXNzIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgb25QcmVzcyhrZXkpO1xuICB9O1xuXG4gIGZsb3dLZXlzID0gKGJhc2UsIGV4dHJhcykgPT4ge1xuICAgIGNvbnN0IHRyYW5zcG9zZWQgPSBbLi4uc29ydEtleXMoYmFzZSksIC4uLnNvcnRLZXlzKGV4dHJhcyldO1xuICAgIHJldHVybiBfLmZsYXR0ZW4odHJhbnNwb3NlZCk7XG4gIH07XG5cbiAga2V5SXNOb3RBbGxvd2VkID0gKGtleSkgPT4ge1xuICAgIGNvbnN0IHsgbm9EZWNpbWFsIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgaWYgKCgoa2V5LndyaXRlID09PSAnLicgJiYga2V5LmxhYmVsID09PSAnLicpIHx8IChrZXkud3JpdGUgPT09ICcsJyAmJiBrZXkubGFiZWwgPT09ICcsJykpICYmIG5vRGVjaW1hbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGNsYXNzTmFtZSwgYmFzZVNldCwgYWRkaXRpb25hbEtleXMsIGxheW91dEZvcktleVBhZCwgb25Gb2N1cywgbW9kZSB9ID0gdGhpcy5wcm9wcztcblxuICAgIGNvbnN0IG5vQmFzZVNldCA9IFsnbm9uLW5lZ2F0aXZlLWludGVnZXJzJywgJ2ludGVnZXJzJywgJ2RlY2ltYWxzJywgJ2ZyYWN0aW9ucycsICdpdGVtLWF1dGhvcmluZycsICdsYW5ndWFnZSddO1xuXG4gICAgY29uc3Qga2V5c1dpdGhvdXRCYXNlU2V0ID0gbm9CYXNlU2V0LmluY2x1ZGVzKG1vZGUpO1xuICAgIGNvbnN0IGFsbEtleXMgPSBrZXlzV2l0aG91dEJhc2VTZXRcbiAgICAgID8gdGhpcy5mbG93S2V5cyhbXSwgYWRkaXRpb25hbEtleXMgfHwgW10pXG4gICAgICA6IHRoaXMuZmxvd0tleXMoYmFzZVNldCwgYWRkaXRpb25hbEtleXMgfHwgW10pO1xuXG4gICAgY29uc3Qgc2hpZnQgPSBhbGxLZXlzLmxlbmd0aCAlIDUgPyAxIDogMDtcbiAgICBjb25zdCBzdHlsZSA9IHtcbiAgICAgIGdyaWRUZW1wbGF0ZUNvbHVtbnM6IGByZXBlYXQoJHtNYXRoLmZsb29yKGFsbEtleXMubGVuZ3RoIC8gNSkgKyBzaGlmdH0sIG1pbm1heChtaW4tY29udGVudCwgMTUwcHgpKWAsXG4gICAgICAuLi5jcmVhdGVDdXN0b21MYXlvdXQobGF5b3V0Rm9yS2V5UGFkKSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxLZXlQYWRDb250YWluZXJcbiAgICAgICAgcmVmPXt0aGlzLmtleXBhZFJlZn1cbiAgICAgICAgY2xhc3NOYW1lPXtbY2xhc3NOYW1lLCBtb2RlXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpfVxuICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgIG9uRm9jdXM9e29uRm9jdXN9XG4gICAgICA+XG4gICAgICAgIHthbGxLZXlzLm1hcCgoaywgaW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCBvbkNsaWNrID0gdGhpcy5idXR0b25DbGljay5iaW5kKHRoaXMsIGspO1xuXG4gICAgICAgICAgaWYgKCFrKSB7XG4gICAgICAgICAgICByZXR1cm4gPHNwYW4ga2V5PXtgZW1wdHktJHtpbmRleH1gfSAvPjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb21tb24gPSB7XG4gICAgICAgICAgICBvbkNsaWNrLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IHRoaXMua2V5SXNOb3RBbGxvd2VkKGspLFxuICAgICAgICAgICAga2V5OiBgJHtrLmxhYmVsIHx8IGsubGF0ZXggfHwgay5jb21tYW5kfS0ke2luZGV4fWAsXG4gICAgICAgICAgICAuLi4oay5hY3Rpb25zIHx8IHt9KSxcbiAgICAgICAgICAgIC4uLihrLmV4dHJhUHJvcHMgfHwge30pLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAoay5sYXRleCkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPFN0eWxlZExhdGV4QnV0dG9uV3JhcHBlclxuICAgICAgICAgICAgICAgIGtleT17Y29tbW9uLmtleX1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtjb21tb24ub25DbGlja31cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17Y29tbW9uLmRpc2FibGVkfVxuICAgICAgICAgICAgICAgIGNhdGVnb3J5PXsha2V5c1dpdGhvdXRCYXNlU2V0ID8gay5jYXRlZ29yeSA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtrLmFyaWFMYWJlbCA/IGsuYXJpYUxhYmVsIDogay5uYW1lIHx8IGsubGFiZWx9XG4gICAgICAgICAgICAgICAgey4uLihrLmFjdGlvbnMgfHwge30pfVxuICAgICAgICAgICAgICAgIHsuLi4oay5leHRyYVByb3BzIHx8IHt9KX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxMYXRleEJ1dHRvbkNvbnRlbnQgbGF0ZXg9e2subGF0ZXh9IC8+XG4gICAgICAgICAgICAgIDwvU3R5bGVkTGF0ZXhCdXR0b25XcmFwcGVyPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoay5sYWJlbCkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPFN0eWxlZEJ1dHRvblxuICAgICAgICAgICAgICAgIGtleT17Y29tbW9uLmtleX1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtjb21tb24ub25DbGlja31cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17Y29tbW9uLmRpc2FibGVkfVxuICAgICAgICAgICAgICAgIGNhdGVnb3J5PXsha2V5c1dpdGhvdXRCYXNlU2V0ID8gay5jYXRlZ29yeSA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICBpc0RlbGV0ZT17ay5sYWJlbCA9PT0gJ+KMqyd9XG4gICAgICAgICAgICAgICAgaXNDb21tYT17ay5sYWJlbCA9PT0gJywnfVxuICAgICAgICAgICAgICAgIGlzRG90PXtrLmxhYmVsID09PSAnLid9XG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17ay5hcmlhTGFiZWwgPyBrLmFyaWFMYWJlbCA6IGsubmFtZSB8fCBrLmxhYmVsfVxuICAgICAgICAgICAgICAgIHsuLi4oay5hY3Rpb25zIHx8IHt9KX1cbiAgICAgICAgICAgICAgICB7Li4uKGsuZXh0cmFQcm9wcyB8fCB7fSl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7ay5sYWJlbH1cbiAgICAgICAgICAgICAgPC9TdHlsZWRCdXR0b24+XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBJY29uID0gay5pY29uID8gay5pY29uIDogJ2Rpdic7XG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIDxTdHlsZWRJY29uQnV0dG9uXG4gICAgICAgICAgICAgICAga2V5PXtjb21tb24ua2V5fVxuICAgICAgICAgICAgICAgIHRhYkluZGV4PXsnLTEnfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2NvbW1vbi5vbkNsaWNrfVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXtjb21tb24uZGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgY2F0ZWdvcnk9eyFrZXlzV2l0aG91dEJhc2VTZXQgPyBrLmNhdGVnb3J5IDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgIHNpemU9XCJsYXJnZVwiXG4gICAgICAgICAgICAgICAgey4uLihrLmFjdGlvbnMgfHwge30pfVxuICAgICAgICAgICAgICAgIHsuLi4oay5leHRyYVByb3BzIHx8IHt9KX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxJY29uIGNsYXNzTmFtZT1cImljb25cIiAvPlxuICAgICAgICAgICAgICA8L1N0eWxlZEljb25CdXR0b24+XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSl9XG4gICAgICA8L0tleVBhZENvbnRhaW5lcj5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEtleVBhZDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFVBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLFdBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLE9BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLE1BQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFNLE9BQUEsR0FBQVAsc0JBQUEsQ0FBQUMs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