@pie-lib/math-input-mathlive 1.1.5-beta.8 → 2.0.1-next.20261107131445

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 (202) hide show
  1. package/README.md +84 -109
  2. package/dist/_virtual/_rolldown/runtime.js +11 -0
  3. package/dist/horizontal-keypad.d.ts +22 -0
  4. package/dist/horizontal-keypad.js +54 -0
  5. package/dist/index.d.ts +20 -0
  6. package/dist/index.js +12 -0
  7. package/dist/keypad/index.d.ts +40 -0
  8. package/dist/keypad/index.js +245 -0
  9. package/dist/keypad/keys-layout.d.ts +7 -0
  10. package/dist/keypad/keys-layout.js +5 -0
  11. package/dist/keys/basic-operators.d.ts +5 -0
  12. package/dist/keys/basic-operators.js +30 -0
  13. package/dist/keys/chars.d.ts +5 -0
  14. package/dist/keys/comparison.d.ts +4 -0
  15. package/dist/keys/comparison.js +32 -0
  16. package/dist/keys/constants.d.ts +4 -0
  17. package/dist/keys/constants.js +35 -0
  18. package/dist/keys/digits.d.ts +15 -0
  19. package/dist/keys/digits.js +34 -0
  20. package/dist/keys/edit.d.ts +6 -0
  21. package/dist/keys/edit.js +9 -0
  22. package/dist/keys/exponent.d.ts +4 -0
  23. package/dist/keys/exponent.js +28 -0
  24. package/dist/keys/fractions.d.ts +3 -0
  25. package/dist/keys/fractions.js +27 -0
  26. package/dist/keys/geometry.d.ts +23 -0
  27. package/dist/keys/geometry.js +127 -0
  28. package/dist/keys/grades.d.ts +9 -0
  29. package/dist/keys/grades.js +414 -0
  30. package/dist/keys/index.d.ts +6 -0
  31. package/dist/keys/index.js +50 -0
  32. package/dist/keys/log.d.ts +3 -0
  33. package/dist/keys/log.js +25 -0
  34. package/dist/keys/logic.d.ts +2 -0
  35. package/dist/keys/logic.js +13 -0
  36. package/dist/keys/matrices.d.ts +2 -0
  37. package/dist/keys/matrices.js +17 -0
  38. package/dist/keys/misc.d.ts +10 -0
  39. package/dist/keys/misc.js +60 -0
  40. package/dist/keys/navigation.d.ts +2 -0
  41. package/dist/keys/navigation.js +13 -0
  42. package/dist/keys/operators.d.ts +1 -0
  43. package/dist/keys/operators.js +11 -0
  44. package/dist/keys/statistics.d.ts +5 -0
  45. package/dist/keys/statistics.js +38 -0
  46. package/dist/keys/sub-sup.d.ts +2 -0
  47. package/dist/keys/sub-sup.js +17 -0
  48. package/dist/keys/trigonometry.d.ts +6 -0
  49. package/dist/keys/trigonometry.js +43 -0
  50. package/dist/keys/utils.d.ts +5 -0
  51. package/dist/keys/utils.js +24 -0
  52. package/dist/keys/vars.d.ts +3 -0
  53. package/dist/keys/vars.js +22 -0
  54. package/dist/latex-bridge.d.ts +197 -0
  55. package/dist/latex-bridge.js +210 -0
  56. package/dist/longdiv.d.ts +24 -0
  57. package/dist/longdiv.js +43 -0
  58. package/dist/math-input.d.ts +26 -0
  59. package/dist/math-input.js +74 -0
  60. package/dist/mathlive-instance.d.ts +221 -0
  61. package/dist/mathlive-instance.js +159 -0
  62. package/dist/mf/common-styles.d.ts +594 -0
  63. package/dist/mf/common-styles.js +80 -0
  64. package/dist/mf/field-label.d.ts +16 -0
  65. package/dist/mf/field-label.js +13 -0
  66. package/dist/mf/index.d.ts +4 -0
  67. package/dist/mf/index.js +21 -0
  68. package/dist/mf/input.d.ts +94 -0
  69. package/dist/mf/input.js +127 -0
  70. package/dist/mf/static.d.ts +143 -0
  71. package/dist/mf/static.js +230 -0
  72. package/dist/selection.d.ts +43 -0
  73. package/dist/selection.js +39 -0
  74. package/package.json +32 -18
  75. package/lib/__tests__/composites.test.js +0 -255
  76. package/lib/__tests__/drop-in-compat.test.js +0 -133
  77. package/lib/__tests__/embedded-fonts.test.js +0 -121
  78. package/lib/__tests__/index.test.js +0 -118
  79. package/lib/__tests__/input-imperative.test.js +0 -155
  80. package/lib/__tests__/input-selection.test.js +0 -103
  81. package/lib/__tests__/keypad-label.test.js +0 -231
  82. package/lib/__tests__/keypad-render.test.js +0 -206
  83. package/lib/__tests__/latex-bridge.test.js +0 -386
  84. package/lib/__tests__/mathlive-instance.test.js +0 -419
  85. package/lib/__tests__/mount-race.test.js +0 -218
  86. package/lib/__tests__/selection.test.js +0 -195
  87. package/lib/__tests__/static-prompts.test.js +0 -405
  88. package/lib/__tests__/tmp-markup.test.js +0 -26
  89. package/lib/horizontal-keypad.js +0 -101
  90. package/lib/horizontal-keypad.js.map +0 -1
  91. package/lib/index.js +0 -143
  92. package/lib/index.js.map +0 -1
  93. package/lib/keypad/index.js +0 -431
  94. package/lib/keypad/index.js.map +0 -1
  95. package/lib/keypad/keys-layout.js +0 -22
  96. package/lib/keypad/keys-layout.js.map +0 -1
  97. package/lib/keys/basic-operators.js +0 -33
  98. package/lib/keys/basic-operators.js.map +0 -1
  99. package/lib/keys/chars.js +0 -12
  100. package/lib/keys/chars.js.map +0 -1
  101. package/lib/keys/comparison.js +0 -39
  102. package/lib/keys/comparison.js.map +0 -1
  103. package/lib/keys/constants.js +0 -37
  104. package/lib/keys/constants.js.map +0 -1
  105. package/lib/keys/digits.js +0 -46
  106. package/lib/keys/digits.js.map +0 -1
  107. package/lib/keys/edit.js +0 -14
  108. package/lib/keys/edit.js.map +0 -1
  109. package/lib/keys/exponent.js +0 -30
  110. package/lib/keys/exponent.js.map +0 -1
  111. package/lib/keys/fractions.js +0 -29
  112. package/lib/keys/fractions.js.map +0 -1
  113. package/lib/keys/geometry.js +0 -143
  114. package/lib/keys/geometry.js.map +0 -1
  115. package/lib/keys/grades.js +0 -259
  116. package/lib/keys/grades.js.map +0 -1
  117. package/lib/keys/index.js +0 -35
  118. package/lib/keys/index.js.map +0 -1
  119. package/lib/keys/log.js +0 -27
  120. package/lib/keys/log.js.map +0 -1
  121. package/lib/keys/logic.js +0 -19
  122. package/lib/keys/logic.js.map +0 -1
  123. package/lib/keys/matrices.js +0 -19
  124. package/lib/keys/matrices.js.map +0 -1
  125. package/lib/keys/misc.js +0 -69
  126. package/lib/keys/misc.js.map +0 -1
  127. package/lib/keys/navigation.js +0 -20
  128. package/lib/keys/navigation.js.map +0 -1
  129. package/lib/keys/operators.js +0 -15
  130. package/lib/keys/operators.js.map +0 -1
  131. package/lib/keys/statistics.js +0 -40
  132. package/lib/keys/statistics.js.map +0 -1
  133. package/lib/keys/sub-sup.js +0 -19
  134. package/lib/keys/sub-sup.js.map +0 -1
  135. package/lib/keys/trigonometry.js +0 -45
  136. package/lib/keys/trigonometry.js.map +0 -1
  137. package/lib/keys/utils.js +0 -87
  138. package/lib/keys/utils.js.map +0 -1
  139. package/lib/keys/vars.js +0 -24
  140. package/lib/keys/vars.js.map +0 -1
  141. package/lib/latex-bridge.js +0 -445
  142. package/lib/latex-bridge.js.map +0 -1
  143. package/lib/math-input.js +0 -143
  144. package/lib/math-input.js.map +0 -1
  145. package/lib/mathlive-instance.js +0 -585
  146. package/lib/mathlive-instance.js.map +0 -1
  147. package/lib/mf/common-styles.js +0 -203
  148. package/lib/mf/common-styles.js.map +0 -1
  149. package/lib/mf/index.js +0 -84
  150. package/lib/mf/index.js.map +0 -1
  151. package/lib/mf/input.js +0 -372
  152. package/lib/mf/input.js.map +0 -1
  153. package/lib/mf/static.js +0 -500
  154. package/lib/mf/static.js.map +0 -1
  155. package/lib/selection.js +0 -148
  156. package/lib/selection.js.map +0 -1
  157. package/src/__tests__/composites.test.jsx +0 -220
  158. package/src/__tests__/drop-in-compat.test.jsx +0 -112
  159. package/src/__tests__/index.test.jsx +0 -109
  160. package/src/__tests__/input-imperative.test.jsx +0 -144
  161. package/src/__tests__/input-selection.test.jsx +0 -64
  162. package/src/__tests__/keypad-label.test.jsx +0 -283
  163. package/src/__tests__/keypad-render.test.jsx +0 -123
  164. package/src/__tests__/latex-bridge.test.js +0 -359
  165. package/src/__tests__/mathlive-instance.test.js +0 -418
  166. package/src/__tests__/mount-race.test.jsx +0 -142
  167. package/src/__tests__/selection.test.js +0 -212
  168. package/src/__tests__/static-prompts.test.jsx +0 -364
  169. package/src/horizontal-keypad.jsx +0 -73
  170. package/src/index.jsx +0 -63
  171. package/src/keypad/index.jsx +0 -386
  172. package/src/keypad/keys-layout.js +0 -16
  173. package/src/keys/basic-operators.js +0 -32
  174. package/src/keys/chars.js +0 -5
  175. package/src/keys/comparison.js +0 -28
  176. package/src/keys/constants.js +0 -35
  177. package/src/keys/digits.js +0 -40
  178. package/src/keys/edit.js +0 -3
  179. package/src/keys/exponent.js +0 -28
  180. package/src/keys/fractions.js +0 -26
  181. package/src/keys/geometry.js +0 -149
  182. package/src/keys/grades.js +0 -367
  183. package/src/keys/index.js +0 -20
  184. package/src/keys/log.js +0 -22
  185. package/src/keys/logic.js +0 -15
  186. package/src/keys/matrices.js +0 -15
  187. package/src/keys/misc.js +0 -71
  188. package/src/keys/navigation.js +0 -8
  189. package/src/keys/operators.js +0 -10
  190. package/src/keys/statistics.js +0 -38
  191. package/src/keys/sub-sup.js +0 -15
  192. package/src/keys/trigonometry.js +0 -15
  193. package/src/keys/utils.js +0 -66
  194. package/src/keys/vars.js +0 -19
  195. package/src/latex-bridge.js +0 -449
  196. package/src/math-input.jsx +0 -115
  197. package/src/mathlive-instance.js +0 -582
  198. package/src/mf/common-styles.js +0 -210
  199. package/src/mf/index.js +0 -30
  200. package/src/mf/input.jsx +0 -328
  201. package/src/mf/static.jsx +0 -479
  202. package/src/selection.js +0 -146
