@pie-element/ebsr 12.3.4-next.3 → 13.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/configure/lib/defaults.js +23 -36
  2. package/configure/lib/defaults.js.map +1 -1
  3. package/configure/lib/index.js +114 -202
  4. package/configure/lib/index.js.map +1 -1
  5. package/configure/lib/main.js +188 -271
  6. package/configure/lib/main.js.map +1 -1
  7. package/configure/node_modules/@pie-element/multiple-choice/CHANGELOG.json +1972 -0
  8. package/configure/node_modules/@pie-element/multiple-choice/CHANGELOG.md +4213 -0
  9. package/configure/node_modules/@pie-element/multiple-choice/PRINT.md +35 -0
  10. package/configure/node_modules/@pie-element/multiple-choice/README.md +56 -0
  11. package/configure/node_modules/@pie-element/multiple-choice/choice.png +0 -0
  12. package/configure/node_modules/@pie-element/multiple-choice/configure/CHANGELOG.json +1387 -0
  13. package/configure/node_modules/@pie-element/multiple-choice/configure/CHANGELOG.md +3351 -0
  14. package/configure/node_modules/@pie-element/multiple-choice/configure/lib/__tests__/root.test.js +248 -0
  15. package/configure/node_modules/@pie-element/multiple-choice/configure/lib/defaults.js +200 -0
  16. package/configure/node_modules/@pie-element/multiple-choice/configure/lib/defaults.js.map +1 -0
  17. package/configure/node_modules/@pie-element/multiple-choice/configure/lib/index.js +211 -0
  18. package/configure/node_modules/@pie-element/multiple-choice/configure/lib/index.js.map +1 -0
  19. package/configure/node_modules/@pie-element/multiple-choice/configure/lib/main.js +477 -0
  20. package/configure/node_modules/@pie-element/multiple-choice/configure/lib/main.js.map +1 -0
  21. package/configure/node_modules/@pie-element/multiple-choice/configure/lib/utils.js +18 -0
  22. package/configure/node_modules/@pie-element/multiple-choice/configure/lib/utils.js.map +1 -0
  23. package/configure/node_modules/@pie-element/multiple-choice/configure/package.json +22 -0
  24. package/configure/node_modules/@pie-element/multiple-choice/controller/CHANGELOG.json +527 -0
  25. package/configure/node_modules/@pie-element/multiple-choice/controller/CHANGELOG.md +2316 -0
  26. package/configure/node_modules/@pie-element/multiple-choice/controller/lib/__tests__/index.test.js +520 -0
  27. package/configure/node_modules/@pie-element/multiple-choice/controller/lib/__tests__/utils.test.js +8 -0
  28. package/configure/node_modules/@pie-element/multiple-choice/controller/lib/defaults.js +33 -0
  29. package/configure/node_modules/@pie-element/multiple-choice/controller/lib/defaults.js.map +1 -0
  30. package/configure/node_modules/@pie-element/multiple-choice/controller/lib/index.js +251 -0
  31. package/configure/node_modules/@pie-element/multiple-choice/controller/lib/index.js.map +1 -0
  32. package/configure/node_modules/@pie-element/multiple-choice/controller/lib/utils.js +16 -0
  33. package/configure/node_modules/@pie-element/multiple-choice/controller/lib/utils.js.map +1 -0
  34. package/configure/node_modules/@pie-element/multiple-choice/controller/package.json +15 -0
  35. package/configure/node_modules/@pie-element/multiple-choice/docs/config-schema.json +2993 -0
  36. package/configure/node_modules/@pie-element/multiple-choice/docs/config-schema.json.md +2217 -0
  37. package/configure/node_modules/@pie-element/multiple-choice/docs/demo/config.js +8 -0
  38. package/configure/node_modules/@pie-element/multiple-choice/docs/demo/generate.js +61 -0
  39. package/configure/node_modules/@pie-element/multiple-choice/docs/demo/index.html +1 -0
  40. package/configure/node_modules/@pie-element/multiple-choice/docs/demo/pie.manifest.json +11 -0
  41. package/configure/node_modules/@pie-element/multiple-choice/docs/demo/session.js +7 -0
  42. package/configure/node_modules/@pie-element/multiple-choice/docs/pie-schema.json +1332 -0
  43. package/configure/node_modules/@pie-element/multiple-choice/docs/pie-schema.json.md +1015 -0
  44. package/configure/node_modules/@pie-element/multiple-choice/lib/__tests__/choice-input-test.js +117 -0
  45. package/configure/node_modules/@pie-element/multiple-choice/lib/__tests__/index-test.js +151 -0
  46. package/configure/node_modules/@pie-element/multiple-choice/lib/__tests__/key-events-test.js +95 -0
  47. package/configure/node_modules/@pie-element/multiple-choice/lib/__tests__/multiple-choice-test.js +223 -0
  48. package/configure/node_modules/@pie-element/multiple-choice/lib/__tests__/session-updater-test.js +70 -0
  49. package/configure/node_modules/@pie-element/multiple-choice/lib/choice-input.js +370 -0
  50. package/configure/node_modules/@pie-element/multiple-choice/lib/choice-input.js.map +1 -0
  51. package/configure/node_modules/@pie-element/multiple-choice/lib/choice.js +197 -0
  52. package/configure/node_modules/@pie-element/multiple-choice/lib/choice.js.map +1 -0
  53. package/configure/node_modules/@pie-element/multiple-choice/lib/feedback-tick.js +130 -0
  54. package/configure/node_modules/@pie-element/multiple-choice/lib/feedback-tick.js.map +1 -0
  55. package/configure/node_modules/@pie-element/multiple-choice/lib/index.js +292 -0
  56. package/configure/node_modules/@pie-element/multiple-choice/lib/index.js.map +1 -0
  57. package/configure/node_modules/@pie-element/multiple-choice/lib/main.js +54 -0
  58. package/configure/node_modules/@pie-element/multiple-choice/lib/main.js.map +1 -0
  59. package/configure/node_modules/@pie-element/multiple-choice/lib/multiple-choice.js +386 -0
  60. package/configure/node_modules/@pie-element/multiple-choice/lib/multiple-choice.js.map +1 -0
  61. package/configure/node_modules/@pie-element/multiple-choice/lib/print.js +92 -0
  62. package/configure/node_modules/@pie-element/multiple-choice/lib/print.js.map +1 -0
  63. package/configure/node_modules/@pie-element/multiple-choice/lib/session-updater.js +37 -0
  64. package/configure/node_modules/@pie-element/multiple-choice/lib/session-updater.js.map +1 -0
  65. package/configure/node_modules/@pie-element/multiple-choice/package.json +39 -0
  66. package/configure/package.json +9 -6
  67. package/configure/src/__tests__/index.test.js +99 -108
  68. package/configure/src/index.js +13 -6
  69. package/configure/src/main.jsx +14 -18
  70. package/controller/lib/defaults.js +20 -32
  71. package/controller/lib/defaults.js.map +1 -1
  72. package/controller/lib/index.js +224 -349
  73. package/controller/lib/index.js.map +1 -1
  74. package/controller/lib/utils.js +4 -18
  75. package/controller/lib/utils.js.map +1 -1
  76. package/controller/package.json +3 -3
  77. package/lib/index.js +113 -181
  78. package/lib/index.js.map +1 -1
  79. package/lib/print.js +120 -204
  80. package/lib/print.js.map +1 -1
  81. package/package.json +5 -13
  82. package/src/__tests__/index.test.js +18 -5
  83. package/configure/src/__tests__/__snapshots__/index.test.js.snap +0 -83
  84. package/esm/configure.js +0 -12003
  85. package/esm/configure.js.map +0 -1
  86. package/esm/controller.js +0 -3358
  87. package/esm/controller.js.map +0 -1
  88. package/esm/element.js +0 -2203
  89. package/esm/element.js.map +0 -1
  90. package/esm/package.json +0 -3
  91. package/esm/print.js +0 -4092
  92. package/esm/print.js.map +0 -1
  93. package/module/configure.js +0 -1
  94. package/module/controller.js +0 -6469
  95. package/module/demo.js +0 -77
  96. package/module/element.js +0 -1
  97. package/module/index.html +0 -21
  98. package/module/manifest.json +0 -14
  99. package/module/print-demo.js +0 -115
  100. package/module/print.html +0 -18
  101. package/module/print.js +0 -1
