@pie-lib/editable-html-tip-tap 1.0.4 → 1.0.6

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 (111) hide show
  1. package/lib/components/MenuBar.js +7 -7
  2. package/lib/constants.js +2 -5
  3. package/package.json +1 -1
  4. package/src/components/MenuBar.jsx +1 -1
  5. package/src/constants.js +0 -2
  6. package/lib/__tests__/editor.test.js +0 -470
  7. package/lib/__tests__/serialization.test.js +0 -246
  8. package/lib/block-tags.js +0 -25
  9. package/lib/components/CharacterPicker.js.map +0 -1
  10. package/lib/components/EditableHtml.js.map +0 -1
  11. package/lib/components/MenuBar.js.map +0 -1
  12. package/lib/components/TiptapContainer.js.map +0 -1
  13. package/lib/components/buttons/done-button.js +0 -53
  14. package/lib/components/characters/characterUtils.js.map +0 -1
  15. package/lib/components/characters/custom-popper.js.map +0 -1
  16. package/lib/components/common/done-button.js.map +0 -1
  17. package/lib/components/icons/CssIcon.js.map +0 -1
  18. package/lib/components/icons/RespArea.js.map +0 -1
  19. package/lib/components/icons/TableIcons.js.map +0 -1
  20. package/lib/components/icons/TextAlign.js.map +0 -1
  21. package/lib/components/icons/index.js +0 -194
  22. package/lib/components/image/ImageToolbar.js.map +0 -1
  23. package/lib/components/image/InsertImageHandler.js.map +0 -1
  24. package/lib/components/image/alt-dialog.js +0 -2
  25. package/lib/components/media/MediaDialog.js.map +0 -1
  26. package/lib/components/media/MediaToolbar.js.map +0 -1
  27. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js.map +0 -1
  28. package/lib/components/respArea/DragInTheBlank/choice.js.map +0 -1
  29. package/lib/components/respArea/DragInTheBlank.js +0 -94
  30. package/lib/components/respArea/ExplicitConstructedResponse.js.map +0 -1
  31. package/lib/components/respArea/InlineDropdown.js.map +0 -1
  32. package/lib/components/respArea/ToolbarIcon.js.map +0 -1
  33. package/lib/components/respArea/choice.js +0 -2
  34. package/lib/constants.js.map +0 -1
  35. package/lib/editor.js +0 -1356
  36. package/lib/extensions/MediaView.js +0 -112
  37. package/lib/extensions/characters.js +0 -65
  38. package/lib/extensions/component.js.map +0 -1
  39. package/lib/extensions/css.js.map +0 -1
  40. package/lib/extensions/custom-toolbar-wrapper.js.map +0 -1
  41. package/lib/extensions/extended-table.js.map +0 -1
  42. package/lib/extensions/image.js.map +0 -1
  43. package/lib/extensions/index.js.map +0 -1
  44. package/lib/extensions/math.js.map +0 -1
  45. package/lib/extensions/media.js.map +0 -1
  46. package/lib/extensions/responseArea.js.map +0 -1
  47. package/lib/index.js.map +0 -1
  48. package/lib/old-index.js +0 -269
  49. package/lib/parse-html.js +0 -16
  50. package/lib/plugins/characters/custom-popper.js +0 -73
  51. package/lib/plugins/characters/index.js +0 -305
  52. package/lib/plugins/characters/utils.js +0 -381
  53. package/lib/plugins/css/icons/index.js +0 -37
  54. package/lib/plugins/css/index.js +0 -390
  55. package/lib/plugins/customPlugin/index.js +0 -114
  56. package/lib/plugins/html/icons/index.js +0 -38
  57. package/lib/plugins/html/index.js +0 -81
  58. package/lib/plugins/image/__tests__/component.test.js +0 -51
  59. package/lib/plugins/image/__tests__/image-toolbar-logic.test.js +0 -56
  60. package/lib/plugins/image/__tests__/image-toolbar.test.js +0 -26
  61. package/lib/plugins/image/__tests__/index.test.js +0 -98
  62. package/lib/plugins/image/__tests__/insert-image-handler.test.js +0 -125
  63. package/lib/plugins/image/__tests__/mock-change.js +0 -25
  64. package/lib/plugins/image/alt-dialog.js +0 -129
  65. package/lib/plugins/image/component.js +0 -419
  66. package/lib/plugins/image/image-toolbar.js +0 -177
  67. package/lib/plugins/image/index.js +0 -263
  68. package/lib/plugins/image/insert-image-handler.js +0 -117
  69. package/lib/plugins/index.js +0 -341
  70. package/lib/plugins/list/__tests__/index.test.js +0 -79
  71. package/lib/plugins/list/index.js +0 -334
  72. package/lib/plugins/math/__tests__/index.test.js +0 -300
  73. package/lib/plugins/math/index.js +0 -454
  74. package/lib/plugins/media/__tests__/index.test.js +0 -71
  75. package/lib/plugins/media/index.js +0 -387
  76. package/lib/plugins/media/media-dialog.js +0 -709
  77. package/lib/plugins/media/media-toolbar.js +0 -101
  78. package/lib/plugins/media/media-wrapper.js +0 -93
  79. package/lib/plugins/rendering/index.js +0 -46
  80. package/lib/plugins/respArea/drag-in-the-blank/choice.js +0 -289
  81. package/lib/plugins/respArea/drag-in-the-blank/index.js +0 -94
  82. package/lib/plugins/respArea/explicit-constructed-response/index.js +0 -120
  83. package/lib/plugins/respArea/icons/index.js +0 -95
  84. package/lib/plugins/respArea/index.js +0 -341
  85. package/lib/plugins/respArea/inline-dropdown/index.js +0 -126
  86. package/lib/plugins/respArea/math-templated/index.js +0 -130
  87. package/lib/plugins/respArea/utils.js +0 -125
  88. package/lib/plugins/table/CustomTablePlugin.js +0 -133
  89. package/lib/plugins/table/__tests__/index.test.js +0 -442
  90. package/lib/plugins/table/__tests__/table-toolbar.test.js +0 -54
  91. package/lib/plugins/table/icons/index.js +0 -69
  92. package/lib/plugins/table/index.js +0 -483
  93. package/lib/plugins/table/table-toolbar.js +0 -187
  94. package/lib/plugins/textAlign/icons/index.js +0 -194
  95. package/lib/plugins/textAlign/index.js +0 -34
  96. package/lib/plugins/toolbar/__tests__/default-toolbar.test.js +0 -128
  97. package/lib/plugins/toolbar/__tests__/editor-and-toolbar.test.js +0 -51
  98. package/lib/plugins/toolbar/__tests__/toolbar-buttons.test.js +0 -54
  99. package/lib/plugins/toolbar/__tests__/toolbar.test.js +0 -120
  100. package/lib/plugins/toolbar/default-toolbar.js +0 -229
  101. package/lib/plugins/toolbar/done-button.js +0 -53
  102. package/lib/plugins/toolbar/editor-and-toolbar.js +0 -286
  103. package/lib/plugins/toolbar/index.js +0 -34
  104. package/lib/plugins/toolbar/toolbar-buttons.js +0 -194
  105. package/lib/plugins/toolbar/toolbar.js +0 -376
  106. package/lib/plugins/utils.js +0 -62
  107. package/lib/serialization.js +0 -677
  108. package/lib/shared/alert-dialog.js +0 -75
  109. package/lib/styles/editorContainerStyles.js.map +0 -1
  110. package/lib/theme.js.map +0 -1
  111. package/lib/utils/size.js.map +0 -1
