@pie-lib/math-input-mathlive 1.1.5-beta.10 → 1.1.5-beta.12
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.
- package/lib/__tests__/input-selection.test.js +103 -0
- package/lib/__tests__/keypad-label.test.js +13 -1
- package/lib/__tests__/latex-bridge.test.js +29 -1
- package/lib/__tests__/longdiv-wiring.test.js +215 -0
- package/lib/__tests__/longdiv.test.js +281 -0
- package/lib/__tests__/selection.test.js +195 -0
- package/lib/keypad/index.js +9 -1
- package/lib/keypad/index.js.map +1 -1
- package/lib/longdiv.js +173 -0
- package/lib/longdiv.js.map +1 -0
- package/lib/mathlive-instance.js +4 -0
- package/lib/mathlive-instance.js.map +1 -1
- package/lib/mf/input.js +16 -0
- package/lib/mf/input.js.map +1 -1
- package/lib/mf/static.js +13 -1
- package/lib/mf/static.js.map +1 -1
- package/lib/selection.js +148 -0
- package/lib/selection.js.map +1 -0
- package/package.json +1 -1
- package/src/__tests__/input-selection.test.jsx +64 -0
- package/src/__tests__/longdiv-wiring.test.jsx +137 -0
- package/src/__tests__/longdiv.test.js +259 -0
- package/src/__tests__/selection.test.js +247 -0
- package/src/keypad/index.jsx +14 -2
- package/src/longdiv.js +172 -0
- package/src/mathlive-instance.js +4 -0
- package/src/mf/input.jsx +18 -0
- package/src/mf/static.jsx +15 -1
- package/src/selection.js +141 -0
|
@@ -0,0 +1,215 @@
|
|
|
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
|
+
var _static = _interopRequireDefault(require("../mf/static"));
|
|
10
|
+
var _keypad = require("../keypad");
|
|
11
|
+
var _longdiv = require("../longdiv");
|
|
12
|
+
/**
|
|
13
|
+
* Every place that draws MathLive output must apply the long-division
|
|
14
|
+
* correction (see longdiv.js): live fields after every render, static markup
|
|
15
|
+
* after it is written into the DOM.
|
|
16
|
+
*/
|
|
17
|
+
jest.mock('../mathlive-instance', function () {
|
|
18
|
+
var FakeMathfieldElement = /*#__PURE__*/(0, _createClass2["default"])(function FakeMathfieldElement() {
|
|
19
|
+
(0, _classCallCheck2["default"])(this, FakeMathfieldElement);
|
|
20
|
+
var el = global.document.createElement('math-field');
|
|
21
|
+
el.value = '';
|
|
22
|
+
el.getValue = function () {
|
|
23
|
+
return el.value;
|
|
24
|
+
};
|
|
25
|
+
return el;
|
|
26
|
+
});
|
|
27
|
+
return {
|
|
28
|
+
loadMathLive: function loadMathLive() {
|
|
29
|
+
return Promise.resolve({
|
|
30
|
+
MathfieldElement: FakeMathfieldElement
|
|
31
|
+
});
|
|
32
|
+
},
|
|
33
|
+
getMacros: function getMacros() {
|
|
34
|
+
return {};
|
|
35
|
+
},
|
|
36
|
+
MATH_MODE_SPACE: '\\ ',
|
|
37
|
+
applyShadowStyles: function applyShadowStyles() {},
|
|
38
|
+
trackPlaceholderCaret: function trackPlaceholderCaret() {
|
|
39
|
+
return function () {};
|
|
40
|
+
},
|
|
41
|
+
latexToMarkup: function latexToMarkup(l) {
|
|
42
|
+
return "<span>".concat(l, "</span>");
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
var mockUntrack = jest.fn();
|
|
47
|
+
jest.mock('../longdiv', function () {
|
|
48
|
+
return {
|
|
49
|
+
trackLongDivision: jest.fn(function () {
|
|
50
|
+
return mockUntrack;
|
|
51
|
+
}),
|
|
52
|
+
fixLongDivisionWhenReady: jest.fn(),
|
|
53
|
+
fixLongDivision: jest.fn()
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
/* eslint-disable import/first */
|
|
58
|
+
|
|
59
|
+
/* eslint-enable import/first */
|
|
60
|
+
|
|
61
|
+
beforeEach(function () {
|
|
62
|
+
_longdiv.trackLongDivision.mockClear();
|
|
63
|
+
_longdiv.fixLongDivisionWhenReady.mockClear();
|
|
64
|
+
mockUntrack.mockClear();
|
|
65
|
+
});
|
|
66
|
+
describe('Input (the editor)', function () {
|
|
67
|
+
it('tracks the mathfield on mount and stops on unmount', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
68
|
+
var input;
|
|
69
|
+
return _regenerator["default"].wrap(function (_context) {
|
|
70
|
+
while (1) switch (_context.prev = _context.next) {
|
|
71
|
+
case 0:
|
|
72
|
+
input = new _input["default"]({});
|
|
73
|
+
input.holderRef = {
|
|
74
|
+
current: document.createElement('span')
|
|
75
|
+
};
|
|
76
|
+
_context.next = 1;
|
|
77
|
+
return input.componentDidMount();
|
|
78
|
+
case 1:
|
|
79
|
+
expect(_longdiv.trackLongDivision).toHaveBeenCalledWith(input.mathField);
|
|
80
|
+
input.componentWillUnmount();
|
|
81
|
+
expect(mockUntrack).toHaveBeenCalledTimes(1);
|
|
82
|
+
expect(input.untrackLongDivision).toBeUndefined();
|
|
83
|
+
case 2:
|
|
84
|
+
case "end":
|
|
85
|
+
return _context.stop();
|
|
86
|
+
}
|
|
87
|
+
}, _callee);
|
|
88
|
+
})));
|
|
89
|
+
});
|
|
90
|
+
describe('Static', function () {
|
|
91
|
+
it('tracks the answer-block field on mount and stops on unmount', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
|
92
|
+
var s;
|
|
93
|
+
return _regenerator["default"].wrap(function (_context2) {
|
|
94
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
95
|
+
case 0:
|
|
96
|
+
s = new _static["default"]({
|
|
97
|
+
latex: 'x=\\MathQuillMathField[r1]{}'
|
|
98
|
+
});
|
|
99
|
+
s.holderRef = {
|
|
100
|
+
current: document.createElement('span')
|
|
101
|
+
};
|
|
102
|
+
s.createLiveRegion = function () {};
|
|
103
|
+
_context2.next = 1;
|
|
104
|
+
return s.componentDidMount();
|
|
105
|
+
case 1:
|
|
106
|
+
expect(_longdiv.trackLongDivision).toHaveBeenCalledWith(s.mathField);
|
|
107
|
+
s.componentWillUnmount();
|
|
108
|
+
expect(mockUntrack).toHaveBeenCalledTimes(1);
|
|
109
|
+
case 2:
|
|
110
|
+
case "end":
|
|
111
|
+
return _context2.stop();
|
|
112
|
+
}
|
|
113
|
+
}, _callee2);
|
|
114
|
+
})));
|
|
115
|
+
|
|
116
|
+
// Display mode: the markup reaches the DOM through state, so it is corrected
|
|
117
|
+
// once React has written it.
|
|
118
|
+
it('corrects static markup after it is rendered', function () {
|
|
119
|
+
var s = new _static["default"]({
|
|
120
|
+
latex: '5\\longdiv{144}'
|
|
121
|
+
});
|
|
122
|
+
var holder = document.createElement('span');
|
|
123
|
+
s.holderRef = {
|
|
124
|
+
current: holder
|
|
125
|
+
};
|
|
126
|
+
s.state = {
|
|
127
|
+
markup: '<span>new</span>'
|
|
128
|
+
};
|
|
129
|
+
s.componentDidUpdate({
|
|
130
|
+
latex: '5\\longdiv{144}'
|
|
131
|
+
}, {
|
|
132
|
+
markup: ''
|
|
133
|
+
});
|
|
134
|
+
expect(_longdiv.fixLongDivisionWhenReady).toHaveBeenCalledWith(holder);
|
|
135
|
+
});
|
|
136
|
+
it('does not redo it when the markup did not change', function () {
|
|
137
|
+
var s = new _static["default"]({
|
|
138
|
+
latex: 'x'
|
|
139
|
+
});
|
|
140
|
+
s.holderRef = {
|
|
141
|
+
current: document.createElement('span')
|
|
142
|
+
};
|
|
143
|
+
s.state = {
|
|
144
|
+
markup: '<span>same</span>'
|
|
145
|
+
};
|
|
146
|
+
s.componentDidUpdate({
|
|
147
|
+
latex: 'x'
|
|
148
|
+
}, {
|
|
149
|
+
markup: '<span>same</span>'
|
|
150
|
+
});
|
|
151
|
+
expect(_longdiv.fixLongDivisionWhenReady).not.toHaveBeenCalled();
|
|
152
|
+
});
|
|
153
|
+
it('leaves a live field to the tracker', function () {
|
|
154
|
+
var s = new _static["default"]({
|
|
155
|
+
latex: 'x'
|
|
156
|
+
});
|
|
157
|
+
s.holderRef = {
|
|
158
|
+
current: document.createElement('span')
|
|
159
|
+
};
|
|
160
|
+
s.mathField = document.createElement('math-field');
|
|
161
|
+
s.state = {
|
|
162
|
+
markup: '<span>new</span>'
|
|
163
|
+
};
|
|
164
|
+
s.componentDidUpdate({
|
|
165
|
+
latex: 'x'
|
|
166
|
+
}, {
|
|
167
|
+
markup: ''
|
|
168
|
+
});
|
|
169
|
+
expect(_longdiv.fixLongDivisionWhenReady).not.toHaveBeenCalled();
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
describe('keypad label', function () {
|
|
173
|
+
it('corrects the label once mounted', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
|
|
174
|
+
var label, el;
|
|
175
|
+
return _regenerator["default"].wrap(function (_context3) {
|
|
176
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
177
|
+
case 0:
|
|
178
|
+
label = new _keypad.LatexLabel({
|
|
179
|
+
latex: '\\longdiv{}'
|
|
180
|
+
});
|
|
181
|
+
el = document.createElement('span');
|
|
182
|
+
label.labelRef = {
|
|
183
|
+
current: el
|
|
184
|
+
};
|
|
185
|
+
_context3.next = 1;
|
|
186
|
+
return label.componentDidMount();
|
|
187
|
+
case 1:
|
|
188
|
+
expect(_longdiv.fixLongDivisionWhenReady).toHaveBeenCalledWith(el);
|
|
189
|
+
case 2:
|
|
190
|
+
case "end":
|
|
191
|
+
return _context3.stop();
|
|
192
|
+
}
|
|
193
|
+
}, _callee3);
|
|
194
|
+
})));
|
|
195
|
+
it('corrects it again when the label changes', function () {
|
|
196
|
+
var label = new _keypad.LatexLabel({
|
|
197
|
+
latex: '\\longdiv{}'
|
|
198
|
+
});
|
|
199
|
+
var el = document.createElement('span');
|
|
200
|
+
label.labelRef = {
|
|
201
|
+
current: el
|
|
202
|
+
};
|
|
203
|
+
label.setState = function () {};
|
|
204
|
+
label.state = {
|
|
205
|
+
markup: '<span>other</span>'
|
|
206
|
+
};
|
|
207
|
+
label.componentDidUpdate({
|
|
208
|
+
latex: '\\longdiv{}'
|
|
209
|
+
}, {
|
|
210
|
+
markup: '<span>first</span>'
|
|
211
|
+
});
|
|
212
|
+
expect(_longdiv.fixLongDivisionWhenReady).toHaveBeenCalledWith(el);
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaW5wdXQiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9zdGF0aWMiLCJfa2V5cGFkIiwiX2xvbmdkaXYiLCJqZXN0IiwibW9jayIsIkZha2VNYXRoZmllbGRFbGVtZW50IiwiX2NyZWF0ZUNsYXNzMiIsIl9jbGFzc0NhbGxDaGVjazIiLCJlbCIsImdsb2JhbCIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInZhbHVlIiwiZ2V0VmFsdWUiLCJsb2FkTWF0aExpdmUiLCJQcm9taXNlIiwicmVzb2x2ZSIsIk1hdGhmaWVsZEVsZW1lbnQiLCJnZXRNYWNyb3MiLCJNQVRIX01PREVfU1BBQ0UiLCJhcHBseVNoYWRvd1N0eWxlcyIsInRyYWNrUGxhY2Vob2xkZXJDYXJldCIsImxhdGV4VG9NYXJrdXAiLCJsIiwiY29uY2F0IiwibW9ja1VudHJhY2siLCJmbiIsInRyYWNrTG9uZ0RpdmlzaW9uIiwiZml4TG9uZ0RpdmlzaW9uV2hlblJlYWR5IiwiZml4TG9uZ0RpdmlzaW9uIiwiYmVmb3JlRWFjaCIsIm1vY2tDbGVhciIsImRlc2NyaWJlIiwiaXQiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsImlucHV0Iiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJJbnB1dCIsImhvbGRlclJlZiIsImN1cnJlbnQiLCJjb21wb25lbnREaWRNb3VudCIsImV4cGVjdCIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwibWF0aEZpZWxkIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJ0b0hhdmVCZWVuQ2FsbGVkVGltZXMiLCJ1bnRyYWNrTG9uZ0RpdmlzaW9uIiwidG9CZVVuZGVmaW5lZCIsInN0b3AiLCJfY2FsbGVlMiIsInMiLCJfY29udGV4dDIiLCJTdGF0aWMiLCJsYXRleCIsImNyZWF0ZUxpdmVSZWdpb24iLCJob2xkZXIiLCJzdGF0ZSIsIm1hcmt1cCIsImNvbXBvbmVudERpZFVwZGF0ZSIsIm5vdCIsInRvSGF2ZUJlZW5DYWxsZWQiLCJfY2FsbGVlMyIsImxhYmVsIiwiX2NvbnRleHQzIiwiTGF0ZXhMYWJlbCIsImxhYmVsUmVmIiwic2V0U3RhdGUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2xvbmdkaXYtd2lyaW5nLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXZlcnkgcGxhY2UgdGhhdCBkcmF3cyBNYXRoTGl2ZSBvdXRwdXQgbXVzdCBhcHBseSB0aGUgbG9uZy1kaXZpc2lvblxuICogY29ycmVjdGlvbiAoc2VlIGxvbmdkaXYuanMpOiBsaXZlIGZpZWxkcyBhZnRlciBldmVyeSByZW5kZXIsIHN0YXRpYyBtYXJrdXBcbiAqIGFmdGVyIGl0IGlzIHdyaXR0ZW4gaW50byB0aGUgRE9NLlxuICovXG5qZXN0Lm1vY2soJy4uL21hdGhsaXZlLWluc3RhbmNlJywgKCkgPT4ge1xuICBjbGFzcyBGYWtlTWF0aGZpZWxkRWxlbWVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICBjb25zdCBlbCA9IGdsb2JhbC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtYXRoLWZpZWxkJyk7XG5cbiAgICAgIGVsLnZhbHVlID0gJyc7XG4gICAgICBlbC5nZXRWYWx1ZSA9ICgpID0+IGVsLnZhbHVlO1xuXG4gICAgICByZXR1cm4gZWw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBsb2FkTWF0aExpdmU6ICgpID0+IFByb21pc2UucmVzb2x2ZSh7IE1hdGhmaWVsZEVsZW1lbnQ6IEZha2VNYXRoZmllbGRFbGVtZW50IH0pLFxuICAgIGdldE1hY3JvczogKCkgPT4gKHt9KSxcbiAgICBNQVRIX01PREVfU1BBQ0U6ICdcXFxcICcsXG4gICAgYXBwbHlTaGFkb3dTdHlsZXM6ICgpID0+IHt9LFxuICAgIHRyYWNrUGxhY2Vob2xkZXJDYXJldDogKCkgPT4gKCkgPT4ge30sXG4gICAgbGF0ZXhUb01hcmt1cDogKGwpID0+IGA8c3Bhbj4ke2x9PC9zcGFuPmAsXG4gIH07XG59KTtcblxuY29uc3QgbW9ja1VudHJhY2sgPSBqZXN0LmZuKCk7XG5cbmplc3QubW9jaygnLi4vbG9uZ2RpdicsICgpID0+ICh7XG4gIHRyYWNrTG9uZ0RpdmlzaW9uOiBqZXN0LmZuKCgpID0+IG1vY2tVbnRyYWNrKSxcbiAgZml4TG9uZ0RpdmlzaW9uV2hlblJlYWR5OiBqZXN0LmZuKCksXG4gIGZpeExvbmdEaXZpc2lvbjogamVzdC5mbigpLFxufSkpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvZmlyc3QgKi9cbmltcG9ydCBJbnB1dCBmcm9tICcuLi9tZi9pbnB1dCc7XG5pbXBvcnQgU3RhdGljIGZyb20gJy4uL21mL3N0YXRpYyc7XG5pbXBvcnQgeyBMYXRleExhYmVsIH0gZnJvbSAnLi4va2V5cGFkJztcbmltcG9ydCB7IHRyYWNrTG9uZ0RpdmlzaW9uLCBmaXhMb25nRGl2aXNpb25XaGVuUmVhZHkgfSBmcm9tICcuLi9sb25nZGl2Jztcbi8qIGVzbGludC1lbmFibGUgaW1wb3J0L2ZpcnN0ICovXG5cbmJlZm9yZUVhY2goKCkgPT4ge1xuICB0cmFja0xvbmdEaXZpc2lvbi5tb2NrQ2xlYXIoKTtcbiAgZml4TG9uZ0RpdmlzaW9uV2hlblJlYWR5Lm1vY2tDbGVhcigpO1xuICBtb2NrVW50cmFjay5tb2NrQ2xlYXIoKTtcbn0pO1xuXG5kZXNjcmliZSgnSW5wdXQgKHRoZSBlZGl0b3IpJywgKCkgPT4ge1xuICBpdCgndHJhY2tzIHRoZSBtYXRoZmllbGQgb24gbW91bnQgYW5kIHN0b3BzIG9uIHVubW91bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSBuZXcgSW5wdXQoe30pO1xuXG4gICAgaW5wdXQuaG9sZGVyUmVmID0geyBjdXJyZW50OiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJykgfTtcbiAgICBhd2FpdCBpbnB1dC5jb21wb25lbnREaWRNb3VudCgpO1xuXG4gICAgZXhwZWN0KHRyYWNrTG9uZ0RpdmlzaW9uKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChpbnB1dC5tYXRoRmllbGQpO1xuXG4gICAgaW5wdXQuY29tcG9uZW50V2lsbFVubW91bnQoKTtcblxuICAgIGV4cGVjdChtb2NrVW50cmFjaykudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgIGV4cGVjdChpbnB1dC51bnRyYWNrTG9uZ0RpdmlzaW9uKS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdTdGF0aWMnLCAoKSA9PiB7XG4gIGl0KCd0cmFja3MgdGhlIGFuc3dlci1ibG9jayBmaWVsZCBvbiBtb3VudCBhbmQgc3RvcHMgb24gdW5tb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzID0gbmV3IFN0YXRpYyh7IGxhdGV4OiAneD1cXFxcTWF0aFF1aWxsTWF0aEZpZWxkW3IxXXt9JyB9KTtcblxuICAgIHMuaG9sZGVyUmVmID0geyBjdXJyZW50OiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJykgfTtcbiAgICBzLmNyZWF0ZUxpdmVSZWdpb24gPSAoKSA9PiB7fTtcbiAgICBhd2FpdCBzLmNvbXBvbmVudERpZE1vdW50KCk7XG5cbiAgICBleHBlY3QodHJhY2tMb25nRGl2aXNpb24pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHMubWF0aEZpZWxkKTtcblxuICAgIHMuY29tcG9uZW50V2lsbFVubW91bnQoKTtcblxuICAgIGV4cGVjdChtb2NrVW50cmFjaykudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICB9KTtcblxuICAvLyBEaXNwbGF5IG1vZGU6IHRoZSBtYXJrdXAgcmVhY2hlcyB0aGUgRE9NIHRocm91Z2ggc3RhdGUsIHNvIGl0IGlzIGNvcnJlY3RlZFxuICAvLyBvbmNlIFJlYWN0IGhhcyB3cml0dGVuIGl0LlxuICBpdCgnY29ycmVjdHMgc3RhdGljIG1hcmt1cCBhZnRlciBpdCBpcyByZW5kZXJlZCcsICgpID0+IHtcbiAgICBjb25zdCBzID0gbmV3IFN0YXRpYyh7IGxhdGV4OiAnNVxcXFxsb25nZGl2ezE0NH0nIH0pO1xuICAgIGNvbnN0IGhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblxuICAgIHMuaG9sZGVyUmVmID0geyBjdXJyZW50OiBob2xkZXIgfTtcbiAgICBzLnN0YXRlID0geyBtYXJrdXA6ICc8c3Bhbj5uZXc8L3NwYW4+JyB9O1xuICAgIHMuY29tcG9uZW50RGlkVXBkYXRlKHsgbGF0ZXg6ICc1XFxcXGxvbmdkaXZ7MTQ0fScgfSwgeyBtYXJrdXA6ICcnIH0pO1xuXG4gICAgZXhwZWN0KGZpeExvbmdEaXZpc2lvbldoZW5SZWFkeSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoaG9sZGVyKTtcbiAgfSk7XG5cbiAgaXQoJ2RvZXMgbm90IHJlZG8gaXQgd2hlbiB0aGUgbWFya3VwIGRpZCBub3QgY2hhbmdlJywgKCkgPT4ge1xuICAgIGNvbnN0IHMgPSBuZXcgU3RhdGljKHsgbGF0ZXg6ICd4JyB9KTtcblxuICAgIHMuaG9sZGVyUmVmID0geyBjdXJyZW50OiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJykgfTtcbiAgICBzLnN0YXRlID0geyBtYXJrdXA6ICc8c3Bhbj5zYW1lPC9zcGFuPicgfTtcbiAgICBzLmNvbXBvbmVudERpZFVwZGF0ZSh7IGxhdGV4OiAneCcgfSwgeyBtYXJrdXA6ICc8c3Bhbj5zYW1lPC9zcGFuPicgfSk7XG5cbiAgICBleHBlY3QoZml4TG9uZ0RpdmlzaW9uV2hlblJlYWR5KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcblxuICBpdCgnbGVhdmVzIGEgbGl2ZSBmaWVsZCB0byB0aGUgdHJhY2tlcicsICgpID0+IHtcbiAgICBjb25zdCBzID0gbmV3IFN0YXRpYyh7IGxhdGV4OiAneCcgfSk7XG5cbiAgICBzLmhvbGRlclJlZiA9IHsgY3VycmVudDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpIH07XG4gICAgcy5tYXRoRmllbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtYXRoLWZpZWxkJyk7XG4gICAgcy5zdGF0ZSA9IHsgbWFya3VwOiAnPHNwYW4+bmV3PC9zcGFuPicgfTtcbiAgICBzLmNvbXBvbmVudERpZFVwZGF0ZSh7IGxhdGV4OiAneCcgfSwgeyBtYXJrdXA6ICcnIH0pO1xuXG4gICAgZXhwZWN0KGZpeExvbmdEaXZpc2lvbldoZW5SZWFkeSkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2tleXBhZCBsYWJlbCcsICgpID0+IHtcbiAgaXQoJ2NvcnJlY3RzIHRoZSBsYWJlbCBvbmNlIG1vdW50ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbGFiZWwgPSBuZXcgTGF0ZXhMYWJlbCh7IGxhdGV4OiAnXFxcXGxvbmdkaXZ7fScgfSk7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG5cbiAgICBsYWJlbC5sYWJlbFJlZiA9IHsgY3VycmVudDogZWwgfTtcbiAgICBhd2FpdCBsYWJlbC5jb21wb25lbnREaWRNb3VudCgpO1xuXG4gICAgZXhwZWN0KGZpeExvbmdEaXZpc2lvbldoZW5SZWFkeSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZWwpO1xuICB9KTtcblxuICBpdCgnY29ycmVjdHMgaXQgYWdhaW4gd2hlbiB0aGUgbGFiZWwgY2hhbmdlcycsICgpID0+IHtcbiAgICBjb25zdCBsYWJlbCA9IG5ldyBMYXRleExhYmVsKHsgbGF0ZXg6ICdcXFxcbG9uZ2Rpdnt9JyB9KTtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblxuICAgIGxhYmVsLmxhYmVsUmVmID0geyBjdXJyZW50OiBlbCB9O1xuICAgIGxhYmVsLnNldFN0YXRlID0gKCkgPT4ge307XG4gICAgbGFiZWwuc3RhdGUgPSB7IG1hcmt1cDogJzxzcGFuPm90aGVyPC9zcGFuPicgfTtcbiAgICBsYWJlbC5jb21wb25lbnREaWRVcGRhdGUoeyBsYXRleDogJ1xcXFxsb25nZGl2e30nIH0sIHsgbWFya3VwOiAnPHNwYW4+Zmlyc3Q8L3NwYW4+JyB9KTtcblxuICAgIGV4cGVjdChmaXhMb25nRGl2aXNpb25XaGVuUmVhZHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGVsKTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQW9DQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxRQUFBLEdBQUFILE9BQUE7QUF2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBSSxJQUFJLENBQUNDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxZQUFNO0VBQUEsSUFDaENDLG9CQUFvQixvQkFBQUMsYUFBQSxhQUN4QixTQUFBRCxxQkFBQSxFQUFjO0lBQUEsSUFBQUUsZ0JBQUEsbUJBQUFGLG9CQUFBO0lBQ1osSUFBTUcsRUFBRSxHQUFHQyxNQUFNLENBQUNDLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLFlBQVksQ0FBQztJQUV0REgsRUFBRSxDQUFDSSxLQUFLLEdBQUcsRUFBRTtJQUNiSixFQUFFLENBQUNLLFFBQVEsR0FBRztNQUFBLE9BQU1MLEVBQUUsQ0FBQ0ksS0FBSztJQUFBO0lBRTVCLE9BQU9KLEVBQUU7RUFDWCxDQUFDO0VBR0gsT0FBTztJQUNMTSxZQUFZLEVBQUUsU0FBZEEsWUFBWUEsQ0FBQTtNQUFBLE9BQVFDLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDO1FBQUVDLGdCQUFnQixFQUFFWjtNQUFxQixDQUFDLENBQUM7SUFBQTtJQUMvRWEsU0FBUyxFQUFFLFNBQVhBLFNBQVNBLENBQUE7TUFBQSxPQUFTLENBQUMsQ0FBQztJQUFBLENBQUM7SUFDckJDLGVBQWUsRUFBRSxLQUFLO0lBQ3RCQyxpQkFBaUIsRUFBRSxTQUFuQkEsaUJBQWlCQSxDQUFBLEVBQVEsQ0FBQyxDQUFDO0lBQzNCQyxxQkFBcUIsRUFBRSxTQUF2QkEscUJBQXFCQSxDQUFBO01BQUEsT0FBUSxZQUFNLENBQUMsQ0FBQztJQUFBO0lBQ3JDQyxhQUFhLEVBQUUsU0FBZkEsYUFBYUEsQ0FBR0MsQ0FBQztNQUFBLGdCQUFBQyxNQUFBLENBQWNELENBQUM7SUFBQTtFQUNsQyxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsSUFBTUUsV0FBVyxHQUFHdEIsSUFBSSxDQUFDdUIsRUFBRSxDQUFDLENBQUM7QUFFN0J2QixJQUFJLENBQUNDLElBQUksQ0FBQyxZQUFZLEVBQUU7RUFBQSxPQUFPO0lBQzdCdUIsaUJBQWlCLEVBQUV4QixJQUFJLENBQUN1QixFQUFFLENBQUM7TUFBQSxPQUFNRCxXQUFXO0lBQUEsRUFBQztJQUM3Q0csd0JBQXdCLEVBQUV6QixJQUFJLENBQUN1QixFQUFFLENBQUMsQ0FBQztJQUNuQ0csZUFBZSxFQUFFMUIsSUFBSSxDQUFDdUIsRUFBRSxDQUFDO0VBQzNCLENBQUM7QUFBQSxDQUFDLENBQUM7O0FBRUg7O0FBS0E7O0FBRUFJLFVBQVUsQ0FBQyxZQUFNO0VBQ2ZILDBCQUFpQixDQUFDSSxTQUFTLENBQUMsQ0FBQztFQUM3QkgsaUNBQXdCLENBQUNHLFNBQVMsQ0FBQyxDQUFDO0VBQ3BDTixXQUFXLENBQUNNLFNBQVMsQ0FBQyxDQUFDO0FBQ3pCLENBQUMsQ0FBQztBQUVGQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsWUFBTTtFQUNuQ0MsRUFBRSxDQUFDLG9EQUFvRCxtQkFBQUMsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUFDLFFBQUE7SUFBQSxJQUFBQyxLQUFBO0lBQUEsT0FBQUgsWUFBQSxZQUFBSSxJQUFBLFdBQUFDLFFBQUE7TUFBQSxrQkFBQUEsUUFBQSxDQUFBQyxJQUFBLEdBQUFELFFBQUEsQ0FBQUUsSUFBQTtRQUFBO1VBQ2pESixLQUFLLEdBQUcsSUFBSUssaUJBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUUzQkwsS0FBSyxDQUFDTSxTQUFTLEdBQUc7WUFBRUMsT0FBTyxFQUFFbkMsUUFBUSxDQUFDQyxhQUFhLENBQUMsTUFBTTtVQUFFLENBQUM7VUFBQzZCLFFBQUEsQ0FBQUUsSUFBQTtVQUFBLE9BQ3hESixLQUFLLENBQUNRLGlCQUFpQixDQUFDLENBQUM7UUFBQTtVQUUvQkMsTUFBTSxDQUFDcEIsMEJBQWlCLENBQUMsQ0FBQ3FCLG9CQUFvQixDQUFDVixLQUFLLENBQUNXLFNBQVMsQ0FBQztVQUUvRFgsS0FBSyxDQUFDWSxvQkFBb0IsQ0FBQyxDQUFDO1VBRTVCSCxNQUFNLENBQUN0QixXQUFXLENBQUMsQ0FBQzBCLHFCQUFxQixDQUFDLENBQUMsQ0FBQztVQUM1Q0osTUFBTSxDQUFDVCxLQUFLLENBQUNjLG1CQUFtQixDQUFDLENBQUNDLGFBQWEsQ0FBQyxDQUFDO1FBQUM7UUFBQTtVQUFBLE9BQUFiLFFBQUEsQ0FBQWMsSUFBQTtNQUFBO0lBQUEsR0FBQWpCLE9BQUE7RUFBQSxDQUNuRCxHQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUZMLFFBQVEsQ0FBQyxRQUFRLEVBQUUsWUFBTTtFQUN2QkMsRUFBRSxDQUFDLDZEQUE2RCxtQkFBQUMsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUFtQixTQUFBO0lBQUEsSUFBQUMsQ0FBQTtJQUFBLE9BQUFyQixZQUFBLFlBQUFJLElBQUEsV0FBQWtCLFNBQUE7TUFBQSxrQkFBQUEsU0FBQSxDQUFBaEIsSUFBQSxHQUFBZ0IsU0FBQSxDQUFBZixJQUFBO1FBQUE7VUFDMURjLENBQUMsR0FBRyxJQUFJRSxrQkFBTSxDQUFDO1lBQUVDLEtBQUssRUFBRTtVQUErQixDQUFDLENBQUM7VUFFL0RILENBQUMsQ0FBQ1osU0FBUyxHQUFHO1lBQUVDLE9BQU8sRUFBRW5DLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLE1BQU07VUFBRSxDQUFDO1VBQ3pENkMsQ0FBQyxDQUFDSSxnQkFBZ0IsR0FBRyxZQUFNLENBQUMsQ0FBQztVQUFDSCxTQUFBLENBQUFmLElBQUE7VUFBQSxPQUN4QmMsQ0FBQyxDQUFDVixpQkFBaUIsQ0FBQyxDQUFDO1FBQUE7VUFFM0JDLE1BQU0sQ0FBQ3BCLDBCQUFpQixDQUFDLENBQUNxQixvQkFBb0IsQ0FBQ1EsQ0FBQyxDQUFDUCxTQUFTLENBQUM7VUFFM0RPLENBQUMsQ0FBQ04sb0JBQW9CLENBQUMsQ0FBQztVQUV4QkgsTUFBTSxDQUFDdEIsV0FBVyxDQUFDLENBQUMwQixxQkFBcUIsQ0FBQyxDQUFDLENBQUM7UUFBQztRQUFBO1VBQUEsT0FBQU0sU0FBQSxDQUFBSCxJQUFBO01BQUE7SUFBQSxHQUFBQyxRQUFBO0VBQUEsQ0FDOUMsR0FBQzs7RUFFRjtFQUNBO0VBQ0F0QixFQUFFLENBQUMsNkNBQTZDLEVBQUUsWUFBTTtJQUN0RCxJQUFNdUIsQ0FBQyxHQUFHLElBQUlFLGtCQUFNLENBQUM7TUFBRUMsS0FBSyxFQUFFO0lBQWtCLENBQUMsQ0FBQztJQUNsRCxJQUFNRSxNQUFNLEdBQUduRCxRQUFRLENBQUNDLGFBQWEsQ0FBQyxNQUFNLENBQUM7SUFFN0M2QyxDQUFDLENBQUNaLFNBQVMsR0FBRztNQUFFQyxPQUFPLEVBQUVnQjtJQUFPLENBQUM7SUFDakNMLENBQUMsQ0FBQ00sS0FBSyxHQUFHO01BQUVDLE1BQU0sRUFBRTtJQUFtQixDQUFDO0lBQ3hDUCxDQUFDLENBQUNRLGtCQUFrQixDQUFDO01BQUVMLEtBQUssRUFBRTtJQUFrQixDQUFDLEVBQUU7TUFBRUksTUFBTSxFQUFFO0lBQUcsQ0FBQyxDQUFDO0lBRWxFaEIsTUFBTSxDQUFDbkIsaUNBQXdCLENBQUMsQ0FBQ29CLG9CQUFvQixDQUFDYSxNQUFNLENBQUM7RUFDL0QsQ0FBQyxDQUFDO0VBRUY1QixFQUFFLENBQUMsaURBQWlELEVBQUUsWUFBTTtJQUMxRCxJQUFNdUIsQ0FBQyxHQUFHLElBQUlFLGtCQUFNLENBQUM7TUFBRUMsS0FBSyxFQUFFO0lBQUksQ0FBQyxDQUFDO0lBRXBDSCxDQUFDLENBQUNaLFNBQVMsR0FBRztNQUFFQyxPQUFPLEVBQUVuQyxRQUFRLENBQUNDLGFBQWEsQ0FBQyxNQUFNO0lBQUUsQ0FBQztJQUN6RDZDLENBQUMsQ0FBQ00sS0FBSyxHQUFHO01BQUVDLE1BQU0sRUFBRTtJQUFvQixDQUFDO0lBQ3pDUCxDQUFDLENBQUNRLGtCQUFrQixDQUFDO01BQUVMLEtBQUssRUFBRTtJQUFJLENBQUMsRUFBRTtNQUFFSSxNQUFNLEVBQUU7SUFBb0IsQ0FBQyxDQUFDO0lBRXJFaEIsTUFBTSxDQUFDbkIsaUNBQXdCLENBQUMsQ0FBQ3FDLEdBQUcsQ0FBQ0MsZ0JBQWdCLENBQUMsQ0FBQztFQUN6RCxDQUFDLENBQUM7RUFFRmpDLEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRSxZQUFNO0lBQzdDLElBQU11QixDQUFDLEdBQUcsSUFBSUUsa0JBQU0sQ0FBQztNQUFFQyxLQUFLLEVBQUU7SUFBSSxDQUFDLENBQUM7SUFFcENILENBQUMsQ0FBQ1osU0FBUyxHQUFHO01BQUVDLE9BQU8sRUFBRW5DLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLE1BQU07SUFBRSxDQUFDO0lBQ3pENkMsQ0FBQyxDQUFDUCxTQUFTLEdBQUd2QyxRQUFRLENBQUNDLGFBQWEsQ0FBQyxZQUFZLENBQUM7SUFDbEQ2QyxDQUFDLENBQUNNLEtBQUssR0FBRztNQUFFQyxNQUFNLEVBQUU7SUFBbUIsQ0FBQztJQUN4Q1AsQ0FBQyxDQUFDUSxrQkFBa0IsQ0FBQztNQUFFTCxLQUFLLEVBQUU7SUFBSSxDQUFDLEVBQUU7TUFBRUksTUFBTSxFQUFFO0lBQUcsQ0FBQyxDQUFDO0lBRXBEaEIsTUFBTSxDQUFDbkIsaUNBQXdCLENBQUMsQ0FBQ3FDLEdBQUcsQ0FBQ0MsZ0JBQWdCLENBQUMsQ0FBQztFQUN6RCxDQUFDLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRmxDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsWUFBTTtFQUM3QkMsRUFBRSxDQUFDLGlDQUFpQyxtQkFBQUMsa0JBQUEsMEJBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQUFFLFNBQUErQixTQUFBO0lBQUEsSUFBQUMsS0FBQSxFQUFBNUQsRUFBQTtJQUFBLE9BQUEyQixZQUFBLFlBQUFJLElBQUEsV0FBQThCLFNBQUE7TUFBQSxrQkFBQUEsU0FBQSxDQUFBNUIsSUFBQSxHQUFBNEIsU0FBQSxDQUFBM0IsSUFBQTtRQUFBO1VBQzlCMEIsS0FBSyxHQUFHLElBQUlFLGtCQUFVLENBQUM7WUFBRVgsS0FBSyxFQUFFO1VBQWMsQ0FBQyxDQUFDO1VBQ2hEbkQsRUFBRSxHQUFHRSxRQUFRLENBQUNDLGFBQWEsQ0FBQyxNQUFNLENBQUM7VUFFekN5RCxLQUFLLENBQUNHLFFBQVEsR0FBRztZQUFFMUIsT0FBTyxFQUFFckM7VUFBRyxDQUFDO1VBQUM2RCxTQUFBLENBQUEzQixJQUFBO1VBQUEsT0FDM0IwQixLQUFLLENBQUN0QixpQkFBaUIsQ0FBQyxDQUFDO1FBQUE7VUFFL0JDLE1BQU0sQ0FBQ25CLGlDQUF3QixDQUFDLENBQUNvQixvQkFBb0IsQ0FBQ3hDLEVBQUUsQ0FBQztRQUFDO1FBQUE7VUFBQSxPQUFBNkQsU0FBQSxDQUFBZixJQUFBO01BQUE7SUFBQSxHQUFBYSxRQUFBO0VBQUEsQ0FDM0QsR0FBQztFQUVGbEMsRUFBRSxDQUFDLDBDQUEwQyxFQUFFLFlBQU07SUFDbkQsSUFBTW1DLEtBQUssR0FBRyxJQUFJRSxrQkFBVSxDQUFDO01BQUVYLEtBQUssRUFBRTtJQUFjLENBQUMsQ0FBQztJQUN0RCxJQUFNbkQsRUFBRSxHQUFHRSxRQUFRLENBQUNDLGFBQWEsQ0FBQyxNQUFNLENBQUM7SUFFekN5RCxLQUFLLENBQUNHLFFBQVEsR0FBRztNQUFFMUIsT0FBTyxFQUFFckM7SUFBRyxDQUFDO0lBQ2hDNEQsS0FBSyxDQUFDSSxRQUFRLEdBQUcsWUFBTSxDQUFDLENBQUM7SUFDekJKLEtBQUssQ0FBQ04sS0FBSyxHQUFHO01BQUVDLE1BQU0sRUFBRTtJQUFxQixDQUFDO0lBQzlDSyxLQUFLLENBQUNKLGtCQUFrQixDQUFDO01BQUVMLEtBQUssRUFBRTtJQUFjLENBQUMsRUFBRTtNQUFFSSxNQUFNLEVBQUU7SUFBcUIsQ0FBQyxDQUFDO0lBRXBGaEIsTUFBTSxDQUFDbkIsaUNBQXdCLENBQUMsQ0FBQ29CLG9CQUFvQixDQUFDeEMsRUFBRSxDQUFDO0VBQzNELENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
5
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
6
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
7
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
8
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
+
var _longdiv = require("../longdiv");
|
|
10
|
+
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; }
|
|
11
|
+
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; }
|
|
12
|
+
/**
|
|
13
|
+
* Markup captured verbatim from MathLive 0.110.0 `convertLatexToMarkup` in
|
|
14
|
+
* Chrome. In `12\enclose{longdiv}{144}` MathLive drops the dividend 0.45em
|
|
15
|
+
* (`top:0.45em`), sizes the box 2.1em wide while the viewBox is 2.54 wide, and
|
|
16
|
+
* ends the bar at 1.8 although the dividend runs to 0.3 + 0.45 + 1.5 = 2.25.
|
|
17
|
+
*/
|
|
18
|
+
var LONGDIV = '<span class="ML__latex"><span class="ML__strut" style="height:0.8em"></span><span class="ML__strut--bottom" style="height:1.25em;vertical-align:-0.44em"></span><span class="ML__base"><span class="ML__cmr">12</span><span style="position:relative;height:1.24em;display:inline-block;margin-left:0.3em;margin-right:0.3em;width:1.95em"><span class="ML__notation" style="box-sizing:border-box;left:calc(-1 * 1px - 0.3em);height:calc( 1.24444em + 1px);top:0em;width:calc(2.1em + 1px);background-color:transparent"><span style="display: inline-block;height:1.24em;vertical-align:0.44em;"></span><svg style="position:absolute;overflow:visible;height:1.24em;top:0;left:0;width:100%;z-index:2;" stroke-width="0.06em" stroke="currentColor" stroke-linecap="round" viewBox="0 0 2.54 1.24"><line x1="0.3" y1="0.3" x2="1.8" y2="0.3" vector-effect="non-scaling-stroke"></line><path d="M 0.3 0.3 a0.3 0.46997, 0, 1, 1, 0 0.93994 " stroke-width="0.004em" stroke="currentColor" fill="none"/></svg></span><span style="position:relative;display:inline-block;height:0.65em;width:1.5em;margin-left:0.45em;top:0.45em"><span class="ML__cmr">144</span></span></span></span></span>';
|
|
19
|
+
|
|
20
|
+
// \enclose{box}{x}: another notation, which must be left alone
|
|
21
|
+
var BOX = '<span class="ML__latex"><span class="ML__strut" style="height:1.04em"></span><span class="ML__base"><span style="position:relative;height:1.03em;display:inline-block;margin-left:0.3em;margin-right:0.3em;width:0.58em"><span class="ML__notation" style="box-sizing:border-box;left:calc(-1 * 1px - 0.3em);height:calc( 1.03056em + 1px);top:0em;width:calc(1.17153em + 1px);background-color:transparent;border:1px solid red"></span><span style="position:relative;display:inline-block;height:0.44em;width:0.58em"><span class="ML__mathit">x</span></span></span></span></span>';
|
|
22
|
+
var mount = function mount(html) {
|
|
23
|
+
var el = document.createElement('div');
|
|
24
|
+
el.innerHTML = html;
|
|
25
|
+
document.body.appendChild(el);
|
|
26
|
+
return el;
|
|
27
|
+
};
|
|
28
|
+
var parts = function parts(el) {
|
|
29
|
+
var notation = el.querySelector('.ML__notation');
|
|
30
|
+
return {
|
|
31
|
+
notation: notation,
|
|
32
|
+
box: notation.parentElement,
|
|
33
|
+
dividend: notation.nextElementSibling,
|
|
34
|
+
line: notation.querySelector('line')
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
afterEach(function () {
|
|
38
|
+
document.body.innerHTML = '';
|
|
39
|
+
});
|
|
40
|
+
describe('fixLongDivision', function () {
|
|
41
|
+
it('puts the dividend back on the baseline', function () {
|
|
42
|
+
var el = mount(LONGDIV);
|
|
43
|
+
(0, _longdiv.fixLongDivision)(el);
|
|
44
|
+
var _parts = parts(el),
|
|
45
|
+
dividend = _parts.dividend,
|
|
46
|
+
box = _parts.box;
|
|
47
|
+
expect(dividend.style.top).toEqual('0px');
|
|
48
|
+
// the drawing keeps its place relative to the dividend, and the line grows
|
|
49
|
+
// so the field does not clip the bar
|
|
50
|
+
expect(box.style.paddingTop).toEqual('0.45em');
|
|
51
|
+
});
|
|
52
|
+
it('sizes the box to the viewBox, so the drawing is not scaled down', function () {
|
|
53
|
+
var el = mount(LONGDIV);
|
|
54
|
+
(0, _longdiv.fixLongDivision)(el);
|
|
55
|
+
expect(parts(el).notation.style.width).toEqual('calc(2.54em + 1px)');
|
|
56
|
+
});
|
|
57
|
+
it('runs the bar to the end of the dividend', function () {
|
|
58
|
+
var el = mount(LONGDIV);
|
|
59
|
+
(0, _longdiv.fixLongDivision)(el);
|
|
60
|
+
|
|
61
|
+
// no layout under jsdom, so from MathLive's numbers: start + gap + width
|
|
62
|
+
expect(parseFloat(parts(el).line.getAttribute('x2'))).toBeCloseTo(0.3 + 0.45 + 1.5, 6);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
// MathLive's width leaves out the spacing around `,` and `+`, so when the
|
|
66
|
+
// markup is laid out the end is measured instead.
|
|
67
|
+
it('measures the bar end from the rendered dividend when laid out', function () {
|
|
68
|
+
var el = mount(LONGDIV);
|
|
69
|
+
var _parts2 = parts(el),
|
|
70
|
+
notation = _parts2.notation,
|
|
71
|
+
dividend = _parts2.dividend;
|
|
72
|
+
var svg = notation.querySelector('svg');
|
|
73
|
+
var glyph = dividend.querySelector('.ML__cmr');
|
|
74
|
+
|
|
75
|
+
// the svg is 254px wide for a 2.54-unit viewBox: 100px per unit
|
|
76
|
+
svg.getBoundingClientRect = function () {
|
|
77
|
+
return {
|
|
78
|
+
left: 100,
|
|
79
|
+
width: 254,
|
|
80
|
+
right: 354
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
glyph.getBoundingClientRect = function () {
|
|
84
|
+
return {
|
|
85
|
+
left: 145,
|
|
86
|
+
right: 340,
|
|
87
|
+
width: 195
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
(0, _longdiv.fixLongDivision)(el);
|
|
91
|
+
expect(parseFloat(parts(el).line.getAttribute('x2'))).toBeCloseTo(2.4, 6);
|
|
92
|
+
});
|
|
93
|
+
it('ignores the caret when measuring', function () {
|
|
94
|
+
var el = mount(LONGDIV);
|
|
95
|
+
var _parts3 = parts(el),
|
|
96
|
+
notation = _parts3.notation,
|
|
97
|
+
dividend = _parts3.dividend;
|
|
98
|
+
var caret = document.createElement('span');
|
|
99
|
+
caret.className = 'ML__caret';
|
|
100
|
+
dividend.appendChild(caret);
|
|
101
|
+
notation.querySelector('svg').getBoundingClientRect = function () {
|
|
102
|
+
return {
|
|
103
|
+
left: 100,
|
|
104
|
+
width: 254,
|
|
105
|
+
right: 354
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
dividend.querySelector('.ML__cmr').getBoundingClientRect = function () {
|
|
109
|
+
return {
|
|
110
|
+
left: 145,
|
|
111
|
+
right: 340,
|
|
112
|
+
width: 195
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
caret.getBoundingClientRect = function () {
|
|
116
|
+
return {
|
|
117
|
+
left: 400,
|
|
118
|
+
right: 402,
|
|
119
|
+
width: 2
|
|
120
|
+
};
|
|
121
|
+
};
|
|
122
|
+
(0, _longdiv.fixLongDivision)(el);
|
|
123
|
+
expect(parseFloat(parts(el).line.getAttribute('x2'))).toBeCloseTo(2.4, 6);
|
|
124
|
+
});
|
|
125
|
+
it('can run again without drifting', function () {
|
|
126
|
+
var el = mount(LONGDIV);
|
|
127
|
+
(0, _longdiv.fixLongDivision)(el);
|
|
128
|
+
var first = _objectSpread(_objectSpread({}, parts(el)), {}, {
|
|
129
|
+
x2: parts(el).line.getAttribute('x2')
|
|
130
|
+
});
|
|
131
|
+
(0, _longdiv.fixLongDivision)(el);
|
|
132
|
+
var second = parts(el);
|
|
133
|
+
expect(second.line.getAttribute('x2')).toEqual(first.x2);
|
|
134
|
+
expect(second.box.style.paddingTop).toEqual('0.45em');
|
|
135
|
+
expect(second.notation.style.width).toEqual('calc(2.54em + 1px)');
|
|
136
|
+
});
|
|
137
|
+
it('leaves other enclose notations alone', function () {
|
|
138
|
+
var el = mount(BOX);
|
|
139
|
+
var before = el.innerHTML;
|
|
140
|
+
expect((0, _longdiv.fixLongDivision)(el)).toBe(0);
|
|
141
|
+
expect(el.innerHTML).toEqual(before);
|
|
142
|
+
});
|
|
143
|
+
it('counts what it corrected', function () {
|
|
144
|
+
expect((0, _longdiv.fixLongDivision)(mount(LONGDIV + LONGDIV))).toBe(2);
|
|
145
|
+
});
|
|
146
|
+
it('is safe on nothing', function () {
|
|
147
|
+
expect((0, _longdiv.fixLongDivision)(null)).toBe(0);
|
|
148
|
+
expect((0, _longdiv.fixLongDivision)(mount('<span>plain</span>'))).toBe(0);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
describe('fixLongDivisionWhenReady', function () {
|
|
152
|
+
it('corrects now, and again once the fonts have loaded', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
153
|
+
var fontsLoaded, original, el;
|
|
154
|
+
return _regenerator["default"].wrap(function (_context) {
|
|
155
|
+
while (1) switch (_context.prev = _context.next) {
|
|
156
|
+
case 0:
|
|
157
|
+
original = document.fonts;
|
|
158
|
+
Object.defineProperty(document, 'fonts', {
|
|
159
|
+
configurable: true,
|
|
160
|
+
value: {
|
|
161
|
+
ready: new Promise(function (resolve) {
|
|
162
|
+
return fontsLoaded = resolve;
|
|
163
|
+
})
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
_context.prev = 1;
|
|
167
|
+
el = mount(LONGDIV);
|
|
168
|
+
(0, _longdiv.fixLongDivisionWhenReady)(el);
|
|
169
|
+
expect(parts(el).dividend.style.top).toEqual('0px');
|
|
170
|
+
|
|
171
|
+
// a re-render before the fonts arrive...
|
|
172
|
+
el.innerHTML = LONGDIV;
|
|
173
|
+
fontsLoaded();
|
|
174
|
+
_context.next = 2;
|
|
175
|
+
return Promise.resolve();
|
|
176
|
+
case 2:
|
|
177
|
+
_context.next = 3;
|
|
178
|
+
return Promise.resolve();
|
|
179
|
+
case 3:
|
|
180
|
+
// ...is corrected once they do
|
|
181
|
+
expect(parts(el).dividend.style.top).toEqual('0px');
|
|
182
|
+
case 4:
|
|
183
|
+
_context.prev = 4;
|
|
184
|
+
Object.defineProperty(document, 'fonts', {
|
|
185
|
+
configurable: true,
|
|
186
|
+
value: original
|
|
187
|
+
});
|
|
188
|
+
return _context.finish(4);
|
|
189
|
+
case 5:
|
|
190
|
+
case "end":
|
|
191
|
+
return _context.stop();
|
|
192
|
+
}
|
|
193
|
+
}, _callee, null, [[1,, 4, 5]]);
|
|
194
|
+
})));
|
|
195
|
+
});
|
|
196
|
+
describe('trackLongDivision', function () {
|
|
197
|
+
var field = function field() {
|
|
198
|
+
var host = document.createElement('div');
|
|
199
|
+
host.attachShadow({
|
|
200
|
+
mode: 'open'
|
|
201
|
+
});
|
|
202
|
+
host.shadowRoot.innerHTML = LONGDIV;
|
|
203
|
+
document.body.appendChild(host);
|
|
204
|
+
return host;
|
|
205
|
+
};
|
|
206
|
+
it('corrects the field straight away', function () {
|
|
207
|
+
var host = field();
|
|
208
|
+
(0, _longdiv.trackLongDivision)(host);
|
|
209
|
+
expect(parts(host.shadowRoot).dividend.style.top).toEqual('0px');
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
// jest.setup.js replaces MutationObserver with a no-op for every test, so this
|
|
213
|
+
// installs one that records what it was asked to observe and can be fired.
|
|
214
|
+
describe('re-rendering', function () {
|
|
215
|
+
var observers;
|
|
216
|
+
var RealObserver = global.MutationObserver;
|
|
217
|
+
beforeEach(function () {
|
|
218
|
+
observers = [];
|
|
219
|
+
global.MutationObserver = /*#__PURE__*/function () {
|
|
220
|
+
function _class(callback) {
|
|
221
|
+
(0, _classCallCheck2["default"])(this, _class);
|
|
222
|
+
this.callback = callback;
|
|
223
|
+
this.disconnected = false;
|
|
224
|
+
observers.push(this);
|
|
225
|
+
}
|
|
226
|
+
return (0, _createClass2["default"])(_class, [{
|
|
227
|
+
key: "observe",
|
|
228
|
+
value: function observe(target, options) {
|
|
229
|
+
this.target = target;
|
|
230
|
+
this.options = options;
|
|
231
|
+
}
|
|
232
|
+
}, {
|
|
233
|
+
key: "disconnect",
|
|
234
|
+
value: function disconnect() {
|
|
235
|
+
this.disconnected = true;
|
|
236
|
+
}
|
|
237
|
+
}]);
|
|
238
|
+
}();
|
|
239
|
+
});
|
|
240
|
+
afterEach(function () {
|
|
241
|
+
global.MutationObserver = RealObserver;
|
|
242
|
+
});
|
|
243
|
+
it('watches the whole shadow tree for MathLive rebuilding it', function () {
|
|
244
|
+
var host = field();
|
|
245
|
+
(0, _longdiv.trackLongDivision)(host);
|
|
246
|
+
expect(observers).toHaveLength(1);
|
|
247
|
+
expect(observers[0].target).toBe(host.shadowRoot);
|
|
248
|
+
expect(observers[0].options).toEqual({
|
|
249
|
+
childList: true,
|
|
250
|
+
subtree: true
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
// MathLive rebuilds its shadow DOM on every keystroke, resize and font load.
|
|
255
|
+
it('re-corrects after MathLive re-renders', function () {
|
|
256
|
+
var host = field();
|
|
257
|
+
(0, _longdiv.trackLongDivision)(host);
|
|
258
|
+
host.shadowRoot.innerHTML = LONGDIV;
|
|
259
|
+
expect(parts(host.shadowRoot).dividend.style.top).toEqual('0.45em');
|
|
260
|
+
observers[0].callback([]);
|
|
261
|
+
expect(parts(host.shadowRoot).dividend.style.top).toEqual('0px');
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
// The corrections change attributes only, so observing childList alone
|
|
265
|
+
// cannot loop.
|
|
266
|
+
it('does not observe attributes', function () {
|
|
267
|
+
(0, _longdiv.trackLongDivision)(field());
|
|
268
|
+
expect(observers[0].options.attributes).toBeUndefined();
|
|
269
|
+
});
|
|
270
|
+
it('stops after teardown', function () {
|
|
271
|
+
var untrack = (0, _longdiv.trackLongDivision)(field());
|
|
272
|
+
untrack();
|
|
273
|
+
expect(observers[0].disconnected).toBe(true);
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
it('is a no-op without a shadow root', function () {
|
|
277
|
+
expect((0, _longdiv.trackLongDivision)(undefined)).toBeUndefined();
|
|
278
|
+
expect((0, _longdiv.trackLongDivision)(document.createElement('div'))).toBeUndefined();
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9uZ2RpdiIsInJlcXVpcmUiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIkxPTkdESVYiLCJCT1giLCJtb3VudCIsImh0bWwiLCJlbCIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImlubmVySFRNTCIsImJvZHkiLCJhcHBlbmRDaGlsZCIsInBhcnRzIiwibm90YXRpb24iLCJxdWVyeVNlbGVjdG9yIiwiYm94IiwicGFyZW50RWxlbWVudCIsImRpdmlkZW5kIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwibGluZSIsImFmdGVyRWFjaCIsImRlc2NyaWJlIiwiaXQiLCJmaXhMb25nRGl2aXNpb24iLCJfcGFydHMiLCJleHBlY3QiLCJzdHlsZSIsInRvcCIsInRvRXF1YWwiLCJwYWRkaW5nVG9wIiwid2lkdGgiLCJwYXJzZUZsb2F0IiwiZ2V0QXR0cmlidXRlIiwidG9CZUNsb3NlVG8iLCJfcGFydHMyIiwic3ZnIiwiZ2x5cGgiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJsZWZ0IiwicmlnaHQiLCJfcGFydHMzIiwiY2FyZXQiLCJjbGFzc05hbWUiLCJmaXJzdCIsIngyIiwic2Vjb25kIiwiYmVmb3JlIiwidG9CZSIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiZm9udHNMb2FkZWQiLCJvcmlnaW5hbCIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiZm9udHMiLCJjb25maWd1cmFibGUiLCJ2YWx1ZSIsInJlYWR5IiwiUHJvbWlzZSIsInJlc29sdmUiLCJmaXhMb25nRGl2aXNpb25XaGVuUmVhZHkiLCJmaW5pc2giLCJzdG9wIiwiZmllbGQiLCJob3N0IiwiYXR0YWNoU2hhZG93IiwibW9kZSIsInNoYWRvd1Jvb3QiLCJ0cmFja0xvbmdEaXZpc2lvbiIsIm9ic2VydmVycyIsIlJlYWxPYnNlcnZlciIsImdsb2JhbCIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJiZWZvcmVFYWNoIiwiX2NsYXNzIiwiY2FsbGJhY2siLCJfY2xhc3NDYWxsQ2hlY2syIiwiZGlzY29ubmVjdGVkIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsIm9ic2VydmUiLCJ0YXJnZXQiLCJvcHRpb25zIiwiZGlzY29ubmVjdCIsInRvSGF2ZUxlbmd0aCIsImNoaWxkTGlzdCIsInN1YnRyZWUiLCJhdHRyaWJ1dGVzIiwidG9CZVVuZGVmaW5lZCIsInVudHJhY2siLCJ1bmRlZmluZWQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2xvbmdkaXYudGVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmaXhMb25nRGl2aXNpb24sIGZpeExvbmdEaXZpc2lvbldoZW5SZWFkeSwgdHJhY2tMb25nRGl2aXNpb24gfSBmcm9tICcuLi9sb25nZGl2JztcblxuLyoqXG4gKiBNYXJrdXAgY2FwdHVyZWQgdmVyYmF0aW0gZnJvbSBNYXRoTGl2ZSAwLjExMC4wIGBjb252ZXJ0TGF0ZXhUb01hcmt1cGAgaW5cbiAqIENocm9tZS4gSW4gYDEyXFxlbmNsb3Nle2xvbmdkaXZ9ezE0NH1gIE1hdGhMaXZlIGRyb3BzIHRoZSBkaXZpZGVuZCAwLjQ1ZW1cbiAqIChgdG9wOjAuNDVlbWApLCBzaXplcyB0aGUgYm94IDIuMWVtIHdpZGUgd2hpbGUgdGhlIHZpZXdCb3ggaXMgMi41NCB3aWRlLCBhbmRcbiAqIGVuZHMgdGhlIGJhciBhdCAxLjggYWx0aG91Z2ggdGhlIGRpdmlkZW5kIHJ1bnMgdG8gMC4zICsgMC40NSArIDEuNSA9IDIuMjUuXG4gKi9cbmNvbnN0IExPTkdESVYgPVxuICAnPHNwYW4gY2xhc3M9XCJNTF9fbGF0ZXhcIj48c3BhbiBjbGFzcz1cIk1MX19zdHJ1dFwiIHN0eWxlPVwiaGVpZ2h0OjAuOGVtXCI+PC9zcGFuPjxzcGFuIGNsYXNzPVwiTUxfX3N0cnV0LS1ib3R0b21cIiBzdHlsZT1cImhlaWdodDoxLjI1ZW07dmVydGljYWwtYWxpZ246LTAuNDRlbVwiPjwvc3Bhbj48c3BhbiBjbGFzcz1cIk1MX19iYXNlXCI+PHNwYW4gY2xhc3M9XCJNTF9fY21yXCI+MTI8L3NwYW4+PHNwYW4gc3R5bGU9XCJwb3NpdGlvbjpyZWxhdGl2ZTtoZWlnaHQ6MS4yNGVtO2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1sZWZ0OjAuM2VtO21hcmdpbi1yaWdodDowLjNlbTt3aWR0aDoxLjk1ZW1cIj48c3BhbiBjbGFzcz1cIk1MX19ub3RhdGlvblwiIHN0eWxlPVwiYm94LXNpemluZzpib3JkZXItYm94O2xlZnQ6Y2FsYygtMSAqIDFweCAtIDAuM2VtKTtoZWlnaHQ6Y2FsYyggMS4yNDQ0NGVtICsgMXB4KTt0b3A6MGVtO3dpZHRoOmNhbGMoMi4xZW0gKyAxcHgpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnRcIj48c3BhbiBzdHlsZT1cImRpc3BsYXk6IGlubGluZS1ibG9jaztoZWlnaHQ6MS4yNGVtO3ZlcnRpY2FsLWFsaWduOjAuNDRlbTtcIj48L3NwYW4+PHN2ZyBzdHlsZT1cInBvc2l0aW9uOmFic29sdXRlO292ZXJmbG93OnZpc2libGU7aGVpZ2h0OjEuMjRlbTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTt6LWluZGV4OjI7XCIgc3Ryb2tlLXdpZHRoPVwiMC4wNmVtXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHZpZXdCb3g9XCIwIDAgMi41NCAxLjI0XCI+PGxpbmUgeDE9XCIwLjNcIiAgeTE9XCIwLjNcIiB4Mj1cIjEuOFwiIHkyPVwiMC4zXCIgdmVjdG9yLWVmZmVjdD1cIm5vbi1zY2FsaW5nLXN0cm9rZVwiPjwvbGluZT48cGF0aCBkPVwiTSAwLjMgMC4zICBhMC4zIDAuNDY5OTcsIDAsIDEsIDEsIDAgMC45Mzk5NCBcIiBzdHJva2Utd2lkdGg9XCIwLjAwNGVtXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgZmlsbD1cIm5vbmVcIi8+PC9zdmc+PC9zcGFuPjxzcGFuIHN0eWxlPVwicG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7aGVpZ2h0OjAuNjVlbTt3aWR0aDoxLjVlbTttYXJnaW4tbGVmdDowLjQ1ZW07dG9wOjAuNDVlbVwiPjxzcGFuIGNsYXNzPVwiTUxfX2NtclwiPjE0NDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NwYW4+JztcblxuLy8gXFxlbmNsb3Nle2JveH17eH06IGFub3RoZXIgbm90YXRpb24sIHdoaWNoIG11c3QgYmUgbGVmdCBhbG9uZVxuY29uc3QgQk9YID1cbiAgJzxzcGFuIGNsYXNzPVwiTUxfX2xhdGV4XCI+PHNwYW4gY2xhc3M9XCJNTF9fc3RydXRcIiBzdHlsZT1cImhlaWdodDoxLjA0ZW1cIj48L3NwYW4+PHNwYW4gY2xhc3M9XCJNTF9fYmFzZVwiPjxzcGFuIHN0eWxlPVwicG9zaXRpb246cmVsYXRpdmU7aGVpZ2h0OjEuMDNlbTtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tbGVmdDowLjNlbTttYXJnaW4tcmlnaHQ6MC4zZW07d2lkdGg6MC41OGVtXCI+PHNwYW4gY2xhc3M9XCJNTF9fbm90YXRpb25cIiBzdHlsZT1cImJveC1zaXppbmc6Ym9yZGVyLWJveDtsZWZ0OmNhbGMoLTEgKiAxcHggLSAwLjNlbSk7aGVpZ2h0OmNhbGMoIDEuMDMwNTZlbSArIDFweCk7dG9wOjBlbTt3aWR0aDpjYWxjKDEuMTcxNTNlbSArIDFweCk7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXI6MXB4IHNvbGlkIHJlZFwiPjwvc3Bhbj48c3BhbiBzdHlsZT1cInBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDowLjQ0ZW07d2lkdGg6MC41OGVtXCI+PHNwYW4gY2xhc3M9XCJNTF9fbWF0aGl0XCI+eDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvc3Bhbj48L3NwYW4+JztcblxuY29uc3QgbW91bnQgPSAoaHRtbCkgPT4ge1xuICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gIGVsLmlubmVySFRNTCA9IGh0bWw7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWwpO1xuXG4gIHJldHVybiBlbDtcbn07XG5cbmNvbnN0IHBhcnRzID0gKGVsKSA9PiB7XG4gIGNvbnN0IG5vdGF0aW9uID0gZWwucXVlcnlTZWxlY3RvcignLk1MX19ub3RhdGlvbicpO1xuXG4gIHJldHVybiB7XG4gICAgbm90YXRpb24sXG4gICAgYm94OiBub3RhdGlvbi5wYXJlbnRFbGVtZW50LFxuICAgIGRpdmlkZW5kOiBub3RhdGlvbi5uZXh0RWxlbWVudFNpYmxpbmcsXG4gICAgbGluZTogbm90YXRpb24ucXVlcnlTZWxlY3RvcignbGluZScpLFxuICB9O1xufTtcblxuYWZ0ZXJFYWNoKCgpID0+IHtcbiAgZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSAnJztcbn0pO1xuXG5kZXNjcmliZSgnZml4TG9uZ0RpdmlzaW9uJywgKCkgPT4ge1xuICBpdCgncHV0cyB0aGUgZGl2aWRlbmQgYmFjayBvbiB0aGUgYmFzZWxpbmUnLCAoKSA9PiB7XG4gICAgY29uc3QgZWwgPSBtb3VudChMT05HRElWKTtcblxuICAgIGZpeExvbmdEaXZpc2lvbihlbCk7XG5cbiAgICBjb25zdCB7IGRpdmlkZW5kLCBib3ggfSA9IHBhcnRzKGVsKTtcblxuICAgIGV4cGVjdChkaXZpZGVuZC5zdHlsZS50b3ApLnRvRXF1YWwoJzBweCcpO1xuICAgIC8vIHRoZSBkcmF3aW5nIGtlZXBzIGl0cyBwbGFjZSByZWxhdGl2ZSB0byB0aGUgZGl2aWRlbmQsIGFuZCB0aGUgbGluZSBncm93c1xuICAgIC8vIHNvIHRoZSBmaWVsZCBkb2VzIG5vdCBjbGlwIHRoZSBiYXJcbiAgICBleHBlY3QoYm94LnN0eWxlLnBhZGRpbmdUb3ApLnRvRXF1YWwoJzAuNDVlbScpO1xuICB9KTtcblxuICBpdCgnc2l6ZXMgdGhlIGJveCB0byB0aGUgdmlld0JveCwgc28gdGhlIGRyYXdpbmcgaXMgbm90IHNjYWxlZCBkb3duJywgKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gbW91bnQoTE9OR0RJVik7XG5cbiAgICBmaXhMb25nRGl2aXNpb24oZWwpO1xuXG4gICAgZXhwZWN0KHBhcnRzKGVsKS5ub3RhdGlvbi5zdHlsZS53aWR0aCkudG9FcXVhbCgnY2FsYygyLjU0ZW0gKyAxcHgpJyk7XG4gIH0pO1xuXG4gIGl0KCdydW5zIHRoZSBiYXIgdG8gdGhlIGVuZCBvZiB0aGUgZGl2aWRlbmQnLCAoKSA9PiB7XG4gICAgY29uc3QgZWwgPSBtb3VudChMT05HRElWKTtcblxuICAgIGZpeExvbmdEaXZpc2lvbihlbCk7XG5cbiAgICAvLyBubyBsYXlvdXQgdW5kZXIganNkb20sIHNvIGZyb20gTWF0aExpdmUncyBudW1iZXJzOiBzdGFydCArIGdhcCArIHdpZHRoXG4gICAgZXhwZWN0KHBhcnNlRmxvYXQocGFydHMoZWwpLmxpbmUuZ2V0QXR0cmlidXRlKCd4MicpKSkudG9CZUNsb3NlVG8oMC4zICsgMC40NSArIDEuNSwgNik7XG4gIH0pO1xuXG4gIC8vIE1hdGhMaXZlJ3Mgd2lkdGggbGVhdmVzIG91dCB0aGUgc3BhY2luZyBhcm91bmQgYCxgIGFuZCBgK2AsIHNvIHdoZW4gdGhlXG4gIC8vIG1hcmt1cCBpcyBsYWlkIG91dCB0aGUgZW5kIGlzIG1lYXN1cmVkIGluc3RlYWQuXG4gIGl0KCdtZWFzdXJlcyB0aGUgYmFyIGVuZCBmcm9tIHRoZSByZW5kZXJlZCBkaXZpZGVuZCB3aGVuIGxhaWQgb3V0JywgKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gbW91bnQoTE9OR0RJVik7XG4gICAgY29uc3QgeyBub3RhdGlvbiwgZGl2aWRlbmQgfSA9IHBhcnRzKGVsKTtcbiAgICBjb25zdCBzdmcgPSBub3RhdGlvbi5xdWVyeVNlbGVjdG9yKCdzdmcnKTtcbiAgICBjb25zdCBnbHlwaCA9IGRpdmlkZW5kLnF1ZXJ5U2VsZWN0b3IoJy5NTF9fY21yJyk7XG5cbiAgICAvLyB0aGUgc3ZnIGlzIDI1NHB4IHdpZGUgZm9yIGEgMi41NC11bml0IHZpZXdCb3g6IDEwMHB4IHBlciB1bml0XG4gICAgc3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCA9ICgpID0+ICh7IGxlZnQ6IDEwMCwgd2lkdGg6IDI1NCwgcmlnaHQ6IDM1NCB9KTtcbiAgICBnbHlwaC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPSAoKSA9PiAoeyBsZWZ0OiAxNDUsIHJpZ2h0OiAzNDAsIHdpZHRoOiAxOTUgfSk7XG5cbiAgICBmaXhMb25nRGl2aXNpb24oZWwpO1xuXG4gICAgZXhwZWN0KHBhcnNlRmxvYXQocGFydHMoZWwpLmxpbmUuZ2V0QXR0cmlidXRlKCd4MicpKSkudG9CZUNsb3NlVG8oMi40LCA2KTtcbiAgfSk7XG5cbiAgaXQoJ2lnbm9yZXMgdGhlIGNhcmV0IHdoZW4gbWVhc3VyaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gbW91bnQoTE9OR0RJVik7XG4gICAgY29uc3QgeyBub3RhdGlvbiwgZGl2aWRlbmQgfSA9IHBhcnRzKGVsKTtcbiAgICBjb25zdCBjYXJldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblxuICAgIGNhcmV0LmNsYXNzTmFtZSA9ICdNTF9fY2FyZXQnO1xuICAgIGRpdmlkZW5kLmFwcGVuZENoaWxkKGNhcmV0KTtcbiAgICBub3RhdGlvbi5xdWVyeVNlbGVjdG9yKCdzdmcnKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPSAoKSA9PiAoeyBsZWZ0OiAxMDAsIHdpZHRoOiAyNTQsIHJpZ2h0OiAzNTQgfSk7XG4gICAgZGl2aWRlbmQucXVlcnlTZWxlY3RvcignLk1MX19jbXInKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPSAoKSA9PiAoeyBsZWZ0OiAxNDUsIHJpZ2h0OiAzNDAsIHdpZHRoOiAxOTUgfSk7XG4gICAgY2FyZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID0gKCkgPT4gKHsgbGVmdDogNDAwLCByaWdodDogNDAyLCB3aWR0aDogMiB9KTtcblxuICAgIGZpeExvbmdEaXZpc2lvbihlbCk7XG5cbiAgICBleHBlY3QocGFyc2VGbG9hdChwYXJ0cyhlbCkubGluZS5nZXRBdHRyaWJ1dGUoJ3gyJykpKS50b0JlQ2xvc2VUbygyLjQsIDYpO1xuICB9KTtcblxuICBpdCgnY2FuIHJ1biBhZ2FpbiB3aXRob3V0IGRyaWZ0aW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gbW91bnQoTE9OR0RJVik7XG5cbiAgICBmaXhMb25nRGl2aXNpb24oZWwpO1xuICAgIGNvbnN0IGZpcnN0ID0geyAuLi5wYXJ0cyhlbCksIHgyOiBwYXJ0cyhlbCkubGluZS5nZXRBdHRyaWJ1dGUoJ3gyJykgfTtcblxuICAgIGZpeExvbmdEaXZpc2lvbihlbCk7XG4gICAgY29uc3Qgc2Vjb25kID0gcGFydHMoZWwpO1xuXG4gICAgZXhwZWN0KHNlY29uZC5saW5lLmdldEF0dHJpYnV0ZSgneDInKSkudG9FcXVhbChmaXJzdC54Mik7XG4gICAgZXhwZWN0KHNlY29uZC5ib3guc3R5bGUucGFkZGluZ1RvcCkudG9FcXVhbCgnMC40NWVtJyk7XG4gICAgZXhwZWN0KHNlY29uZC5ub3RhdGlvbi5zdHlsZS53aWR0aCkudG9FcXVhbCgnY2FsYygyLjU0ZW0gKyAxcHgpJyk7XG4gIH0pO1xuXG4gIGl0KCdsZWF2ZXMgb3RoZXIgZW5jbG9zZSBub3RhdGlvbnMgYWxvbmUnLCAoKSA9PiB7XG4gICAgY29uc3QgZWwgPSBtb3VudChCT1gpO1xuICAgIGNvbnN0IGJlZm9yZSA9IGVsLmlubmVySFRNTDtcblxuICAgIGV4cGVjdChmaXhMb25nRGl2aXNpb24oZWwpKS50b0JlKDApO1xuICAgIGV4cGVjdChlbC5pbm5lckhUTUwpLnRvRXF1YWwoYmVmb3JlKTtcbiAgfSk7XG5cbiAgaXQoJ2NvdW50cyB3aGF0IGl0IGNvcnJlY3RlZCcsICgpID0+IHtcbiAgICBleHBlY3QoZml4TG9uZ0RpdmlzaW9uKG1vdW50KExPTkdESVYgKyBMT05HRElWKSkpLnRvQmUoMik7XG4gIH0pO1xuXG4gIGl0KCdpcyBzYWZlIG9uIG5vdGhpbmcnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGZpeExvbmdEaXZpc2lvbihudWxsKSkudG9CZSgwKTtcbiAgICBleHBlY3QoZml4TG9uZ0RpdmlzaW9uKG1vdW50KCc8c3Bhbj5wbGFpbjwvc3Bhbj4nKSkpLnRvQmUoMCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdmaXhMb25nRGl2aXNpb25XaGVuUmVhZHknLCAoKSA9PiB7XG4gIGl0KCdjb3JyZWN0cyBub3csIGFuZCBhZ2FpbiBvbmNlIHRoZSBmb250cyBoYXZlIGxvYWRlZCcsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgZm9udHNMb2FkZWQ7XG4gICAgY29uc3Qgb3JpZ2luYWwgPSBkb2N1bWVudC5mb250cztcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ2ZvbnRzJywge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHsgcmVhZHk6IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiAoZm9udHNMb2FkZWQgPSByZXNvbHZlKSkgfSxcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbCA9IG1vdW50KExPTkdESVYpO1xuXG4gICAgICBmaXhMb25nRGl2aXNpb25XaGVuUmVhZHkoZWwpO1xuICAgICAgZXhwZWN0KHBhcnRzKGVsKS5kaXZpZGVuZC5zdHlsZS50b3ApLnRvRXF1YWwoJzBweCcpO1xuXG4gICAgICAvLyBhIHJlLXJlbmRlciBiZWZvcmUgdGhlIGZvbnRzIGFycml2ZS4uLlxuICAgICAgZWwuaW5uZXJIVE1MID0gTE9OR0RJVjtcbiAgICAgIGZvbnRzTG9hZGVkKCk7XG4gICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgICAvLyAuLi5pcyBjb3JyZWN0ZWQgb25jZSB0aGV5IGRvXG4gICAgICBleHBlY3QocGFydHMoZWwpLmRpdmlkZW5kLnN0eWxlLnRvcCkudG9FcXVhbCgnMHB4Jyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ2ZvbnRzJywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBvcmlnaW5hbCB9KTtcbiAgICB9XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCd0cmFja0xvbmdEaXZpc2lvbicsICgpID0+IHtcbiAgY29uc3QgZmllbGQgPSAoKSA9PiB7XG4gICAgY29uc3QgaG9zdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgaG9zdC5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgaG9zdC5zaGFkb3dSb290LmlubmVySFRNTCA9IExPTkdESVY7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChob3N0KTtcblxuICAgIHJldHVybiBob3N0O1xuICB9O1xuXG4gIGl0KCdjb3JyZWN0cyB0aGUgZmllbGQgc3RyYWlnaHQgYXdheScsICgpID0+IHtcbiAgICBjb25zdCBob3N0ID0gZmllbGQoKTtcblxuICAgIHRyYWNrTG9uZ0RpdmlzaW9uKGhvc3QpO1xuXG4gICAgZXhwZWN0KHBhcnRzKGhvc3Quc2hhZG93Um9vdCkuZGl2aWRlbmQuc3R5bGUudG9wKS50b0VxdWFsKCcwcHgnKTtcbiAgfSk7XG5cbiAgLy8gamVzdC5zZXR1cC5qcyByZXBsYWNlcyBNdXRhdGlvbk9ic2VydmVyIHdpdGggYSBuby1vcCBmb3IgZXZlcnkgdGVzdCwgc28gdGhpc1xuICAvLyBpbnN0YWxscyBvbmUgdGhhdCByZWNvcmRzIHdoYXQgaXQgd2FzIGFza2VkIHRvIG9ic2VydmUgYW5kIGNhbiBiZSBmaXJlZC5cbiAgZGVzY3JpYmUoJ3JlLXJlbmRlcmluZycsICgpID0+IHtcbiAgICBsZXQgb2JzZXJ2ZXJzO1xuICAgIGNvbnN0IFJlYWxPYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBvYnNlcnZlcnMgPSBbXTtcbiAgICAgIGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyID0gY2xhc3Mge1xuICAgICAgICBjb25zdHJ1Y3RvcihjYWxsYmFjaykge1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICAgIG9ic2VydmVycy5wdXNoKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZSh0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlzY29ubmVjdCgpIHtcbiAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgPSBSZWFsT2JzZXJ2ZXI7XG4gICAgfSk7XG5cbiAgICBpdCgnd2F0Y2hlcyB0aGUgd2hvbGUgc2hhZG93IHRyZWUgZm9yIE1hdGhMaXZlIHJlYnVpbGRpbmcgaXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBob3N0ID0gZmllbGQoKTtcblxuICAgICAgdHJhY2tMb25nRGl2aXNpb24oaG9zdCk7XG5cbiAgICAgIGV4cGVjdChvYnNlcnZlcnMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICAgIGV4cGVjdChvYnNlcnZlcnNbMF0udGFyZ2V0KS50b0JlKGhvc3Quc2hhZG93Um9vdCk7XG4gICAgICBleHBlY3Qob2JzZXJ2ZXJzWzBdLm9wdGlvbnMpLnRvRXF1YWwoeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBNYXRoTGl2ZSByZWJ1aWxkcyBpdHMgc2hhZG93IERPTSBvbiBldmVyeSBrZXlzdHJva2UsIHJlc2l6ZSBhbmQgZm9udCBsb2FkLlxuICAgIGl0KCdyZS1jb3JyZWN0cyBhZnRlciBNYXRoTGl2ZSByZS1yZW5kZXJzJywgKCkgPT4ge1xuICAgICAgY29uc3QgaG9zdCA9IGZpZWxkKCk7XG5cbiAgICAgIHRyYWNrTG9uZ0RpdmlzaW9uKGhvc3QpO1xuICAgICAgaG9zdC5zaGFkb3dSb290LmlubmVySFRNTCA9IExPTkdESVY7XG4gICAgICBleHBlY3QocGFydHMoaG9zdC5zaGFkb3dSb290KS5kaXZpZGVuZC5zdHlsZS50b3ApLnRvRXF1YWwoJzAuNDVlbScpO1xuXG4gICAgICBvYnNlcnZlcnNbMF0uY2FsbGJhY2soW10pO1xuXG4gICAgICBleHBlY3QocGFydHMoaG9zdC5zaGFkb3dSb290KS5kaXZpZGVuZC5zdHlsZS50b3ApLnRvRXF1YWwoJzBweCcpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIGNvcnJlY3Rpb25zIGNoYW5nZSBhdHRyaWJ1dGVzIG9ubHksIHNvIG9ic2VydmluZyBjaGlsZExpc3QgYWxvbmVcbiAgICAvLyBjYW5ub3QgbG9vcC5cbiAgICBpdCgnZG9lcyBub3Qgb2JzZXJ2ZSBhdHRyaWJ1dGVzJywgKCkgPT4ge1xuICAgICAgdHJhY2tMb25nRGl2aXNpb24oZmllbGQoKSk7XG5cbiAgICAgIGV4cGVjdChvYnNlcnZlcnNbMF0ub3B0aW9ucy5hdHRyaWJ1dGVzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3RvcHMgYWZ0ZXIgdGVhcmRvd24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB1bnRyYWNrID0gdHJhY2tMb25nRGl2aXNpb24oZmllbGQoKSk7XG5cbiAgICAgIHVudHJhY2soKTtcblxuICAgICAgZXhwZWN0KG9ic2VydmVyc1swXS5kaXNjb25uZWN0ZWQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdpcyBhIG5vLW9wIHdpdGhvdXQgYSBzaGFkb3cgcm9vdCcsICgpID0+IHtcbiAgICBleHBlY3QodHJhY2tMb25nRGl2aXNpb24odW5kZWZpbmVkKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIGV4cGVjdCh0cmFja0xvbmdEaXZpc2lvbihkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxRQUFBLEdBQUFDLE9BQUE7QUFBMEYsU0FBQUMsUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFBLElBQUFZLFNBQUEsQ0FBQVosQ0FBQSxRQUFBQSxDQUFBLE9BQUFGLE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLE9BQUFhLE9BQUEsV0FBQWQsQ0FBQSxRQUFBZSxnQkFBQSxhQUFBaEIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsQ0FBQUQsQ0FBQSxTQUFBRSxNQUFBLENB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
|