@@ -0,0 +1,477 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = exports.Main = void 0;
8
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _react = _interopRequireDefault(require("react"));
11
+ var _propTypes = _interopRequireDefault(require("prop-types"));
12
+ var _styles = require("@mui/material/styles");
13
+ var _editableHtml = _interopRequireDefault(require("@pie-lib/editable-html"));
14
+ var _configUi = require("@pie-lib/config-ui");
15
+ var _renderUi = require("@pie-lib/render-ui");
16
+ var _Button = _interopRequireDefault(require("@mui/material/Button"));
17
+ var _Tooltip = _interopRequireDefault(require("@mui/material/Tooltip"));
18
+ var _Typography = _interopRequireDefault(require("@mui/material/Typography"));
19
+ var _Box = _interopRequireDefault(require("@mui/material/Box"));
20
+ var _Info = _interopRequireDefault(require("@mui/icons-material/Info"));
21
+ var _merge = _interopRequireDefault(require("lodash/merge"));
22
+ var _utils = require("./utils");
23
+ const {
24
+ Panel,
25
+ toggle,
26
+ radio,
27
+ dropdown
28
+ } = _configUi.settings;
29
+ const MAX_CHOICES = 9;
30
+ const PromptHolder = (0, _styles.styled)(_configUi.InputContainer)(({
31
+ theme
32
+ }) => ({
33
+ width: '100%',
34
+ paddingTop: theme.spacing(2),
35
+ marginBottom: theme.spacing(2)
36
+ }));
37
+ const RationaleHolder = (0, _styles.styled)(_configUi.InputContainer)(({
38
+ theme
39
+ }) => ({
40
+ flex: 1,
41
+ marginTop: theme.spacing(1.5),
42
+ paddingTop: theme.spacing(2),
43
+ marginLeft: theme.spacing(3.5)
44
+ }));
45
+ const ChoiceConfigurationHolder = (0, _styles.styled)(_configUi.InputContainer)(({
46
+ theme
47
+ }) => ({
48
+ display: 'flex',
49
+ flexDirection: 'column',
50
+ marginBottom: theme.spacing(1),
51
+ width: '100%'
52
+ }));
53
+ const AddButton = (0, _styles.styled)(_Button.default)(({
54
+ theme
55
+ }) => ({
56
+ marginTop: theme.spacing(1),
57
+ float: 'right'
58
+ }));
59
+ const DisableButton = (0, _styles.styled)(AddButton)({
60
+ cursor: 'not-allowed',
61
+ pointerEvents: 'all',
62
+ backgroundColor: _renderUi.color.disabled(),
63
+ '&:hover': {
64
+ backgroundColor: _renderUi.color.disabled()
65
+ },
66
+ '&:focus': {
67
+ backgroundColor: _renderUi.color.disabled()
68
+ }
69
+ });
70
+ const FlexContainer = (0, _styles.styled)(_Box.default)({
71
+ display: 'flex',
72
+ alignItems: 'center'
73
+ });
74
+ const TitleText = (0, _styles.styled)(_Typography.default)(({
75
+ theme
76
+ }) => ({
77
+ fontSize: theme.typography.fontSize + 2,
78
+ marginRight: theme.spacing(1)
79
+ }));
80
+ const StyledTooltip = (0, _styles.styled)(_Tooltip.default)(({
81
+ theme
82
+ }) => ({
83
+ '& .MuiTooltip-tooltip': {
84
+ fontSize: theme.typography.fontSize - 2,
85
+ whiteSpace: 'pre',
86
+ maxWidth: '500px'
87
+ }
88
+ }));
89
+ const ErrorText = (0, _styles.styled)('div')(({
90
+ theme
91
+ }) => ({
92
+ fontSize: theme.typography.fontSize - 2,
93
+ color: theme.palette.error.main,
94
+ paddingTop: theme.spacing(1)
95
+ }));
96
+ const Design = props => {
97
+ const {
98
+ model,
99
+ configuration,
100
+ onPromptChanged,
101
+ onChoiceChanged,
102
+ onRemoveChoice,
103
+ onAddChoice,
104
+ imageSupport,
105
+ uploadSoundSupport,
106
+ onChangeModel,
107
+ onConfigurationChanged,
108
+ onTeacherInstructionsChanged
109
+ } = props;
110
+ const {
111
+ addChoiceButton = {},
112
+ contentDimensions = {},
113
+ feedback = {},
114
+ deleteChoice = {},
115
+ choiceMode = {},
116
+ choicePrefix = {},
117
+ partialScoring = {},
118
+ lockChoiceOrder = {},
119
+ teacherInstructions = {},
120
+ studentInstructions = {},
121
+ rationale = {},
122
+ scoringType = {},
123
+ sequentialChoiceLabels = {},
124
+ settingsPanelDisabled,
125
+ choicesLayout,
126
+ spellCheck = {},
127
+ gridColumns,
128
+ maxImageWidth = {},
129
+ maxImageHeight = {},
130
+ prompt = {},
131
+ withRubric = {},
132
+ mathMlOptions = {},
133
+ language = {},
134
+ languageChoices = {}
135
+ } = configuration || {};
136
+ let {
137
+ maxAnswerChoices
138
+ } = configuration || {};
139
+ const {
140
+ limitChoicesNumber,
141
+ teacherInstructionsEnabled,
142
+ rationaleEnabled,
143
+ feedbackEnabled,
144
+ promptEnabled,
145
+ spellCheckEnabled,
146
+ choices,
147
+ errors,
148
+ toolbarEditorPosition,
149
+ extraCSSRules
150
+ } = model || {};
151
+ const {
152
+ answerChoices: answerChoicesError,
153
+ choices: choicesErrors,
154
+ correctResponse: correctResponseError,
155
+ prompt: promptError,
156
+ rationale: rationaleErrors,
157
+ teacherInstructions: teacherInstructionsError
158
+ } = errors || {};
159
+ const nrOfColumnsAvailable = choices?.length ? Array.from({
160
+ length: choices.length
161
+ }, (_, i) => `${i + 1}`) : [];
162
+ const {
163
+ baseInputConfiguration = {}
164
+ } = configuration;
165
+ const toolbarOpts = {
166
+ position: toolbarEditorPosition === 'top' ? 'top' : 'bottom'
167
+ };
168
+
169
+ // if old property is used, set maxAnswerChoices to 9
170
+ if (limitChoicesNumber) {
171
+ maxAnswerChoices = MAX_CHOICES;
172
+ }
173
+ const getPluginProps = (props = {}) => ({
174
+ ...baseInputConfiguration,
175
+ ...props
176
+ });
177
+ const validationMessage = (0, _utils.generateValidationMessage)(configuration);
178
+ const defaultImageMaxWidth = maxImageWidth && maxImageWidth.prompt;
179
+ const defaultImageMaxHeight = maxImageHeight && maxImageHeight.prompt;
180
+ const addChoiceButtonTooltip = maxAnswerChoices && choices?.length >= maxAnswerChoices ? `Only ${maxAnswerChoices} allowed maximum` : '';
181
+ const panelSettings = {
182
+ choiceMode: choiceMode.settings && radio(choiceMode.label, ['checkbox', 'radio']),
183
+ 'sequentialChoiceLabels.enabled': sequentialChoiceLabels.settings && toggle(sequentialChoiceLabels.label, true),
184
+ choicePrefix: choicePrefix.settings && radio(choicePrefix.label, ['numbers', 'letters']),
185
+ partialScoring: partialScoring.settings && toggle(partialScoring.label),
186
+ lockChoiceOrder: lockChoiceOrder.settings && toggle(lockChoiceOrder.label),
187
+ feedbackEnabled: feedback.settings && toggle(feedback.label),
188
+ choicesLayout: choicesLayout.settings && dropdown(choicesLayout.label, ['vertical', 'grid', 'horizontal']),
189
+ gridColumns: choicesLayout.settings && model.choicesLayout === 'grid' && nrOfColumnsAvailable.length > 0 && dropdown(gridColumns.label, nrOfColumnsAvailable),
190
+ 'language.enabled': language.settings && toggle(language.label, true),
191
+ language: language.settings && language.enabled && dropdown(languageChoices.label, languageChoices.options)
192
+ };
193
+ const panelProperties = {
194
+ teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),
195
+ studentInstructionsEnabled: studentInstructions.settings && toggle(studentInstructions.label),
196
+ promptEnabled: prompt.settings && toggle(prompt.label),
197
+ rationaleEnabled: rationale.settings && toggle(rationale.label),
198
+ spellCheckEnabled: spellCheck.settings && toggle(spellCheck.label),
199
+ scoringType: scoringType.settings && radio(scoringType.label, ['auto', 'rubric']),
200
+ rubricEnabled: withRubric?.settings && toggle(withRubric?.label)
201
+ };
202
+ return /*#__PURE__*/_react.default.createElement(_configUi.layout.ConfigLayout, {
203
+ dimensions: contentDimensions,
204
+ hideSettings: settingsPanelDisabled,
205
+ extraCSSRules: extraCSSRules,
206
+ classes: {},
207
+ settings: /*#__PURE__*/_react.default.createElement(Panel, {
208
+ model: model,
209
+ onChangeModel: onChangeModel,
210
+ configuration: configuration,
211
+ onChangeConfiguration: onConfigurationChanged,
212
+ groups: {
213
+ Settings: panelSettings,
214
+ Properties: panelProperties
215
+ }
216
+ })
217
+ }, teacherInstructionsEnabled && /*#__PURE__*/_react.default.createElement(PromptHolder, {
218
+ label: teacherInstructions.label
219
+ }, /*#__PURE__*/_react.default.createElement(_editableHtml.default, {
220
+ markup: model.teacherInstructions || '',
221
+ onChange: onTeacherInstructionsChanged,
222
+ imageSupport: imageSupport,
223
+ nonEmpty: false,
224
+ disableUnderline: true,
225
+ error: teacherInstructionsError,
226
+ toolbarOpts: toolbarOpts,
227
+ pluginProps: getPluginProps(configuration?.teacherInstructions?.inputConfiguration),
228
+ spellCheck: spellCheckEnabled,
229
+ maxImageWidth: maxImageWidth && maxImageWidth.teacherInstructions || defaultImageMaxWidth,
230
+ maxImageHeight: maxImageHeight && maxImageHeight.teacherInstructions || defaultImageMaxHeight,
231
+ uploadSoundSupport: uploadSoundSupport,
232
+ languageCharactersProps: [{
233
+ language: 'spanish'
234
+ }, {
235
+ language: 'special'
236
+ }],
237
+ mathMlOptions: mathMlOptions
238
+ }), teacherInstructionsError && /*#__PURE__*/_react.default.createElement(ErrorText, null, teacherInstructionsError)), promptEnabled && /*#__PURE__*/_react.default.createElement(PromptHolder, {
239
+ label: prompt.label
240
+ }, /*#__PURE__*/_react.default.createElement(_editableHtml.default, {
241
+ markup: model.prompt,
242
+ onChange: onPromptChanged,
243
+ imageSupport: imageSupport,
244
+ nonEmpty: false,
245
+ disableUnderline: true,
246
+ error: promptError,
247
+ toolbarOpts: toolbarOpts,
248
+ pluginProps: getPluginProps(configuration?.prompt?.inputConfiguration),
249
+ spellCheck: spellCheckEnabled,
250
+ maxImageWidth: maxImageWidth && maxImageWidth.prompt,
251
+ maxImageHeight: maxImageHeight && maxImageHeight.prompt,
252
+ uploadSoundSupport: uploadSoundSupport,
253
+ languageCharactersProps: [{
254
+ language: 'spanish'
255
+ }, {
256
+ language: 'special'
257
+ }],
258
+ mathMlOptions: mathMlOptions
259
+ }), promptError && /*#__PURE__*/_react.default.createElement(ErrorText, null, promptError)), /*#__PURE__*/_react.default.createElement(FlexContainer, null, /*#__PURE__*/_react.default.createElement(TitleText, {
260
+ component: 'div'
261
+ }, "Choices"), /*#__PURE__*/_react.default.createElement(StyledTooltip, {
262
+ disableFocusListener: true,
263
+ disableTouchListener: true,
264
+ placement: 'right',
265
+ title: validationMessage
266
+ }, /*#__PURE__*/_react.default.createElement(_Info.default, {
267
+ fontSize: 'small',
268
+ color: 'primary'
269
+ }))), choices.map((choice, index) => /*#__PURE__*/_react.default.createElement(ChoiceConfigurationHolder, {
270
+ key: `choice-${index}`
271
+ }, /*#__PURE__*/_react.default.createElement(_configUi.ChoiceConfiguration, {
272
+ key: index,
273
+ index: index + 1,
274
+ useLetterOrdering: model.choicePrefix === 'letters',
275
+ mode: model.choiceMode,
276
+ data: choice,
277
+ defaultFeedback: {},
278
+ imageSupport: imageSupport,
279
+ disableImageAlignmentButtons: true,
280
+ onDelete: () => onRemoveChoice(index),
281
+ onChange: c => onChoiceChanged(index, c),
282
+ allowFeedBack: feedbackEnabled,
283
+ allowDelete: deleteChoice.settings,
284
+ noLabels: true,
285
+ pluginOpts: getPluginProps(configuration?.choices?.inputConfiguration),
286
+ toolbarOpts: toolbarOpts,
287
+ spellCheck: spellCheckEnabled,
288
+ error: choicesErrors?.[choice.value] || null,
289
+ noCorrectAnswerError: correctResponseError,
290
+ maxImageWidth: maxImageWidth && maxImageWidth.choices || defaultImageMaxWidth,
291
+ maxImageHeight: maxImageHeight && maxImageHeight.choices || defaultImageMaxHeight,
292
+ uploadSoundSupport: uploadSoundSupport,
293
+ mathMlOptions: mathMlOptions
294
+ }), rationaleEnabled && /*#__PURE__*/_react.default.createElement(RationaleHolder, {
295
+ key: `rationale-${index}`,
296
+ label: rationale.label
297
+ }, /*#__PURE__*/_react.default.createElement(_editableHtml.default, {
298
+ markup: choice.rationale || '',
299
+ onChange: c => onChoiceChanged(index, {
300
+ ...choice,
301
+ rationale: c
302
+ }),
303
+ imageSupport: imageSupport,
304
+ error: rationaleErrors?.[choice.value] || null,
305
+ toolbarOpts: toolbarOpts,
306
+ pluginProps: getPluginProps(configuration?.rationale?.inputConfiguration),
307
+ spellCheck: spellCheckEnabled,
308
+ maxImageWidth: maxImageWidth && maxImageWidth.rationale || defaultImageMaxWidth,
309
+ maxImageHeight: maxImageHeight && maxImageHeight.rationale || defaultImageMaxHeight,
310
+ uploadSoundSupport: uploadSoundSupport,
311
+ languageCharactersProps: [{
312
+ language: 'spanish'
313
+ }, {
314
+ language: 'special'
315
+ }],
316
+ mathMlOptions: mathMlOptions
317
+ }), rationaleErrors?.[choice.value] && /*#__PURE__*/_react.default.createElement(ErrorText, null, rationaleErrors?.[choice.value])))), correctResponseError && /*#__PURE__*/_react.default.createElement(ErrorText, null, correctResponseError), answerChoicesError && /*#__PURE__*/_react.default.createElement(ErrorText, null, answerChoicesError), addChoiceButton.settings && /*#__PURE__*/_react.default.createElement(StyledTooltip, {
318
+ title: addChoiceButtonTooltip
319
+ }, maxAnswerChoices && choices?.length >= maxAnswerChoices ? /*#__PURE__*/_react.default.createElement(DisableButton, {
320
+ variant: "contained",
321
+ color: "primary",
322
+ onClick: onAddChoice,
323
+ disabled: true
324
+ }, addChoiceButton.label) : /*#__PURE__*/_react.default.createElement(AddButton, {
325
+ variant: "contained",
326
+ color: "primary",
327
+ onClick: onAddChoice
328
+ }, addChoiceButton.label)));
329
+ };
330
+ class Main extends _react.default.Component {
331
+ constructor(...args) {
332
+ super(...args);
333
+ (0, _defineProperty2.default)(this, "state", {
334
+ showWarning: false
335
+ });
336
+ (0, _defineProperty2.default)(this, "onRemoveChoice", index => {
337
+ const {
338
+ model,
339
+ configuration,
340
+ onModelChanged
341
+ } = this.props;
342
+ const {
343
+ minAnswerChoices
344
+ } = configuration || {};
345
+ if (minAnswerChoices && model.choices.length === minAnswerChoices) {
346
+ this.setState({
347
+ showWarning: true
348
+ });
349
+ return;
350
+ }
351
+ model.choices.splice(index, 1);
352
+ onModelChanged(model);
353
+ });
354
+ (0, _defineProperty2.default)(this, "onAddChoice", () => {
355
+ const {
356
+ model,
357
+ configuration,
358
+ onModelChanged
359
+ } = this.props;
360
+ let {
361
+ maxAnswerChoices
362
+ } = configuration || {};
363
+ const {
364
+ limitChoicesNumber
365
+ } = model || {};
366
+
367
+ // if old property is used, set maxAnswerChoices to 9
368
+ if (limitChoicesNumber) {
369
+ maxAnswerChoices = MAX_CHOICES;
370
+ }
371
+ if (maxAnswerChoices && model.choices.length >= maxAnswerChoices) {
372
+ return;
373
+ }
374
+ model.choices.push({
375
+ label: '',
376
+ value: _configUi.choiceUtils.firstAvailableIndex(model.choices.map(c => c.value), 0),
377
+ feedback: {
378
+ type: 'none'
379
+ }
380
+ });
381
+ onModelChanged(model);
382
+ });
383
+ (0, _defineProperty2.default)(this, "onChoiceChanged", (index, choice) => {
384
+ const {
385
+ model,
386
+ onModelChanged
387
+ } = this.props;
388
+ if (choice.correct && model.choiceMode === 'radio') {
389
+ model.choices = model.choices.map(c => (0, _merge.default)({}, c, {
390
+ correct: false
391
+ }));
392
+ }
393
+ model.choices.splice(index, 1, choice);
394
+ onModelChanged(model);
395
+ });
396
+ (0, _defineProperty2.default)(this, "onPromptChanged", prompt => {
397
+ this.props.onModelChanged({
398
+ ...this.props.model,
399
+ prompt
400
+ });
401
+ });
402
+ (0, _defineProperty2.default)(this, "onTeacherInstructionsChanged", teacherInstructions => {
403
+ this.props.onModelChanged({
404
+ ...this.props.model,
405
+ teacherInstructions
406
+ });
407
+ });
408
+ (0, _defineProperty2.default)(this, "onModelChanged", (model, key) => {
409
+ const {
410
+ onModelChanged
411
+ } = this.props;
412
+ switch (key) {
413
+ case 'choiceMode':
414
+ {
415
+ let value = model.choiceMode;
416
+ if (value === 'radio') {
417
+ let correctFound = false;
418
+ model.choices = model.choices.map(c => {
419
+ if (correctFound) {
420
+ c.correct = false;
421
+ return c;
422
+ }
423
+ if (c.correct) {
424
+ correctFound = true;
425
+ }
426
+ return c;
427
+ });
428
+ }
429
+ onModelChanged(model, true);
430
+ break;
431
+ }
432
+ default:
433
+ onModelChanged(model);
434
+ break;
435
+ }
436
+ });
437
+ }
438
+ render() {
439
+ const {
440
+ configuration: {
441
+ minAnswerChoices
442
+ } = {}
443
+ } = this.props;
444
+ const {
445
+ showWarning
446
+ } = this.state;
447
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_configUi.AlertDialog, {
448
+ open: showWarning,
449
+ title: "Warning",
450
+ text: `There can't be less than ${minAnswerChoices || 0} choices.`,
451
+ onConfirm: () => this.setState({
452
+ showWarning: false
453
+ })
454
+ }), /*#__PURE__*/_react.default.createElement(Design, (0, _extends2.default)({}, this.props, {
455
+ onChangeModel: this.onModelChanged,
456
+ onRemoveChoice: this.onRemoveChoice,
457
+ onChoiceChanged: this.onChoiceChanged,
458
+ onAddChoice: this.onAddChoice,
459
+ onPromptChanged: this.onPromptChanged,
460
+ onTeacherInstructionsChanged: this.onTeacherInstructionsChanged
461
+ })));
462
+ }
463
+ }
464
+ exports.Main = Main;
465
+ (0, _defineProperty2.default)(Main, "propTypes", {
466
+ model: _propTypes.default.object.isRequired,
467
+ configuration: _propTypes.default.object.isRequired,
468
+ disableSidePanel: _propTypes.default.bool,
469
+ onModelChanged: _propTypes.default.func.isRequired,
470
+ onConfigurationChanged: _propTypes.default.func.isRequired,
471
+ imageSupport: _propTypes.default.shape({
472
+ add: _propTypes.default.func.isRequired,
473
+ delete: _propTypes.default.func.isRequired
474
+ })
475
+ });
476
+ var _default = exports.default = Main;
477
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9wcm9wVHlwZXMiLCJfc3R5bGVzIiwiX2VkaXRhYmxlSHRtbCIsIl9jb25maWdVaSIsIl9yZW5kZXJVaSIsIl9CdXR0b24iLCJfVG9vbHRpcCIsIl9UeXBvZ3JhcGh5IiwiX0JveCIsIl9JbmZvIiwiX21lcmdlIiwiX3V0aWxzIiwiUGFuZWwiLCJ0b2dnbGUiLCJyYWRpbyIsImRyb3Bkb3duIiwic2V0dGluZ3MiLCJNQVhfQ0hPSUNFUyIsIlByb21wdEhvbGRlciIsInN0eWxlZCIsIklucHV0Q29udGFpbmVyIiwidGhlbWUiLCJ3aWR0aCIsInBhZGRpbmdUb3AiLCJzcGFjaW5nIiwibWFyZ2luQm90dG9tIiwiUmF0aW9uYWxlSG9sZGVyIiwiZmxleCIsIm1hcmdpblRvcCIsIm1hcmdpbkxlZnQiLCJDaG9pY2VDb25maWd1cmF0aW9uSG9sZGVyIiwiZGlzcGxheSIsImZsZXhEaXJlY3Rpb24iLCJBZGRCdXR0b24iLCJCdXR0b24iLCJmbG9hdCIsIkRpc2FibGVCdXR0b24iLCJjdXJzb3IiLCJwb2ludGVyRXZlbnRzIiwiYmFja2dyb3VuZENvbG9yIiwiY29sb3IiLCJkaXNhYmxlZCIsIkZsZXhDb250YWluZXIiLCJCb3giLCJhbGlnbkl0ZW1zIiwiVGl0bGVUZXh0IiwiVHlwb2dyYXBoeSIsImZvbnRTaXplIiwidHlwb2dyYXBoeSIsIm1hcmdpblJpZ2h0IiwiU3R5bGVkVG9vbHRpcCIsIlRvb2x0aXAiLCJ3aGl0ZVNwYWNlIiwibWF4V2lkdGgiLCJFcnJvclRleHQiLCJwYWxldHRlIiwiZXJyb3IiLCJtYWluIiwiRGVzaWduIiwicHJvcHMiLCJtb2RlbCIsImNvbmZpZ3VyYXRpb24iLCJvblByb21wdENoYW5nZWQiLCJvbkNob2ljZUNoYW5nZWQiLCJvblJlbW92ZUNob2ljZSIsIm9uQWRkQ2hvaWNlIiwiaW1hZ2VTdXBwb3J0IiwidXBsb2FkU291bmRTdXBwb3J0Iiwib25DaGFuZ2VNb2RlbCIsIm9uQ29uZmlndXJhdGlvbkNoYW5nZWQiLCJvblRlYWNoZXJJbnN0cnVjdGlvbnNDaGFuZ2VkIiwiYWRkQ2hvaWNlQnV0dG9uIiwiY29udGVudERpbWVuc2lvbnMiLCJmZWVkYmFjayIsImRlbGV0ZUNob2ljZSIsImNob2ljZU1vZGUiLCJjaG9pY2VQcmVmaXgiLCJwYXJ0aWFsU2NvcmluZyIsImxvY2tDaG9pY2VPcmRlciIsInRlYWNoZXJJbnN0cnVjdGlvbnMiLCJzdHVkZW50SW5zdHJ1Y3Rpb25zIiwicmF0aW9uYWxlIiwic2NvcmluZ1R5cGUiLCJzZXF1ZW50aWFsQ2hvaWNlTGFiZWxzIiwic2V0dGluZ3NQYW5lbERpc2FibGVkIiwiY2hvaWNlc0xheW91dCIsInNwZWxsQ2hlY2siLCJncmlkQ29sdW1ucyIsIm1heEltYWdlV2lkdGgiLCJtYXhJbWFnZUhlaWdodCIsInByb21wdCIsIndpdGhSdWJyaWMiLCJtYXRoTWxPcHRpb25zIiwibGFuZ3VhZ2UiLCJsYW5ndWFnZUNob2ljZXMiLCJtYXhBbnN3ZXJDaG9pY2VzIiwibGltaXRDaG9pY2VzTnVtYmVyIiwidGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQiLCJyYXRpb25hbGVFbmFibGVkIiwiZmVlZGJhY2tFbmFibGVkIiwicHJvbXB0RW5hYmxlZCIsInNwZWxsQ2hlY2tFbmFibGVkIiwiY2hvaWNlcyIsImVycm9ycyIsInRvb2xiYXJFZGl0b3JQb3NpdGlvbiIsImV4dHJhQ1NTUnVsZXMiLCJhbnN3ZXJDaG9pY2VzIiwiYW5zd2VyQ2hvaWNlc0Vycm9yIiwiY2hvaWNlc0Vycm9ycyIsImNvcnJlY3RSZXNwb25zZSIsImNvcnJlY3RSZXNwb25zZUVycm9yIiwicHJvbXB0RXJyb3IiLCJyYXRpb25hbGVFcnJvcnMiLCJ0ZWFjaGVySW5zdHJ1Y3Rpb25zRXJyb3IiLCJuck9mQ29sdW1uc0F2YWlsYWJsZSIsImxlbmd0aCIsIkFycmF5IiwiZnJvbSIsIl8iLCJpIiwiYmFzZUlucHV0Q29uZmlndXJhdGlvbiIsInRvb2xiYXJPcHRzIiwicG9zaXRpb24iLCJnZXRQbHVnaW5Qcm9wcyIsInZhbGlkYXRpb25NZXNzYWdlIiwiZ2VuZXJhdGVWYWxpZGF0aW9uTWVzc2FnZSIsImRlZmF1bHRJbWFnZU1heFdpZHRoIiwiZGVmYXVsdEltYWdlTWF4SGVpZ2h0IiwiYWRkQ2hvaWNlQnV0dG9uVG9vbHRpcCIsInBhbmVsU2V0dGluZ3MiLCJsYWJlbCIsImVuYWJsZWQiLCJvcHRpb25zIiwicGFuZWxQcm9wZXJ0aWVzIiwic3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQiLCJydWJyaWNFbmFibGVkIiwiZGVmYXVsdCIsImNyZWF0ZUVsZW1lbnQiLCJsYXlvdXQiLCJDb25maWdMYXlvdXQiLCJkaW1lbnNpb25zIiwiaGlkZVNldHRpbmdzIiwiY2xhc3NlcyIsIm9uQ2hhbmdlQ29uZmlndXJhdGlvbiIsImdyb3VwcyIsIlNldHRpbmdzIiwiUHJvcGVydGllcyIsIm1hcmt1cCIsIm9uQ2hhbmdlIiwibm9uRW1wdHkiLCJkaXNhYmxlVW5kZXJsaW5lIiwicGx1Z2luUHJvcHMiLCJpbnB1dENvbmZpZ3VyYXRpb24iLCJsYW5ndWFnZUNoYXJhY3RlcnNQcm9wcyIsImNvbXBvbmVudCIsImRpc2FibGVGb2N1c0xpc3RlbmVyIiwiZGlzYWJsZVRvdWNoTGlzdGVuZXIiLCJwbGFjZW1lbnQiLCJ0aXRsZSIsIm1hcCIsImNob2ljZSIsImluZGV4Iiwia2V5IiwiQ2hvaWNlQ29uZmlndXJhdGlvbiIsInVzZUxldHRlck9yZGVyaW5nIiwibW9kZSIsImRhdGEiLCJkZWZhdWx0RmVlZGJhY2siLCJkaXNhYmxlSW1hZ2VBbGlnbm1lbnRCdXR0b25zIiwib25EZWxldGUiLCJjIiwiYWxsb3dGZWVkQmFjayIsImFsbG93RGVsZXRlIiwibm9MYWJlbHMiLCJwbHVnaW5PcHRzIiwidmFsdWUiLCJub0NvcnJlY3RBbnN3ZXJFcnJvciIsInZhcmlhbnQiLCJvbkNsaWNrIiwiTWFpbiIsIlJlYWN0IiwiQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJhcmdzIiwiX2RlZmluZVByb3BlcnR5MiIsInNob3dXYXJuaW5nIiwib25Nb2RlbENoYW5nZWQiLCJtaW5BbnN3ZXJDaG9pY2VzIiwic2V0U3RhdGUiLCJzcGxpY2UiLCJwdXNoIiwidXRpbHMiLCJmaXJzdEF2YWlsYWJsZUluZGV4IiwidHlwZSIsImNvcnJlY3QiLCJtZXJnZSIsImNvcnJlY3RGb3VuZCIsInJlbmRlciIsInN0YXRlIiwiRnJhZ21lbnQiLCJBbGVydERpYWxvZyIsIm9wZW4iLCJ0ZXh0Iiwib25Db25maXJtIiwiX2V4dGVuZHMyIiwiZXhwb3J0cyIsIlByb3BUeXBlcyIsIm9iamVjdCIsImlzUmVxdWlyZWQiLCJkaXNhYmxlU2lkZVBhbmVsIiwiYm9vbCIsImZ1bmMiLCJzaGFwZSIsImFkZCIsImRlbGV0ZSIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vc3JjL21haW4uanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9zdHlsZXMnO1xuaW1wb3J0IEVkaXRhYmxlSHRtbCBmcm9tICdAcGllLWxpYi9lZGl0YWJsZS1odG1sJztcbmltcG9ydCB7XG4gIEFsZXJ0RGlhbG9nLFxuICBJbnB1dENvbnRhaW5lcixcbiAgQ2hvaWNlQ29uZmlndXJhdGlvbixcbiAgc2V0dGluZ3MsXG4gIGxheW91dCxcbiAgY2hvaWNlVXRpbHMgYXMgdXRpbHMsXG59IGZyb20gJ0BwaWUtbGliL2NvbmZpZy11aSc7XG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ0BwaWUtbGliL3JlbmRlci11aSc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJ0BtdWkvbWF0ZXJpYWwvQnV0dG9uJztcbmltcG9ydCBUb29sdGlwIGZyb20gJ0BtdWkvbWF0ZXJpYWwvVG9vbHRpcCc7XG5pbXBvcnQgVHlwb2dyYXBoeSBmcm9tICdAbXVpL21hdGVyaWFsL1R5cG9ncmFwaHknO1xuaW1wb3J0IEJveCBmcm9tICdAbXVpL21hdGVyaWFsL0JveCc7XG5pbXBvcnQgSW5mbyBmcm9tICdAbXVpL2ljb25zLW1hdGVyaWFsL0luZm8nO1xuaW1wb3J0IG1lcmdlIGZyb20gJ2xvZGFzaC9tZXJnZSc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZhbGlkYXRpb25NZXNzYWdlIH0gZnJvbSAnLi91dGlscyc7XG5cbmNvbnN0IHsgUGFuZWwsIHRvZ2dsZSwgcmFkaW8sIGRyb3Bkb3duIH0gPSBzZXR0aW5ncztcblxuY29uc3QgTUFYX0NIT0lDRVMgPSA5O1xuXG5jb25zdCBQcm9tcHRIb2xkZXIgPSBzdHlsZWQoSW5wdXRDb250YWluZXIpKCh7IHRoZW1lIH0pID0+ICh7XG4gIHdpZHRoOiAnMTAwJScsXG4gIHBhZGRpbmdUb3A6IHRoZW1lLnNwYWNpbmcoMiksXG4gIG1hcmdpbkJvdHRvbTogdGhlbWUuc3BhY2luZygyKSxcbn0pKTtcblxuY29uc3QgUmF0aW9uYWxlSG9sZGVyID0gc3R5bGVkKElucHV0Q29udGFpbmVyKSgoeyB0aGVtZSB9KSA9PiAoe1xuICBmbGV4OiAxLFxuICBtYXJnaW5Ub3A6IHRoZW1lLnNwYWNpbmcoMS41KSxcbiAgcGFkZGluZ1RvcDogdGhlbWUuc3BhY2luZygyKSxcbiAgbWFyZ2luTGVmdDogdGhlbWUuc3BhY2luZygzLjUpLFxufSkpO1xuXG5jb25zdCBDaG9pY2VDb25maWd1cmF0aW9uSG9sZGVyID0gc3R5bGVkKElucHV0Q29udGFpbmVyKSgoeyB0aGVtZSB9KSA9PiAoe1xuICBkaXNwbGF5OiAnZmxleCcsXG4gIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICBtYXJnaW5Cb3R0b206IHRoZW1lLnNwYWNpbmcoMSksXG4gIHdpZHRoOiAnMTAwJScsXG59KSk7XG5cblxuY29uc3QgQWRkQnV0dG9uID0gc3R5bGVkKEJ1dHRvbikoKHsgdGhlbWUgfSkgPT4gKHtcbiAgbWFyZ2luVG9wOiB0aGVtZS5zcGFjaW5nKDEpLFxuICBmbG9hdDogJ3JpZ2h0Jyxcbn0pKTtcblxuY29uc3QgRGlzYWJsZUJ1dHRvbiA9IHN0eWxlZChBZGRCdXR0b24pKHtcbiAgY3Vyc29yOiAnbm90LWFsbG93ZWQnLFxuICBwb2ludGVyRXZlbnRzOiAnYWxsJyxcbiAgYmFja2dyb3VuZENvbG9yOiBjb2xvci5kaXNhYmxlZCgpLFxuICAnJjpob3Zlcic6IHtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yLmRpc2FibGVkKCksXG4gIH0sXG4gICcmOmZvY3VzJzoge1xuICAgIGJhY2tncm91bmRDb2xvcjogY29sb3IuZGlzYWJsZWQoKSxcbiAgfSxcbn0pO1xuXG5jb25zdCBGbGV4Q29udGFpbmVyID0gc3R5bGVkKEJveCkoe1xuICBkaXNwbGF5OiAnZmxleCcsXG4gIGFsaWduSXRlbXM6ICdjZW50ZXInLFxufSk7XG5cbmNvbnN0IFRpdGxlVGV4dCA9IHN0eWxlZChUeXBvZ3JhcGh5KSgoeyB0aGVtZSB9KSA9PiAoe1xuICBmb250U2l6ZTogdGhlbWUudHlwb2dyYXBoeS5mb250U2l6ZSArIDIsXG4gIG1hcmdpblJpZ2h0OiB0aGVtZS5zcGFjaW5nKDEpLFxufSkpO1xuXG5jb25zdCBTdHlsZWRUb29sdGlwID0gc3R5bGVkKFRvb2x0aXApKCh7IHRoZW1lIH0pID0+ICh7XG4gICcmIC5NdWlUb29sdGlwLXRvb2x0aXAnOiB7XG4gICAgZm9udFNpemU6IHRoZW1lLnR5cG9ncmFwaHkuZm9udFNpemUgLSAyLFxuICAgIHdoaXRlU3BhY2U6ICdwcmUnLFxuICAgIG1heFdpZHRoOiAnNTAwcHgnLFxuICB9LFxufSkpO1xuXG5jb25zdCBFcnJvclRleHQgPSBzdHlsZWQoJ2RpdicpKCh7IHRoZW1lIH0pID0+ICh7XG4gIGZvbnRTaXplOiB0aGVtZS50eXBvZ3JhcGh5LmZvbnRTaXplIC0gMixcbiAgY29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgcGFkZGluZ1RvcDogdGhlbWUuc3BhY2luZygxKSxcbn0pKTtcblxuY29uc3QgRGVzaWduID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBtb2RlbCxcbiAgICBjb25maWd1cmF0aW9uLFxuICAgIG9uUHJvbXB0Q2hhbmdlZCxcbiAgICBvbkNob2ljZUNoYW5nZWQsXG4gICAgb25SZW1vdmVDaG9pY2UsXG4gICAgb25BZGRDaG9pY2UsXG4gICAgaW1hZ2VTdXBwb3J0LFxuICAgIHVwbG9hZFNvdW5kU3VwcG9ydCxcbiAgICBvbkNoYW5nZU1vZGVsLFxuICAgIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQsXG4gICAgb25UZWFjaGVySW5zdHJ1Y3Rpb25zQ2hhbmdlZCxcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBhZGRDaG9pY2VCdXR0b24gPSB7fSxcbiAgICBjb250ZW50RGltZW5zaW9ucyA9IHt9LFxuICAgIGZlZWRiYWNrID0ge30sXG4gICAgZGVsZXRlQ2hvaWNlID0ge30sXG4gICAgY2hvaWNlTW9kZSA9IHt9LFxuICAgIGNob2ljZVByZWZpeCA9IHt9LFxuICAgIHBhcnRpYWxTY29yaW5nID0ge30sXG4gICAgbG9ja0Nob2ljZU9yZGVyID0ge30sXG4gICAgdGVhY2hlckluc3RydWN0aW9ucyA9IHt9LFxuICAgIHN0dWRlbnRJbnN0cnVjdGlvbnMgPSB7fSxcbiAgICByYXRpb25hbGUgPSB7fSxcbiAgICBzY29yaW5nVHlwZSA9IHt9LFxuICAgIHNlcXVlbnRpYWxDaG9pY2VMYWJlbHMgPSB7fSxcbiAgICBzZXR0aW5nc1BhbmVsRGlzYWJsZWQsXG4gICAgY2hvaWNlc0xheW91dCxcbiAgICBzcGVsbENoZWNrID0ge30sXG4gICAgZ3JpZENvbHVtbnMsXG4gICAgbWF4SW1hZ2VXaWR0aCA9IHt9LFxuICAgIG1heEltYWdlSGVpZ2h0ID0ge30sXG4gICAgcHJvbXB0ID0ge30sXG4gICAgd2l0aFJ1YnJpYyA9IHt9LFxuICAgIG1hdGhNbE9wdGlvbnMgPSB7fSxcbiAgICBsYW5ndWFnZSA9IHt9LFxuICAgIGxhbmd1YWdlQ2hvaWNlcyA9IHt9LFxuICB9ID0gY29uZmlndXJhdGlvbiB8fCB7fTtcbiAgbGV0IHsgbWF4QW5zd2VyQ2hvaWNlcyB9ID0gY29uZmlndXJhdGlvbiB8fCB7fTtcbiAgY29uc3Qge1xuICAgIGxpbWl0Q2hvaWNlc051bWJlcixcbiAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCxcbiAgICByYXRpb25hbGVFbmFibGVkLFxuICAgIGZlZWRiYWNrRW5hYmxlZCxcbiAgICBwcm9tcHRFbmFibGVkLFxuICAgIHNwZWxsQ2hlY2tFbmFibGVkLFxuICAgIGNob2ljZXMsXG4gICAgZXJyb3JzLFxuICAgIHRvb2xiYXJFZGl0b3JQb3NpdGlvbixcbiAgICBleHRyYUNTU1J1bGVzLFxuICB9ID0gbW9kZWwgfHwge307XG5cbiAgY29uc3Qge1xuICAgIGFuc3dlckNob2ljZXM6IGFuc3dlckNob2ljZXNFcnJvcixcbiAgICBjaG9pY2VzOiBjaG9pY2VzRXJyb3JzLFxuICAgIGNvcnJlY3RSZXNwb25zZTogY29ycmVjdFJlc3BvbnNlRXJyb3IsXG4gICAgcHJvbXB0OiBwcm9tcHRFcnJvcixcbiAgICByYXRpb25hbGU6IHJhdGlvbmFsZUVycm9ycyxcbiAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiB0ZWFjaGVySW5zdHJ1Y3Rpb25zRXJyb3IsXG4gIH0gPSBlcnJvcnMgfHwge307XG4gIGNvbnN0IG5yT2ZDb2x1bW5zQXZhaWxhYmxlID0gY2hvaWNlcz8ubGVuZ3RoID8gQXJyYXkuZnJvbSh7IGxlbmd0aDogY2hvaWNlcy5sZW5ndGggfSwgKF8sIGkpID0+IGAke2kgKyAxfWApIDogW107XG5cbiAgY29uc3QgeyBiYXNlSW5wdXRDb25maWd1cmF0aW9uID0ge30gfSA9IGNvbmZpZ3VyYXRpb247XG4gIGNvbnN0IHRvb2xiYXJPcHRzID0ge1xuICAgIHBvc2l0aW9uOiB0b29sYmFyRWRpdG9yUG9zaXRpb24gPT09ICd0b3AnID8gJ3RvcCcgOiAnYm90dG9tJyxcbiAgfTtcblxuICAvLyBpZiBvbGQgcHJvcGVydHkgaXMgdXNlZCwgc2V0IG1heEFuc3dlckNob2ljZXMgdG8gOVxuICBpZiAobGltaXRDaG9pY2VzTnVtYmVyKSB7XG4gICAgbWF4QW5zd2VyQ2hvaWNlcyA9IE1BWF9DSE9JQ0VTO1xuICB9XG5cbiAgY29uc3QgZ2V0UGx1Z2luUHJvcHMgPSAocHJvcHMgPSB7fSkgPT4gKHtcbiAgICAuLi5iYXNlSW5wdXRDb25maWd1cmF0aW9uLFxuICAgIC4uLnByb3BzLFxuICB9KTtcblxuICBjb25zdCB2YWxpZGF0aW9uTWVzc2FnZSA9IGdlbmVyYXRlVmFsaWRhdGlvbk1lc3NhZ2UoY29uZmlndXJhdGlvbik7XG4gIGNvbnN0IGRlZmF1bHRJbWFnZU1heFdpZHRoID0gbWF4SW1hZ2VXaWR0aCAmJiBtYXhJbWFnZVdpZHRoLnByb21wdDtcbiAgY29uc3QgZGVmYXVsdEltYWdlTWF4SGVpZ2h0ID0gbWF4SW1hZ2VIZWlnaHQgJiYgbWF4SW1hZ2VIZWlnaHQucHJvbXB0O1xuICBjb25zdCBhZGRDaG9pY2VCdXR0b25Ub29sdGlwID1cbiAgICBtYXhBbnN3ZXJDaG9pY2VzICYmIGNob2ljZXM/Lmxlbmd0aCA+PSBtYXhBbnN3ZXJDaG9pY2VzID8gYE9ubHkgJHttYXhBbnN3ZXJDaG9pY2VzfSBhbGxvd2VkIG1heGltdW1gIDogJyc7XG5cbiAgY29uc3QgcGFuZWxTZXR0aW5ncyA9IHtcbiAgICBjaG9pY2VNb2RlOiBjaG9pY2VNb2RlLnNldHRpbmdzICYmIHJhZGlvKGNob2ljZU1vZGUubGFiZWwsIFsnY2hlY2tib3gnLCAncmFkaW8nXSksXG4gICAgJ3NlcXVlbnRpYWxDaG9pY2VMYWJlbHMuZW5hYmxlZCc6IHNlcXVlbnRpYWxDaG9pY2VMYWJlbHMuc2V0dGluZ3MgJiYgdG9nZ2xlKHNlcXVlbnRpYWxDaG9pY2VMYWJlbHMubGFiZWwsIHRydWUpLFxuICAgIGNob2ljZVByZWZpeDogY2hvaWNlUHJlZml4LnNldHRpbmdzICYmIHJhZGlvKGNob2ljZVByZWZpeC5sYWJlbCwgWydudW1iZXJzJywgJ2xldHRlcnMnXSksXG4gICAgcGFydGlhbFNjb3Jpbmc6IHBhcnRpYWxTY29yaW5nLnNldHRpbmdzICYmIHRvZ2dsZShwYXJ0aWFsU2NvcmluZy5sYWJlbCksXG4gICAgbG9ja0Nob2ljZU9yZGVyOiBsb2NrQ2hvaWNlT3JkZXIuc2V0dGluZ3MgJiYgdG9nZ2xlKGxvY2tDaG9pY2VPcmRlci5sYWJlbCksXG4gICAgZmVlZGJhY2tFbmFibGVkOiBmZWVkYmFjay5zZXR0aW5ncyAmJiB0b2dnbGUoZmVlZGJhY2subGFiZWwpLFxuICAgIGNob2ljZXNMYXlvdXQ6IGNob2ljZXNMYXlvdXQuc2V0dGluZ3MgJiYgZHJvcGRvd24oY2hvaWNlc0xheW91dC5sYWJlbCwgWyd2ZXJ0aWNhbCcsICdncmlkJywgJ2hvcml6b250YWwnXSksXG4gICAgZ3JpZENvbHVtbnM6XG4gICAgICBjaG9pY2VzTGF5b3V0LnNldHRpbmdzICYmXG4gICAgICBtb2RlbC5jaG9pY2VzTGF5b3V0ID09PSAnZ3JpZCcgJiZcbiAgICAgIG5yT2ZDb2x1bW5zQXZhaWxhYmxlLmxlbmd0aCA+IDAgJiZcbiAgICAgIGRyb3Bkb3duKGdyaWRDb2x1bW5zLmxhYmVsLCBuck9mQ29sdW1uc0F2YWlsYWJsZSksXG4gICAgJ2xhbmd1YWdlLmVuYWJsZWQnOiBsYW5ndWFnZS5zZXR0aW5ncyAmJiB0b2dnbGUobGFuZ3VhZ2UubGFiZWwsIHRydWUpLFxuICAgIGxhbmd1YWdlOiBsYW5ndWFnZS5zZXR0aW5ncyAmJiBsYW5ndWFnZS5lbmFibGVkICYmIGRyb3Bkb3duKGxhbmd1YWdlQ2hvaWNlcy5sYWJlbCwgbGFuZ3VhZ2VDaG9pY2VzLm9wdGlvbnMpLFxuICB9O1xuXG4gIGNvbnN0IHBhbmVsUHJvcGVydGllcyA9IHtcbiAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZDogdGVhY2hlckluc3RydWN0aW9ucy5zZXR0aW5ncyAmJiB0b2dnbGUodGVhY2hlckluc3RydWN0aW9ucy5sYWJlbCksXG4gICAgc3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQ6IHN0dWRlbnRJbnN0cnVjdGlvbnMuc2V0dGluZ3MgJiYgdG9nZ2xlKHN0dWRlbnRJbnN0cnVjdGlvbnMubGFiZWwpLFxuICAgIHByb21wdEVuYWJsZWQ6IHByb21wdC5zZXR0aW5ncyAmJiB0b2dnbGUocHJvbXB0LmxhYmVsKSxcbiAgICByYXRpb25hbGVFbmFibGVkOiByYXRpb25hbGUuc2V0dGluZ3MgJiYgdG9nZ2xlKHJhdGlvbmFsZS5sYWJlbCksXG4gICAgc3BlbGxDaGVja0VuYWJsZWQ6IHNwZWxsQ2hlY2suc2V0dGluZ3MgJiYgdG9nZ2xlKHNwZWxsQ2hlY2subGFiZWwpLFxuICAgIHNjb3JpbmdUeXBlOiBzY29yaW5nVHlwZS5zZXR0aW5ncyAmJiByYWRpbyhzY29yaW5nVHlwZS5sYWJlbCwgWydhdXRvJywgJ3J1YnJpYyddKSxcbiAgICBydWJyaWNFbmFibGVkOiB3aXRoUnVicmljPy5zZXR0aW5ncyAmJiB0b2dnbGUod2l0aFJ1YnJpYz8ubGFiZWwpLFxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPGxheW91dC5Db25maWdMYXlvdXRcbiAgICAgIGRpbWVuc2lvbnM9e2NvbnRlbnREaW1lbnNpb25zfVxuICAgICAgaGlkZVNldHRpbmdzPXtzZXR0aW5nc1BhbmVsRGlzYWJsZWR9XG4gICAgICBleHRyYUNTU1J1bGVzPXtleHRyYUNTU1J1bGVzfVxuICAgICAgY2xhc3Nlcz17e319XG4gICAgICBzZXR0aW5ncz17XG4gICAgICAgIDxQYW5lbFxuICAgICAgICAgIG1vZGVsPXttb2RlbH1cbiAgICAgICAgICBvbkNoYW5nZU1vZGVsPXtvbkNoYW5nZU1vZGVsfVxuICAgICAgICAgIGNvbmZpZ3VyYXRpb249e2NvbmZpZ3VyYXRpb259XG4gICAgICAgICAgb25DaGFuZ2VDb25maWd1cmF0aW9uPXtvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkfVxuICAgICAgICAgIGdyb3Vwcz17e1xuICAgICAgICAgICAgU2V0dGluZ3M6IHBhbmVsU2V0dGluZ3MsXG4gICAgICAgICAgICBQcm9wZXJ0aWVzOiBwYW5lbFByb3BlcnRpZXMsXG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgIH1cbiAgICA+XG4gICAgICB7dGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQgJiYgKFxuICAgICAgICA8UHJvbXB0SG9sZGVyIGxhYmVsPXt0ZWFjaGVySW5zdHJ1Y3Rpb25zLmxhYmVsfT5cbiAgICAgICAgICAgIDxFZGl0YWJsZUh0bWxcbiAgICAgICAgICAgICAgbWFya3VwPXttb2RlbC50ZWFjaGVySW5zdHJ1Y3Rpb25zIHx8ICcnfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17b25UZWFjaGVySW5zdHJ1Y3Rpb25zQ2hhbmdlZH1cbiAgICAgICAgICAgICAgaW1hZ2VTdXBwb3J0PXtpbWFnZVN1cHBvcnR9XG4gICAgICAgICAgICAgIG5vbkVtcHR5PXtmYWxzZX1cbiAgICAgICAgICAgICAgZGlzYWJsZVVuZGVybGluZVxuICAgICAgICAgICAgICBlcnJvcj17dGVhY2hlckluc3RydWN0aW9uc0Vycm9yfVxuICAgICAgICAgICAgICB0b29sYmFyT3B0cz17dG9vbGJhck9wdHN9XG4gICAgICAgICAgICAgIHBsdWdpblByb3BzPXtnZXRQbHVnaW5Qcm9wcyhjb25maWd1cmF0aW9uPy50ZWFjaGVySW5zdHJ1Y3Rpb25zPy5pbnB1dENvbmZpZ3VyYXRpb24pfVxuICAgICAgICAgICAgICBzcGVsbENoZWNrPXtzcGVsbENoZWNrRW5hYmxlZH1cbiAgICAgICAgICAgICAgbWF4SW1hZ2VXaWR0aD17KG1heEltYWdlV2lkdGggJiYgbWF4SW1hZ2VXaWR0aC50ZWFjaGVySW5zdHJ1Y3Rpb25zKSB8fCBkZWZhdWx0SW1hZ2VNYXhXaWR0aH1cbiAgICAgICAgICAgICAgbWF4SW1hZ2VIZWlnaHQ9eyhtYXhJbWFnZUhlaWdodCAmJiBtYXhJbWFnZUhlaWdodC50ZWFjaGVySW5zdHJ1Y3Rpb25zKSB8fCBkZWZhdWx0SW1hZ2VNYXhIZWlnaHR9XG4gICAgICAgICAgICAgIHVwbG9hZFNvdW5kU3VwcG9ydD17dXBsb2FkU291bmRTdXBwb3J0fVxuICAgICAgICAgICAgICBsYW5ndWFnZUNoYXJhY3RlcnNQcm9wcz17W3sgbGFuZ3VhZ2U6ICdzcGFuaXNoJyB9LCB7IGxhbmd1YWdlOiAnc3BlY2lhbCcgfV19XG4gICAgICAgICAgICAgIG1hdGhNbE9wdGlvbnM9e21hdGhNbE9wdGlvbnN9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAge3RlYWNoZXJJbnN0cnVjdGlvbnNFcnJvciAmJiA8RXJyb3JUZXh0Pnt0ZWFjaGVySW5zdHJ1Y3Rpb25zRXJyb3J9PC9FcnJvclRleHQ+fVxuICAgICAgICA8L1Byb21wdEhvbGRlcj5cbiAgICAgICl9XG5cbiAgICAgIHtwcm9tcHRFbmFibGVkICYmIChcbiAgICAgICAgPFByb21wdEhvbGRlciBsYWJlbD17cHJvbXB0LmxhYmVsfT5cbiAgICAgICAgICAgIDxFZGl0YWJsZUh0bWxcbiAgICAgICAgICAgICAgbWFya3VwPXttb2RlbC5wcm9tcHR9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXtvblByb21wdENoYW5nZWR9XG4gICAgICAgICAgICAgIGltYWdlU3VwcG9ydD17aW1hZ2VTdXBwb3J0fVxuICAgICAgICAgICAgICBub25FbXB0eT17ZmFsc2V9XG4gICAgICAgICAgICAgIGRpc2FibGVVbmRlcmxpbmVcbiAgICAgICAgICAgICAgZXJyb3I9e3Byb21wdEVycm9yfVxuICAgICAgICAgICAgICB0b29sYmFyT3B0cz17dG9vbGJhck9wdHN9XG4gICAgICAgICAgICAgIHBsdWdpblByb3BzPXtnZXRQbHVnaW5Qcm9wcyhjb25maWd1cmF0aW9uPy5wcm9tcHQ/LmlucHV0Q29uZmlndXJhdGlvbil9XG4gICAgICAgICAgICAgIHNwZWxsQ2hlY2s9e3NwZWxsQ2hlY2tFbmFibGVkfVxuICAgICAgICAgICAgICBtYXhJbWFnZVdpZHRoPXttYXhJbWFnZVdpZHRoICYmIG1heEltYWdlV2lkdGgucHJvbXB0fVxuICAgICAgICAgICAgICBtYXhJbWFnZUhlaWdodD17bWF4SW1hZ2VIZWlnaHQgJiYgbWF4SW1hZ2VIZWlnaHQucHJvbXB0fVxuICAgICAgICAgICAgICB1cGxvYWRTb3VuZFN1cHBvcnQ9e3VwbG9hZFNvdW5kU3VwcG9ydH1cbiAgICAgICAgICAgICAgbGFuZ3VhZ2VDaGFyYWN0ZXJzUHJvcHM9e1t7IGxhbmd1YWdlOiAnc3BhbmlzaCcgfSwgeyBsYW5ndWFnZTogJ3NwZWNpYWwnIH1dfVxuICAgICAgICAgICAgICBtYXRoTWxPcHRpb25zPXttYXRoTWxPcHRpb25zfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIHtwcm9tcHRFcnJvciAmJiA8RXJyb3JUZXh0Pntwcm9tcHRFcnJvcn08L0Vycm9yVGV4dD59XG4gICAgICAgIDwvUHJvbXB0SG9sZGVyPlxuICAgICAgKX1cblxuICAgICAgPEZsZXhDb250YWluZXI+XG4gICAgICAgIDxUaXRsZVRleHQgY29tcG9uZW50PXsnZGl2J30+XG4gICAgICAgICAgQ2hvaWNlc1xuICAgICAgICA8L1RpdGxlVGV4dD5cbiAgICAgICAgPFN0eWxlZFRvb2x0aXBcbiAgICAgICAgICBkaXNhYmxlRm9jdXNMaXN0ZW5lclxuICAgICAgICAgIGRpc2FibGVUb3VjaExpc3RlbmVyXG4gICAgICAgICAgcGxhY2VtZW50PXsncmlnaHQnfVxuICAgICAgICAgIHRpdGxlPXt2YWxpZGF0aW9uTWVzc2FnZX1cbiAgICAgICAgPlxuICAgICAgICAgIDxJbmZvIGZvbnRTaXplPXsnc21hbGwnfSBjb2xvcj17J3ByaW1hcnknfSAvPlxuICAgICAgICA8L1N0eWxlZFRvb2x0aXA+XG4gICAgICA8L0ZsZXhDb250YWluZXI+XG5cbiAgICAgIHtjaG9pY2VzLm1hcCgoY2hvaWNlLCBpbmRleCkgPT4gKFxuICAgICAgICA8Q2hvaWNlQ29uZmlndXJhdGlvbkhvbGRlciBrZXk9e2BjaG9pY2UtJHtpbmRleH1gfT5cbiAgICAgICAgICA8Q2hvaWNlQ29uZmlndXJhdGlvblxuICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgIGluZGV4PXtpbmRleCArIDF9XG4gICAgICAgICAgICB1c2VMZXR0ZXJPcmRlcmluZz17bW9kZWwuY2hvaWNlUHJlZml4ID09PSAnbGV0dGVycyd9XG4gICAgICAgICAgICBtb2RlPXttb2RlbC5jaG9pY2VNb2RlfVxuICAgICAgICAgICAgZGF0YT17Y2hvaWNlfVxuICAgICAgICAgICAgZGVmYXVsdEZlZWRiYWNrPXt7fX1cbiAgICAgICAgICAgIGltYWdlU3VwcG9ydD17aW1hZ2VTdXBwb3J0fVxuICAgICAgICAgICAgZGlzYWJsZUltYWdlQWxpZ25tZW50QnV0dG9ucz17dHJ1ZX1cbiAgICAgICAgICAgIG9uRGVsZXRlPXsoKSA9PiBvblJlbW92ZUNob2ljZShpbmRleCl9XG4gICAgICAgICAgICBvbkNoYW5nZT17KGMpID0+IG9uQ2hvaWNlQ2hhbmdlZChpbmRleCwgYyl9XG4gICAgICAgICAgICBhbGxvd0ZlZWRCYWNrPXtmZWVkYmFja0VuYWJsZWR9XG4gICAgICAgICAgICBhbGxvd0RlbGV0ZT17ZGVsZXRlQ2hvaWNlLnNldHRpbmdzfVxuICAgICAgICAgICAgbm9MYWJlbHNcbiAgICAgICAgICAgIHBsdWdpbk9wdHM9e2dldFBsdWdpblByb3BzKGNvbmZpZ3VyYXRpb24/LmNob2ljZXM/LmlucHV0Q29uZmlndXJhdGlvbil9XG4gICAgICAgICAgICB0b29sYmFyT3B0cz17dG9vbGJhck9wdHN9XG4gICAgICAgICAgICBzcGVsbENoZWNrPXtzcGVsbENoZWNrRW5hYmxlZH1cbiAgICAgICAgICAgIGVycm9yPXtjaG9pY2VzRXJyb3JzPy5bY2hvaWNlLnZhbHVlXSB8fCBudWxsfVxuICAgICAgICAgICAgbm9Db3JyZWN0QW5zd2VyRXJyb3I9e2NvcnJlY3RSZXNwb25zZUVycm9yfVxuICAgICAgICAgICAgbWF4SW1hZ2VXaWR0aD17KG1heEltYWdlV2lkdGggJiYgbWF4SW1hZ2VXaWR0aC5jaG9pY2VzKSB8fCBkZWZhdWx0SW1hZ2VNYXhXaWR0aH1cbiAgICAgICAgICAgIG1heEltYWdlSGVpZ2h0PXsobWF4SW1hZ2VIZWlnaHQgJiYgbWF4SW1hZ2VIZWlnaHQuY2hvaWNlcykgfHwgZGVmYXVsdEltYWdlTWF4SGVpZ2h0fVxuICAgICAgICAgICAgdXBsb2FkU291bmRTdXBwb3J0PXt1cGxvYWRTb3VuZFN1cHBvcnR9XG4gICAgICAgICAgICBtYXRoTWxPcHRpb25zPXttYXRoTWxPcHRpb25zfVxuICAgICAgICAgIC8+XG5cbiAgICAgICAgICB7cmF0aW9uYWxlRW5hYmxlZCAmJiAoXG4gICAgICAgICAgICA8UmF0aW9uYWxlSG9sZGVyIGtleT17YHJhdGlvbmFsZS0ke2luZGV4fWB9IGxhYmVsPXtyYXRpb25hbGUubGFiZWx9PlxuICAgICAgICAgICAgICAgIDxFZGl0YWJsZUh0bWxcbiAgICAgICAgICAgICAgICAgIG1hcmt1cD17Y2hvaWNlLnJhdGlvbmFsZSB8fCAnJ31cbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoYykgPT4gb25DaG9pY2VDaGFuZ2VkKGluZGV4LCB7IC4uLmNob2ljZSwgcmF0aW9uYWxlOiBjIH0pfVxuICAgICAgICAgICAgICAgICAgaW1hZ2VTdXBwb3J0PXtpbWFnZVN1cHBvcnR9XG4gICAgICAgICAgICAgICAgICBlcnJvcj17cmF0aW9uYWxlRXJyb3JzPy5bY2hvaWNlLnZhbHVlXSB8fCBudWxsfVxuICAgICAgICAgICAgICAgICAgdG9vbGJhck9wdHM9e3Rvb2xiYXJPcHRzfVxuICAgICAgICAgICAgICAgICAgcGx1Z2luUHJvcHM9e2dldFBsdWdpblByb3BzKGNvbmZpZ3VyYXRpb24/LnJhdGlvbmFsZT8uaW5wdXRDb25maWd1cmF0aW9uKX1cbiAgICAgICAgICAgICAgICAgIHNwZWxsQ2hlY2s9e3NwZWxsQ2hlY2tFbmFibGVkfVxuICAgICAgICAgICAgICAgICAgbWF4SW1hZ2VXaWR0aD17KG1heEltYWdlV2lkdGggJiYgbWF4SW1hZ2VXaWR0aC5yYXRpb25hbGUpIHx8IGRlZmF1bHRJbWFnZU1heFdpZHRofVxuICAgICAgICAgICAgICAgICAgbWF4SW1hZ2VIZWlnaHQ9eyhtYXhJbWFnZUhlaWdodCAmJiBtYXhJbWFnZUhlaWdodC5yYXRpb25hbGUpIHx8IGRlZmF1bHRJbWFnZU1heEhlaWdodH1cbiAgICAgICAgICAgICAgICAgIHVwbG9hZFNvdW5kU3VwcG9ydD17dXBsb2FkU291bmRTdXBwb3J0fVxuICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VDaGFyYWN0ZXJzUHJvcHM9e1t7IGxhbmd1YWdlOiAnc3BhbmlzaCcgfSwgeyBsYW5ndWFnZTogJ3NwZWNpYWwnIH1dfVxuICAgICAgICAgICAgICAgICAgbWF0aE1sT3B0aW9ucz17bWF0aE1sT3B0aW9uc31cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIHtyYXRpb25hbGVFcnJvcnM/LltjaG9pY2UudmFsdWVdICYmIChcbiAgICAgICAgICAgICAgICAgIDxFcnJvclRleHQ+e3JhdGlvbmFsZUVycm9ycz8uW2Nob2ljZS52YWx1ZV19PC9FcnJvclRleHQ+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvUmF0aW9uYWxlSG9sZGVyPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvQ2hvaWNlQ29uZmlndXJhdGlvbkhvbGRlcj5cbiAgICAgICkpfVxuXG4gICAgICB7Y29ycmVjdFJlc3BvbnNlRXJyb3IgJiYgPEVycm9yVGV4dD57Y29ycmVjdFJlc3BvbnNlRXJyb3J9PC9FcnJvclRleHQ+fVxuICAgICAge2Fuc3dlckNob2ljZXNFcnJvciAmJiA8RXJyb3JUZXh0PnthbnN3ZXJDaG9pY2VzRXJyb3J9PC9FcnJvclRleHQ+fVxuXG4gICAgICB7YWRkQ2hvaWNlQnV0dG9uLnNldHRpbmdzICYmIChcbiAgICAgICAgPFN0eWxlZFRvb2x0aXAgdGl0bGU9e2FkZENob2ljZUJ1dHRvblRvb2x0aXB9PlxuICAgICAgICAgIHttYXhBbnN3ZXJDaG9pY2VzICYmIGNob2ljZXM/Lmxlbmd0aCA+PSBtYXhBbnN3ZXJDaG9pY2VzID8gKFxuICAgICAgICAgICAgPERpc2FibGVCdXR0b25cbiAgICAgICAgICAgICAgdmFyaWFudD1cImNvbnRhaW5lZFwiXG4gICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e29uQWRkQ2hvaWNlfVxuICAgICAgICAgICAgICBkaXNhYmxlZFxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7YWRkQ2hvaWNlQnV0dG9uLmxhYmVsfVxuICAgICAgICAgICAgPC9EaXNhYmxlQnV0dG9uPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8QWRkQnV0dG9uXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJjb250YWluZWRcIlxuICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICBvbkNsaWNrPXtvbkFkZENob2ljZX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2FkZENob2ljZUJ1dHRvbi5sYWJlbH1cbiAgICAgICAgICAgIDwvQWRkQnV0dG9uPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvU3R5bGVkVG9vbHRpcD5cbiAgICAgICl9XG4gICAgPC9sYXlvdXQuQ29uZmlnTGF5b3V0PlxuICApO1xufTtcblxuZXhwb3J0IGNsYXNzIE1haW4gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIG1vZGVsOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgY29uZmlndXJhdGlvbjogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgIGRpc2FibGVTaWRlUGFuZWw6IFByb3BUeXBlcy5ib29sLFxuICAgIG9uTW9kZWxDaGFuZ2VkOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgaW1hZ2VTdXBwb3J0OiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgYWRkOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgZGVsZXRlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIH0pLFxuICB9O1xuXG4gIHN0YXRlID0geyBzaG93V2FybmluZzogZmFsc2UgfTtcblxuICBvblJlbW92ZUNob2ljZSA9IChpbmRleCkgPT4ge1xuICAgIGNvbnN0IHsgbW9kZWwsIGNvbmZpZ3VyYXRpb24sIG9uTW9kZWxDaGFuZ2VkIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgbWluQW5zd2VyQ2hvaWNlcyB9ID0gY29uZmlndXJhdGlvbiB8fCB7fTtcblxuICAgIGlmIChtaW5BbnN3ZXJDaG9pY2VzICYmIG1vZGVsLmNob2ljZXMubGVuZ3RoID09PSBtaW5BbnN3ZXJDaG9pY2VzKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc2hvd1dhcm5pbmc6IHRydWUgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBtb2RlbC5jaG9pY2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgb25Nb2RlbENoYW5nZWQobW9kZWwpO1xuICB9O1xuXG4gIG9uQWRkQ2hvaWNlID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgbW9kZWwsIGNvbmZpZ3VyYXRpb24sIG9uTW9kZWxDaGFuZ2VkIH0gPSB0aGlzLnByb3BzO1xuICAgIGxldCB7IG1heEFuc3dlckNob2ljZXMgfSA9IGNvbmZpZ3VyYXRpb24gfHwge307XG4gICAgY29uc3QgeyBsaW1pdENob2ljZXNOdW1iZXIgfSA9IG1vZGVsIHx8IHt9O1xuXG4gICAgLy8gaWYgb2xkIHByb3BlcnR5IGlzIHVzZWQsIHNldCBtYXhBbnN3ZXJDaG9pY2VzIHRvIDlcbiAgICBpZiAobGltaXRDaG9pY2VzTnVtYmVyKSB7XG4gICAgICBtYXhBbnN3ZXJDaG9pY2VzID0gTUFYX0NIT0lDRVM7XG4gICAgfVxuXG4gICAgaWYgKG1heEFuc3dlckNob2ljZXMgJiYgbW9kZWwuY2hvaWNlcy5sZW5ndGggPj0gbWF4QW5zd2VyQ2hvaWNlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG1vZGVsLmNob2ljZXMucHVzaCh7XG4gICAgICBsYWJlbDogJycsXG4gICAgICB2YWx1ZTogdXRpbHMuZmlyc3RBdmFpbGFibGVJbmRleChcbiAgICAgICAgbW9kZWwuY2hvaWNlcy5tYXAoKGMpID0+IGMudmFsdWUpLFxuICAgICAgICAwLFxuICAgICAgKSxcbiAgICAgIGZlZWRiYWNrOiB7IHR5cGU6ICdub25lJyB9LFxuICAgIH0pO1xuXG4gICAgb25Nb2RlbENoYW5nZWQobW9kZWwpO1xuICB9O1xuXG4gIG9uQ2hvaWNlQ2hhbmdlZCA9IChpbmRleCwgY2hvaWNlKSA9PiB7XG4gICAgY29uc3QgeyBtb2RlbCwgb25Nb2RlbENoYW5nZWQgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBpZiAoY2hvaWNlLmNvcnJlY3QgJiYgbW9kZWwuY2hvaWNlTW9kZSA9PT0gJ3JhZGlvJykge1xuICAgICAgbW9kZWwuY2hvaWNlcyA9IG1vZGVsLmNob2ljZXMubWFwKChjKSA9PiBtZXJnZSh7fSwgYywgeyBjb3JyZWN0OiBmYWxzZSB9KSk7XG4gICAgfVxuXG4gICAgbW9kZWwuY2hvaWNlcy5zcGxpY2UoaW5kZXgsIDEsIGNob2ljZSk7XG4gICAgb25Nb2RlbENoYW5nZWQobW9kZWwpO1xuICB9O1xuXG4gIG9uUHJvbXB0Q2hhbmdlZCA9IChwcm9tcHQpID0+IHtcbiAgICB0aGlzLnByb3BzLm9uTW9kZWxDaGFuZ2VkKHtcbiAgICAgIC4uLnRoaXMucHJvcHMubW9kZWwsXG4gICAgICBwcm9tcHQsXG4gICAgfSk7XG4gIH07XG5cbiAgb25UZWFjaGVySW5zdHJ1Y3Rpb25zQ2hhbmdlZCA9ICh0ZWFjaGVySW5zdHJ1Y3Rpb25zKSA9PiB7XG4gICAgdGhpcy5wcm9wcy5vbk1vZGVsQ2hhbmdlZCh7XG4gICAgICAuLi50aGlzLnByb3BzLm1vZGVsLFxuICAgICAgdGVhY2hlckluc3RydWN0aW9ucyxcbiAgICB9KTtcbiAgfTtcblxuICBvbk1vZGVsQ2hhbmdlZCA9IChtb2RlbCwga2V5KSA9PiB7XG4gICAgY29uc3QgeyBvbk1vZGVsQ2hhbmdlZCB9ID0gdGhpcy5wcm9wcztcblxuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICBjYXNlICdjaG9pY2VNb2RlJzoge1xuICAgICAgICBsZXQgdmFsdWUgPSBtb2RlbC5jaG9pY2VNb2RlO1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICAgIGxldCBjb3JyZWN0Rm91bmQgPSBmYWxzZTtcblxuICAgICAgICAgIG1vZGVsLmNob2ljZXMgPSBtb2RlbC5jaG9pY2VzLm1hcCgoYykgPT4ge1xuICAgICAgICAgICAgaWYgKGNvcnJlY3RGb3VuZCkge1xuICAgICAgICAgICAgICBjLmNvcnJlY3QgPSBmYWxzZTtcblxuICAgICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGMuY29ycmVjdCkge1xuICAgICAgICAgICAgICBjb3JyZWN0Rm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9uTW9kZWxDaGFuZ2VkKG1vZGVsLCB0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIG9uTW9kZWxDaGFuZ2VkKG1vZGVsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGNvbmZpZ3VyYXRpb246IHsgbWluQW5zd2VyQ2hvaWNlcyB9ID0ge30gfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgeyBzaG93V2FybmluZyB9ID0gdGhpcy5zdGF0ZTtcblxuICAgIHJldHVybiAoXG4gICAgICA8UmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgIDxBbGVydERpYWxvZ1xuICAgICAgICAgIG9wZW49e3Nob3dXYXJuaW5nfVxuICAgICAgICAgIHRpdGxlPVwiV2FybmluZ1wiXG4gICAgICAgICAgdGV4dD17YFRoZXJlIGNhbid0IGJlIGxlc3MgdGhhbiAke21pbkFuc3dlckNob2ljZXMgfHwgMH0gY2hvaWNlcy5gfVxuICAgICAgICAgIG9uQ29uZmlybT17KCkgPT4gdGhpcy5zZXRTdGF0ZSh7IHNob3dXYXJuaW5nOiBmYWxzZSB9KX1cbiAgICAgICAgLz5cbiAgICAgICAgPERlc2lnblxuICAgICAgICAgIHsuLi50aGlzLnByb3BzfVxuICAgICAgICAgIG9uQ2hhbmdlTW9kZWw9e3RoaXMub25Nb2RlbENoYW5nZWR9XG4gICAgICAgICAgb25SZW1vdmVDaG9pY2U9e3RoaXMub25SZW1vdmVDaG9pY2V9XG4gICAgICAgICAgb25DaG9pY2VDaGFuZ2VkPXt0aGlzLm9uQ2hvaWNlQ2hhbmdlZH1cbiAgICAgICAgICBvbkFkZENob2ljZT17dGhpcy5vbkFkZENob2ljZX1cbiAgICAgICAgICBvblByb21wdENoYW5nZWQ9e3RoaXMub25Qcm9tcHRDaGFuZ2VkfVxuICAgICAgICAgIG9uVGVhY2hlckluc3RydWN0aW9uc0NoYW5nZWQ9e3RoaXMub25UZWFjaGVySW5zdHJ1Y3Rpb25zQ2hhbmdlZH1cbiAgICAgICAgLz5cbiAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYWluO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxVQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxhQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxTQUFBLEdBQUFKLE9BQUE7QUFRQSxJQUFBSyxTQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxPQUFBLEdBQUFQLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTyxRQUFBLEdBQUFSLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUSxXQUFBLEdBQUFULHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUyxJQUFBLEdBQUFWLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVSxLQUFBLEdBQUFYLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVyxNQUFBLEdBQUFaLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBWSxNQUFBLEdBQUFaLE9BQUE7QUFFQSxNQUFNO0VBQUVhLEtBQUs7RUFBRUMsTUFBTTtFQUFFQyxLQUFLO0VBQUVDO0FBQVMsQ0FBQyxHQUFHQyxrQkFBUTtBQUVuRCxNQUFNQyxXQUFXLEdBQUcsQ0FBQztBQUVyQixNQUFNQyxZQUFZLEdBQUcsSUFBQUMsY0FBTSxFQUFDQyx3QkFBYyxDQUFDLENBQUMsQ0FBQztFQUFFQztBQUFNLENBQUMsTUFBTTtFQUMxREMsS0FBSyxFQUFFLE1BQU07RUFDYkMsVUFBVSxFQUFFRixLQUFLLENBQUNHLE9BQU8sQ0FBQyxDQUFDLENBQUM7RUFDNUJDLFlBQVksRUFBRUosS0FBSyxDQUFDRyxPQUFPLENBQUMsQ0FBQztBQUMvQixDQUFDLENBQUMsQ0FBQztBQUVILE1BQU1FLGVBQWUsR0FBRyxJQUFBUCxjQUFNLEVBQUNDLHdCQUFjLENBQUMsQ0FBQyxDQUFDO0VBQUVDO0FBQU0sQ0FBQyxNQUFNO0VBQzdETSxJQUFJLEVBQUUsQ0FBQztFQUNQQyxTQUFTLEVBQUVQLEtBQUssQ0FBQ0csT0FBTyxDQUFDLEdBQUcsQ0FBQztFQUM3QkQsVUFBVSxFQUFFRixLQUFLLENBQUNHLE9BQU8sQ0FBQyxDQUFDLENBQUM7RUFDNUJLLFVBQVUsRUFBRVIsS0FBSyxDQUFDRyxPQUFPLENBQUMsR0FBRztBQUMvQixDQUFDLENBQUMsQ0FBQztBQUVILE1BQU1NLHlCQUF5QixHQUFHLElBQUFYLGNBQU0sRUFBQ0Msd0JBQWMsQ0FBQyxDQUFDLENBQUM7RUFBRUM7QUFBTSxDQUFDLE1BQU07RUFDdkVVLE9BQU8sRUFBRSxNQUFNO0VBQ2ZDLGFBQWEsRUFBRSxRQUFRO0VBQ3ZCUCxZQUFZLEVBQUVKLEtBQUssQ0FBQ0csT0FBTyxDQUFDLENBQUMsQ0FBQztFQUM5QkYsS0FBSyxFQUFFO0FBQ1QsQ0FBQyxDQUFDLENBQUM7QUFHSCxNQUFNVyxTQUFTLEdBQUcsSUFBQWQsY0FBTSxFQUFDZSxlQUFNLENBQUMsQ0FBQyxDQUFDO0VBQUViO0FBQU0sQ0FBQyxNQUFNO0VBQy9DTyxTQUFTLEVBQUVQLEtBQUssQ0FBQ0csT0FBTyxDQUFDLENBQUMsQ0FBQztFQUMzQlcsS0FBSyxFQUFFO0FBQ1QsQ0FBQyxDQUFDLENBQUM7QUFFSCxNQUFNQyxhQUFhLEdBQUcsSUFBQWpCLGNBQU0sRUFBQ2MsU0FBUyxDQUFDLENBQUM7RUFDdENJLE1BQU0sRUFBRSxhQUFhO0VBQ3JCQyxhQUFhLEVBQUUsS0FBSztFQUNwQkMsZUFBZSxFQUFFQyxlQUFLLENBQUNDLFFBQVEsQ0FBQyxDQUFDO0VBQ2pDLFNBQVMsRUFBRTtJQUNURixlQUFlLEVBQUVDLGVBQUssQ0FBQ0MsUUFBUSxDQUFDO0VBQ2xDLENBQUM7RUFDRCxTQUFTLEVBQUU7SUFDVEYsZUFBZSxFQUFFQyxlQUFLLENBQUNDLFFBQVEsQ0FBQztFQUNsQztBQUNGLENBQUMsQ0FBQztBQUVGLE1BQU1DLGFBQWEsR0FBRyxJQUFBdkIsY0FBTSxFQUFDd0IsWUFBRyxDQUFDLENBQUM7RUFDaENaLE9BQU8sRUFBRSxNQUFNO0VBQ2ZhLFVBQVUsRUFBRTtBQUNkLENBQUMsQ0FBQztBQUVGLE1BQU1DLFNBQVMsR0FBRyxJQUFBMUIsY0FBTSxFQUFDMkIsbUJBQVUsQ0FBQyxDQUFDLENBQUM7RUFBRXpCO0FBQU0sQ0FBQyxNQUFNO0VBQ25EMEIsUUFBUSxFQUFFMUIsS0FBSyxDQUFDMkIsVUFBVSxDQUFDRCxRQUFRLEdBQUcsQ0FBQztFQUN2Q0UsV0FBVyxFQUFFNUIsS0FBSyxDQUFDRyxPQUFPLENBQUMsQ0FBQztBQUM5QixDQUFDLENBQUMsQ0FBQztBQUVILE1BQU0wQixhQUFhLEdBQUcsSUFBQS9CLGNBQU0sRUFBQ2dDLGdCQUFPLENBQUMsQ0FBQyxDQUFDO0VBQUU5QjtBQUFNLENBQUMsTUFBTTtFQUNwRCx1QkFBdUIsRUFBRTtJQUN2QjBCLFFBQVEsRUFBRTFCLEtBQUssQ0FBQzJCLFVBQVUsQ0FBQ0QsUUFBUSxHQUFHLENBQUM7SUFDdkNLLFVBQVUsRUFBRSxLQUFLO0lBQ2pCQyxRQUFRLEVBQUU7RUFDWjtBQUNGLENBQUMsQ0FBQyxDQUFDO0FBRUgsTUFBTUMsU0FBUyxHQUFHLElBQUFuQyxjQUFNLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztFQUFFRTtBQUFNLENBQUMsTUFBTTtFQUM5QzBCLFFBQVEsRUFBRTFCLEtBQUssQ0FBQzJCLFVBQVUsQ0FBQ0QsUUFBUSxHQUFHLENBQUM7RUFDdkNQLEtBQUssRUFBRW5CLEtBQUssQ0FBQ2tDLE9BQU8sQ0FBQ0MsS0FBSyxDQUFDQyxJQUFJO0VBQy9CbEMsVUFBVSxFQUFFRixLQUFLLENBQUNHLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUMsQ0FBQyxDQUFDO0FBRUgsTUFBTWtDLE1BQU0sR0FBSUMsS0FBSyxJQUFLO0VBQ3hCLE1BQU07SUFDSkMsS0FBSztJQUNMQyxhQUFhO0lBQ2JDLGVBQWU7SUFDZkMsZUFBZTtJQUNmQyxjQUFjO0lBQ2RDLFdBQVc7SUFDWEMsWUFBWTtJQUNaQyxrQkFBa0I7SUFDbEJDLGFBQWE7SUFDYkMsc0JBQXNCO0lBQ3RCQztFQUNGLENBQUMsR0FBR1gsS0FBSztFQUVULE1BQU07SUFDSlksZUFBZSxHQUFHLENBQUMsQ0FBQztJQUNwQkMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2JDLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDakJDLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDZkMsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUNqQkMsY0FBYyxHQUFHLENBQUMsQ0FBQztJQUNuQkMsZUFBZSxHQUFHLENBQUMsQ0FBQztJQUNwQkMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCQyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7SUFDeEJDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDZEMsV0FBVyxHQUFHLENBQUMsQ0FBQztJQUNoQkMsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO0lBQzNCQyxxQkFBcUI7SUFDckJDLGFBQWE7SUFDYkMsVUFBVSxHQUFHLENBQUMsQ0FBQztJQUNmQyxXQUFXO0lBQ1hDLGFBQWEsR0FBRyxDQUFDLENBQUM7SUFDbEJDLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDbkJDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDWEMsVUFBVSxHQUFHLENBQUMsQ0FBQztJQUNmQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2JDLGVBQWUsR0FBRyxDQUFDO0VBQ3JCLENBQUMsR0FBR2pDLGFBQWEsSUFBSSxDQUFDLENBQUM7RUFDdkIsSUFBSTtJQUFFa0M7RUFBaUIsQ0FBQyxHQUFHbEMsYUFBYSxJQUFJLENBQUMsQ0FBQztFQUM5QyxNQUFNO0lBQ0ptQyxrQkFBa0I7SUFDbEJDLDBCQUEwQjtJQUMxQkMsZ0JBQWdCO0lBQ2hCQyxlQUFlO0lBQ2ZDLGFBQWE7SUFDYkMsaUJBQWlCO0lBQ2pCQyxPQUFPO0lBQ1BDLE1BQU07SUFDTkMscUJBQXFCO0lBQ3JCQztFQUNGLENBQUMsR0FBRzdDLEtBQUssSUFBSSxDQUFDLENBQUM7RUFFZixNQUFNO0lBQ0o4QyxhQUFhLEVBQUVDLGtCQUFrQjtJQUNqQ0wsT0FBTyxFQUFFTSxhQUFhO0lBQ3RCQyxlQUFlLEVBQUVDLG9CQUFvQjtJQUNyQ3BCLE1BQU0sRUFBRXFCLFdBQVc7SUFDbkI5QixTQUFTLEVBQUUrQixlQUFlO0lBQzFCakMsbUJBQW1CLEVBQUVrQztFQUN2QixDQUFDLEdBQUdWLE1BQU0sSUFBSSxDQUFDLENBQUM7RUFDaEIsTUFBTVcsb0JBQW9CLEdBQUdaLE9BQU8sRUFBRWEsTUFBTSxHQUFHQyxLQUFLLENBQUNDLElBQUksQ0FBQztJQUFFRixNQUFNLEVBQUViLE9BQU8sQ0FBQ2E7RUFBTyxDQUFDLEVBQUUsQ0FBQ0csQ0FBQyxFQUFFQyxDQUFDLEtBQUssR0FBR0EsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRTtFQUVoSCxNQUFNO0lBQUVDLHNCQUFzQixHQUFHLENBQUM7RUFBRSxDQUFDLEdBQUczRCxhQUFhO0VBQ3JELE1BQU00RCxXQUFXLEdBQUc7SUFDbEJDLFFBQVEsRUFBRWxCLHFCQUFxQixLQUFLLEtBQUssR0FBRyxLQUFLLEdBQUc7RUFDdEQsQ0FBQzs7RUFFRDtFQUNBLElBQUlSLGtCQUFrQixFQUFFO0lBQ3RCRCxnQkFBZ0IsR0FBRzlFLFdBQVc7RUFDaEM7RUFFQSxNQUFNMEcsY0FBYyxHQUFHQSxDQUFDaEUsS0FBSyxHQUFHLENBQUMsQ0FBQyxNQUFNO0lBQ3RDLEdBQUc2RCxzQkFBc0I7SUFDekIsR0FBRzdEO0VBQ0wsQ0FBQyxDQUFDO0VBRUYsTUFBTWlFLGlCQUFpQixHQUFHLElBQUFDLGdDQUF5QixFQUFDaEUsYUFBYSxDQUFDO0VBQ2xFLE1BQU1pRSxvQkFBb0IsR0FBR3RDLGFBQWEsSUFBSUEsYUFBYSxDQUFDRSxNQUFNO0VBQ2xFLE1BQU1xQyxxQkFBcUIsR0FBR3RDLGNBQWMsSUFBSUEsY0FBYyxDQUFDQyxNQUFNO0VBQ3JFLE1BQU1zQyxzQkFBc0IsR0FDMUJqQyxnQkFBZ0IsSUFBSU8sT0FBTyxFQUFFYSxNQUFNLElBQUlwQixnQkFBZ0IsR0FBRyxRQUFRQSxnQkFBZ0Isa0JBQWtCLEdBQUcsRUFBRTtFQUUzRyxNQUFNa0MsYUFBYSxHQUFHO0lBQ3BCdEQsVUFBVSxFQUFFQSxVQUFVLENBQUMzRCxRQUFRLElBQUlGLEtBQUssQ0FBQzZELFVBQVUsQ0FBQ3VELEtBQUssRUFBRSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqRixnQ0FBZ0MsRUFBRS9DLHNCQUFzQixDQUFDbkUsUUFBUSxJQUFJSCxNQUFNLENBQUNzRSxzQkFBc0IsQ0FBQytDLEtBQUssRUFBRSxJQUFJLENBQUM7SUFDL0d0RCxZQUFZLEVBQUVBLFlBQVksQ0FBQzVELFFBQVEsSUFBSUYsS0FBSyxDQUFDOEQsWUFBWSxDQUFDc0QsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3hGckQsY0FBYyxFQUFFQSxjQUFjLENBQUM3RCxRQUFRLElBQUlILE1BQU0sQ0FBQ2dFLGNBQWMsQ0FBQ3FELEtBQUssQ0FBQztJQUN2RXBELGVBQWUsRUFBRUEsZUFBZSxDQUFDOUQsUUFBUSxJQUFJSCxNQUFNLENBQUNpRSxlQUFlLENBQUNvRCxLQUFLLENBQUM7SUFDMUUvQixlQUFlLEVBQUUxQixRQUFRLENBQUN6RCxRQUFRLElBQUlILE1BQU0sQ0FBQzRELFFBQVEsQ0FBQ3lELEtBQUssQ0FBQztJQUM1RDdDLGFBQWEsRUFBRUEsYUFBYSxDQUFDckUsUUFBUSxJQUFJRCxRQUFRLENBQUNzRSxhQUFhLENBQUM2QyxLQUFLLEVBQUUsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzFHM0MsV0FBVyxFQUNURixhQUFhLENBQUNyRSxRQUFRLElBQ3RCNEMsS0FBSyxDQUFDeUIsYUFBYSxLQUFLLE1BQU0sSUFDOUI2QixvQkFBb0IsQ0FBQ0MsTUFBTSxHQUFHLENBQUMsSUFDL0JwRyxRQUFRLENBQUN3RSxXQUFXLENBQUMyQyxLQUFLLEVBQUVoQixvQkFBb0IsQ0FBQztJQUNuRCxrQkFBa0IsRUFBRXJCLFFBQVEsQ0FBQzdFLFFBQVEsSUFBSUgsTUFBTSxDQUFDZ0YsUUFBUSxDQUFDcUMsS0FBSyxFQUFFLElBQUksQ0FBQztJQUNyRXJDLFFBQVEsRUFBRUEsUUFBUSxDQUFDN0UsUUFBUSxJQUFJNkUsUUFBUSxDQUFDc0MsT0FBTyxJQUFJcEgsUUFBUSxDQUFDK0UsZUFBZSxDQUFDb0MsS0FBSyxFQUFFcEMsZUFBZSxDQUFDc0MsT0FBTztFQUM1RyxDQUFDO0VBRUQsTUFBTUMsZUFBZSxHQUFHO0lBQ3RCcEMsMEJBQTBCLEVBQUVsQixtQkFBbUIsQ0FBQy9ELFFBQVEsSUFBSUgsTUFBTSxDQUFDa0UsbUJBQW1CLENBQUNtRCxLQUFLLENBQUM7SUFDN0ZJLDBCQUEwQixFQUFFdEQsbUJBQW1CLENBQUNoRSxRQUFRLElBQUlILE1BQU0sQ0FBQ21FLG1CQUFtQixDQUFDa0QsS0FBSyxDQUFDO0lBQzdGOUIsYUFBYSxFQUFFVixNQUFNLENBQUMxRSxRQUFRLElBQUlILE1BQU0sQ0FBQzZFLE1BQU0sQ0FBQ3dDLEtBQUssQ0FBQztJQUN0RGhDLGdCQUFnQixFQUFFakIsU0FBUyxDQUFDakUsUUFBUSxJQUFJSCxNQUFNLENBQUNvRSxTQUFTLENBQUNpRCxLQUFLLENBQUM7SUFDL0Q3QixpQkFBaUIsRUFBRWYsVUFBVSxDQUFDdEUsUUFBUSxJQUFJSCxNQUFNLENBQUN5RSxVQUFVLENBQUM0QyxLQUFLLENBQUM7SUFDbEVoRCxXQUFXLEVBQUVBLFdBQVcsQ0FBQ2xFLFFBQVEsSUFBSUYsS0FBSyxDQUFDb0UsV0FBVyxDQUFDZ0QsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pGSyxhQUFhLEVBQUU1QyxVQUFVLEVBQUUzRSxRQUFRLElBQUlILE1BQU0sQ0FBQzhFLFVBQVUsRUFBRXVDLEtBQUs7RUFDakUsQ0FBQztFQUVELG9CQUNFckksTUFBQSxDQUFBMkksT0FBQSxDQUFBQyxhQUFBLENBQUN0SSxTQUFBLENBQUF1SSxNQUFNLENBQUNDLFlBQVk7SUFDbEJDLFVBQVUsRUFBRXBFLGlCQUFrQjtJQUM5QnFFLFlBQVksRUFBRXpELHFCQUFzQjtJQUNwQ3FCLGFBQWEsRUFBRUEsYUFBYztJQUM3QnFDLE9BQU8sRUFBRSxDQUFDLENBQUU7SUFDWjlILFFBQVEsZUFDTm5CLE1BQUEsQ0FBQTJJLE9BQUEsQ0FBQUMsYUFBQSxDQUFDN0gsS0FBSztNQUNKZ0QsS0FBSyxFQUFFQSxLQUFNO01BQ2JRLGFBQWEsRUFBRUEsYUFBYztNQUM3QlAsYUFBYSxFQUFFQSxhQUFjO01BQzdCa0YscUJBQXFCLEVBQUUxRSxzQkFBdUI7TUFDOUMyRSxNQUFNLEVBQUU7UUFDTkMsUUFBUSxFQUFFaEIsYUFBYTtRQUN2QmlCLFVBQVUsRUFBRWI7TUFDZDtJQUFFLENBQ0g7RUFDRixHQUVBcEMsMEJBQTBCLGlCQUN6QnBHLE1BQUEsQ0FBQTJJLE9BQUEsQ0FBQUMsYUFBQSxDQUFDdkgsWUFBWTtJQUFDZ0gsS0FBSyxFQUFFbkQsbUJBQW1CLENBQUNtRDtFQUFNLGdCQUMzQ3JJLE1BQUEsQ0FBQTJJLE9BQUEsQ0FBQUMsYUFBQSxDQUFDdkksYUFBQSxDQUFBc0ksT0FBWTtJQUNYVyxNQUFNLEVBQUV2RixLQUFLLENBQUNtQixtQkFBbUIsSUFBSSxFQUFHO0lBQ3hDcUUsUUFBUSxFQUFFOUUsNEJBQTZCO0lBQ3ZDSixZQUFZLEVBQUVBLFlBQWE7SUFDM0JtRixRQUFRLEVBQUUsS0FBTTtJQUNoQkMsZ0JBQWdCO0lBQ2hCOUYsS0FBSyxFQUFFeUQsd0JBQXlCO0lBQ2hDUSxXQUFXLEVBQUVBLFdBQVk7SUFDekI4QixXQUFXLEVBQUU1QixjQUFjLENBQUM5RCxhQUFhLEVBQUVrQixtQkFBbUIsRUFBRXlFLGtCQUFrQixDQUFFO0lBQ3BGbEUsVUFBVSxFQUFFZSxpQkFBa0I7SUFDOUJiLGFBQWEsRUFBR0EsYUFBYSxJQUFJQSxhQUFhLENBQUNULG1CQUFtQixJQUFLK0Msb0JBQXFCO0lBQzVGckMsY0FBYyxFQUFHQSxjQUFjLElBQUlBLGNBQWMsQ0FBQ1YsbUJBQW1CLElBQUtnRCxxQkFBc0I7SUFDaEc1RCxrQkFBa0IsRUFBRUEsa0JBQW1CO0lBQ3ZDc0YsdUJBQXVCLEVBQUUsQ0FBQztNQUFFNUQsUUFBUSxFQUFFO0lBQVUsQ0FBQyxFQUFFO01BQUVBLFFBQVEsRUFBRTtJQUFVLENBQUMsQ0FBRTtJQUM1RUQsYUFBYSxFQUFFQTtFQUFjLENBQzlCLENBQUMsRUFDRHFCLHdCQUF3QixpQkFBSXBILE1BQUEsQ0FBQTJJLE9BQUEsQ0FBQUMsYUFBQSxDQUFDbkYsU0FBUyxRQUFFMkQsd0JBQW9DLENBQ25FLENBQ2YsRUFFQWIsYUFBYSxpQkFDWnZHLE1BQUEsQ0FBQTJJLE9BQUEsQ0FBQUMsYUFBQSxDQUFDdkgsWUFBWTtJQUFDZ0gsS0FBSyxFQUFFeEMsTUFBTSxDQUFDd0M7RUFBTSxnQkFDOUJySSxNQUFBLENBQUEySSxPQUFBLENBQUFDLGFBQUEsQ0FBQ3ZJLGFBQUEsQ0FBQXNJLE9BQVk7SUFDWFcsTUFBTSxFQUFFdkYsS0FBSyxDQUFDOEIsTUFBTztJQUNyQjBELFFBQVEsRUFBRXRGLGVBQWdCO0lBQzFCSSxZQUFZLEVBQUVBLFlBQWE7SUFDM0JtRixRQUFRLEVBQUUsS0FBTTtJQUNoQkMsZ0JBQWdCO0lBQ2hCOUYsS0FBSyxFQUFFdUQsV0FBWTtJQUNuQlUsV0FBVyxFQUFFQSxXQUFZO0lBQ3pCOEIsV0FBVyxFQUFFNUIsY0FBYyxDQUFDOUQsYUFBYSxFQUFFNkIsTUFBTSxFQUFFOEQsa0JBQWtCLENBQUU7SUFDdkVsRSxVQUFVLEVBQUVlLGlCQUFrQjtJQUM5QmIsYUFBYSxFQUFFQSxhQUFhLElBQUlBLGFBQWEsQ0FBQ0UsTUFBTztJQUNyREQsY0FBYyxFQUFFQSxjQUFjLElBQUlBLGNBQWMsQ0FBQ0MsTUFBTztJQUN4RHZCLGtCQUFrQixFQUFFQSxrQkFBbUI7SUFDdkNzRix1QkFBdUIsRUFBRSxDQUFDO01BQUU1RCxRQUFRLEVBQUU7SUFBVSxDQUFDLEVBQUU7TUFBRUEsUUFBUSxFQUFFO0lBQVUsQ0FBQyxDQUFFO0lBQzVFRCxhQUFhLEVBQUVBO0VBQWMsQ0FDOUIsQ0FBQyxFQUNEbUIsV0FBVyxpQkFBSWxILE1BQUEsQ0FBQTJJLE9BQUEsQ0FBQUMsYUFBQSxDQUFDbkYsU0FBUyxRQUFFeUQsV0FBdUIsQ0FDekMsQ0FDZixlQUVEbEgsTUFBQSxDQUFBMkksT0FBQSxDQUFBQyxhQUFBLENBQUMvRixhQUFhLHFCQUNaN0MsTUFBQSxDQUFBMkksT0FBQSxDQUFBQyxhQUFBLENBQUM1RixTQUFTO0lBQUM2RyxTQUFTLEVBQUU7RUFBTSxHQUFDLFNBRWxCLENBQUMsZUFDWjdKLE1BQUEsQ0FBQTJJLE9BQUEsQ0FBQUMsYUFBQSxDQUFDdkYsYUFBYTtJQUNaeUcsb0JBQW9CO0lBQ3BCQyxvQkFBb0I7SUFDcEJDLFNBQVMsRUFBRSxPQUFRO0lBQ25CQyxLQUFLLEVBQUVsQztFQUFrQixnQkFFekIvSCxNQUFBLENBQUEySSxPQUFBLENBQUFDLGFBQUEsQ0FBQ2hJLEtBQUEsQ0FBQStILE9BQUk7SUFBQ3pGLFFBQVEsRUFBRSxPQUFRO0lBQUNQLEtBQUssRUFBRTtFQUFVLENBQUUsQ0FDL0IsQ0FDRixDQUFDLEVBRWY4RCxPQUFPLENBQUN5RCxHQUFHLENBQUMsQ0FBQ0MsTUFBTSxFQUFFQyxLQUFLLGtCQUN6QnBLLE1BQUEsQ0FBQTJJLE9BQUEsQ0FBQUMsYUFBQSxDQUFDM0cseUJBQXlCO0lBQUNvSSxHQUFHLEVBQUUsVUFBVUQsS0FBSztFQUFHLGdCQUNoRHBLLE1BQUEsQ0FBQTJJLE9BQUEsQ0FBQUMsYUFBQSxDQUFDdEksU0FBQSxDQUFBZ0ssbUJBQW1CO0lBQ2xCRCxHQUFHLEVBQUVELEtBQU07SUFDWEEsS0FBSyxFQUFFQSxLQUFLLEdBQUcsQ0FBRTtJQUNqQkcsaUJBQWlCLEVBQUV4RyxLQUFLLENBQUNnQixZQUFZLEtBQUssU0FBVTtJQUNwRHlGLElBQUksRUFBRXpHLEtBQUssQ0FBQ2UsVUFBVztJQUN2QjJGLElBQUksRUFBRU4sTUFBTztJQUNiTyxlQUFlLEVBQUUsQ0FBQyxDQUFFO0lBQ3BCckcsWUFBWSxFQUFFQSxZQUFhO0lBQzNCc0csNEJBQTRCLEVBQUUsSUFBSztJQUNuQ0MsUUFBUSxFQUFFQSxDQUFBLEtBQU16RyxjQUFjLENBQUNpRyxLQUFLLENBQUU7SUFDdENiLFFBQVEsRUFBR3NCLENBQUMsSUFBSzNHLGVBQWUsQ0FBQ2tHLEtBQUssRUFBRVMsQ0FBQyxDQUFFO0lBQzNDQyxhQUFhLEVBQUV4RSxlQUFnQjtJQUMvQnlFLFdBQVcsRUFBRWxHLFlBQVksQ0FBQzFELFFBQVM7SUFDbkM2SixRQUFRO0lBQ1JDLFVBQVUsRUFBRW5ELGNBQWMsQ0FBQzlELGFBQWEsRUFBRXlDLE9BQU8sRUFBRWtELGtCQUFrQixDQUFFO0lBQ3ZFL0IsV0FBVyxFQUFFQSxXQUFZO0lBQ3pCbkMsVUFBVSxFQUFFZSxpQkFBa0I7SUFDOUI3QyxLQUFLLEVBQUVvRCxhQUFhLEdBQUdvRCxNQUFNLENBQUNlLEtBQUssQ0FBQyxJQUFJLElBQUs7SUFDN0NDLG9CQUFvQixFQUFFbEUsb0JBQXFCO0lBQzNDdEIsYUFBYSxFQUFHQSxhQUFhLElBQUlBLGFBQWEsQ0FBQ2MsT0FBTyxJQUFLd0Isb0JBQXFCO0lBQ2hGckMsY0FBYyxFQUFHQSxjQUFjLElBQUlBLGNBQWMsQ0FBQ2EsT0FBTyxJQUFLeUIscUJBQXNCO0lBQ3BGNUQsa0JBQWtCLEVBQUVBLGtCQUFtQjtJQUN2Q3lCLGFBQWEsRUFBRUE7RUFBYyxDQUM5QixDQUFDLEVBRURNLGdCQUFnQixpQkFDZnJHLE1BQUEsQ0FBQTJJLE9BQUEsQ0FBQUMsYUFBQSxDQUFDL0csZUFBZTtJQUFDd0ksR0FBRyxFQUFFLGFBQWFELEtBQUssRUFBRztJQUFDL0IsS0FBSyxFQUFFakQsU0FBUyxDQUFDaUQ7RUFBTSxnQkFDL0RySSxNQUFBLENBQUEySSxPQUFBLENBQUFDLGFBQUEsQ0FBQ3ZJLGFBQUEsQ0FBQXNJLE9BQVk7SUFDWFcsTUFBTSxFQUFFYSxNQUFNLENBQUMvRSxTQUFTLElBQUksRUFBRztJQUMvQm1FLFFBQVEsRUFBR3NCLENBQUMsSUFBSzNHLGVBQWUsQ0FBQ2tHLEtBQUssRUFBRTtNQUFFLEdBQUdELE1BQU07TUFBRS9FLFNBQVMsRUFBRXlGO0lBQUUsQ0FBQyxDQUFFO0lBQ3JFeEcsWUFBWSxFQUFFQSxZQUFhO0lBQzNCVixLQUFLLEVBQUV3RCxlQUFlLEdBQUdnRCxNQUFNLENBQUNlLEtBQUssQ0FBQyxJQUFJLElBQUs7SUFDL0N0RCxXQUFXLEVBQUVBLFdBQVk7SUFDekI4QixXQUFXLEVBQUU1QixjQUFjLENBQUM5RCxhQUFhLEVBQUVvQixTQUFTLEVBQUV1RSxrQkFBa0IsQ0FBRTtJQUMxRWxFLFVBQVUsRUFBRWUsaUJBQWtCO0lBQzlCYixhQUFhLEVBQUdBLGFBQWEsSUFBSUEsYUFBYSxDQUFDUCxTQUFTLElBQUs2QyxvQkFBcUI7SUFDbEZyQyxjQUFjLEVBQUdBLGNBQWMsSUFBSUEsY0FBYyxDQUFDUixTQUFTLElBQUs4QyxxQkFBc0I7SUFDdEY1RCxrQkFBa0IsRUFBRUEsa0JBQW1CO0lBQ3ZDc0YsdUJBQXVCLEVBQUUsQ0FBQztNQUFFNUQsUUFBUSxFQUFFO0lBQVUsQ0FBQyxFQUFFO01BQUVBLFFBQVEsRUFBRTtJQUFVLENBQUMsQ0FBRTtJQUM1RUQsYUFBYSxFQUFFQTtFQUFjLENBQzlCLENBQUMsRUFDRG9CLGVBQWUsR0FBR2dELE1BQU0sQ0FBQ2UsS0FBSyxDQUFDLGlCQUM5QmxMLE1BQUEsQ0FBQTJJLE9BQUEsQ0FBQUMsYUFBQSxDQUFDbkYsU0FBUyxRQUFFMEQsZUFBZSxHQUFHZ0QsTUFBTSxDQUFDZSxLQUFLLENBQWEsQ0FFNUMsQ0FFTSxDQUM1QixDQUFDLEVBRURqRSxvQkFBb0IsaUJBQUlqSCxNQUFBLENBQUEySSxPQUFBLENBQUFDLGFBQUEsQ0FBQ25GLFNBQVMsUUFBRXdELG9CQUFnQyxDQUFDLEVBQ3JFSCxrQkFBa0IsaUJBQUk5RyxNQUFBLENBQUEySSxPQUFBLENBQUFDLGFBQUEsQ0FBQ25GLFNBQVMsUUFBRXFELGtCQUE4QixDQUFDLEVBRWpFcEMsZUFBZSxDQUFDdkQsUUFBUSxpQkFDdkJuQixNQUFBLENBQUEySSxPQUFBLENBQUFDLGFBQUEsQ0FBQ3ZGLGFBQWE7SUFBQzRHLEtBQUssRUFBRTlCO0VBQXVCLEdBQzFDakMsZ0JBQWdCLElBQUlPLE9BQU8sRUFBRWEsTUFBTSxJQUFJcEIsZ0JBQWdCLGdCQUN0RGxHLE1BQUEsQ0FBQTJJLE9BQUEsQ0FBQUMsYUFBQSxDQUFDckcsYUFBYTtJQUNaNkksT0FBTyxFQUFDLFdBQVc7SUFDbkJ6SSxLQUFLLEVBQUMsU0FBUztJQUNmMEksT0FBTyxFQUFFakgsV0FBWTtJQUNyQnhCLFFBQVE7RUFBQSxHQUVQOEIsZUFBZSxDQUFDMkQsS0FDSixDQUFDLGdCQUVoQnJJLE1BQUEsQ0FBQTJJLE9BQUEsQ0FBQUMsYUFBQSxDQUFDeEcsU0FBUztJQUNSZ0osT0FBTyxFQUFDLFdBQVc7SUFDbkJ6SSxLQUFLLEVBQUMsU0FBUztJQUNmMEksT0FBTyxFQUFFakg7RUFBWSxHQUVwQk0sZUFBZSxDQUFDMkQsS0FDUixDQUVBLENBRUUsQ0FBQztBQUUxQixDQUFDO0FBRU0sTUFBTWlELElBQUksU0FBU0MsY0FBSyxDQUFDQyxTQUFTLENBQUM7RUFBQUMsWUFBQSxHQUFBQyxJQUFBO0lBQUEsU0FBQUEsSUFBQTtJQUFBLElBQUFDLGdCQUFBLENBQUFoRCxPQUFBLGlCQWFoQztNQUFFaUQsV0FBVyxFQUFFO0lBQU0sQ0FBQztJQUFBLElBQUFELGdCQUFBLENBQUFoRCxPQUFBLDBCQUVaeUIsS0FBSyxJQUFLO01BQzFCLE1BQU07UUFBRXJHLEtBQUs7UUFBRUMsYUFBYTtRQUFFNkg7TUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDL0gsS0FBSztNQUMzRCxNQUFNO1FBQUVnSTtNQUFpQixDQUFDLEdBQUc5SCxhQUFhLElBQUksQ0FBQyxDQUFDO01BRWhELElBQUk4SCxnQkFBZ0IsSUFBSS9ILEtBQUssQ0FBQzBDLE9BQU8sQ0FBQ2EsTUFBTSxLQUFLd0UsZ0JBQWdCLEVBQUU7UUFDakUsSUFBSSxDQUFDQyxRQUFRLENBQUM7VUFBRUgsV0FBVyxFQUFFO1FBQUssQ0FBQyxDQUFDO1FBRXBDO01BQ0Y7TUFFQTdILEtBQUssQ0FBQzBDLE9BQU8sQ0FBQ3VGLE1BQU0sQ0FBQzVCLEtBQUssRUFBRSxDQUFDLENBQUM7TUFDOUJ5QixjQUFjLENBQUM5SCxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUFBLElBQUE0SCxnQkFBQSxDQUFBaEQsT0FBQSx1QkFFYSxNQUFNO01BQ2xCLE1BQU07UUFBRTVFLEtBQUs7UUFBRUMsYUFBYTtRQUFFNkg7TUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDL0gsS0FBSztNQUMzRCxJQUFJO1FBQUVvQztNQUFpQixDQUFDLEdBQUdsQyxhQUFhLElBQUksQ0FBQyxDQUFDO01BQzlDLE1BQU07UUFBRW1DO01BQW1CLENBQUMsR0FBR3BDLEtBQUssSUFBSSxDQUFDLENBQUM7O01BRTFDO01BQ0EsSUFBSW9DLGtCQUFrQixFQUFFO1FBQ3RCRCxnQkFBZ0IsR0FBRzlFLFdBQVc7TUFDaEM7TUFFQSxJQUFJOEUsZ0JBQWdCLElBQUluQyxLQUFLLENBQUMwQyxPQUFPLENBQUNhLE1BQU0sSUFBSXBCLGdCQUFnQixFQUFFO1FBQ2hFO01BQ0Y7TUFFQW5DLEtBQUssQ0FBQzBDLE9BQU8sQ0FBQ3dGLElBQUksQ0FBQztRQUNqQjVELEtBQUssRUFBRSxFQUFFO1FBQ1Q2QyxLQUFLLEVBQUVnQixxQkFBSyxDQUFDQyxtQkFBbUIsQ0FDOUJwSSxLQUFLLENBQUMwQyxPQUFPLENBQUN5RCxHQUFHLENBQUVXLENBQUMsSUFBS0EsQ0FBQyxDQUFDSyxLQUFLLENBQUMsRUFDakMsQ0FDRixDQUFDO1FBQ0R0RyxRQUFRLEVBQUU7VUFBRXdILElBQUksRUFBRTtRQUFPO01BQzNCLENBQUMsQ0FBQztNQUVGUCxjQUFjLENBQUM5SCxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUFBLElBQUE0SCxnQkFBQSxDQUFBaEQsT0FBQSwyQkFFaUIsQ0FBQ3lCLEtBQUssRUFBRUQsTUFBTSxLQUFLO01BQ25DLE1BQU07UUFBRXBHLEtBQUs7UUFBRThIO01BQWUsQ0FBQyxHQUFHLElBQUksQ0FBQy9ILEtBQUs7TUFFNUMsSUFBSXFHLE1BQU0sQ0FBQ2tDLE9BQU8sSUFBSXRJLEtBQUssQ0FBQ2UsVUFBVSxLQUFLLE9BQU8sRUFBRTtRQUNsRGYsS0FBSyxDQUFDMEMsT0FBTyxHQUFHMUMsS0FBSyxDQUFDMEMsT0FBTyxDQUFDeUQsR0FBRyxDQUFFVyxDQUFDLElBQUssSUFBQXlCLGNBQUssRUFBQyxDQUFDLENBQUMsRUFBRXpCLENBQUMsRUFBRTtVQUFFd0IsT0FBTyxFQUFFO1FBQU0sQ0FBQyxDQUFDLENBQUM7TUFDNUU7TUFFQXRJLEtBQUssQ0FBQzBDLE9BQU8sQ0FBQ3VGLE1BQU0sQ0FBQzVCLEtBQUssRUFBRSxDQUFDLEVBQUVELE1BQU0sQ0FBQztNQUN0QzBCLGNBQWMsQ0FBQzlILEtBQUssQ0FBQztJQUN2QixDQUFDO0lBQUEsSUFBQTRILGdCQUFBLENBQUFoRCxPQUFBLDJCQUVrQjlDLE1BQU0sSUFBSztNQUM1QixJQUFJLENBQUMvQixLQUFLLENBQUMrSCxjQUFjLENBQUM7UUFDeEIsR0FBRyxJQUFJLENBQUMvSCxLQUFLLENBQUNDLEtBQUs7UUFDbkI4QjtNQUNGLENBQUMsQ0FBQztJQUNKLENBQUM7SUFBQSxJQUFBOEYsZ0JBQUEsQ0FBQWhELE9BQUEsd0NBRStCekQsbUJBQW1CLElBQUs7TUFDdEQsSUFBSSxDQUFDcEIsS0FBSyxDQUFDK0gsY0FBYyxDQUFDO1FBQ3hCLEdBQUcsSUFBSSxDQUFDL0gsS0FBSyxDQUFDQyxLQUFLO1FBQ25CbUI7TUFDRixDQUFDLENBQUM7SUFDSixDQUFDO0lBQUEsSUFBQXlHLGdCQUFBLENBQUFoRCxPQUFBLDBCQUVnQixDQUFDNUUsS0FBSyxFQUFFc0csR0FBRyxLQUFLO01BQy9CLE1BQU07UUFBRXdCO01BQWUsQ0FBQyxHQUFHLElBQUksQ0FBQy9ILEtBQUs7TUFFckMsUUFBUXVHLEdBQUc7UUFDVCxLQUFLLFlBQVk7VUFBRTtZQUNqQixJQUFJYSxLQUFLLEdBQUduSCxLQUFLLENBQUNlLFVBQVU7WUFFNUIsSUFBSW9HLEtBQUssS0FBSyxPQUFPLEVBQUU7Y0FDckIsSUFBSXFCLFlBQVksR0FBRyxLQUFLO2NBRXhCeEksS0FBSyxDQUFDMEMsT0FBTyxHQUFHMUMsS0FBSyxDQUFDMEMsT0FBTyxDQUFDeUQsR0FBRyxDQUFFVyxDQUFDLElBQUs7Z0JBQ3ZDLElBQUkwQixZQUFZLEVBQUU7a0JBQ2hCMUIsQ0FBQyxDQUFDd0IsT0FBTyxHQUFHLEtBQUs7a0JBRWpCLE9BQU94QixDQUFDO2dCQUNWO2dCQUVBLElBQUlBLENBQUMsQ0FBQ3dCLE9BQU8sRUFBRTtrQkFDYkUsWUFBWSxHQUFHLElBQUk7Z0JBQ3JCO2dCQUVBLE9BQU8xQixDQUFDO2NBQ1YsQ0FBQyxDQUFDO1lBQ0o7WUFFQWdCLGNBQWMsQ0FBQzlILEtBQUssRUFBRSxJQUFJLENBQUM7WUFDM0I7VUFDRjtRQUVBO1VBQ0U4SCxjQUFjLENBQUM5SCxLQUFLLENBQUM7VUFDckI7TUFDSjtJQUNGLENBQUM7RUFBQTtFQUVEeUksTUFBTUEsQ0FBQSxFQUFHO0lBQ1AsTUFBTTtNQUFFeEksYUFBYSxFQUFFO1FBQUU4SDtNQUFpQixDQUFDLEdBQUcsQ0FBQztJQUFFLENBQUMsR0FBRyxJQUFJLENBQUNoSSxLQUFLO0lBQy9ELE1BQU07TUFBRThIO0lBQVksQ0FBQyxHQUFHLElBQUksQ0FBQ2EsS0FBSztJQUVsQyxvQkFDRXpNLE1BQUEsQ0FBQTJJLE9BQUEsQ0FBQUMsYUFBQSxDQUFDNUksTUFBQSxDQUFBMkksT0FBSyxDQUFDK0QsUUFBUSxxQkFDYjFNLE1BQUEsQ0FBQTJJLE9BQUEsQ0FBQUMsYUFBQSxDQUFDdEksU0FBQSxDQUFBcU0sV0FBVztNQUNWQyxJQUFJLEVBQUVoQixXQUFZO01BQ2xCM0IsS0FBSyxFQUFDLFNBQVM7TUFDZjRDLElBQUksRUFBRSw0QkFBNEJmLGdCQUFnQixJQUFJLENBQUMsV0FBWTtNQUNuRWdCLFNBQVMsRUFBRUEsQ0FBQSxLQUFNLElBQUksQ0FBQ2YsUUFBUSxDQUFDO1FBQUVILFdBQVcsRUFBRTtNQUFNLENBQUM7SUFBRSxDQUN4RCxDQUFDLGVBQ0Y1TCxNQUFBLENBQUEySSxPQUFBLENBQUFDLGFBQUEsQ0FBQy9FLE1BQU0sTUFBQWtKLFNBQUEsQ0FBQXBFLE9BQUEsTUFDRCxJQUFJLENBQUM3RSxLQUFLO01BQ2RTLGFBQWEsRUFBRSxJQUFJLENBQUNzSCxjQUFlO01BQ25DMUgsY0FBYyxFQUFFLElBQUksQ0FBQ0EsY0FBZTtNQUNwQ0QsZUFBZSxFQUFFLElBQUksQ0FBQ0EsZUFBZ0I7TUFDdENFLFdBQVcsRUFBRSxJQUFJLENBQUNBLFdBQVk7TUFDOUJILGVBQWUsRUFBRSxJQUFJLENBQUNBLGVBQWdCO01BQ3RDUSw0QkFBNEIsRUFBRSxJQUFJLENBQUNBO0lBQTZCLEVBQ2pFLENBQ2EsQ0FBQztFQUVyQjtBQUNGO0FBQUN1SSxPQUFBLENBQUExQixJQUFBLEdBQUFBLElBQUE7QUFBQSxJQUFBSyxnQkFBQSxDQUFBaEQsT0FBQSxFQTNJWTJDLElBQUksZUFDSTtFQUNqQnZILEtBQUssRUFBRWtKLGtCQUFTLENBQUNDLE1BQU0sQ0FBQ0MsVUFBVTtFQUNsQ25KLGFBQWEsRUFBRWlKLGtCQUFTLENBQUNDLE1BQU0sQ0FBQ0MsVUFBVTtFQUMxQ0MsZ0JBQWdCLEVBQUVILGtCQUFTLENBQUNJLElBQUk7RUFDaEN4QixjQUFjLEVBQUVvQixrQkFBUyxDQUFDSyxJQUFJLENBQUNILFVBQVU7RUFDekMzSSxzQkFBc0IsRUFBRXlJLGtCQUFTLENBQUNLLElBQUksQ0FBQ0gsVUFBVTtFQUNqRDlJLFlBQVksRUFBRTRJLGtCQUFTLENBQUNNLEtBQUssQ0FBQztJQUM1QkMsR0FBRyxFQUFFUCxrQkFBUyxDQUFDSyxJQUFJLENBQUNILFVBQVU7SUFDOUJNLE1BQU0sRUFBRVIsa0JBQVMsQ0FBQ0ssSUFBSSxDQUFDSDtFQUN6QixDQUFDO0FBQ0gsQ0FBQztBQUFBLElBQUFPLFFBQUEsR0FBQVYsT0FBQSxDQUFBckUsT0FBQSxHQWtJWTJDLElBQUkiLCJpZ25vcmVMaXN0IjpbXX0=