@@ -1,300 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- var _typeof = require("@babel/runtime/helpers/typeof");
6
-
7
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
8
-
9
- var _react = _interopRequireDefault(require("react"));
10
-
11
- var _debug = _interopRequireDefault(require("debug"));
12
-
13
- var _mockChange = _interopRequireDefault(require("../../image/__tests__/mock-change"));
14
-
15
- var _slate = require("slate");
16
-
17
- var _index = _interopRequireWildcard(require("../index"));
18
-
19
- var _enzyme = require("enzyme");
20
-
21
- var _mathToolbar = require("@pie-lib/math-toolbar");
22
-
23
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
24
-
25
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
26
-
27
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
28
-
29
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
30
-
31
- jest.mock('@pie-framework/mathquill', function () {
32
- return {
33
- StaticMath: jest.fn(),
34
- getInterface: jest.fn().mockReturnThis(),
35
- registerEmbed: jest.fn()
36
- };
37
- });
38
- jest.mock('@pie-lib/math-toolbar', function () {
39
- return {
40
- MathPreview: function MathPreview() {
41
- return /*#__PURE__*/_react["default"].createElement("div", null);
42
- },
43
- MathToolbar: function MathToolbar() {
44
- return /*#__PURE__*/_react["default"].createElement("div", null);
45
- }
46
- };
47
- });
48
- jest.mock('@pie-lib/math-rendering', function () {
49
- return _objectSpread(_objectSpread({}, jest.requireActual('@pie-lib/math-rendering')), {}, {
50
- mmlToLatex: jest.fn(function () {
51
- return '/foobar/latex';
52
- })
53
- });
54
- });
55
- var log = (0, _debug["default"])('@pie-lib:editable-html:test:math'); // I believe @andrei is moving this stuff out.
56
-
57
- describe('MathPlugin', function () {
58
- describe('toolbar', function () {
59
- describe('onClick', function () {
60
- var plugin, mockChange, value, onChange;
61
- beforeEach(function () {
62
- plugin = (0, _index["default"])({});
63
- mockChange = new _mockChange["default"]();
64
- value = {
65
- change: jest.fn(function () {
66
- return mockChange;
67
- })
68
- };
69
- onChange = jest.fn();
70
- plugin.toolbar.onClick(value, onChange);
71
- });
72
- test('calls insertInline', function () {
73
- expect(mockChange.insertInline).toBeCalledWith(expect.objectContaining({
74
- data: (0, _index.inlineMath)().data
75
- }));
76
- });
77
- test('it calls onChange', function () {
78
- expect(onChange).toHaveBeenCalledWith(mockChange);
79
- });
80
- });
81
- });
82
- describe('renderNode', function () {
83
- test('the component has props', function () {
84
- var plugin = (0, _index["default"])({});
85
-
86
- var _plugin$renderNode = plugin.renderNode({
87
- node: {
88
- type: 'math'
89
- }
90
- }),
91
- props = _plugin$renderNode.props;
92
-
93
- expect(props.node).toEqual({
94
- type: 'math'
95
- });
96
- });
97
- });
98
- describe('serialization', function () {
99
- describe('deserialize', function () {
100
- var assertDeserialize = function assertDeserialize(html, expected, wrapType) {
101
- it("innerHTML: ".concat(html, " is deserialized to: ").concat(expected, " with wrapType: ").concat(wrapType), function () {
102
- var el = {
103
- tagName: 'span',
104
- childNodes: [],
105
- getAttribute: jest.fn(function () {
106
- return '';
107
- }),
108
- hasAttribute: jest.fn(function () {
109
- return true;
110
- }),
111
- innerHTML: html
112
- };
113
- var next = jest.fn();
114
-
115
- var out = _index.serialization.deserialize(el, next);
116
-
117
- expect(out).toEqual({
118
- object: 'inline',
119
- type: 'math',
120
- isVoid: true,
121
- nodes: [],
122
- data: {
123
- latex: expected,
124
- wrapper: wrapType
125
- }
126
- });
127
- });
128
- };
129
-
130
- assertDeserialize('$$&lt;$$', '<', _index["default"].DOLLAR);
131
- assertDeserialize('$&lt;$', '<', _index["default"].DOLLAR);
132
- assertDeserialize('\\(&lt;\\)', '<', _index["default"].ROUND_BRACKETS);
133
- assertDeserialize('\\[&lt;\\]', '<', _index["default"].ROUND_BRACKETS);
134
- assertDeserialize('latex', 'latex', _index["default"].ROUND_BRACKETS);
135
- assertDeserialize('\\displaystyle foo', 'foo', _index["default"].ROUND_BRACKETS);
136
- it('should make mathml editable if MathPlugin.mathMlOptions.mmlEditing is true', function () {
137
- _index["default"].mathMlOptions.mmlEditing = true;
138
- var el = {
139
- tagName: 'math',
140
- outerHTML: '<math xmlns="http://www.w3.org/1998/Math/MathML"> <mn>2</mn> <mi>x</mi> <mtext>&#xA0;</mtext> <mo>&#x2264;</mo> <mn>4</mn> <mi>y</mi> <mtext>&#xA0;</mtext> <mo>+</mo> <mtext>&#xA0;</mtext> <mn>8</mn> <msqrt> <mi>h</mi> </msqrt></math>'
141
- };
142
- var next = jest.fn();
143
-
144
- var out = _index.serialization.deserialize(el, next);
145
-
146
- expect(out).toEqual({
147
- object: 'inline',
148
- type: 'math',
149
- isVoid: true,
150
- nodes: [],
151
- data: {
152
- latex: '/foobar/latex',
153
- wrapper: 'round_brackets'
154
- }
155
- });
156
- });
157
- it('should make mathml readOnly if MathPlugin.mathMlOptions.mmlEditing is false', function () {
158
- _index["default"].mathMlOptions.mmlEditing = false;
159
- var el = {
160
- tagName: 'math',
161
- outerHTML: '<math xmlns="http://www.w3.org/1998/Math/MathML"> <mn>2</mn> <mi>x</mi> <mtext>&#xA0;</mtext> <mo>&#x2264;</mo> <mn>4</mn> <mi>y</mi> <mtext>&#xA0;</mtext> <mo>+</mo> <mtext>&#xA0;</mtext> <mn>8</mn> <msqrt> <mi>h</mi> </msqrt></math>'
162
- };
163
- var next = jest.fn();
164
-
165
- var out = _index.serialization.deserialize(el, next);
166
-
167
- expect(out).toEqual({
168
- object: 'inline',
169
- isVoid: true,
170
- type: 'mathml',
171
- data: {
172
- html: el.outerHTML
173
- }
174
- });
175
- });
176
- });
177
- describe('serialize', function () {
178
- var assertSerialize = function assertSerialize(latex, expectedHtml, wrapper) {
179
- wrapper = wrapper || _index["default"].ROUND_BRACKETS;
180
- it("".concat(latex, " is serialized to: ").concat(expectedHtml), function () {
181
- var object = {
182
- kind: 'inline',
183
- type: 'math',
184
- isVoid: true,
185
- nodes: [],
186
- data: _slate.Data.create({
187
- latex: latex,
188
- wrapper: wrapper
189
- })
190
- };
191
- var children = [];
192
-
193
- var out = _index.serialization.serialize(object, children);
194
-
195
- log('out: ', out);
196
- expect(out).toEqual( /*#__PURE__*/_react["default"].createElement("span", {
197
- "data-latex": "",
198
- "data-raw": latex
199
- }, expectedHtml));
200
- });
201
- };
202
-
203
- assertSerialize('latex', '\\(latex\\)', _index["default"].ROUND_BRACKETS);
204
- assertSerialize('latex', '\\(latex\\)', _index["default"].SQUARE_BRACKETS);
205
- assertSerialize('latex', '$latex$', _index["default"].DOLLAR);
206
- assertSerialize('latex', '$latex$', _index["default"].DOUBLE_DOLLAR);
207
- /**
208
- * Note that when this is converted to html it get's escaped - but that's an issue with the slate html-serializer.
209
- */
210
-
211
- assertSerialize('<', '\\(<\\)');
212
- assertSerialize('x<y', '\\(x<y\\)');
213
- });
214
- });
215
- });
216
- describe('CustomToolbarComp', function () {
217
- var onDataChange;
218
- var onToolbarDone;
219
-
220
- var wrapper = function wrapper(extras) {
221
- var mockChange = new _mockChange["default"]();
222
- var defaults = {
223
- node: {
224
- key: '1',
225
- data: _slate.Data.create({
226
- latex: 'foo'
227
- }),
228
- equals: function equals() {
229
- return true;
230
- }
231
- },
232
- value: {
233
- document: {
234
- getNextText: jest.fn().mockReturnValue({
235
- key: 'nt'
236
- })
237
- },
238
- change: jest.fn().mockReturnValue(mockChange)
239
- },
240
- onDataChange: onDataChange,
241
- onToolbarDone: onToolbarDone
242
- };
243
-
244
- var props = _objectSpread(_objectSpread({}, defaults), extras);
245
-
246
- return (0, _enzyme.shallow)( /*#__PURE__*/_react["default"].createElement(_index.CustomToolbarComp, props));
247
- };
248
-
249
- describe('render', function () {
250
- it('renders without default keypadMode', function () {
251
- var w = wrapper();
252
- expect(w).toMatchSnapshot();
253
- w.setProps({
254
- pluginProps: {
255
- math: {
256
- keypadMode: 3
257
- }
258
- }
259
- });
260
- expect(w).toMatchSnapshot();
261
- });
262
- it('renders with default keypadMode', function () {
263
- var w = wrapper({
264
- pluginProps: {
265
- math: {
266
- keypadMode: 'geometry'
267
- }
268
- }
269
- });
270
- expect(w).toMatchSnapshot();
271
- w.setProps({
272
- pluginProps: {
273
- math: {
274
- keypadMode: 3
275
- }
276
- }
277
- });
278
- expect(w).toMatchSnapshot();
279
- });
280
- });
281
- describe('onDone', function () {
282
- it('calls onToolbarDone', function () {
283
- onToolbarDone = jest.fn();
284
- var w = wrapper();
285
- w.find(_mathToolbar.MathToolbar).prop('onDone')('oo');
286
- expect(onToolbarDone).toHaveBeenCalledWith(expect.anything(), false);
287
- });
288
- });
289
- describe('onChange', function () {
290
- it('calls onDataChange', function () {
291
- onDataChange = jest.fn();
292
- var w = wrapper();
293
- w.find(_mathToolbar.MathToolbar).prop('onChange')('oo');
294
- expect(onDataChange).toHaveBeenCalledWith('1', {
295
- latex: 'oo'
296
- });
297
- });
298
- });
299
- });
300
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbHVnaW5zL21hdGgvX190ZXN0c19fL2luZGV4LnRlc3QuanN4Il0sIm5hbWVzIjpbImplc3QiLCJtb2NrIiwiU3RhdGljTWF0aCIsImZuIiwiZ2V0SW50ZXJmYWNlIiwibW9ja1JldHVyblRoaXMiLCJyZWdpc3RlckVtYmVkIiwiTWF0aFByZXZpZXciLCJNYXRoVG9vbGJhciIsInJlcXVpcmVBY3R1YWwiLCJtbWxUb0xhdGV4IiwibG9nIiwiZGVzY3JpYmUiLCJwbHVnaW4iLCJtb2NrQ2hhbmdlIiwidmFsdWUiLCJvbkNoYW5nZSIsImJlZm9yZUVhY2giLCJNb2NrQ2hhbmdlIiwiY2hhbmdlIiwidG9vbGJhciIsIm9uQ2xpY2siLCJ0ZXN0IiwiZXhwZWN0IiwiaW5zZXJ0SW5saW5lIiwidG9CZUNhbGxlZFdpdGgiLCJvYmplY3RDb250YWluaW5nIiwiZGF0YSIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwicmVuZGVyTm9kZSIsIm5vZGUiLCJ0eXBlIiwicHJvcHMiLCJ0b0VxdWFsIiwiYXNzZXJ0RGVzZXJpYWxpemUiLCJodG1sIiwiZXhwZWN0ZWQiLCJ3cmFwVHlwZSIsIml0IiwiZWwiLCJ0YWdOYW1lIiwiY2hpbGROb2RlcyIsImdldEF0dHJpYnV0ZSIsImhhc0F0dHJpYnV0ZSIsImlubmVySFRNTCIsIm5leHQiLCJvdXQiLCJzZXJpYWxpemF0aW9uIiwiZGVzZXJpYWxpemUiLCJvYmplY3QiLCJpc1ZvaWQiLCJub2RlcyIsImxhdGV4Iiwid3JhcHBlciIsIk1hdGhQbHVnaW4iLCJET0xMQVIiLCJST1VORF9CUkFDS0VUUyIsIm1hdGhNbE9wdGlvbnMiLCJtbWxFZGl0aW5nIiwib3V0ZXJIVE1MIiwiYXNzZXJ0U2VyaWFsaXplIiwiZXhwZWN0ZWRIdG1sIiwia2luZCIsIkRhdGEiLCJjcmVhdGUiLCJjaGlsZHJlbiIsInNlcmlhbGl6ZSIsIlNRVUFSRV9CUkFDS0VUUyIsIkRPVUJMRV9ET0xMQVIiLCJvbkRhdGFDaGFuZ2UiLCJvblRvb2xiYXJEb25lIiwiZXh0cmFzIiwiZGVmYXVsdHMiLCJrZXkiLCJlcXVhbHMiLCJkb2N1bWVudCIsImdldE5leHRUZXh0IiwibW9ja1JldHVyblZhbHVlIiwidyIsInRvTWF0Y2hTbmFwc2hvdCIsInNldFByb3BzIiwicGx1Z2luUHJvcHMiLCJtYXRoIiwia2V5cGFkTW9kZSIsImZpbmQiLCJwcm9wIiwiYW55dGhpbmciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7QUFDQUEsSUFBSSxDQUFDQyxJQUFMLENBQVUsMEJBQVYsRUFBc0M7QUFBQSxTQUFPO0FBQzNDQyxJQUFBQSxVQUFVLEVBQUVGLElBQUksQ0FBQ0csRUFBTCxFQUQrQjtBQUUzQ0MsSUFBQUEsWUFBWSxFQUFFSixJQUFJLENBQUNHLEVBQUwsR0FBVUUsY0FBVixFQUY2QjtBQUczQ0MsSUFBQUEsYUFBYSxFQUFFTixJQUFJLENBQUNHLEVBQUw7QUFINEIsR0FBUDtBQUFBLENBQXRDO0FBTUFILElBQUksQ0FBQ0MsSUFBTCxDQUFVLHVCQUFWLEVBQW1DO0FBQUEsU0FBTztBQUN4Q00sSUFBQUEsV0FBVyxFQUFFO0FBQUEsMEJBQU0sNENBQU47QUFBQSxLQUQyQjtBQUV4Q0MsSUFBQUEsV0FBVyxFQUFFO0FBQUEsMEJBQU0sNENBQU47QUFBQTtBQUYyQixHQUFQO0FBQUEsQ0FBbkM7QUFLQVIsSUFBSSxDQUFDQyxJQUFMLENBQVUseUJBQVYsRUFBcUM7QUFBQSx5Q0FDaENELElBQUksQ0FBQ1MsYUFBTCxDQUFtQix5QkFBbkIsQ0FEZ0M7QUFFbkNDLElBQUFBLFVBQVUsRUFBRVYsSUFBSSxDQUFDRyxFQUFMLENBQVEsWUFBTTtBQUN4QixhQUFPLGVBQVA7QUFDRCxLQUZXO0FBRnVCO0FBQUEsQ0FBckM7QUFNQSxJQUFNUSxHQUFHLEdBQUcsdUJBQU0sa0NBQU4sQ0FBWixDLENBRUE7O0FBQ0FDLFFBQVEsQ0FBQyxZQUFELEVBQWUsWUFBTTtBQUMzQkEsRUFBQUEsUUFBUSxDQUFDLFNBQUQsRUFBWSxZQUFNO0FBQ3hCQSxJQUFBQSxRQUFRLENBQUMsU0FBRCxFQUFZLFlBQU07QUFDeEIsVUFBSUMsTUFBSixFQUFZQyxVQUFaLEVBQXdCQyxLQUF4QixFQUErQkMsUUFBL0I7QUFDQUMsTUFBQUEsVUFBVSxDQUFDLFlBQU07QUFDZkosUUFBQUEsTUFBTSxHQUFHLHVCQUFXLEVBQVgsQ0FBVDtBQUNBQyxRQUFBQSxVQUFVLEdBQUcsSUFBSUksc0JBQUosRUFBYjtBQUNBSCxRQUFBQSxLQUFLLEdBQUc7QUFDTkksVUFBQUEsTUFBTSxFQUFFbkIsSUFBSSxDQUFDRyxFQUFMLENBQVE7QUFBQSxtQkFBTVcsVUFBTjtBQUFBLFdBQVI7QUFERixTQUFSO0FBR0FFLFFBQUFBLFFBQVEsR0FBR2hCLElBQUksQ0FBQ0csRUFBTCxFQUFYO0FBQ0FVLFFBQUFBLE1BQU0sQ0FBQ08sT0FBUCxDQUFlQyxPQUFmLENBQXVCTixLQUF2QixFQUE4QkMsUUFBOUI7QUFDRCxPQVJTLENBQVY7QUFVQU0sTUFBQUEsSUFBSSxDQUFDLG9CQUFELEVBQXVCLFlBQU07QUFDL0JDLFFBQUFBLE1BQU0sQ0FBQ1QsVUFBVSxDQUFDVSxZQUFaLENBQU4sQ0FBZ0NDLGNBQWhDLENBQStDRixNQUFNLENBQUNHLGdCQUFQLENBQXdCO0FBQUVDLFVBQUFBLElBQUksRUFBRSx5QkFBYUE7QUFBckIsU0FBeEIsQ0FBL0M7QUFDRCxPQUZHLENBQUo7QUFJQUwsTUFBQUEsSUFBSSxDQUFDLG1CQUFELEVBQXNCLFlBQU07QUFDOUJDLFFBQUFBLE1BQU0sQ0FBQ1AsUUFBRCxDQUFOLENBQWlCWSxvQkFBakIsQ0FBc0NkLFVBQXRDO0FBQ0QsT0FGRyxDQUFKO0FBR0QsS0FuQk8sQ0FBUjtBQW9CRCxHQXJCTyxDQUFSO0FBdUJBRixFQUFBQSxRQUFRLENBQUMsWUFBRCxFQUFlLFlBQU07QUFDM0JVLElBQUFBLElBQUksQ0FBQyx5QkFBRCxFQUE0QixZQUFNO0FBQ3BDLFVBQU1ULE1BQU0sR0FBRyx1QkFBVyxFQUFYLENBQWY7O0FBQ0EsK0JBQWtCQSxNQUFNLENBQUNnQixVQUFQLENBQWtCO0FBQUVDLFFBQUFBLElBQUksRUFBRTtBQUFFQyxVQUFBQSxJQUFJLEVBQUU7QUFBUjtBQUFSLE9BQWxCLENBQWxCO0FBQUEsVUFBUUMsS0FBUixzQkFBUUEsS0FBUjs7QUFDQVQsTUFBQUEsTUFBTSxDQUFDUyxLQUFLLENBQUNGLElBQVAsQ0FBTixDQUFtQkcsT0FBbkIsQ0FBMkI7QUFBRUYsUUFBQUEsSUFBSSxFQUFFO0FBQVIsT0FBM0I7QUFDRCxLQUpHLENBQUo7QUFLRCxHQU5PLENBQVI7QUFRQW5CLEVBQUFBLFFBQVEsQ0FBQyxlQUFELEVBQWtCLFlBQU07QUFDOUJBLElBQUFBLFFBQVEsQ0FBQyxhQUFELEVBQWdCLFlBQU07QUFDNUIsVUFBTXNCLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBb0IsQ0FBQ0MsSUFBRCxFQUFPQyxRQUFQLEVBQWlCQyxRQUFqQixFQUE4QjtBQUN0REMsUUFBQUEsRUFBRSxzQkFBZUgsSUFBZixrQ0FBMkNDLFFBQTNDLDZCQUFzRUMsUUFBdEUsR0FBa0YsWUFBTTtBQUN4RixjQUFNRSxFQUFFLEdBQUc7QUFDVEMsWUFBQUEsT0FBTyxFQUFFLE1BREE7QUFFVEMsWUFBQUEsVUFBVSxFQUFFLEVBRkg7QUFHVEMsWUFBQUEsWUFBWSxFQUFFMUMsSUFBSSxDQUFDRyxFQUFMLENBQVE7QUFBQSxxQkFBTSxFQUFOO0FBQUEsYUFBUixDQUhMO0FBSVR3QyxZQUFBQSxZQUFZLEVBQUUzQyxJQUFJLENBQUNHLEVBQUwsQ0FBUTtBQUFBLHFCQUFNLElBQU47QUFBQSxhQUFSLENBSkw7QUFLVHlDLFlBQUFBLFNBQVMsRUFBRVQ7QUFMRixXQUFYO0FBT0EsY0FBTVUsSUFBSSxHQUFHN0MsSUFBSSxDQUFDRyxFQUFMLEVBQWI7O0FBRUEsY0FBTTJDLEdBQUcsR0FBR0MscUJBQWNDLFdBQWQsQ0FBMEJULEVBQTFCLEVBQThCTSxJQUE5QixDQUFaOztBQUNBdEIsVUFBQUEsTUFBTSxDQUFDdUIsR0FBRCxDQUFOLENBQVliLE9BQVosQ0FBb0I7QUFDbEJnQixZQUFBQSxNQUFNLEVBQUUsUUFEVTtBQUVsQmxCLFlBQUFBLElBQUksRUFBRSxNQUZZO0FBR2xCbUIsWUFBQUEsTUFBTSxFQUFFLElBSFU7QUFJbEJDLFlBQUFBLEtBQUssRUFBRSxFQUpXO0FBS2xCeEIsWUFBQUEsSUFBSSxFQUFFO0FBQ0p5QixjQUFBQSxLQUFLLEVBQUVoQixRQURIO0FBRUppQixjQUFBQSxPQUFPLEVBQUVoQjtBQUZMO0FBTFksV0FBcEI7QUFVRCxTQXJCQyxDQUFGO0FBc0JELE9BdkJEOztBQXlCQUgsTUFBQUEsaUJBQWlCLENBQUMsVUFBRCxFQUFhLEdBQWIsRUFBa0JvQixrQkFBV0MsTUFBN0IsQ0FBakI7QUFDQXJCLE1BQUFBLGlCQUFpQixDQUFDLFFBQUQsRUFBVyxHQUFYLEVBQWdCb0Isa0JBQVdDLE1BQTNCLENBQWpCO0FBQ0FyQixNQUFBQSxpQkFBaUIsQ0FBQyxZQUFELEVBQWUsR0FBZixFQUFvQm9CLGtCQUFXRSxjQUEvQixDQUFqQjtBQUNBdEIsTUFBQUEsaUJBQWlCLENBQUMsWUFBRCxFQUFlLEdBQWYsRUFBb0JvQixrQkFBV0UsY0FBL0IsQ0FBakI7QUFDQXRCLE1BQUFBLGlCQUFpQixDQUFDLE9BQUQsRUFBVSxPQUFWLEVBQW1Cb0Isa0JBQVdFLGNBQTlCLENBQWpCO0FBQ0F0QixNQUFBQSxpQkFBaUIsQ0FBQyxvQkFBRCxFQUF1QixLQUF2QixFQUE4Qm9CLGtCQUFXRSxjQUF6QyxDQUFqQjtBQUVBbEIsTUFBQUEsRUFBRSxDQUFDLDRFQUFELEVBQStFLFlBQU07QUFDckZnQiwwQkFBV0csYUFBWCxDQUF5QkMsVUFBekIsR0FBc0MsSUFBdEM7QUFDQSxZQUFNbkIsRUFBRSxHQUFHO0FBQ1RDLFVBQUFBLE9BQU8sRUFBRSxNQURBO0FBRVRtQixVQUFBQSxTQUFTLEVBQ1A7QUFITyxTQUFYO0FBS0EsWUFBTWQsSUFBSSxHQUFHN0MsSUFBSSxDQUFDRyxFQUFMLEVBQWI7O0FBRUEsWUFBTTJDLEdBQUcsR0FBR0MscUJBQWNDLFdBQWQsQ0FBMEJULEVBQTFCLEVBQThCTSxJQUE5QixDQUFaOztBQUVBdEIsUUFBQUEsTUFBTSxDQUFDdUIsR0FBRCxDQUFOLENBQVliLE9BQVosQ0FBb0I7QUFDbEJnQixVQUFBQSxNQUFNLEVBQUUsUUFEVTtBQUVsQmxCLFVBQUFBLElBQUksRUFBRSxNQUZZO0FBR2xCbUIsVUFBQUEsTUFBTSxFQUFFLElBSFU7QUFJbEJDLFVBQUFBLEtBQUssRUFBRSxFQUpXO0FBS2xCeEIsVUFBQUEsSUFBSSxFQUFFO0FBQ0p5QixZQUFBQSxLQUFLLEVBQUUsZUFESDtBQUVKQyxZQUFBQSxPQUFPLEVBQUU7QUFGTDtBQUxZLFNBQXBCO0FBVUQsT0FyQkMsQ0FBRjtBQXVCQWYsTUFBQUEsRUFBRSxDQUFDLDZFQUFELEVBQWdGLFlBQU07QUFDdEZnQiwwQkFBV0csYUFBWCxDQUF5QkMsVUFBekIsR0FBc0MsS0FBdEM7QUFDQSxZQUFNbkIsRUFBRSxHQUFHO0FBQ1RDLFVBQUFBLE9BQU8sRUFBRSxNQURBO0FBRVRtQixVQUFBQSxTQUFTLEVBQ1A7QUFITyxTQUFYO0FBS0EsWUFBTWQsSUFBSSxHQUFHN0MsSUFBSSxDQUFDRyxFQUFMLEVBQWI7O0FBRUEsWUFBTTJDLEdBQUcsR0FBR0MscUJBQWNDLFdBQWQsQ0FBMEJULEVBQTFCLEVBQThCTSxJQUE5QixDQUFaOztBQUVBdEIsUUFBQUEsTUFBTSxDQUFDdUIsR0FBRCxDQUFOLENBQVliLE9BQVosQ0FBb0I7QUFDbEJnQixVQUFBQSxNQUFNLEVBQUUsUUFEVTtBQUVsQkMsVUFBQUEsTUFBTSxFQUFFLElBRlU7QUFHbEJuQixVQUFBQSxJQUFJLEVBQUUsUUFIWTtBQUlsQkosVUFBQUEsSUFBSSxFQUFFO0FBQ0pRLFlBQUFBLElBQUksRUFBRUksRUFBRSxDQUFDb0I7QUFETDtBQUpZLFNBQXBCO0FBUUQsT0FuQkMsQ0FBRjtBQW9CRCxLQTVFTyxDQUFSO0FBOEVBL0MsSUFBQUEsUUFBUSxDQUFDLFdBQUQsRUFBYyxZQUFNO0FBQzFCLFVBQU1nRCxlQUFlLEdBQUcsU0FBbEJBLGVBQWtCLENBQUNSLEtBQUQsRUFBUVMsWUFBUixFQUFzQlIsT0FBdEIsRUFBa0M7QUFDeERBLFFBQUFBLE9BQU8sR0FBR0EsT0FBTyxJQUFJQyxrQkFBV0UsY0FBaEM7QUFDQWxCLFFBQUFBLEVBQUUsV0FBSWMsS0FBSixnQ0FBK0JTLFlBQS9CLEdBQStDLFlBQU07QUFDckQsY0FBTVosTUFBTSxHQUFHO0FBQ2JhLFlBQUFBLElBQUksRUFBRSxRQURPO0FBRWIvQixZQUFBQSxJQUFJLEVBQUUsTUFGTztBQUdibUIsWUFBQUEsTUFBTSxFQUFFLElBSEs7QUFJYkMsWUFBQUEsS0FBSyxFQUFFLEVBSk07QUFLYnhCLFlBQUFBLElBQUksRUFBRW9DLFlBQUtDLE1BQUwsQ0FBWTtBQUFFWixjQUFBQSxLQUFLLEVBQUxBLEtBQUY7QUFBU0MsY0FBQUEsT0FBTyxFQUFQQTtBQUFULGFBQVo7QUFMTyxXQUFmO0FBT0EsY0FBTVksUUFBUSxHQUFHLEVBQWpCOztBQUVBLGNBQU1uQixHQUFHLEdBQUdDLHFCQUFjbUIsU0FBZCxDQUF3QmpCLE1BQXhCLEVBQWdDZ0IsUUFBaEMsQ0FBWjs7QUFDQXRELFVBQUFBLEdBQUcsQ0FBQyxPQUFELEVBQVVtQyxHQUFWLENBQUg7QUFDQXZCLFVBQUFBLE1BQU0sQ0FBQ3VCLEdBQUQsQ0FBTixDQUFZYixPQUFaLGVBQ0U7QUFBTSwwQkFBVyxFQUFqQjtBQUFvQix3QkFBVW1CO0FBQTlCLGFBQ0dTLFlBREgsQ0FERjtBQUtELFNBakJDLENBQUY7QUFrQkQsT0FwQkQ7O0FBc0JBRCxNQUFBQSxlQUFlLENBQUMsT0FBRCxFQUFVLGFBQVYsRUFBeUJOLGtCQUFXRSxjQUFwQyxDQUFmO0FBQ0FJLE1BQUFBLGVBQWUsQ0FBQyxPQUFELEVBQVUsYUFBVixFQUF5Qk4sa0JBQVdhLGVBQXBDLENBQWY7QUFDQVAsTUFBQUEsZUFBZSxDQUFDLE9BQUQsRUFBVSxTQUFWLEVBQXFCTixrQkFBV0MsTUFBaEMsQ0FBZjtBQUNBSyxNQUFBQSxlQUFlLENBQUMsT0FBRCxFQUFVLFNBQVYsRUFBcUJOLGtCQUFXYyxhQUFoQyxDQUFmO0FBRUE7QUFDTjtBQUNBOztBQUNNUixNQUFBQSxlQUFlLENBQUMsR0FBRCxFQUFNLFNBQU4sQ0FBZjtBQUNBQSxNQUFBQSxlQUFlLENBQUMsS0FBRCxFQUFRLFdBQVIsQ0FBZjtBQUNELEtBakNPLENBQVI7QUFrQ0QsR0FqSE8sQ0FBUjtBQWtIRCxDQWxKTyxDQUFSO0FBb0pBaEQsUUFBUSxDQUFDLG1CQUFELEVBQXNCLFlBQU07QUFDbEMsTUFBSXlELFlBQUo7QUFDQSxNQUFJQyxhQUFKOztBQUVBLE1BQU1qQixPQUFPLEdBQUcsU0FBVkEsT0FBVSxDQUFDa0IsTUFBRCxFQUFZO0FBQzFCLFFBQUl6RCxVQUFVLEdBQUcsSUFBSUksc0JBQUosRUFBakI7QUFDQSxRQUFNc0QsUUFBUSxHQUFHO0FBQ2YxQyxNQUFBQSxJQUFJLEVBQUU7QUFDSjJDLFFBQUFBLEdBQUcsRUFBRSxHQUREO0FBRUo5QyxRQUFBQSxJQUFJLEVBQUVvQyxZQUFLQyxNQUFMLENBQVk7QUFBRVosVUFBQUEsS0FBSyxFQUFFO0FBQVQsU0FBWixDQUZGO0FBR0pzQixRQUFBQSxNQUFNLEVBQUU7QUFBQSxpQkFBTSxJQUFOO0FBQUE7QUFISixPQURTO0FBTWYzRCxNQUFBQSxLQUFLLEVBQUU7QUFDTDRELFFBQUFBLFFBQVEsRUFBRTtBQUNSQyxVQUFBQSxXQUFXLEVBQUU1RSxJQUFJLENBQUNHLEVBQUwsR0FBVTBFLGVBQVYsQ0FBMEI7QUFBRUosWUFBQUEsR0FBRyxFQUFFO0FBQVAsV0FBMUI7QUFETCxTQURMO0FBSUx0RCxRQUFBQSxNQUFNLEVBQUVuQixJQUFJLENBQUNHLEVBQUwsR0FBVTBFLGVBQVYsQ0FBMEIvRCxVQUExQjtBQUpILE9BTlE7QUFZZnVELE1BQUFBLFlBQVksRUFBWkEsWUFaZTtBQWFmQyxNQUFBQSxhQUFhLEVBQWJBO0FBYmUsS0FBakI7O0FBZ0JBLFFBQU10QyxLQUFLLG1DQUNOd0MsUUFETSxHQUVORCxNQUZNLENBQVg7O0FBS0EsV0FBTyxtQ0FBUSxnQ0FBQyx3QkFBRCxFQUF1QnZDLEtBQXZCLENBQVIsQ0FBUDtBQUNELEdBeEJEOztBQTBCQXBCLEVBQUFBLFFBQVEsQ0FBQyxRQUFELEVBQVcsWUFBTTtBQUN2QjBCLElBQUFBLEVBQUUsQ0FBQyxvQ0FBRCxFQUF1QyxZQUFNO0FBQzdDLFVBQU13QyxDQUFDLEdBQUd6QixPQUFPLEVBQWpCO0FBRUE5QixNQUFBQSxNQUFNLENBQUN1RCxDQUFELENBQU4sQ0FBVUMsZUFBVjtBQUVBRCxNQUFBQSxDQUFDLENBQUNFLFFBQUYsQ0FBVztBQUFFQyxRQUFBQSxXQUFXLEVBQUU7QUFBRUMsVUFBQUEsSUFBSSxFQUFFO0FBQUVDLFlBQUFBLFVBQVUsRUFBRTtBQUFkO0FBQVI7QUFBZixPQUFYO0FBRUE1RCxNQUFBQSxNQUFNLENBQUN1RCxDQUFELENBQU4sQ0FBVUMsZUFBVjtBQUNELEtBUkMsQ0FBRjtBQVVBekMsSUFBQUEsRUFBRSxDQUFDLGlDQUFELEVBQW9DLFlBQU07QUFDMUMsVUFBTXdDLENBQUMsR0FBR3pCLE9BQU8sQ0FBQztBQUFFNEIsUUFBQUEsV0FBVyxFQUFFO0FBQUVDLFVBQUFBLElBQUksRUFBRTtBQUFFQyxZQUFBQSxVQUFVLEVBQUU7QUFBZDtBQUFSO0FBQWYsT0FBRCxDQUFqQjtBQUVBNUQsTUFBQUEsTUFBTSxDQUFDdUQsQ0FBRCxDQUFOLENBQVVDLGVBQVY7QUFFQUQsTUFBQUEsQ0FBQyxDQUFDRSxRQUFGLENBQVc7QUFBRUMsUUFBQUEsV0FBVyxFQUFFO0FBQUVDLFVBQUFBLElBQUksRUFBRTtBQUFFQyxZQUFBQSxVQUFVLEVBQUU7QUFBZDtBQUFSO0FBQWYsT0FBWDtBQUVBNUQsTUFBQUEsTUFBTSxDQUFDdUQsQ0FBRCxDQUFOLENBQVVDLGVBQVY7QUFDRCxLQVJDLENBQUY7QUFTRCxHQXBCTyxDQUFSO0FBc0JBbkUsRUFBQUEsUUFBUSxDQUFDLFFBQUQsRUFBVyxZQUFNO0FBQ3ZCMEIsSUFBQUEsRUFBRSxDQUFDLHFCQUFELEVBQXdCLFlBQU07QUFDOUJnQyxNQUFBQSxhQUFhLEdBQUd0RSxJQUFJLENBQUNHLEVBQUwsRUFBaEI7QUFDQSxVQUFNMkUsQ0FBQyxHQUFHekIsT0FBTyxFQUFqQjtBQUNBeUIsTUFBQUEsQ0FBQyxDQUFDTSxJQUFGLENBQU81RSx3QkFBUCxFQUFvQjZFLElBQXBCLENBQXlCLFFBQXpCLEVBQW1DLElBQW5DO0FBQ0E5RCxNQUFBQSxNQUFNLENBQUMrQyxhQUFELENBQU4sQ0FBc0IxQyxvQkFBdEIsQ0FBMkNMLE1BQU0sQ0FBQytELFFBQVAsRUFBM0MsRUFBOEQsS0FBOUQ7QUFDRCxLQUxDLENBQUY7QUFNRCxHQVBPLENBQVI7QUFTQTFFLEVBQUFBLFFBQVEsQ0FBQyxVQUFELEVBQWEsWUFBTTtBQUN6QjBCLElBQUFBLEVBQUUsQ0FBQyxvQkFBRCxFQUF1QixZQUFNO0FBQzdCK0IsTUFBQUEsWUFBWSxHQUFHckUsSUFBSSxDQUFDRyxFQUFMLEVBQWY7QUFDQSxVQUFNMkUsQ0FBQyxHQUFHekIsT0FBTyxFQUFqQjtBQUNBeUIsTUFBQUEsQ0FBQyxDQUFDTSxJQUFGLENBQU81RSx3QkFBUCxFQUFvQjZFLElBQXBCLENBQXlCLFVBQXpCLEVBQXFDLElBQXJDO0FBQ0E5RCxNQUFBQSxNQUFNLENBQUM4QyxZQUFELENBQU4sQ0FBcUJ6QyxvQkFBckIsQ0FBMEMsR0FBMUMsRUFBK0M7QUFBRXdCLFFBQUFBLEtBQUssRUFBRTtBQUFULE9BQS9DO0FBQ0QsS0FMQyxDQUFGO0FBTUQsR0FQTyxDQUFSO0FBUUQsQ0FyRU8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IE1vY2tDaGFuZ2UgZnJvbSAnLi4vLi4vaW1hZ2UvX190ZXN0c19fL21vY2stY2hhbmdlJztcbmltcG9ydCB7IERhdGEgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgTWF0aFBsdWdpbiwgeyBzZXJpYWxpemF0aW9uLCBpbmxpbmVNYXRoLCBDdXN0b21Ub29sYmFyQ29tcCB9IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IHNoYWxsb3cgfSBmcm9tICdlbnp5bWUnO1xuaW1wb3J0IHsgTWF0aFRvb2xiYXIgfSBmcm9tICdAcGllLWxpYi9tYXRoLXRvb2xiYXInO1xuamVzdC5tb2NrKCdAcGllLWZyYW1ld29yay9tYXRocXVpbGwnLCAoKSA9PiAoe1xuICBTdGF0aWNNYXRoOiBqZXN0LmZuKCksXG4gIGdldEludGVyZmFjZTogamVzdC5mbigpLm1vY2tSZXR1cm5UaGlzKCksXG4gIHJlZ2lzdGVyRW1iZWQ6IGplc3QuZm4oKSxcbn0pKTtcblxuamVzdC5tb2NrKCdAcGllLWxpYi9tYXRoLXRvb2xiYXInLCAoKSA9PiAoe1xuICBNYXRoUHJldmlldzogKCkgPT4gPGRpdiAvPixcbiAgTWF0aFRvb2xiYXI6ICgpID0+IDxkaXYgLz4sXG59KSk7XG5cbmplc3QubW9jaygnQHBpZS1saWIvbWF0aC1yZW5kZXJpbmcnLCAoKSA9PiAoe1xuICAuLi5qZXN0LnJlcXVpcmVBY3R1YWwoJ0BwaWUtbGliL21hdGgtcmVuZGVyaW5nJyksXG4gIG1tbFRvTGF0ZXg6IGplc3QuZm4oKCkgPT4ge1xuICAgIHJldHVybiAnL2Zvb2Jhci9sYXRleCc7XG4gIH0pLFxufSkpO1xuY29uc3QgbG9nID0gZGVidWcoJ0BwaWUtbGliOmVkaXRhYmxlLWh0bWw6dGVzdDptYXRoJyk7XG5cbi8vIEkgYmVsaWV2ZSBAYW5kcmVpIGlzIG1vdmluZyB0aGlzIHN0dWZmIG91dC5cbmRlc2NyaWJlKCdNYXRoUGx1Z2luJywgKCkgPT4ge1xuICBkZXNjcmliZSgndG9vbGJhcicsICgpID0+IHtcbiAgICBkZXNjcmliZSgnb25DbGljaycsICgpID0+IHtcbiAgICAgIGxldCBwbHVnaW4sIG1vY2tDaGFuZ2UsIHZhbHVlLCBvbkNoYW5nZTtcbiAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBwbHVnaW4gPSBNYXRoUGx1Z2luKHt9KTtcbiAgICAgICAgbW9ja0NoYW5nZSA9IG5ldyBNb2NrQ2hhbmdlKCk7XG4gICAgICAgIHZhbHVlID0ge1xuICAgICAgICAgIGNoYW5nZTogamVzdC5mbigoKSA9PiBtb2NrQ2hhbmdlKSxcbiAgICAgICAgfTtcbiAgICAgICAgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICAgIHBsdWdpbi50b29sYmFyLm9uQ2xpY2sodmFsdWUsIG9uQ2hhbmdlKTtcbiAgICAgIH0pO1xuXG4gICAgICB0ZXN0KCdjYWxscyBpbnNlcnRJbmxpbmUnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChtb2NrQ2hhbmdlLmluc2VydElubGluZSkudG9CZUNhbGxlZFdpdGgoZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyBkYXRhOiBpbmxpbmVNYXRoKCkuZGF0YSB9KSk7XG4gICAgICB9KTtcblxuICAgICAgdGVzdCgnaXQgY2FsbHMgb25DaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgobW9ja0NoYW5nZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlbmRlck5vZGUnLCAoKSA9PiB7XG4gICAgdGVzdCgndGhlIGNvbXBvbmVudCBoYXMgcHJvcHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwbHVnaW4gPSBNYXRoUGx1Z2luKHt9KTtcbiAgICAgIGNvbnN0IHsgcHJvcHMgfSA9IHBsdWdpbi5yZW5kZXJOb2RlKHsgbm9kZTogeyB0eXBlOiAnbWF0aCcgfSB9KTtcbiAgICAgIGV4cGVjdChwcm9wcy5ub2RlKS50b0VxdWFsKHsgdHlwZTogJ21hdGgnIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2VyaWFsaXphdGlvbicsICgpID0+IHtcbiAgICBkZXNjcmliZSgnZGVzZXJpYWxpemUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhc3NlcnREZXNlcmlhbGl6ZSA9IChodG1sLCBleHBlY3RlZCwgd3JhcFR5cGUpID0+IHtcbiAgICAgICAgaXQoYGlubmVySFRNTDogJHtodG1sfSBpcyBkZXNlcmlhbGl6ZWQgdG86ICR7ZXhwZWN0ZWR9IHdpdGggd3JhcFR5cGU6ICR7d3JhcFR5cGV9YCwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVsID0ge1xuICAgICAgICAgICAgdGFnTmFtZTogJ3NwYW4nLFxuICAgICAgICAgICAgY2hpbGROb2RlczogW10sXG4gICAgICAgICAgICBnZXRBdHRyaWJ1dGU6IGplc3QuZm4oKCkgPT4gJycpLFxuICAgICAgICAgICAgaGFzQXR0cmlidXRlOiBqZXN0LmZuKCgpID0+IHRydWUpLFxuICAgICAgICAgICAgaW5uZXJIVE1MOiBodG1sLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgbmV4dCA9IGplc3QuZm4oKTtcblxuICAgICAgICAgIGNvbnN0IG91dCA9IHNlcmlhbGl6YXRpb24uZGVzZXJpYWxpemUoZWwsIG5leHQpO1xuICAgICAgICAgIGV4cGVjdChvdXQpLnRvRXF1YWwoe1xuICAgICAgICAgICAgb2JqZWN0OiAnaW5saW5lJyxcbiAgICAgICAgICAgIHR5cGU6ICdtYXRoJyxcbiAgICAgICAgICAgIGlzVm9pZDogdHJ1ZSxcbiAgICAgICAgICAgIG5vZGVzOiBbXSxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgbGF0ZXg6IGV4cGVjdGVkLFxuICAgICAgICAgICAgICB3cmFwcGVyOiB3cmFwVHlwZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgYXNzZXJ0RGVzZXJpYWxpemUoJyQkJmx0OyQkJywgJzwnLCBNYXRoUGx1Z2luLkRPTExBUik7XG4gICAgICBhc3NlcnREZXNlcmlhbGl6ZSgnJCZsdDskJywgJzwnLCBNYXRoUGx1Z2luLkRPTExBUik7XG4gICAgICBhc3NlcnREZXNlcmlhbGl6ZSgnXFxcXCgmbHQ7XFxcXCknLCAnPCcsIE1hdGhQbHVnaW4uUk9VTkRfQlJBQ0tFVFMpO1xuICAgICAgYXNzZXJ0RGVzZXJpYWxpemUoJ1xcXFxbJmx0O1xcXFxdJywgJzwnLCBNYXRoUGx1Z2luLlJPVU5EX0JSQUNLRVRTKTtcbiAgICAgIGFzc2VydERlc2VyaWFsaXplKCdsYXRleCcsICdsYXRleCcsIE1hdGhQbHVnaW4uUk9VTkRfQlJBQ0tFVFMpO1xuICAgICAgYXNzZXJ0RGVzZXJpYWxpemUoJ1xcXFxkaXNwbGF5c3R5bGUgZm9vJywgJ2ZvbycsIE1hdGhQbHVnaW4uUk9VTkRfQlJBQ0tFVFMpO1xuXG4gICAgICBpdCgnc2hvdWxkIG1ha2UgbWF0aG1sIGVkaXRhYmxlIGlmIE1hdGhQbHVnaW4ubWF0aE1sT3B0aW9ucy5tbWxFZGl0aW5nIGlzIHRydWUnLCAoKSA9PiB7XG4gICAgICAgIE1hdGhQbHVnaW4ubWF0aE1sT3B0aW9ucy5tbWxFZGl0aW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgZWwgPSB7XG4gICAgICAgICAgdGFnTmFtZTogJ21hdGgnLFxuICAgICAgICAgIG91dGVySFRNTDpcbiAgICAgICAgICAgICc8bWF0aCB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUxcIj4gIDxtbj4yPC9tbj4gIDxtaT54PC9taT4gIDxtdGV4dD4mI3hBMDs8L210ZXh0PiAgPG1vPiYjeDIyNjQ7PC9tbz4gIDxtbj40PC9tbj4gIDxtaT55PC9taT4gIDxtdGV4dD4mI3hBMDs8L210ZXh0PiAgPG1vPis8L21vPiAgPG10ZXh0PiYjeEEwOzwvbXRleHQ+ICA8bW4+ODwvbW4+IDxtc3FydD4gICAgPG1pPmg8L21pPiAgPC9tc3FydD48L21hdGg+JyxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmV4dCA9IGplc3QuZm4oKTtcblxuICAgICAgICBjb25zdCBvdXQgPSBzZXJpYWxpemF0aW9uLmRlc2VyaWFsaXplKGVsLCBuZXh0KTtcblxuICAgICAgICBleHBlY3Qob3V0KS50b0VxdWFsKHtcbiAgICAgICAgICBvYmplY3Q6ICdpbmxpbmUnLFxuICAgICAgICAgIHR5cGU6ICdtYXRoJyxcbiAgICAgICAgICBpc1ZvaWQ6IHRydWUsXG4gICAgICAgICAgbm9kZXM6IFtdLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGxhdGV4OiAnL2Zvb2Jhci9sYXRleCcsXG4gICAgICAgICAgICB3cmFwcGVyOiAncm91bmRfYnJhY2tldHMnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbWFrZSBtYXRobWwgcmVhZE9ubHkgaWYgTWF0aFBsdWdpbi5tYXRoTWxPcHRpb25zLm1tbEVkaXRpbmcgaXMgZmFsc2UnLCAoKSA9PiB7XG4gICAgICAgIE1hdGhQbHVnaW4ubWF0aE1sT3B0aW9ucy5tbWxFZGl0aW5nID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGVsID0ge1xuICAgICAgICAgIHRhZ05hbWU6ICdtYXRoJyxcbiAgICAgICAgICBvdXRlckhUTUw6XG4gICAgICAgICAgICAnPG1hdGggeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MXCI+ICA8bW4+MjwvbW4+ICA8bWk+eDwvbWk+ICA8bXRleHQ+JiN4QTA7PC9tdGV4dD4gIDxtbz4mI3gyMjY0OzwvbW8+ICA8bW4+NDwvbW4+ICA8bWk+eTwvbWk+ICA8bXRleHQ+JiN4QTA7PC9tdGV4dD4gIDxtbz4rPC9tbz4gIDxtdGV4dD4mI3hBMDs8L210ZXh0PiAgPG1uPjg8L21uPiA8bXNxcnQ+ICAgIDxtaT5oPC9taT4gIDwvbXNxcnQ+PC9tYXRoPicsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5leHQgPSBqZXN0LmZuKCk7XG5cbiAgICAgICAgY29uc3Qgb3V0ID0gc2VyaWFsaXphdGlvbi5kZXNlcmlhbGl6ZShlbCwgbmV4dCk7XG5cbiAgICAgICAgZXhwZWN0KG91dCkudG9FcXVhbCh7XG4gICAgICAgICAgb2JqZWN0OiAnaW5saW5lJyxcbiAgICAgICAgICBpc1ZvaWQ6IHRydWUsXG4gICAgICAgICAgdHlwZTogJ21hdGhtbCcsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgaHRtbDogZWwub3V0ZXJIVE1MLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2VyaWFsaXplJywgKCkgPT4ge1xuICAgICAgY29uc3QgYXNzZXJ0U2VyaWFsaXplID0gKGxhdGV4LCBleHBlY3RlZEh0bWwsIHdyYXBwZXIpID0+IHtcbiAgICAgICAgd3JhcHBlciA9IHdyYXBwZXIgfHwgTWF0aFBsdWdpbi5ST1VORF9CUkFDS0VUUztcbiAgICAgICAgaXQoYCR7bGF0ZXh9IGlzIHNlcmlhbGl6ZWQgdG86ICR7ZXhwZWN0ZWRIdG1sfWAsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBvYmplY3QgPSB7XG4gICAgICAgICAgICBraW5kOiAnaW5saW5lJyxcbiAgICAgICAgICAgIHR5cGU6ICdtYXRoJyxcbiAgICAgICAgICAgIGlzVm9pZDogdHJ1ZSxcbiAgICAgICAgICAgIG5vZGVzOiBbXSxcbiAgICAgICAgICAgIGRhdGE6IERhdGEuY3JlYXRlKHsgbGF0ZXgsIHdyYXBwZXIgfSksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFtdO1xuXG4gICAgICAgICAgY29uc3Qgb3V0ID0gc2VyaWFsaXphdGlvbi5zZXJpYWxpemUob2JqZWN0LCBjaGlsZHJlbik7XG4gICAgICAgICAgbG9nKCdvdXQ6ICcsIG91dCk7XG4gICAgICAgICAgZXhwZWN0KG91dCkudG9FcXVhbChcbiAgICAgICAgICAgIDxzcGFuIGRhdGEtbGF0ZXg9XCJcIiBkYXRhLXJhdz17bGF0ZXh9PlxuICAgICAgICAgICAgICB7ZXhwZWN0ZWRIdG1sfVxuICAgICAgICAgICAgPC9zcGFuPixcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGFzc2VydFNlcmlhbGl6ZSgnbGF0ZXgnLCAnXFxcXChsYXRleFxcXFwpJywgTWF0aFBsdWdpbi5ST1VORF9CUkFDS0VUUyk7XG4gICAgICBhc3NlcnRTZXJpYWxpemUoJ2xhdGV4JywgJ1xcXFwobGF0ZXhcXFxcKScsIE1hdGhQbHVnaW4uU1FVQVJFX0JSQUNLRVRTKTtcbiAgICAgIGFzc2VydFNlcmlhbGl6ZSgnbGF0ZXgnLCAnJGxhdGV4JCcsIE1hdGhQbHVnaW4uRE9MTEFSKTtcbiAgICAgIGFzc2VydFNlcmlhbGl6ZSgnbGF0ZXgnLCAnJGxhdGV4JCcsIE1hdGhQbHVnaW4uRE9VQkxFX0RPTExBUik7XG5cbiAgICAgIC8qKlxuICAgICAgICogTm90ZSB0aGF0IHdoZW4gdGhpcyBpcyBjb252ZXJ0ZWQgdG8gaHRtbCBpdCBnZXQncyBlc2NhcGVkIC0gYnV0IHRoYXQncyBhbiBpc3N1ZSB3aXRoIHRoZSBzbGF0ZSBodG1sLXNlcmlhbGl6ZXIuXG4gICAgICAgKi9cbiAgICAgIGFzc2VydFNlcmlhbGl6ZSgnPCcsICdcXFxcKDxcXFxcKScpO1xuICAgICAgYXNzZXJ0U2VyaWFsaXplKCd4PHknLCAnXFxcXCh4PHlcXFxcKScpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnQ3VzdG9tVG9vbGJhckNvbXAnLCAoKSA9PiB7XG4gIGxldCBvbkRhdGFDaGFuZ2U7XG4gIGxldCBvblRvb2xiYXJEb25lO1xuXG4gIGNvbnN0IHdyYXBwZXIgPSAoZXh0cmFzKSA9PiB7XG4gICAgbGV0IG1vY2tDaGFuZ2UgPSBuZXcgTW9ja0NoYW5nZSgpO1xuICAgIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgICAgbm9kZToge1xuICAgICAgICBrZXk6ICcxJyxcbiAgICAgICAgZGF0YTogRGF0YS5jcmVhdGUoeyBsYXRleDogJ2ZvbycgfSksXG4gICAgICAgIGVxdWFsczogKCkgPT4gdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB2YWx1ZToge1xuICAgICAgICBkb2N1bWVudDoge1xuICAgICAgICAgIGdldE5leHRUZXh0OiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHsga2V5OiAnbnQnIH0pLFxuICAgICAgICB9LFxuICAgICAgICBjaGFuZ2U6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUobW9ja0NoYW5nZSksXG4gICAgICB9LFxuICAgICAgb25EYXRhQ2hhbmdlLFxuICAgICAgb25Ub29sYmFyRG9uZSxcbiAgICB9O1xuXG4gICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAuLi5kZWZhdWx0cyxcbiAgICAgIC4uLmV4dHJhcyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHNoYWxsb3coPEN1c3RvbVRvb2xiYXJDb21wIHsuLi5wcm9wc30gLz4pO1xuICB9O1xuXG4gIGRlc2NyaWJlKCdyZW5kZXInLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgd2l0aG91dCBkZWZhdWx0IGtleXBhZE1vZGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3ID0gd3JhcHBlcigpO1xuXG4gICAgICBleHBlY3QodykudG9NYXRjaFNuYXBzaG90KCk7XG5cbiAgICAgIHcuc2V0UHJvcHMoeyBwbHVnaW5Qcm9wczogeyBtYXRoOiB7IGtleXBhZE1vZGU6IDMgfSB9IH0pO1xuXG4gICAgICBleHBlY3QodykudG9NYXRjaFNuYXBzaG90KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGRlZmF1bHQga2V5cGFkTW9kZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHcgPSB3cmFwcGVyKHsgcGx1Z2luUHJvcHM6IHsgbWF0aDogeyBrZXlwYWRNb2RlOiAnZ2VvbWV0cnknIH0gfSB9KTtcblxuICAgICAgZXhwZWN0KHcpLnRvTWF0Y2hTbmFwc2hvdCgpO1xuXG4gICAgICB3LnNldFByb3BzKHsgcGx1Z2luUHJvcHM6IHsgbWF0aDogeyBrZXlwYWRNb2RlOiAzIH0gfSB9KTtcblxuICAgICAgZXhwZWN0KHcpLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnb25Eb25lJywgKCkgPT4ge1xuICAgIGl0KCdjYWxscyBvblRvb2xiYXJEb25lJywgKCkgPT4ge1xuICAgICAgb25Ub29sYmFyRG9uZSA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IHcgPSB3cmFwcGVyKCk7XG4gICAgICB3LmZpbmQoTWF0aFRvb2xiYXIpLnByb3AoJ29uRG9uZScpKCdvbycpO1xuICAgICAgZXhwZWN0KG9uVG9vbGJhckRvbmUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5hbnl0aGluZygpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvbkNoYW5nZScsICgpID0+IHtcbiAgICBpdCgnY2FsbHMgb25EYXRhQ2hhbmdlJywgKCkgPT4ge1xuICAgICAgb25EYXRhQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgdyA9IHdyYXBwZXIoKTtcbiAgICAgIHcuZmluZChNYXRoVG9vbGJhcikucHJvcCgnb25DaGFuZ2UnKSgnb28nKTtcbiAgICAgIGV4cGVjdChvbkRhdGFDaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCcxJywgeyBsYXRleDogJ29vJyB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==