@@ -1,218 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
5
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
6
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
7
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
8
- var _input = _interopRequireDefault(require("../mf/input"));
9
- /**
10
- * MathLive loads asynchronously, so `componentDidMount` resumes after an await
11
- * before appending a <math-field>. Two orderings must both hold:
12
- *
13
- * - StrictMode dev double-mount (mount -> unmount -> mount on the SAME
14
- * instance) must end up with exactly ONE field. A boolean "unmounted" flag
15
- * latches here and blocks the remount entirely - which is why this uses a
16
- * generation counter.
17
- * - A genuine unmount while the load is in flight must append nothing.
18
- *
19
- * MathLive cannot load under jsdom, so it is mocked with a minimal stub in
20
- * order to actually count appended fields.
21
- */
22
- jest.mock('../mathlive-instance', function () {
23
- // Must be a real DOM node: the component uses replaceChildren(), which
24
- // rejects anything that is not a Node. Returning an element from the
25
- // constructor replaces `this`, so callers get a genuine <math-field>.
26
- var FakeMathfieldElement = /*#__PURE__*/(0, _createClass2["default"])(function FakeMathfieldElement() {
27
- (0, _classCallCheck2["default"])(this, FakeMathfieldElement);
28
- // `global` rather than `document`: jest forbids out-of-scope variables in
29
- // a mock factory, and `global` is on its allow-list.
30
- var el = global.document.createElement('math-field');
31
- el.value = '';
32
- el.getValue = function () {
33
- return el.value;
34
- };
35
- return el;
36
- });
37
- return {
38
- loadMathLive: function loadMathLive() {
39
- return Promise.resolve({
40
- MathfieldElement: FakeMathfieldElement
41
- });
42
- },
43
- getMacros: function getMacros() {
44
- return {};
45
- },
46
- // must mirror the real export, otherwise the component sets `undefined`
47
- MATH_MODE_SPACE: '\\ ',
48
- applyShadowStyles: function applyShadowStyles() {},
49
- trackPlaceholderCaret: function trackPlaceholderCaret() {
50
- return function () {};
51
- },
52
- latexToMarkup: function latexToMarkup(l) {
53
- return "<span>".concat(l, "</span>");
54
- }
55
- };
56
- });
57
-
58
- // eslint-disable-next-line import/first
59
-
60
- var holderFor = function holderFor(cmp) {
61
- var el = document.createElement('span');
62
- cmp.holderRef = {
63
- current: el
64
- };
65
- return el;
66
- };
67
- var fieldCount = function fieldCount(el) {
68
- return Array.from(el.childNodes).filter(function (n) {
69
- return n.tagName === 'MATH-FIELD';
70
- }).length;
71
- };
72
- describe('async mount race', function () {
73
- it('StrictMode mount -> unmount -> mount yields exactly one field', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
74
- var input, el, first, second;
75
- return _regenerator["default"].wrap(function (_context) {
76
- while (1) switch (_context.prev = _context.next) {
77
- case 0:
78
- input = new _input["default"]({});
79
- el = holderFor(input);
80
- first = input.componentDidMount();
81
- input.componentWillUnmount();
82
- second = input.componentDidMount();
83
- _context.next = 1;
84
- return Promise.all([first, second]);
85
- case 1:
86
- expect(fieldCount(el)).toBe(1);
87
- expect(input.mathField).toBeDefined();
88
- case 2:
89
- case "end":
90
- return _context.stop();
91
- }
92
- }, _callee);
93
- })));
94
- it('appends nothing when unmounted while the load is in flight', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
95
- var input, el, pending;
96
- return _regenerator["default"].wrap(function (_context2) {
97
- while (1) switch (_context2.prev = _context2.next) {
98
- case 0:
99
- input = new _input["default"]({});
100
- el = holderFor(input);
101
- pending = input.componentDidMount();
102
- input.componentWillUnmount();
103
- _context2.next = 1;
104
- return pending;
105
- case 1:
106
- expect(fieldCount(el)).toBe(0);
107
- expect(input.mathField).toBeUndefined();
108
- case 2:
109
- case "end":
110
- return _context2.stop();
111
- }
112
- }, _callee2);
113
- })));
114
- it('a normal single mount creates the field', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
115
- var input, el;
116
- return _regenerator["default"].wrap(function (_context3) {
117
- while (1) switch (_context3.prev = _context3.next) {
118
- case 0:
119
- input = new _input["default"]({});
120
- el = holderFor(input);
121
- _context3.next = 1;
122
- return input.componentDidMount();
123
- case 1:
124
- expect(fieldCount(el)).toBe(1);
125
- case 2:
126
- case "end":
127
- return _context3.stop();
128
- }
129
- }, _callee3);
130
- })));
131
- it('repeated mounts never accumulate fields', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4() {
132
- var input, el;
133
- return _regenerator["default"].wrap(function (_context4) {
134
- while (1) switch (_context4.prev = _context4.next) {
135
- case 0:
136
- input = new _input["default"]({});
137
- el = holderFor(input);
138
- _context4.next = 1;
139
- return input.componentDidMount();
140
- case 1:
141
- _context4.next = 2;
142
- return input.componentDidMount();
143
- case 2:
144
- _context4.next = 3;
145
- return input.componentDidMount();
146
- case 3:
147
- expect(fieldCount(el)).toBe(1);
148
- case 4:
149
- case "end":
150
- return _context4.stop();
151
- }
152
- }, _callee4);
153
- })));
154
-
155
- // MathLive's mathModeSpace defaults to '', which makes the spacebar a no-op.
156
- it('configures the spacebar so a space can be typed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5() {
157
- var input;
158
- return _regenerator["default"].wrap(function (_context5) {
159
- while (1) switch (_context5.prev = _context5.next) {
160
- case 0:
161
- input = new _input["default"]({});
162
- holderFor(input);
163
- _context5.next = 1;
164
- return input.componentDidMount();
165
- case 1:
166
- // a LaTeX control space - what MathQuill produced, and MathJax understands
167
- expect(input.mathField.mathModeSpace).toEqual('\\ ');
168
- expect(input.mathField.mathModeSpace).not.toEqual('');
169
- case 2:
170
- case "end":
171
- return _context5.stop();
172
- }
173
- }, _callee5);
174
- })));
175
-
176
- // MathLive leaves a superscript after one digit by default (`smartSuperscript`),
177
- // so x^23 / 10^6 cannot be typed.
178
- it('stays in the exponent after a digit instead of jumping out', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6() {
179
- var input;
180
- return _regenerator["default"].wrap(function (_context6) {
181
- while (1) switch (_context6.prev = _context6.next) {
182
- case 0:
183
- input = new _input["default"]({});
184
- holderFor(input);
185
- _context6.next = 1;
186
- return input.componentDidMount();
187
- case 1:
188
- expect(input.mathField.smartSuperscript).toBe(false);
189
- case 2:
190
- case "end":
191
- return _context6.stop();
192
- }
193
- }, _callee6);
194
- })));
195
- it('reports itself through innerRef on mount and clears it on unmount', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7() {
196
- var innerRef, input;
197
- return _regenerator["default"].wrap(function (_context7) {
198
- while (1) switch (_context7.prev = _context7.next) {
199
- case 0:
200
- innerRef = jest.fn();
201
- input = new _input["default"]({
202
- innerRef: innerRef
203
- });
204
- holderFor(input);
205
- _context7.next = 1;
206
- return input.componentDidMount();
207
- case 1:
208
- expect(innerRef).toHaveBeenCalledWith(input);
209
- input.componentWillUnmount();
210
- expect(innerRef).toHaveBeenLastCalledWith(null);
211
- case 2:
212
- case "end":
213
- return _context7.stop();
214
- }
215
- }, _callee7);
216
- })));
217
- });
218
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaW5wdXQiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsImplc3QiLCJtb2NrIiwiRmFrZU1hdGhmaWVsZEVsZW1lbnQiLCJfY3JlYXRlQ2xhc3MyIiwiX2NsYXNzQ2FsbENoZWNrMiIsImVsIiwiZ2xvYmFsIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwidmFsdWUiLCJnZXRWYWx1ZSIsImxvYWRNYXRoTGl2ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwiTWF0aGZpZWxkRWxlbWVudCIsImdldE1hY3JvcyIsIk1BVEhfTU9ERV9TUEFDRSIsImFwcGx5U2hhZG93U3R5bGVzIiwidHJhY2tQbGFjZWhvbGRlckNhcmV0IiwibGF0ZXhUb01hcmt1cCIsImwiLCJjb25jYXQiLCJob2xkZXJGb3IiLCJjbXAiLCJob2xkZXJSZWYiLCJjdXJyZW50IiwiZmllbGRDb3VudCIsIkFycmF5IiwiZnJvbSIsImNoaWxkTm9kZXMiLCJmaWx0ZXIiLCJuIiwidGFnTmFtZSIsImxlbmd0aCIsImRlc2NyaWJlIiwiaXQiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsImlucHV0IiwiZmlyc3QiLCJzZWNvbmQiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsIklucHV0IiwiY29tcG9uZW50RGlkTW91bnQiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsImFsbCIsImV4cGVjdCIsInRvQmUiLCJtYXRoRmllbGQiLCJ0b0JlRGVmaW5lZCIsInN0b3AiLCJfY2FsbGVlMiIsInBlbmRpbmciLCJfY29udGV4dDIiLCJ0b0JlVW5kZWZpbmVkIiwiX2NhbGxlZTMiLCJfY29udGV4dDMiLCJfY2FsbGVlNCIsIl9jb250ZXh0NCIsIl9jYWxsZWU1IiwiX2NvbnRleHQ1IiwibWF0aE1vZGVTcGFjZSIsInRvRXF1YWwiLCJub3QiLCJfY2FsbGVlNiIsIl9jb250ZXh0NiIsInNtYXJ0U3VwZXJzY3JpcHQiLCJfY2FsbGVlNyIsImlubmVyUmVmIiwiX2NvbnRleHQ3IiwiZm4iLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsInRvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vbW91bnQtcmFjZS50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1hdGhMaXZlIGxvYWRzIGFzeW5jaHJvbm91c2x5LCBzbyBgY29tcG9uZW50RGlkTW91bnRgIHJlc3VtZXMgYWZ0ZXIgYW4gYXdhaXRcbiAqIGJlZm9yZSBhcHBlbmRpbmcgYSA8bWF0aC1maWVsZD4uIFR3byBvcmRlcmluZ3MgbXVzdCBib3RoIGhvbGQ6XG4gKlxuICogIC0gU3RyaWN0TW9kZSBkZXYgZG91YmxlLW1vdW50IChtb3VudCAtPiB1bm1vdW50IC0+IG1vdW50IG9uIHRoZSBTQU1FXG4gKiAgICBpbnN0YW5jZSkgbXVzdCBlbmQgdXAgd2l0aCBleGFjdGx5IE9ORSBmaWVsZC4gQSBib29sZWFuIFwidW5tb3VudGVkXCIgZmxhZ1xuICogICAgbGF0Y2hlcyBoZXJlIGFuZCBibG9ja3MgdGhlIHJlbW91bnQgZW50aXJlbHkgLSB3aGljaCBpcyB3aHkgdGhpcyB1c2VzIGFcbiAqICAgIGdlbmVyYXRpb24gY291bnRlci5cbiAqICAtIEEgZ2VudWluZSB1bm1vdW50IHdoaWxlIHRoZSBsb2FkIGlzIGluIGZsaWdodCBtdXN0IGFwcGVuZCBub3RoaW5nLlxuICpcbiAqIE1hdGhMaXZlIGNhbm5vdCBsb2FkIHVuZGVyIGpzZG9tLCBzbyBpdCBpcyBtb2NrZWQgd2l0aCBhIG1pbmltYWwgc3R1YiBpblxuICogb3JkZXIgdG8gYWN0dWFsbHkgY291bnQgYXBwZW5kZWQgZmllbGRzLlxuICovXG5qZXN0Lm1vY2soJy4uL21hdGhsaXZlLWluc3RhbmNlJywgKCkgPT4ge1xuICAvLyBNdXN0IGJlIGEgcmVhbCBET00gbm9kZTogdGhlIGNvbXBvbmVudCB1c2VzIHJlcGxhY2VDaGlsZHJlbigpLCB3aGljaFxuICAvLyByZWplY3RzIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgTm9kZS4gUmV0dXJuaW5nIGFuIGVsZW1lbnQgZnJvbSB0aGVcbiAgLy8gY29uc3RydWN0b3IgcmVwbGFjZXMgYHRoaXNgLCBzbyBjYWxsZXJzIGdldCBhIGdlbnVpbmUgPG1hdGgtZmllbGQ+LlxuICBjbGFzcyBGYWtlTWF0aGZpZWxkRWxlbWVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAvLyBgZ2xvYmFsYCByYXRoZXIgdGhhbiBgZG9jdW1lbnRgOiBqZXN0IGZvcmJpZHMgb3V0LW9mLXNjb3BlIHZhcmlhYmxlcyBpblxuICAgICAgLy8gYSBtb2NrIGZhY3RvcnksIGFuZCBgZ2xvYmFsYCBpcyBvbiBpdHMgYWxsb3ctbGlzdC5cbiAgICAgIGNvbnN0IGVsID0gZ2xvYmFsLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21hdGgtZmllbGQnKTtcblxuICAgICAgZWwudmFsdWUgPSAnJztcbiAgICAgIGVsLmdldFZhbHVlID0gKCkgPT4gZWwudmFsdWU7XG5cbiAgICAgIHJldHVybiBlbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGxvYWRNYXRoTGl2ZTogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHsgTWF0aGZpZWxkRWxlbWVudDogRmFrZU1hdGhmaWVsZEVsZW1lbnQgfSksXG4gICAgZ2V0TWFjcm9zOiAoKSA9PiAoe30pLFxuICAgIC8vIG11c3QgbWlycm9yIHRoZSByZWFsIGV4cG9ydCwgb3RoZXJ3aXNlIHRoZSBjb21wb25lbnQgc2V0cyBgdW5kZWZpbmVkYFxuICAgIE1BVEhfTU9ERV9TUEFDRTogJ1xcXFwgJyxcbiAgICBhcHBseVNoYWRvd1N0eWxlczogKCkgPT4ge30sXG4gICAgdHJhY2tQbGFjZWhvbGRlckNhcmV0OiAoKSA9PiAoKSA9PiB7fSxcbiAgICBsYXRleFRvTWFya3VwOiAobCkgPT4gYDxzcGFuPiR7bH08L3NwYW4+YCxcbiAgfTtcbn0pO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L2ZpcnN0XG5pbXBvcnQgSW5wdXQgZnJvbSAnLi4vbWYvaW5wdXQnO1xuXG5jb25zdCBob2xkZXJGb3IgPSAoY21wKSA9PiB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuXG4gIGNtcC5ob2xkZXJSZWYgPSB7IGN1cnJlbnQ6IGVsIH07XG5cbiAgcmV0dXJuIGVsO1xufTtcblxuY29uc3QgZmllbGRDb3VudCA9IChlbCkgPT4gQXJyYXkuZnJvbShlbC5jaGlsZE5vZGVzKS5maWx0ZXIoKG4pID0+IG4udGFnTmFtZSA9PT0gJ01BVEgtRklFTEQnKS5sZW5ndGg7XG5cbmRlc2NyaWJlKCdhc3luYyBtb3VudCByYWNlJywgKCkgPT4ge1xuICBpdCgnU3RyaWN0TW9kZSBtb3VudCAtPiB1bm1vdW50IC0+IG1vdW50IHlpZWxkcyBleGFjdGx5IG9uZSBmaWVsZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IG5ldyBJbnB1dCh7fSk7XG4gICAgY29uc3QgZWwgPSBob2xkZXJGb3IoaW5wdXQpO1xuXG4gICAgY29uc3QgZmlyc3QgPSBpbnB1dC5jb21wb25lbnREaWRNb3VudCgpO1xuXG4gICAgaW5wdXQuY29tcG9uZW50V2lsbFVubW91bnQoKTtcblxuICAgIGNvbnN0IHNlY29uZCA9IGlucHV0LmNvbXBvbmVudERpZE1vdW50KCk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChbZmlyc3QsIHNlY29uZF0pO1xuXG4gICAgZXhwZWN0KGZpZWxkQ291bnQoZWwpKS50b0JlKDEpO1xuICAgIGV4cGVjdChpbnB1dC5tYXRoRmllbGQpLnRvQmVEZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGl0KCdhcHBlbmRzIG5vdGhpbmcgd2hlbiB1bm1vdW50ZWQgd2hpbGUgdGhlIGxvYWQgaXMgaW4gZmxpZ2h0JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gbmV3IElucHV0KHt9KTtcbiAgICBjb25zdCBlbCA9IGhvbGRlckZvcihpbnB1dCk7XG5cbiAgICBjb25zdCBwZW5kaW5nID0gaW5wdXQuY29tcG9uZW50RGlkTW91bnQoKTtcblxuICAgIGlucHV0LmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG5cbiAgICBhd2FpdCBwZW5kaW5nO1xuXG4gICAgZXhwZWN0KGZpZWxkQ291bnQoZWwpKS50b0JlKDApO1xuICAgIGV4cGVjdChpbnB1dC5tYXRoRmllbGQpLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ2Egbm9ybWFsIHNpbmdsZSBtb3VudCBjcmVhdGVzIHRoZSBmaWVsZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IG5ldyBJbnB1dCh7fSk7XG4gICAgY29uc3QgZWwgPSBob2xkZXJGb3IoaW5wdXQpO1xuXG4gICAgYXdhaXQgaW5wdXQuY29tcG9uZW50RGlkTW91bnQoKTtcblxuICAgIGV4cGVjdChmaWVsZENvdW50KGVsKSkudG9CZSgxKTtcbiAgfSk7XG5cbiAgaXQoJ3JlcGVhdGVkIG1vdW50cyBuZXZlciBhY2N1bXVsYXRlIGZpZWxkcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IG5ldyBJbnB1dCh7fSk7XG4gICAgY29uc3QgZWwgPSBob2xkZXJGb3IoaW5wdXQpO1xuXG4gICAgYXdhaXQgaW5wdXQuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICBhd2FpdCBpbnB1dC5jb21wb25lbnREaWRNb3VudCgpO1xuICAgIGF3YWl0IGlucHV0LmNvbXBvbmVudERpZE1vdW50KCk7XG5cbiAgICBleHBlY3QoZmllbGRDb3VudChlbCkpLnRvQmUoMSk7XG4gIH0pO1xuXG4gIC8vIE1hdGhMaXZlJ3MgbWF0aE1vZGVTcGFjZSBkZWZhdWx0cyB0byAnJywgd2hpY2ggbWFrZXMgdGhlIHNwYWNlYmFyIGEgbm8tb3AuXG4gIGl0KCdjb25maWd1cmVzIHRoZSBzcGFjZWJhciBzbyBhIHNwYWNlIGNhbiBiZSB0eXBlZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IG5ldyBJbnB1dCh7fSk7XG5cbiAgICBob2xkZXJGb3IoaW5wdXQpO1xuICAgIGF3YWl0IGlucHV0LmNvbXBvbmVudERpZE1vdW50KCk7XG5cbiAgICAvLyBhIExhVGVYIGNvbnRyb2wgc3BhY2UgLSB3aGF0IE1hdGhRdWlsbCBwcm9kdWNlZCwgYW5kIE1hdGhKYXggdW5kZXJzdGFuZHNcbiAgICBleHBlY3QoaW5wdXQubWF0aEZpZWxkLm1hdGhNb2RlU3BhY2UpLnRvRXF1YWwoJ1xcXFwgJyk7XG4gICAgZXhwZWN0KGlucHV0Lm1hdGhGaWVsZC5tYXRoTW9kZVNwYWNlKS5ub3QudG9FcXVhbCgnJyk7XG4gIH0pO1xuXG4gIC8vIE1hdGhMaXZlIGxlYXZlcyBhIHN1cGVyc2NyaXB0IGFmdGVyIG9uZSBkaWdpdCBieSBkZWZhdWx0IChgc21hcnRTdXBlcnNjcmlwdGApLFxuICAvLyBzbyB4XjIzIC8gMTBeNiBjYW5ub3QgYmUgdHlwZWQuXG4gIGl0KCdzdGF5cyBpbiB0aGUgZXhwb25lbnQgYWZ0ZXIgYSBkaWdpdCBpbnN0ZWFkIG9mIGp1bXBpbmcgb3V0JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gbmV3IElucHV0KHt9KTtcblxuICAgIGhvbGRlckZvcihpbnB1dCk7XG4gICAgYXdhaXQgaW5wdXQuY29tcG9uZW50RGlkTW91bnQoKTtcblxuICAgIGV4cGVjdChpbnB1dC5tYXRoRmllbGQuc21hcnRTdXBlcnNjcmlwdCkudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdyZXBvcnRzIGl0c2VsZiB0aHJvdWdoIGlubmVyUmVmIG9uIG1vdW50IGFuZCBjbGVhcnMgaXQgb24gdW5tb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbm5lclJlZiA9IGplc3QuZm4oKTtcbiAgICBjb25zdCBpbnB1dCA9IG5ldyBJbnB1dCh7IGlubmVyUmVmIH0pO1xuXG4gICAgaG9sZGVyRm9yKGlucHV0KTtcbiAgICBhd2FpdCBpbnB1dC5jb21wb25lbnREaWRNb3VudCgpO1xuXG4gICAgZXhwZWN0KGlubmVyUmVmKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChpbnB1dCk7XG5cbiAgICBpbnB1dC5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuXG4gICAgZXhwZWN0KGlubmVyUmVmKS50b0hhdmVCZWVuTGFzdENhbGxlZFdpdGgobnVsbCk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUEwQ0EsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0FDLElBQUksQ0FBQ0MsSUFBSSxDQUFDLHNCQUFzQixFQUFFLFlBQU07RUFDdEM7RUFDQTtFQUNBO0VBQUEsSUFDTUMsb0JBQW9CLG9CQUFBQyxhQUFBLGFBQ3hCLFNBQUFELHFCQUFBLEVBQWM7SUFBQSxJQUFBRSxnQkFBQSxtQkFBQUYsb0JBQUE7SUFDWjtJQUNBO0lBQ0EsSUFBTUcsRUFBRSxHQUFHQyxNQUFNLENBQUNDLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLFlBQVksQ0FBQztJQUV0REgsRUFBRSxDQUFDSSxLQUFLLEdBQUcsRUFBRTtJQUNiSixFQUFFLENBQUNLLFFBQVEsR0FBRztNQUFBLE9BQU1MLEVBQUUsQ0FBQ0ksS0FBSztJQUFBO0lBRTVCLE9BQU9KLEVBQUU7RUFDWCxDQUFDO0VBR0gsT0FBTztJQUNMTSxZQUFZLEVBQUUsU0FBZEEsWUFBWUEsQ0FBQTtNQUFBLE9BQVFDLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDO1FBQUVDLGdCQUFnQixFQUFFWjtNQUFxQixDQUFDLENBQUM7SUFBQTtJQUMvRWEsU0FBUyxFQUFFLFNBQVhBLFNBQVNBLENBQUE7TUFBQSxPQUFTLENBQUMsQ0FBQztJQUFBLENBQUM7SUFDckI7SUFDQUMsZUFBZSxFQUFFLEtBQUs7SUFDdEJDLGlCQUFpQixFQUFFLFNBQW5CQSxpQkFBaUJBLENBQUEsRUFBUSxDQUFDLENBQUM7SUFDM0JDLHFCQUFxQixFQUFFLFNBQXZCQSxxQkFBcUJBLENBQUE7TUFBQSxPQUFRLFlBQU0sQ0FBQyxDQUFDO0lBQUE7SUFDckNDLGFBQWEsRUFBRSxTQUFmQSxhQUFhQSxDQUFHQyxDQUFDO01BQUEsZ0JBQUFDLE1BQUEsQ0FBY0QsQ0FBQztJQUFBO0VBQ2xDLENBQUM7QUFDSCxDQUFDLENBQUM7O0FBRUY7O0FBR0EsSUFBTUUsU0FBUyxHQUFHLFNBQVpBLFNBQVNBLENBQUlDLEdBQUcsRUFBSztFQUN6QixJQUFNbEIsRUFBRSxHQUFHRSxRQUFRLENBQUNDLGFBQWEsQ0FBQyxNQUFNLENBQUM7RUFFekNlLEdBQUcsQ0FBQ0MsU0FBUyxHQUFHO0lBQUVDLE9BQU8sRUFBRXBCO0VBQUcsQ0FBQztFQUUvQixPQUFPQSxFQUFFO0FBQ1gsQ0FBQztBQUVELElBQU1xQixVQUFVLEdBQUcsU0FBYkEsVUFBVUEsQ0FBSXJCLEVBQUU7RUFBQSxPQUFLc0IsS0FBSyxDQUFDQyxJQUFJLENBQUN2QixFQUFFLENBQUN3QixVQUFVLENBQUMsQ0FBQ0MsTUFBTSxDQUFDLFVBQUNDLENBQUM7SUFBQSxPQUFLQSxDQUFDLENBQUNDLE9BQU8sS0FBSyxZQUFZO0VBQUEsRUFBQyxDQUFDQyxNQUFNO0FBQUE7QUFFckdDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxZQUFNO0VBQ2pDQyxFQUFFLENBQUMsK0RBQStELG1CQUFBQyxrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQUMsUUFBQTtJQUFBLElBQUFDLEtBQUEsRUFBQW5DLEVBQUEsRUFBQW9DLEtBQUEsRUFBQUMsTUFBQTtJQUFBLE9BQUFMLFlBQUEsWUFBQU0sSUFBQSxXQUFBQyxRQUFBO01BQUEsa0JBQUFBLFFBQUEsQ0FBQUMsSUFBQSxHQUFBRCxRQUFBLENBQUFFLElBQUE7UUFBQTtVQUM1RE4sS0FBSyxHQUFHLElBQUlPLGlCQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFDckIxQyxFQUFFLEdBQUdpQixTQUFTLENBQUNrQixLQUFLLENBQUM7VUFFckJDLEtBQUssR0FBR0QsS0FBSyxDQUFDUSxpQkFBaUIsQ0FBQyxDQUFDO1VBRXZDUixLQUFLLENBQUNTLG9CQUFvQixDQUFDLENBQUM7VUFFdEJQLE1BQU0sR0FBR0YsS0FBSyxDQUFDUSxpQkFBaUIsQ0FBQyxDQUFDO1VBQUFKLFFBQUEsQ0FBQUUsSUFBQTtVQUFBLE9BRWxDbEMsT0FBTyxDQUFDc0MsR0FBRyxDQUFDLENBQUNULEtBQUssRUFBRUMsTUFBTSxDQUFDLENBQUM7UUFBQTtVQUVsQ1MsTUFBTSxDQUFDekIsVUFBVSxDQUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQytDLElBQUksQ0FBQyxDQUFDLENBQUM7VUFDOUJELE1BQU0sQ0FBQ1gsS0FBSyxDQUFDYSxTQUFTLENBQUMsQ0FBQ0MsV0FBVyxDQUFDLENBQUM7UUFBQztRQUFBO1VBQUEsT0FBQVYsUUFBQSxDQUFBVyxJQUFBO01BQUE7SUFBQSxHQUFBaEIsT0FBQTtFQUFBLENBQ3ZDLEdBQUM7RUFFRkosRUFBRSxDQUFDLDREQUE0RCxtQkFBQUMsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUFrQixTQUFBO0lBQUEsSUFBQWhCLEtBQUEsRUFBQW5DLEVBQUEsRUFBQW9ELE9BQUE7SUFBQSxPQUFBcEIsWUFBQSxZQUFBTSxJQUFBLFdBQUFlLFNBQUE7TUFBQSxrQkFBQUEsU0FBQSxDQUFBYixJQUFBLEdBQUFhLFNBQUEsQ0FBQVosSUFBQTtRQUFBO1VBQ3pETixLQUFLLEdBQUcsSUFBSU8saUJBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUNyQjFDLEVBQUUsR0FBR2lCLFNBQVMsQ0FBQ2tCLEtBQUssQ0FBQztVQUVyQmlCLE9BQU8sR0FBR2pCLEtBQUssQ0FBQ1EsaUJBQWlCLENBQUMsQ0FBQztVQUV6Q1IsS0FBSyxDQUFDUyxvQkFBb0IsQ0FBQyxDQUFDO1VBQUNTLFNBQUEsQ0FBQVosSUFBQTtVQUFBLE9BRXZCVyxPQUFPO1FBQUE7VUFFYk4sTUFBTSxDQUFDekIsVUFBVSxDQUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQytDLElBQUksQ0FBQyxDQUFDLENBQUM7VUFDOUJELE1BQU0sQ0FBQ1gsS0FBSyxDQUFDYSxTQUFTLENBQUMsQ0FBQ00sYUFBYSxDQUFDLENBQUM7UUFBQztRQUFBO1VBQUEsT0FBQUQsU0FBQSxDQUFBSCxJQUFBO01BQUE7SUFBQSxHQUFBQyxRQUFBO0VBQUEsQ0FDekMsR0FBQztFQUVGckIsRUFBRSxDQUFDLHlDQUF5QyxtQkFBQUMsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUFzQixTQUFBO0lBQUEsSUFBQXBCLEtBQUEsRUFBQW5DLEVBQUE7SUFBQSxPQUFBZ0MsWUFBQSxZQUFBTSxJQUFBLFdBQUFrQixTQUFBO01BQUEsa0JBQUFBLFNBQUEsQ0FBQWhCLElBQUEsR0FBQWdCLFNBQUEsQ0FBQWYsSUFBQTtRQUFBO1VBQ3RDTixLQUFLLEdBQUcsSUFBSU8saUJBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUNyQjFDLEVBQUUsR0FBR2lCLFNBQVMsQ0FBQ2tCLEtBQUssQ0FBQztVQUFBcUIsU0FBQSxDQUFBZixJQUFBO1VBQUEsT0FFckJOLEtBQUssQ0FBQ1EsaUJBQWlCLENBQUMsQ0FBQztRQUFBO1VBRS9CRyxNQUFNLENBQUN6QixVQUFVLENBQUNyQixFQUFFLENBQUMsQ0FBQyxDQUFDK0MsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUFDO1FBQUE7VUFBQSxPQUFBUyxTQUFBLENBQUFOLElBQUE7TUFBQTtJQUFBLEdBQUFLLFFBQUE7RUFBQSxDQUNoQyxHQUFDO0VBRUZ6QixFQUFFLENBQUMseUNBQXlDLG1CQUFBQyxrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQXdCLFNBQUE7SUFBQSxJQUFBdEIsS0FBQSxFQUFBbkMsRUFBQTtJQUFBLE9BQUFnQyxZQUFBLFlBQUFNLElBQUEsV0FBQW9CLFNBQUE7TUFBQSxrQkFBQUEsU0FBQSxDQUFBbEIsSUFBQSxHQUFBa0IsU0FBQSxDQUFBakIsSUFBQTtRQUFBO1VBQ3RDTixLQUFLLEdBQUcsSUFBSU8saUJBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUNyQjFDLEVBQUUsR0FBR2lCLFNBQVMsQ0FBQ2tCLEtBQUssQ0FBQztVQUFBdUIsU0FBQSxDQUFBakIsSUFBQTtVQUFBLE9BRXJCTixLQUFLLENBQUNRLGlCQUFpQixDQUFDLENBQUM7UUFBQTtVQUFBZSxTQUFBLENBQUFqQixJQUFBO1VBQUEsT0FDekJOLEtBQUssQ0FBQ1EsaUJBQWlCLENBQUMsQ0FBQztRQUFBO1VBQUFlLFNBQUEsQ0FBQWpCLElBQUE7VUFBQSxPQUN6Qk4sS0FBSyxDQUFDUSxpQkFBaUIsQ0FBQyxDQUFDO1FBQUE7VUFFL0JHLE1BQU0sQ0FBQ3pCLFVBQVUsQ0FBQ3JCLEVBQUUsQ0FBQyxDQUFDLENBQUMrQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQUM7UUFBQTtVQUFBLE9BQUFXLFNBQUEsQ0FBQVIsSUFBQTtNQUFBO0lBQUEsR0FBQU8sUUFBQTtFQUFBLENBQ2hDLEdBQUM7O0VBRUY7RUFDQTNCLEVBQUUsQ0FBQyxpREFBaUQsbUJBQUFDLGtCQUFBLDBCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBRSxTQUFBMEIsU0FBQTtJQUFBLElBQUF4QixLQUFBO0lBQUEsT0FBQUgsWUFBQSxZQUFBTSxJQUFBLFdBQUFzQixTQUFBO01BQUEsa0JBQUFBLFNBQUEsQ0FBQXBCLElBQUEsR0FBQW9CLFNBQUEsQ0FBQW5CLElBQUE7UUFBQTtVQUM5Q04sS0FBSyxHQUFHLElBQUlPLGlCQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFFM0J6QixTQUFTLENBQUNrQixLQUFLLENBQUM7VUFBQ3lCLFNBQUEsQ0FBQW5CLElBQUE7VUFBQSxPQUNYTixLQUFLLENBQUNRLGlCQUFpQixDQUFDLENBQUM7UUFBQTtVQUUvQjtVQUNBRyxNQUFNLENBQUNYLEtBQUssQ0FBQ2EsU0FBUyxDQUFDYSxhQUFhLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLEtBQUssQ0FBQztVQUNwRGhCLE1BQU0sQ0FBQ1gsS0FBSyxDQUFDYSxTQUFTLENBQUNhLGFBQWEsQ0FBQyxDQUFDRSxHQUFHLENBQUNELE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFBQztRQUFBO1VBQUEsT0FBQUYsU0FBQSxDQUFBVixJQUFBO01BQUE7SUFBQSxHQUFBUyxRQUFBO0VBQUEsQ0FDdkQsR0FBQzs7RUFFRjtFQUNBO0VBQ0E3QixFQUFFLENBQUMsNERBQTRELG1CQUFBQyxrQkFBQSwwQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUUsU0FBQStCLFNBQUE7SUFBQSxJQUFBN0IsS0FBQTtJQUFBLE9BQUFILFlBQUEsWUFBQU0sSUFBQSxXQUFBMkIsU0FBQTtNQUFBLGtCQUFBQSxTQUFBLENBQUF6QixJQUFBLEdBQUF5QixTQUFBLENBQUF4QixJQUFBO1FBQUE7VUFDekROLEtBQUssR0FBRyxJQUFJTyxpQkFBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1VBRTNCekIsU0FBUyxDQUFDa0IsS0FBSyxDQUFDO1VBQUM4QixTQUFBLENBQUF4QixJQUFBO1VBQUEsT0FDWE4sS0FBSyxDQUFDUSxpQkFBaUIsQ0FBQyxDQUFDO1FBQUE7VUFFL0JHLE1BQU0sQ0FBQ1gsS0FBSyxDQUFDYSxTQUFTLENBQUNrQixnQkFBZ0IsQ0FBQyxDQUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUFDO1FBQUE7VUFBQSxPQUFBa0IsU0FBQSxDQUFBZixJQUFBO01BQUE7SUFBQSxHQUFBYyxRQUFBO0VBQUEsQ0FDdEQsR0FBQztFQUVGbEMsRUFBRSxDQUFDLG1FQUFtRSxtQkFBQUMsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUFrQyxTQUFBO0lBQUEsSUFBQUMsUUFBQSxFQUFBakMsS0FBQTtJQUFBLE9BQUFILFlBQUEsWUFBQU0sSUFBQSxXQUFBK0IsU0FBQTtNQUFBLGtCQUFBQSxTQUFBLENBQUE3QixJQUFBLEdBQUE2QixTQUFBLENBQUE1QixJQUFBO1FBQUE7VUFDaEUyQixRQUFRLEdBQUd6RSxJQUFJLENBQUMyRSxFQUFFLENBQUMsQ0FBQztVQUNwQm5DLEtBQUssR0FBRyxJQUFJTyxpQkFBSyxDQUFDO1lBQUUwQixRQUFRLEVBQVJBO1VBQVMsQ0FBQyxDQUFDO1VBRXJDbkQsU0FBUyxDQUFDa0IsS0FBSyxDQUFDO1VBQUNrQyxTQUFBLENBQUE1QixJQUFBO1VBQUEsT0FDWE4sS0FBSyxDQUFDUSxpQkFBaUIsQ0FBQyxDQUFDO1FBQUE7VUFFL0JHLE1BQU0sQ0FBQ3NCLFFBQVEsQ0FBQyxDQUFDRyxvQkFBb0IsQ0FBQ3BDLEtBQUssQ0FBQztVQUU1Q0EsS0FBSyxDQUFDUyxvQkFBb0IsQ0FBQyxDQUFDO1VBRTVCRSxNQUFNLENBQUNzQixRQUFRLENBQUMsQ0FBQ0ksd0JBQXdCLENBQUMsSUFBSSxDQUFDO1FBQUM7UUFBQTtVQUFBLE9BQUFILFNBQUEsQ0FBQW5CLElBQUE7TUFBQTtJQUFBLEdBQUFpQixRQUFBO0VBQUEsQ0FDakQsR0FBQztBQUNKLENBQUMsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
@@ -1,195 +0,0 @@
1
- "use strict";
2
-
3
- var _selection = require("../selection");
4
- /**
5
- * Offset tables captured from MathLive 0.110.0 `getElementInfo(i)` in Chrome,
6
- * as [depth, latex] per offset. Offset `i` is the atom ending at caret `i`.
7
- */
8
- var table = function table(rows) {
9
- return function (i) {
10
- return rows[i] ? {
11
- depth: rows[i][0],
12
- latex: rows[i][1]
13
- } : undefined;
14
- };
15
- };
16
-
17
- // 5x^2+2x+\frac{\pi}{2}-4
18
- var POLY = table([[0, ''], [0, '5'], [0, 'x'], [1, ''], [1, '2'], [0, '^2'], [0, '+'], [0, '2'], [0, 'x'], [0, '+'], [1, ''], [1, '\\pi'], [1, ''], [1, '2'], [0, '\\frac{\\pi}{2}'], [0, '-'], [0, '4']]);
19
- var POLY_LAST = 16;
20
-
21
- // a+\sqrt{x+1}+b
22
- var ROOT = table([[0, ''], [0, 'a'], [0, '+'], [1, ''], [1, 'x'], [1, '+'], [1, '1'], [0, '\\sqrt{x+1}'], [0, '+'], [0, 'b']]);
23
-
24
- // \frac{\frac{a}{b}}{c}
25
- var NESTED = table([[0, ''], [1, ''], [2, ''], [2, 'a'], [2, ''], [2, 'b'], [1, '\\frac{a}{b}'], [1, ''], [1, 'c'], [0, '\\frac{\\frac{a}{b}}{c}']]);
26
- describe('expandRange', function () {
27
- var poly = function poly(a, b) {
28
- return (0, _selection.expandRange)(a, b, POLY, POLY_LAST);
29
- };
30
- it('leaves a selection of whole sibling atoms alone', function () {
31
- expect(poly(6, 7)).toEqual([6, 7]); // 2
32
- expect(poly(6, 9)).toEqual([6, 9]); // 2x+
33
- expect(poly(6, 15)).toEqual([6, 15]); // 2x+\frac{\pi}{2}-
34
- expect(poly(0, 16)).toEqual([0, 16]);
35
- });
36
-
37
- // The reported case: five Shift+Right presses from before `2x` gave `2x+\pi`.
38
- it('takes the whole fraction when the selection reaches into it', function () {
39
- expect(poly(6, 10)).toEqual([6, 14]);
40
- expect(poly(6, 11)).toEqual([6, 14]);
41
- expect(poly(6, 13)).toEqual([6, 14]);
42
- });
43
- it('takes the whole fraction when the selection leaves it', function () {
44
- expect(poly(11, 15)).toEqual([9, 15]); // from the pi to after the minus
45
- });
46
- it('crossing from numerator to denominator selects the fraction', function () {
47
- expect(poly(11, 13)).toEqual([9, 14]);
48
- expect(poly(11, 12)).toEqual([9, 14]);
49
- });
50
- it('a selection inside one branch stays inside it', function () {
51
- expect(poly(10, 11)).toEqual([10, 11]); // \pi
52
- expect(poly(12, 13)).toEqual([12, 13]); // the 2 of the denominator
53
- });
54
-
55
- // MathLive stores x^2 as `x` then a separate `^2` atom.
56
- it('keeps a superscript with its base', function () {
57
- expect(poly(3, 7)).toEqual([1, 7]); // x^2+2, not ^2+2
58
- expect(poly(4, 6)).toEqual([1, 6]); // x^2+
59
- });
60
- it('accepts a reversed range', function () {
61
- expect(poly(11, 6)).toEqual([6, 14]);
62
- });
63
- it('leaves a collapsed range alone', function () {
64
- expect(poly(11, 11)).toEqual([11, 11]);
65
- });
66
- it('handles roots the same way', function () {
67
- expect((0, _selection.expandRange)(2, 4, ROOT, 9)).toEqual([2, 7]);
68
- expect((0, _selection.expandRange)(4, 6, ROOT, 9)).toEqual([4, 6]); // +1 inside the radicand
69
- });
70
- it('climbs as many levels as needed in nested fractions', function () {
71
- expect((0, _selection.expandRange)(2, 3, NESTED, 9)).toEqual([2, 3]); // a
72
- expect((0, _selection.expandRange)(3, 5, NESTED, 9)).toEqual([1, 6]); // a/b crossing -> inner fraction
73
- expect((0, _selection.expandRange)(6, 7, NESTED, 9)).toEqual([0, 9]); // inner -> outer denominator
74
- });
75
- it('tolerates missing info', function () {
76
- expect((0, _selection.expandRange)(1, 3, function () {
77
- return undefined;
78
- }, 5)).toEqual([1, 3]);
79
- });
80
- });
81
- describe('trackWholeAtomSelection', function () {
82
- var stubField = function stubField(range) {
83
- var direction = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'forward';
84
- var listeners = {};
85
- return {
86
- selection: {
87
- ranges: [range],
88
- direction: direction
89
- },
90
- get selectionIsCollapsed() {
91
- return this.selection.ranges[0][0] === this.selection.ranges[0][1];
92
- },
93
- lastOffset: POLY_LAST,
94
- getElementInfo: POLY,
95
- sets: 0,
96
- addEventListener: function addEventListener(type, fn) {
97
- listeners[type] = fn;
98
- },
99
- removeEventListener: function removeEventListener(type, fn) {
100
- if (listeners[type] === fn) {
101
- delete listeners[type];
102
- }
103
- },
104
- fire: function fire(type) {
105
- if (listeners[type]) {
106
- listeners[type]();
107
- }
108
- },
109
- has: function has(type) {
110
- return !!listeners[type];
111
- }
112
- };
113
- };
114
- var track = function track(field) {
115
- // count assignments without breaking the getter
116
- var current = field.selection;
117
- Object.defineProperty(field, 'selection', {
118
- get: function get() {
119
- return current;
120
- },
121
- set: function set(v) {
122
- field.sets += 1;
123
- current = v;
124
- }
125
- });
126
- return (0, _selection.trackWholeAtomSelection)(field);
127
- };
128
- it('widens the selection on selection-change', function () {
129
- var field = stubField([6, 11]);
130
- track(field);
131
- field.fire('selection-change');
132
- expect(field.selection.ranges).toEqual([[6, 14]]);
133
- });
134
- it('preserves the direction, so Shift+Arrow keeps extending the same end', function () {
135
- var field = stubField([11, 16], 'backward');
136
- track(field);
137
- field.fire('selection-change');
138
- expect(field.selection).toEqual({
139
- ranges: [[9, 16]],
140
- direction: 'backward'
141
- });
142
- });
143
- it('does not touch a selection that is already whole', function () {
144
- var field = stubField([6, 9]);
145
- track(field);
146
- field.fire('selection-change');
147
- expect(field.sets).toBe(0);
148
- });
149
- it('ignores a collapsed caret', function () {
150
- var field = stubField([11, 11]);
151
- track(field);
152
- field.fire('selection-change');
153
- expect(field.sets).toBe(0);
154
- });
155
- it('does not recurse when its own assignment fires selection-change', function () {
156
- var field = stubField([6, 11]);
157
- var current = field.selection;
158
- Object.defineProperty(field, 'selection', {
159
- get: function get() {
160
- return current;
161
- },
162
- set: function set(v) {
163
- field.sets += 1;
164
- current = v;
165
- field.fire('selection-change');
166
- }
167
- });
168
- (0, _selection.trackWholeAtomSelection)(field);
169
- field.fire('selection-change');
170
- expect(field.sets).toBe(1);
171
- expect(field.selection.ranges).toEqual([[6, 14]]);
172
- });
173
- it('survives a field that throws', function () {
174
- var field = stubField([6, 11]);
175
- field.getElementInfo = function () {
176
- throw new Error('boom');
177
- };
178
- track(field);
179
- expect(function () {
180
- return field.fire('selection-change');
181
- }).not.toThrow();
182
- });
183
- it('tears down its listener', function () {
184
- var field = stubField([6, 11]);
185
- var untrack = track(field);
186
- expect(field.has('selection-change')).toBe(true);
187
- untrack();
188
- expect(field.has('selection-change')).toBe(false);
189
- });
190
- it('is a no-op without a field', function () {
191
- expect((0, _selection.trackWholeAtomSelection)(undefined)).toBeUndefined();
192
- expect((0, _selection.trackWholeAtomSelection)({})).toBeUndefined();
193
- });
194
- });
195
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc2VsZWN0aW9uIiwicmVxdWlyZSIsInRhYmxlIiwicm93cyIsImkiLCJkZXB0aCIsImxhdGV4IiwidW5kZWZpbmVkIiwiUE9MWSIsIlBPTFlfTEFTVCIsIlJPT1QiLCJORVNURUQiLCJkZXNjcmliZSIsInBvbHkiLCJhIiwiYiIsImV4cGFuZFJhbmdlIiwiaXQiLCJleHBlY3QiLCJ0b0VxdWFsIiwic3R1YkZpZWxkIiwicmFuZ2UiLCJkaXJlY3Rpb24iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJsaXN0ZW5lcnMiLCJzZWxlY3Rpb24iLCJyYW5nZXMiLCJzZWxlY3Rpb25Jc0NvbGxhcHNlZCIsImxhc3RPZmZzZXQiLCJnZXRFbGVtZW50SW5mbyIsInNldHMiLCJhZGRFdmVudExpc3RlbmVyIiwidHlwZSIsImZuIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImZpcmUiLCJoYXMiLCJ0cmFjayIsImZpZWxkIiwiY3VycmVudCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0Iiwic2V0IiwidiIsInRyYWNrV2hvbGVBdG9tU2VsZWN0aW9uIiwidG9CZSIsIkVycm9yIiwibm90IiwidG9UaHJvdyIsInVudHJhY2siLCJ0b0JlVW5kZWZpbmVkIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9zZWxlY3Rpb24udGVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleHBhbmRSYW5nZSwgdHJhY2tXaG9sZUF0b21TZWxlY3Rpb24gfSBmcm9tICcuLi9zZWxlY3Rpb24nO1xuXG4vKipcbiAqIE9mZnNldCB0YWJsZXMgY2FwdHVyZWQgZnJvbSBNYXRoTGl2ZSAwLjExMC4wIGBnZXRFbGVtZW50SW5mbyhpKWAgaW4gQ2hyb21lLFxuICogYXMgW2RlcHRoLCBsYXRleF0gcGVyIG9mZnNldC4gT2Zmc2V0IGBpYCBpcyB0aGUgYXRvbSBlbmRpbmcgYXQgY2FyZXQgYGlgLlxuICovXG5jb25zdCB0YWJsZSA9IChyb3dzKSA9PiAoaSkgPT4gKHJvd3NbaV0gPyB7IGRlcHRoOiByb3dzW2ldWzBdLCBsYXRleDogcm93c1tpXVsxXSB9IDogdW5kZWZpbmVkKTtcblxuLy8gNXheMisyeCtcXGZyYWN7XFxwaX17Mn0tNFxuY29uc3QgUE9MWSA9IHRhYmxlKFtcbiAgWzAsICcnXSwgWzAsICc1J10sIFswLCAneCddLCBbMSwgJyddLCBbMSwgJzInXSwgWzAsICdeMiddLCBbMCwgJysnXSwgWzAsICcyJ10sIFswLCAneCddLCBbMCwgJysnXSxcbiAgWzEsICcnXSwgWzEsICdcXFxccGknXSwgWzEsICcnXSwgWzEsICcyJ10sIFswLCAnXFxcXGZyYWN7XFxcXHBpfXsyfSddLCBbMCwgJy0nXSwgWzAsICc0J10sXG5dKTtcbmNvbnN0IFBPTFlfTEFTVCA9IDE2O1xuXG4vLyBhK1xcc3FydHt4KzF9K2JcbmNvbnN0IFJPT1QgPSB0YWJsZShbWzAsICcnXSwgWzAsICdhJ10sIFswLCAnKyddLCBbMSwgJyddLCBbMSwgJ3gnXSwgWzEsICcrJ10sIFsxLCAnMSddLCBbMCwgJ1xcXFxzcXJ0e3grMX0nXSwgWzAsICcrJ10sIFswLCAnYiddXSk7XG5cbi8vIFxcZnJhY3tcXGZyYWN7YX17Yn19e2N9XG5jb25zdCBORVNURUQgPSB0YWJsZShbXG4gIFswLCAnJ10sIFsxLCAnJ10sIFsyLCAnJ10sIFsyLCAnYSddLCBbMiwgJyddLCBbMiwgJ2InXSwgWzEsICdcXFxcZnJhY3thfXtifSddLCBbMSwgJyddLCBbMSwgJ2MnXSwgWzAsICdcXFxcZnJhY3tcXFxcZnJhY3thfXtifX17Y30nXSxcbl0pO1xuXG5kZXNjcmliZSgnZXhwYW5kUmFuZ2UnLCAoKSA9PiB7XG4gIGNvbnN0IHBvbHkgPSAoYSwgYikgPT4gZXhwYW5kUmFuZ2UoYSwgYiwgUE9MWSwgUE9MWV9MQVNUKTtcblxuICBpdCgnbGVhdmVzIGEgc2VsZWN0aW9uIG9mIHdob2xlIHNpYmxpbmcgYXRvbXMgYWxvbmUnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBvbHkoNiwgNykpLnRvRXF1YWwoWzYsIDddKTsgLy8gMlxuICAgIGV4cGVjdChwb2x5KDYsIDkpKS50b0VxdWFsKFs2LCA5XSk7IC8vIDJ4K1xuICAgIGV4cGVjdChwb2x5KDYsIDE1KSkudG9FcXVhbChbNiwgMTVdKTsgLy8gMngrXFxmcmFje1xccGl9ezJ9LVxuICAgIGV4cGVjdChwb2x5KDAsIDE2KSkudG9FcXVhbChbMCwgMTZdKTtcbiAgfSk7XG5cbiAgLy8gVGhlIHJlcG9ydGVkIGNhc2U6IGZpdmUgU2hpZnQrUmlnaHQgcHJlc3NlcyBmcm9tIGJlZm9yZSBgMnhgIGdhdmUgYDJ4K1xccGlgLlxuICBpdCgndGFrZXMgdGhlIHdob2xlIGZyYWN0aW9uIHdoZW4gdGhlIHNlbGVjdGlvbiByZWFjaGVzIGludG8gaXQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBvbHkoNiwgMTApKS50b0VxdWFsKFs2LCAxNF0pO1xuICAgIGV4cGVjdChwb2x5KDYsIDExKSkudG9FcXVhbChbNiwgMTRdKTtcbiAgICBleHBlY3QocG9seSg2LCAxMykpLnRvRXF1YWwoWzYsIDE0XSk7XG4gIH0pO1xuXG4gIGl0KCd0YWtlcyB0aGUgd2hvbGUgZnJhY3Rpb24gd2hlbiB0aGUgc2VsZWN0aW9uIGxlYXZlcyBpdCcsICgpID0+IHtcbiAgICBleHBlY3QocG9seSgxMSwgMTUpKS50b0VxdWFsKFs5LCAxNV0pOyAvLyBmcm9tIHRoZSBwaSB0byBhZnRlciB0aGUgbWludXNcbiAgfSk7XG5cbiAgaXQoJ2Nyb3NzaW5nIGZyb20gbnVtZXJhdG9yIHRvIGRlbm9taW5hdG9yIHNlbGVjdHMgdGhlIGZyYWN0aW9uJywgKCkgPT4ge1xuICAgIGV4cGVjdChwb2x5KDExLCAxMykpLnRvRXF1YWwoWzksIDE0XSk7XG4gICAgZXhwZWN0KHBvbHkoMTEsIDEyKSkudG9FcXVhbChbOSwgMTRdKTtcbiAgfSk7XG5cbiAgaXQoJ2Egc2VsZWN0aW9uIGluc2lkZSBvbmUgYnJhbmNoIHN0YXlzIGluc2lkZSBpdCcsICgpID0+IHtcbiAgICBleHBlY3QocG9seSgxMCwgMTEpKS50b0VxdWFsKFsxMCwgMTFdKTsgLy8gXFxwaVxuICAgIGV4cGVjdChwb2x5KDEyLCAxMykpLnRvRXF1YWwoWzEyLCAxM10pOyAvLyB0aGUgMiBvZiB0aGUgZGVub21pbmF0b3JcbiAgfSk7XG5cbiAgLy8gTWF0aExpdmUgc3RvcmVzIHheMiBhcyBgeGAgdGhlbiBhIHNlcGFyYXRlIGBeMmAgYXRvbS5cbiAgaXQoJ2tlZXBzIGEgc3VwZXJzY3JpcHQgd2l0aCBpdHMgYmFzZScsICgpID0+IHtcbiAgICBleHBlY3QocG9seSgzLCA3KSkudG9FcXVhbChbMSwgN10pOyAvLyB4XjIrMiwgbm90IF4yKzJcbiAgICBleHBlY3QocG9seSg0LCA2KSkudG9FcXVhbChbMSwgNl0pOyAvLyB4XjIrXG4gIH0pO1xuXG4gIGl0KCdhY2NlcHRzIGEgcmV2ZXJzZWQgcmFuZ2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBvbHkoMTEsIDYpKS50b0VxdWFsKFs2LCAxNF0pO1xuICB9KTtcblxuICBpdCgnbGVhdmVzIGEgY29sbGFwc2VkIHJhbmdlIGFsb25lJywgKCkgPT4ge1xuICAgIGV4cGVjdChwb2x5KDExLCAxMSkpLnRvRXF1YWwoWzExLCAxMV0pO1xuICB9KTtcblxuICBpdCgnaGFuZGxlcyByb290cyB0aGUgc2FtZSB3YXknLCAoKSA9PiB7XG4gICAgZXhwZWN0KGV4cGFuZFJhbmdlKDIsIDQsIFJPT1QsIDkpKS50b0VxdWFsKFsyLCA3XSk7XG4gICAgZXhwZWN0KGV4cGFuZFJhbmdlKDQsIDYsIFJPT1QsIDkpKS50b0VxdWFsKFs0LCA2XSk7IC8vICsxIGluc2lkZSB0aGUgcmFkaWNhbmRcbiAgfSk7XG5cbiAgaXQoJ2NsaW1icyBhcyBtYW55IGxldmVscyBhcyBuZWVkZWQgaW4gbmVzdGVkIGZyYWN0aW9ucycsICgpID0+IHtcbiAgICBleHBlY3QoZXhwYW5kUmFuZ2UoMiwgMywgTkVTVEVELCA5KSkudG9FcXVhbChbMiwgM10pOyAvLyBhXG4gICAgZXhwZWN0KGV4cGFuZFJhbmdlKDMsIDUsIE5FU1RFRCwgOSkpLnRvRXF1YWwoWzEsIDZdKTsgLy8gYS9iIGNyb3NzaW5nIC0+IGlubmVyIGZyYWN0aW9uXG4gICAgZXhwZWN0KGV4cGFuZFJhbmdlKDYsIDcsIE5FU1RFRCwgOSkpLnRvRXF1YWwoWzAsIDldKTsgLy8gaW5uZXIgLT4gb3V0ZXIgZGVub21pbmF0b3JcbiAgfSk7XG5cbiAgaXQoJ3RvbGVyYXRlcyBtaXNzaW5nIGluZm8nLCAoKSA9PiB7XG4gICAgZXhwZWN0KGV4cGFuZFJhbmdlKDEsIDMsICgpID0+IHVuZGVmaW5lZCwgNSkpLnRvRXF1YWwoWzEsIDNdKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ3RyYWNrV2hvbGVBdG9tU2VsZWN0aW9uJywgKCkgPT4ge1xuICBjb25zdCBzdHViRmllbGQgPSAocmFuZ2UsIGRpcmVjdGlvbiA9ICdmb3J3YXJkJykgPT4ge1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IHt9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdGlvbjogeyByYW5nZXM6IFtyYW5nZV0sIGRpcmVjdGlvbiB9LFxuICAgICAgZ2V0IHNlbGVjdGlvbklzQ29sbGFwc2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24ucmFuZ2VzWzBdWzBdID09PSB0aGlzLnNlbGVjdGlvbi5yYW5nZXNbMF1bMV07XG4gICAgICB9LFxuICAgICAgbGFzdE9mZnNldDogUE9MWV9MQVNULFxuICAgICAgZ2V0RWxlbWVudEluZm86IFBPTFksXG4gICAgICBzZXRzOiAwLFxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBmbikge1xuICAgICAgICBsaXN0ZW5lcnNbdHlwZV0gPSBmbjtcbiAgICAgIH0sXG4gICAgICByZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGZuKSB7XG4gICAgICAgIGlmIChsaXN0ZW5lcnNbdHlwZV0gPT09IGZuKSB7XG4gICAgICAgICAgZGVsZXRlIGxpc3RlbmVyc1t0eXBlXTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZpcmUodHlwZSkge1xuICAgICAgICBpZiAobGlzdGVuZXJzW3R5cGVdKSB7XG4gICAgICAgICAgbGlzdGVuZXJzW3R5cGVdKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBoYXModHlwZSkge1xuICAgICAgICByZXR1cm4gISFsaXN0ZW5lcnNbdHlwZV07XG4gICAgICB9LFxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgdHJhY2sgPSAoZmllbGQpID0+IHtcbiAgICAvLyBjb3VudCBhc3NpZ25tZW50cyB3aXRob3V0IGJyZWFraW5nIHRoZSBnZXR0ZXJcbiAgICBsZXQgY3VycmVudCA9IGZpZWxkLnNlbGVjdGlvbjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmaWVsZCwgJ3NlbGVjdGlvbicsIHtcbiAgICAgIGdldDogKCkgPT4gY3VycmVudCxcbiAgICAgIHNldDogKHYpID0+IHtcbiAgICAgICAgZmllbGQuc2V0cyArPSAxO1xuICAgICAgICBjdXJyZW50ID0gdjtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJhY2tXaG9sZUF0b21TZWxlY3Rpb24oZmllbGQpO1xuICB9O1xuXG4gIGl0KCd3aWRlbnMgdGhlIHNlbGVjdGlvbiBvbiBzZWxlY3Rpb24tY2hhbmdlJywgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkID0gc3R1YkZpZWxkKFs2LCAxMV0pO1xuXG4gICAgdHJhY2soZmllbGQpO1xuICAgIGZpZWxkLmZpcmUoJ3NlbGVjdGlvbi1jaGFuZ2UnKTtcblxuICAgIGV4cGVjdChmaWVsZC5zZWxlY3Rpb24ucmFuZ2VzKS50b0VxdWFsKFtbNiwgMTRdXSk7XG4gIH0pO1xuXG4gIGl0KCdwcmVzZXJ2ZXMgdGhlIGRpcmVjdGlvbiwgc28gU2hpZnQrQXJyb3cga2VlcHMgZXh0ZW5kaW5nIHRoZSBzYW1lIGVuZCcsICgpID0+IHtcbiAgICBjb25zdCBmaWVsZCA9IHN0dWJGaWVsZChbMTEsIDE2XSwgJ2JhY2t3YXJkJyk7XG5cbiAgICB0cmFjayhmaWVsZCk7XG4gICAgZmllbGQuZmlyZSgnc2VsZWN0aW9uLWNoYW5nZScpO1xuXG4gICAgZXhwZWN0KGZpZWxkLnNlbGVjdGlvbikudG9FcXVhbCh7IHJhbmdlczogW1s5LCAxNl1dLCBkaXJlY3Rpb246ICdiYWNrd2FyZCcgfSk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCB0b3VjaCBhIHNlbGVjdGlvbiB0aGF0IGlzIGFscmVhZHkgd2hvbGUnLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGQgPSBzdHViRmllbGQoWzYsIDldKTtcblxuICAgIHRyYWNrKGZpZWxkKTtcbiAgICBmaWVsZC5maXJlKCdzZWxlY3Rpb24tY2hhbmdlJyk7XG5cbiAgICBleHBlY3QoZmllbGQuc2V0cykudG9CZSgwKTtcbiAgfSk7XG5cbiAgaXQoJ2lnbm9yZXMgYSBjb2xsYXBzZWQgY2FyZXQnLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGQgPSBzdHViRmllbGQoWzExLCAxMV0pO1xuXG4gICAgdHJhY2soZmllbGQpO1xuICAgIGZpZWxkLmZpcmUoJ3NlbGVjdGlvbi1jaGFuZ2UnKTtcblxuICAgIGV4cGVjdChmaWVsZC5zZXRzKS50b0JlKDApO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3QgcmVjdXJzZSB3aGVuIGl0cyBvd24gYXNzaWdubWVudCBmaXJlcyBzZWxlY3Rpb24tY2hhbmdlJywgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkID0gc3R1YkZpZWxkKFs2LCAxMV0pO1xuICAgIGxldCBjdXJyZW50ID0gZmllbGQuc2VsZWN0aW9uO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZpZWxkLCAnc2VsZWN0aW9uJywge1xuICAgICAgZ2V0OiAoKSA9PiBjdXJyZW50LFxuICAgICAgc2V0OiAodikgPT4ge1xuICAgICAgICBmaWVsZC5zZXRzICs9IDE7XG4gICAgICAgIGN1cnJlbnQgPSB2O1xuICAgICAgICBmaWVsZC5maXJlKCdzZWxlY3Rpb24tY2hhbmdlJyk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdHJhY2tXaG9sZUF0b21TZWxlY3Rpb24oZmllbGQpO1xuICAgIGZpZWxkLmZpcmUoJ3NlbGVjdGlvbi1jaGFuZ2UnKTtcblxuICAgIGV4cGVjdChmaWVsZC5zZXRzKS50b0JlKDEpO1xuICAgIGV4cGVjdChmaWVsZC5zZWxlY3Rpb24ucmFuZ2VzKS50b0VxdWFsKFtbNiwgMTRdXSk7XG4gIH0pO1xuXG4gIGl0KCdzdXJ2aXZlcyBhIGZpZWxkIHRoYXQgdGhyb3dzJywgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkID0gc3R1YkZpZWxkKFs2LCAxMV0pO1xuXG4gICAgZmllbGQuZ2V0RWxlbWVudEluZm8gPSAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Jvb20nKTtcbiAgICB9O1xuXG4gICAgdHJhY2soZmllbGQpO1xuXG4gICAgZXhwZWN0KCgpID0+IGZpZWxkLmZpcmUoJ3NlbGVjdGlvbi1jaGFuZ2UnKSkubm90LnRvVGhyb3coKTtcbiAgfSk7XG5cbiAgaXQoJ3RlYXJzIGRvd24gaXRzIGxpc3RlbmVyJywgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkID0gc3R1YkZpZWxkKFs2LCAxMV0pO1xuICAgIGNvbnN0IHVudHJhY2sgPSB0cmFjayhmaWVsZCk7XG5cbiAgICBleHBlY3QoZmllbGQuaGFzKCdzZWxlY3Rpb24tY2hhbmdlJykpLnRvQmUodHJ1ZSk7XG4gICAgdW50cmFjaygpO1xuICAgIGV4cGVjdChmaWVsZC5oYXMoJ3NlbGVjdGlvbi1jaGFuZ2UnKSkudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdpcyBhIG5vLW9wIHdpdGhvdXQgYSBmaWVsZCcsICgpID0+IHtcbiAgICBleHBlY3QodHJhY2tXaG9sZUF0b21TZWxlY3Rpb24odW5kZWZpbmVkKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIGV4cGVjdCh0cmFja1dob2xlQXRvbVNlbGVjdGlvbih7fSkpLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFBQSxVQUFBLEdBQUFDLE9BQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQU1DLEtB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QUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcENELE1BQU0sQ0FBQ0wsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDTSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BDRCxNQUFNLENBQUNMLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQ00sT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0Q0QsTUFBTSxDQUFDTCxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUNNLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztFQUN0QyxDQUFDLENBQUM7O0VBRUY7RUFDQUYsRUFBRSxDQUFDLDZEQUE2RCxFQUFFLFlBQU07SUFDdEVDLE1BQU0sQ0FBQ0wsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDTSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDcENELE1BQU0sQ0FBQ0wsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDTSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDcENELE1BQU0sQ0FBQ0wsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDTSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7RUFDdEMsQ0FBQyxDQUFDO0VBRUZGLEVBQUUsQ0FBQyx1REFBdUQsRUFBRSxZQUFNO0lBQ2hFQyxNQUFNLENBQUNMLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQ00sT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUN6QyxDQUFDLENBQUM7RUFFRkYsRUFBRSxDQUFDLDZEQUE2RCxFQUFFLFlBQU07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