@pie-lib/plot 2.27.3-next.2 → 2.27.4-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/root.js CHANGED
@@ -1,84 +1,131 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports["default"] = exports.Root = void 0;
9
-
10
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
-
12
9
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
-
14
10
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
15
-
16
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
17
-
18
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
19
-
20
11
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
21
-
22
12
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
23
-
13
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
24
14
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
25
-
26
15
  var _react = _interopRequireDefault(require("react"));
27
-
28
- var _styles = require("@material-ui/core/styles");
29
-
16
+ var _styles = require("@mui/material/styles");
30
17
  var _propTypes = _interopRequireDefault(require("prop-types"));
31
-
32
18
  var _d3Selection = require("d3-selection");
33
-
34
- var _classnames = _interopRequireDefault(require("classnames"));
35
-
36
19
  var _renderUi = require("@pie-lib/render-ui");
37
-
38
20
  var _editableHtml = _interopRequireDefault(require("@pie-lib/editable-html"));
39
-
40
21
  var _types = require("./types");
41
-
42
22
  var _label = _interopRequireDefault(require("./label"));
43
-
44
23
  var _utils = require("./utils");
45
-
46
- function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
47
-
48
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
49
-
50
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
51
-
52
- 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; }
53
-
54
- 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; }
55
-
56
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
57
-
58
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
59
-
60
- var Root = /*#__PURE__*/function (_React$Component) {
61
- (0, _inherits2["default"])(Root, _React$Component);
62
-
63
- var _super = _createSuper(Root);
64
-
24
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
25
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
26
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
27
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
28
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
29
+ function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
30
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
31
+ var StyledRoot = (0, _styles.styled)('div')(function (_ref) {
32
+ var theme = _ref.theme;
33
+ return {
34
+ border: "solid 1px ".concat(_renderUi.color.primaryLight()),
35
+ color: _renderUi.color.defaults.TEXT,
36
+ backgroundColor: theme.palette.common.white,
37
+ touchAction: 'none',
38
+ position: 'relative',
39
+ boxSizing: 'unset' // to override the default border-box in IBX that breaks the component width layout
40
+ };
41
+ });
42
+ var Wrapper = (0, _styles.styled)('div')({
43
+ display: 'flex',
44
+ position: 'relative'
45
+ });
46
+ var DefineChartSvg = (0, _styles.styled)('svg')({
47
+ paddingLeft: '50px',
48
+ overflow: 'visible'
49
+ });
50
+ var ChartSvg = (0, _styles.styled)('svg')({
51
+ overflow: 'visible'
52
+ });
53
+ var GraphBox = (0, _styles.styled)('g')({
54
+ cursor: 'pointer',
55
+ userSelect: 'none'
56
+ });
57
+ var GraphTitle = (0, _styles.styled)('div')(function (_ref2) {
58
+ var theme = _ref2.theme;
59
+ return {
60
+ color: _renderUi.color.defaults.TEXT,
61
+ fontSize: theme.typography.fontSize + 2,
62
+ padding: "".concat(theme.spacing(1.5), " ").concat(theme.spacing(0.5), " 0"),
63
+ textAlign: 'center',
64
+ '&.disabled': {
65
+ pointerEvents: 'none'
66
+ },
67
+ '&.rightMargin': {
68
+ marginRight: '74px'
69
+ }
70
+ };
71
+ });
72
+ var ChartTitle = (0, _styles.styled)('div')(function (_ref3) {
73
+ var theme = _ref3.theme;
74
+ return {
75
+ color: _renderUi.color.defaults.TEXT,
76
+ fontSize: theme.typography.fontSize + 4,
77
+ padding: "".concat(theme.spacing(1.5), " ").concat(theme.spacing(0.5), " 0"),
78
+ textAlign: 'center',
79
+ '&.disabled': {
80
+ pointerEvents: 'none'
81
+ },
82
+ '&.rightMargin': {
83
+ marginRight: '74px'
84
+ }
85
+ };
86
+ });
87
+ var TopPixelGuides = (0, _styles.styled)('div')({
88
+ display: 'flex',
89
+ paddingTop: '6px'
90
+ });
91
+ var TopPixelIndicator = (0, _styles.styled)('div')({
92
+ display: 'flex',
93
+ flexDirection: 'column',
94
+ alignItems: 'center',
95
+ width: '100px',
96
+ pointerEvents: 'none',
97
+ userSelect: 'none'
98
+ });
99
+ var SidePixelGuides = (0, _styles.styled)('div')({
100
+ width: '70px',
101
+ display: 'flex',
102
+ flexDirection: 'column',
103
+ marginRight: '6px'
104
+ });
105
+ var SidePixelIndicator = (0, _styles.styled)('div')({
106
+ textAlign: 'right',
107
+ height: '20px',
108
+ pointerEvents: 'none',
109
+ userSelect: 'none',
110
+ '&:not(:last-child)': {
111
+ marginBottom: '80px'
112
+ }
113
+ });
114
+ var Root = exports.Root = /*#__PURE__*/function (_React$Component) {
65
115
  function Root(props) {
66
116
  var _this;
67
-
68
117
  (0, _classCallCheck2["default"])(this, Root);
69
- _this = _super.call(this, props);
70
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "mouseMove", function (g) {
118
+ _this = _callSuper(this, Root, [props]);
119
+ (0, _defineProperty2["default"])(_this, "mouseMove", function (g) {
71
120
  var _this$props = _this.props,
72
- graphProps = _this$props.graphProps,
73
- onMouseMove = _this$props.onMouseMove;
74
-
121
+ graphProps = _this$props.graphProps,
122
+ onMouseMove = _this$props.onMouseMove;
75
123
  if (!onMouseMove) {
76
124
  return;
77
125
  }
78
-
79
126
  var scale = graphProps.scale,
80
- snap = graphProps.snap;
81
- var coords = (0, _d3Selection.mouse)(g._groups[0][0]);
127
+ snap = graphProps.snap;
128
+ var coords = (0, _d3Selection.mouse)(g.node());
82
129
  var x = scale.x.invert(coords[0]);
83
130
  var y = scale.y.invert(coords[1]);
84
131
  var snapped = {
@@ -87,62 +134,55 @@ var Root = /*#__PURE__*/function (_React$Component) {
87
134
  };
88
135
  onMouseMove(snapped);
89
136
  });
90
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onChangeLabel", function (newValue, side) {
137
+ (0, _defineProperty2["default"])(_this, "onChangeLabel", function (newValue, side) {
91
138
  var _this$props2 = _this.props,
92
- labels = _this$props2.labels,
93
- onChangeLabels = _this$props2.onChangeLabels,
94
- isChart = _this$props2.isChart;
95
-
139
+ labels = _this$props2.labels,
140
+ onChangeLabels = _this$props2.onChangeLabels,
141
+ isChart = _this$props2.isChart;
96
142
  if (!onChangeLabels) {
97
143
  return;
98
144
  }
99
-
100
145
  if (isChart) {
101
146
  if (side === 'left') {
102
147
  onChangeLabels('range', newValue);
103
148
  } else {
104
149
  onChangeLabels('domain', newValue);
105
150
  }
106
-
107
151
  return;
108
152
  }
109
-
110
153
  onChangeLabels(_objectSpread(_objectSpread({}, labels), {}, (0, _defineProperty2["default"])({}, side, newValue)));
111
154
  });
112
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "measureTitleHeight", function () {
155
+ (0, _defineProperty2["default"])(_this, "measureTitleHeight", function () {
113
156
  var titleElement = _this.titleRef;
114
-
115
157
  if (titleElement) {
116
158
  var titleHeight = titleElement.clientHeight;
117
-
118
159
  _this.setState({
119
160
  titleHeight: titleHeight,
120
161
  prevTitle: _this.props.title
121
162
  });
122
-
123
163
  if (!_this.resizeObserver && typeof ResizeObserver !== 'undefined') {
124
164
  _this.setupVisibilityObserver();
125
165
  }
126
166
  }
127
167
  });
128
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleKeyDown", function () {
168
+ (0, _defineProperty2["default"])(_this, "handleKeyDown", function () {
129
169
  setTimeout(function () {
130
170
  _this.measureTitleHeight();
131
171
  }, 0);
132
172
  });
133
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "setupVisibilityObserver", function () {
173
+ // handle edge case where chart is hidden with display:none and then shown with display:block
174
+ (0, _defineProperty2["default"])(_this, "setupVisibilityObserver", function () {
134
175
  if (typeof ResizeObserver !== 'undefined' && _this.titleRef) {
135
176
  _this.resizeObserver = new ResizeObserver(function (entries) {
136
177
  var _iterator = _createForOfIteratorHelper(entries),
137
- _step;
138
-
178
+ _step;
139
179
  try {
140
180
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
141
181
  var entry = _step.value;
142
182
  var _entry$contentRect = entry.contentRect,
143
- width = _entry$contentRect.width,
144
- height = _entry$contentRect.height; // trigger if element becomes visible and we haven't measured this height yet
145
-
183
+ width = _entry$contentRect.width,
184
+ height = _entry$contentRect.height;
185
+ // trigger if element becomes visible and we haven't measured this height yet
146
186
  if (width > 0 && height > 0) {
147
187
  setTimeout(function () {
148
188
  _this.measureTitleHeight();
@@ -156,14 +196,12 @@ var Root = /*#__PURE__*/function (_React$Component) {
156
196
  _iterator.f();
157
197
  }
158
198
  });
159
-
160
199
  _this.resizeObserver.observe(_this.titleRef);
161
200
  }
162
201
  });
163
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "cleanupVisibilityObserver", function () {
202
+ (0, _defineProperty2["default"])(_this, "cleanupVisibilityObserver", function () {
164
203
  if (_this.resizeObserver) {
165
204
  _this.resizeObserver.disconnect();
166
-
167
205
  _this.resizeObserver = null;
168
206
  }
169
207
  });
@@ -173,8 +211,8 @@ var Root = /*#__PURE__*/function (_React$Component) {
173
211
  _this.resizeObserver = null;
174
212
  return _this;
175
213
  }
176
-
177
- (0, _createClass2["default"])(Root, [{
214
+ (0, _inherits2["default"])(Root, _React$Component);
215
+ return (0, _createClass2["default"])(Root, [{
178
216
  key: "componentDidMount",
179
217
  value: function componentDidMount() {
180
218
  var g = (0, _d3Selection.select)(this.g);
@@ -200,50 +238,46 @@ var Root = /*#__PURE__*/function (_React$Component) {
200
238
  key: "render",
201
239
  value: function render() {
202
240
  var _this2 = this;
203
-
204
241
  var _this$props3 = this.props,
205
- disabledTitle = _this$props3.disabledTitle,
206
- disabledLabels = _this$props3.disabledLabels,
207
- labels = _this$props3.labels,
208
- labelsPlaceholders = _this$props3.labelsPlaceholders,
209
- titlePlaceholder = _this$props3.titlePlaceholder,
210
- graphProps = _this$props3.graphProps,
211
- children = _this$props3.children,
212
- classes = _this$props3.classes,
213
- defineChart = _this$props3.defineChart,
214
- onChangeTitle = _this$props3.onChangeTitle,
215
- isChart = _this$props3.isChart,
216
- showLabels = _this$props3.showLabels,
217
- showPixelGuides = _this$props3.showPixelGuides,
218
- showTitle = _this$props3.showTitle,
219
- title = _this$props3.title,
220
- rootRef = _this$props3.rootRef,
221
- _this$props3$mathMlOp = _this$props3.mathMlOptions,
222
- mathMlOptions = _this$props3$mathMlOp === void 0 ? {} : _this$props3$mathMlOp,
223
- labelsCharactersLimit = _this$props3.labelsCharactersLimit;
242
+ disabledTitle = _this$props3.disabledTitle,
243
+ disabledLabels = _this$props3.disabledLabels,
244
+ labels = _this$props3.labels,
245
+ labelsPlaceholders = _this$props3.labelsPlaceholders,
246
+ titlePlaceholder = _this$props3.titlePlaceholder,
247
+ graphProps = _this$props3.graphProps,
248
+ children = _this$props3.children,
249
+ defineChart = _this$props3.defineChart,
250
+ onChangeTitle = _this$props3.onChangeTitle,
251
+ isChart = _this$props3.isChart,
252
+ showLabels = _this$props3.showLabels,
253
+ showPixelGuides = _this$props3.showPixelGuides,
254
+ showTitle = _this$props3.showTitle,
255
+ title = _this$props3.title,
256
+ rootRef = _this$props3.rootRef,
257
+ _this$props3$mathMlOp = _this$props3.mathMlOptions,
258
+ mathMlOptions = _this$props3$mathMlOp === void 0 ? {} : _this$props3$mathMlOp,
259
+ labelsCharactersLimit = _this$props3.labelsCharactersLimit;
224
260
  var _graphProps$size = graphProps.size,
225
- _graphProps$size$widt = _graphProps$size.width,
226
- width = _graphProps$size$widt === void 0 ? 500 : _graphProps$size$widt,
227
- _graphProps$size$heig = _graphProps$size.height,
228
- height = _graphProps$size$heig === void 0 ? 500 : _graphProps$size$heig,
229
- domain = graphProps.domain,
230
- range = graphProps.range;
261
+ _graphProps$size$widt = _graphProps$size.width,
262
+ width = _graphProps$size$widt === void 0 ? 500 : _graphProps$size$widt,
263
+ _graphProps$size$heig = _graphProps$size.height,
264
+ height = _graphProps$size$heig === void 0 ? 500 : _graphProps$size$heig,
265
+ domain = graphProps.domain,
266
+ range = graphProps.range;
231
267
  var topPadding = 40;
232
268
  var leftPadding = (0, _utils.isEmptyString)((0, _utils.extractTextFromHTML)(labels === null || labels === void 0 ? void 0 : labels.left)) && (0, _utils.isEmptyObject)(labelsPlaceholders) ? 48 : 70;
233
269
  var rightPadding = (0, _utils.isEmptyString)((0, _utils.extractTextFromHTML)(labels === null || labels === void 0 ? void 0 : labels.right)) && (0, _utils.isEmptyObject)(labelsPlaceholders) ? 48 : 70;
234
270
  var finalWidth = width + leftPadding + rightPadding + (domain.padding || 0) * 2;
235
271
  var finalHeight = height + topPadding * 2 + (range.padding || 0) * 2;
236
- var activeTitlePlugins = ['bold', 'italic', 'underline', 'superscript', 'subscript', 'strikethrough', 'math' // 'languageCharacters'
272
+ var activeTitlePlugins = ['bold', 'italic', 'underline', 'superscript', 'subscript', 'strikethrough', 'math'
273
+ // 'languageCharacters'
237
274
  ];
238
275
  var actualHeight = defineChart && showPixelGuides ? height - 160 : height;
239
276
  var nbOfVerticalLines = parseInt(width / 100);
240
277
  var nbOfHorizontalLines = parseInt(actualHeight / 100);
241
278
  var sideGridlinesPadding = parseInt(actualHeight % 100);
242
279
  var titleHeight = this.state.titleHeight;
243
- return /*#__PURE__*/_react["default"].createElement("div", {
244
- className: classes.root
245
- }, showPixelGuides && /*#__PURE__*/_react["default"].createElement("div", {
246
- className: classes.topPixelGuides,
280
+ return /*#__PURE__*/_react["default"].createElement(StyledRoot, null, showPixelGuides && /*#__PURE__*/_react["default"].createElement(TopPixelGuides, {
247
281
  style: {
248
282
  marginLeft: isChart ? 80 : showLabels ? 30 : 10
249
283
  }
@@ -251,9 +285,7 @@ var Root = /*#__PURE__*/function (_React$Component) {
251
285
  return /*#__PURE__*/_react["default"].createElement(_renderUi.Readable, {
252
286
  "false": true,
253
287
  key: "top-guide-".concat(value)
254
- }, /*#__PURE__*/_react["default"].createElement("div", {
255
- className: classes.topPixelIndicator
256
- }, /*#__PURE__*/_react["default"].createElement("div", null, value * 100, "px"), /*#__PURE__*/_react["default"].createElement("div", null, "|")));
288
+ }, /*#__PURE__*/_react["default"].createElement(TopPixelIndicator, null, /*#__PURE__*/_react["default"].createElement("div", null, value * 100, "px"), /*#__PURE__*/_react["default"].createElement("div", null, "|")));
257
289
  })), showTitle && (disabledTitle ? /*#__PURE__*/_react["default"].createElement("div", {
258
290
  ref: function ref(r) {
259
291
  return _this2.titleRef = r;
@@ -262,20 +294,27 @@ var Root = /*#__PURE__*/function (_React$Component) {
262
294
  width: finalWidth
263
295
  }), (0, _utils.isEmptyString)((0, _utils.extractTextFromHTML)(title)) && {
264
296
  display: 'none'
265
- }),
266
- className: (0, _classnames["default"])(isChart ? classes.chartTitle : classes.graphTitle, classes.disabledTitle),
297
+ })
298
+ }, isChart ? /*#__PURE__*/_react["default"].createElement(ChartTitle, {
299
+ className: "disabled",
267
300
  dangerouslySetInnerHTML: {
268
301
  __html: title || ''
269
302
  }
270
- }) : /*#__PURE__*/_react["default"].createElement("div", {
303
+ }) : /*#__PURE__*/_react["default"].createElement(GraphTitle, {
304
+ className: "disabled",
305
+ dangerouslySetInnerHTML: {
306
+ __html: title || ''
307
+ }
308
+ })) : /*#__PURE__*/_react["default"].createElement("div", {
271
309
  ref: function ref(r) {
272
310
  return _this2.titleRef = r;
273
311
  }
312
+ }, isChart ? /*#__PURE__*/_react["default"].createElement(ChartTitle, {
313
+ className: showPixelGuides ? 'rightMargin' : ''
274
314
  }, /*#__PURE__*/_react["default"].createElement(_editableHtml["default"], {
275
315
  style: isChart && {
276
316
  width: finalWidth
277
317
  },
278
- className: (0, _classnames["default"])((0, _defineProperty2["default"])({}, classes.rightMargin, showPixelGuides), isChart ? classes.chartTitle : classes.graphTitle),
279
318
  markup: title || '',
280
319
  onChange: onChangeTitle,
281
320
  placeholder: defineChart && titlePlaceholder || !disabledTitle && 'Click here to add a title for this graph',
@@ -286,7 +325,23 @@ var Root = /*#__PURE__*/function (_React$Component) {
286
325
  activePlugins: activeTitlePlugins,
287
326
  disableScrollbar: true,
288
327
  onKeyDown: this.handleKeyDown
289
- }))), showLabels && !isChart && /*#__PURE__*/_react["default"].createElement(_label["default"], {
328
+ })) : /*#__PURE__*/_react["default"].createElement(GraphTitle, {
329
+ className: showPixelGuides ? 'rightMargin' : ''
330
+ }, /*#__PURE__*/_react["default"].createElement(_editableHtml["default"], {
331
+ style: isChart && {
332
+ width: finalWidth
333
+ },
334
+ markup: title || '',
335
+ onChange: onChangeTitle,
336
+ placeholder: defineChart && titlePlaceholder || !disabledTitle && 'Click here to add a title for this graph',
337
+ toolbarOpts: {
338
+ noPadding: true,
339
+ noBorder: true
340
+ },
341
+ activePlugins: activeTitlePlugins,
342
+ disableScrollbar: true,
343
+ onKeyDown: this.handleKeyDown
344
+ })))), showLabels && !isChart && /*#__PURE__*/_react["default"].createElement(_label["default"], {
290
345
  side: "top",
291
346
  text: labels.top,
292
347
  disabledLabel: disabledLabels,
@@ -298,9 +353,7 @@ var Root = /*#__PURE__*/function (_React$Component) {
298
353
  },
299
354
  mathMlOptions: mathMlOptions,
300
355
  charactersLimit: labelsCharactersLimit
301
- }), /*#__PURE__*/_react["default"].createElement("div", {
302
- className: classes.wrapper
303
- }, showLabels && /*#__PURE__*/_react["default"].createElement(_label["default"], {
356
+ }), /*#__PURE__*/_react["default"].createElement(Wrapper, null, showLabels && /*#__PURE__*/_react["default"].createElement(_label["default"], {
304
357
  side: "left",
305
358
  text: labels.left,
306
359
  disabledLabel: disabledLabels,
@@ -314,19 +367,27 @@ var Root = /*#__PURE__*/function (_React$Component) {
314
367
  },
315
368
  mathMlOptions: mathMlOptions,
316
369
  charactersLimit: labelsCharactersLimit
317
- }), /*#__PURE__*/_react["default"].createElement("svg", {
370
+ }), defineChart ? /*#__PURE__*/_react["default"].createElement(DefineChartSvg, {
318
371
  width: finalWidth,
319
- height: finalHeight,
320
- className: defineChart ? classes.defineChart : classes.chart
321
- }, /*#__PURE__*/_react["default"].createElement("g", {
372
+ height: finalHeight
373
+ }, /*#__PURE__*/_react["default"].createElement(GraphBox, {
374
+ ref: function ref(r) {
375
+ _this2.g = r;
376
+ if (rootRef) {
377
+ rootRef(r);
378
+ }
379
+ },
380
+ transform: "translate(".concat(leftPadding + (domain.padding || 0), ", ").concat(topPadding + (range.padding || 0), ")")
381
+ }, children)) : /*#__PURE__*/_react["default"].createElement(ChartSvg, {
382
+ width: finalWidth,
383
+ height: finalHeight
384
+ }, /*#__PURE__*/_react["default"].createElement(GraphBox, {
322
385
  ref: function ref(r) {
323
386
  _this2.g = r;
324
-
325
387
  if (rootRef) {
326
388
  rootRef(r);
327
389
  }
328
390
  },
329
- className: classes.graphBox,
330
391
  transform: "translate(".concat(leftPadding + (domain.padding || 0), ", ").concat(topPadding + (range.padding || 0), ")")
331
392
  }, children)), showLabels && !isChart && /*#__PURE__*/_react["default"].createElement(_label["default"], {
332
393
  side: "right",
@@ -340,8 +401,7 @@ var Root = /*#__PURE__*/function (_React$Component) {
340
401
  },
341
402
  mathMlOptions: mathMlOptions,
342
403
  charactersLimit: labelsCharactersLimit
343
- }), showPixelGuides && /*#__PURE__*/_react["default"].createElement("div", {
344
- className: classes.sidePixelGuides,
404
+ }), showPixelGuides && /*#__PURE__*/_react["default"].createElement(SidePixelGuides, {
345
405
  style: {
346
406
  paddingTop: sideGridlinesPadding,
347
407
  marginTop: 31
@@ -350,9 +410,7 @@ var Root = /*#__PURE__*/function (_React$Component) {
350
410
  return /*#__PURE__*/_react["default"].createElement(_renderUi.Readable, {
351
411
  "false": true,
352
412
  key: "top-guide-".concat(value)
353
- }, /*#__PURE__*/_react["default"].createElement("div", {
354
- className: classes.sidePixelIndicator
355
- }, "\u2501 ", value * 100, "px"));
413
+ }, /*#__PURE__*/_react["default"].createElement(SidePixelIndicator, null, "\u2501 ", value * 100, "px"));
356
414
  }))), showLabels && /*#__PURE__*/_react["default"].createElement(_label["default"], {
357
415
  side: "bottom",
358
416
  text: labels.bottom,
@@ -371,11 +429,7 @@ var Root = /*#__PURE__*/function (_React$Component) {
371
429
  }));
372
430
  }
373
431
  }]);
374
- return Root;
375
- }(_react["default"].Component); // use default color theme style to avoid color contrast issues
376
-
377
-
378
- exports.Root = Root;
432
+ }(_react["default"].Component);
379
433
  (0, _defineProperty2["default"])(Root, "propTypes", {
380
434
  title: _propTypes["default"].string,
381
435
  children: _types.ChildrenType,
@@ -388,7 +442,6 @@ exports.Root = Root;
388
442
  labelsPlaceholders: _propTypes["default"].object,
389
443
  onChangeTitle: _propTypes["default"].func,
390
444
  onMouseMove: _propTypes["default"].func,
391
- classes: _propTypes["default"].object.isRequired,
392
445
  showLabels: _propTypes["default"].bool,
393
446
  showTitle: _propTypes["default"].bool,
394
447
  showPixelGuides: _propTypes["default"].bool,
@@ -398,83 +451,5 @@ exports.Root = Root;
398
451
  mathMlOptions: _propTypes["default"].object,
399
452
  labelsCharactersLimit: _propTypes["default"].number
400
453
  });
401
-
402
- var styles = function styles(theme) {
403
- return {
404
- root: {
405
- border: "solid 1px ".concat(_renderUi.color.primaryLight()),
406
- color: _renderUi.color.defaults.TEXT,
407
- backgroundColor: theme.palette.common.white,
408
- touchAction: 'none',
409
- position: 'relative',
410
- boxSizing: 'unset' // to override the default border-box in IBX that breaks the component width layout
411
-
412
- },
413
- wrapper: {
414
- display: 'flex',
415
- position: 'relative'
416
- },
417
- svg: {},
418
- defineChart: {
419
- paddingLeft: '50px',
420
- overflow: 'visible'
421
- },
422
- chart: {
423
- overflow: 'visible'
424
- },
425
- graphBox: {
426
- cursor: 'pointer',
427
- userSelect: 'none'
428
- },
429
- graphTitle: {
430
- color: _renderUi.color.defaults.TEXT,
431
- fontSize: theme.typography.fontSize + 2,
432
- padding: "".concat(theme.spacing.unit * 1.5, "px ").concat(theme.spacing.unit / 2, "px 0"),
433
- textAlign: 'center'
434
- },
435
- chartTitle: {
436
- color: _renderUi.color.defaults.TEXT,
437
- fontSize: theme.typography.fontSize + 4,
438
- padding: "".concat(theme.spacing.unit * 1.5, "px ").concat(theme.spacing.unit / 2, "px 0"),
439
- textAlign: 'center'
440
- },
441
- disabledTitle: {
442
- pointerEvents: 'none'
443
- },
444
- rightMargin: {
445
- marginRight: '74px'
446
- },
447
- topPixelGuides: {
448
- display: 'flex',
449
- paddingTop: '6px'
450
- },
451
- topPixelIndicator: {
452
- display: 'flex',
453
- flexDirection: 'column',
454
- alignItems: 'center',
455
- width: '100px',
456
- pointerEvents: 'none',
457
- userSelect: 'none'
458
- },
459
- sidePixelGuides: {
460
- width: '70px',
461
- display: 'flex',
462
- flexDirection: 'column',
463
- marginRight: '6px'
464
- },
465
- sidePixelIndicator: {
466
- textAlign: 'right',
467
- height: '20px',
468
- pointerEvents: 'none',
469
- userSelect: 'none',
470
- '&:not(:last-child)': {
471
- marginBottom: '80px'
472
- }
473
- }
474
- };
475
- };
476
-
477
- var _default = (0, _styles.withStyles)(styles)(Root);
478
-
479
- exports["default"] = _default;
480
- //# sourceMappingURL=root.js.map
454
+ var _default = exports["default"] = Root;
455
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9zdHlsZXMiLCJfcHJvcFR5cGVzIiwiX2QzU2VsZWN0aW9uIiwiX3JlbmRlclVpIiwiX2VkaXRhYmxlSHRtbCIsIl90eXBlcyIsIl9sYWJlbCIsIl91dGlscyIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiciIsImUiLCJ0IiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJsZW5ndGgiLCJfbiIsIkYiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsImYiLCJUeXBlRXJyb3IiLCJvIiwiYSIsInUiLCJjYWxsIiwibmV4dCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0Iiwib3duS2V5cyIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsIlN0eWxlZFJvb3QiLCJzdHlsZWQiLCJfcmVmIiwidGhlbWUiLCJib3JkZXIiLCJjb25jYXQiLCJjb2xvciIsInByaW1hcnlMaWdodCIsImRlZmF1bHRzIiwiVEVYVCIsImJhY2tncm91bmRDb2xvciIsInBhbGV0dGUiLCJjb21tb24iLCJ3aGl0ZSIsInRvdWNoQWN0aW9uIiwicG9zaXRpb24iLCJib3hTaXppbmciLCJXcmFwcGVyIiwiZGlzcGxheSIsIkRlZmluZUNoYXJ0U3ZnIiwicGFkZGluZ0xlZnQiLCJvdmVyZmxvdyIsIkNoYXJ0U3ZnIiwiR3JhcGhCb3giLCJjdXJzb3IiLCJ1c2VyU2VsZWN0IiwiR3JhcGhUaXRsZSIsIl9yZWYyIiwiZm9udFNpemUiLCJ0eXBvZ3JhcGh5IiwicGFkZGluZyIsInNwYWNpbmciLCJ0ZXh0QWxpZ24iLCJwb2ludGVyRXZlbnRzIiwibWFyZ2luUmlnaHQiLCJDaGFydFRpdGxlIiwiX3JlZjMiLCJUb3BQaXhlbEd1aWRlcyIsInBhZGRpbmdUb3AiLCJUb3BQaXhlbEluZGljYXRvciIsImZsZXhEaXJlY3Rpb24iLCJhbGlnbkl0ZW1zIiwid2lkdGgiLCJTaWRlUGl4ZWxHdWlkZXMiLCJTaWRlUGl4ZWxJbmRpY2F0b3IiLCJoZWlnaHQiLCJtYXJnaW5Cb3R0b20iLCJSb290IiwiZXhwb3J0cyIsIl9SZWFjdCRDb21wb25lbnQiLCJwcm9wcyIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsImciLCJfdGhpcyRwcm9wcyIsImdyYXBoUHJvcHMiLCJvbk1vdXNlTW92ZSIsInNjYWxlIiwic25hcCIsImNvb3JkcyIsIm1vdXNlIiwibm9kZSIsIngiLCJpbnZlcnQiLCJ5Iiwic25hcHBlZCIsIm5ld1ZhbHVlIiwic2lkZSIsIl90aGlzJHByb3BzMiIsImxhYmVscyIsIm9uQ2hhbmdlTGFiZWxzIiwiaXNDaGFydCIsInRpdGxlRWxlbWVudCIsInRpdGxlUmVmIiwidGl0bGVIZWlnaHQiLCJjbGllbnRIZWlnaHQiLCJzZXRTdGF0ZSIsInByZXZUaXRsZSIsInRpdGxlIiwicmVzaXplT2JzZXJ2ZXIiLCJSZXNpemVPYnNlcnZlciIsInNldHVwVmlzaWJpbGl0eU9ic2VydmVyIiwic2V0VGltZW91dCIsIm1lYXN1cmVUaXRsZUhlaWdodCIsImVudHJpZXMiLCJfaXRlcmF0b3IiLCJfc3RlcCIsImVudHJ5IiwiX2VudHJ5JGNvbnRlbnRSZWN0IiwiY29udGVudFJlY3QiLCJlcnIiLCJvYnNlcnZlIiwiZGlzY29ubmVjdCIsInN0YXRlIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJjb21wb25lbnREaWRNb3VudCIsInNlbGVjdCIsIm9uIiwibW91c2VNb3ZlIiwiYmluZCIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwiY2xlYW51cFZpc2liaWxpdHlPYnNlcnZlciIsImNvbXBvbmVudERpZFVwZGF0ZSIsInByZXZQcm9wcyIsInJlbmRlciIsIl90aGlzMiIsIl90aGlzJHByb3BzMyIsImRpc2FibGVkVGl0bGUiLCJkaXNhYmxlZExhYmVscyIsImxhYmVsc1BsYWNlaG9sZGVycyIsInRpdGxlUGxhY2Vob2xkZXIiLCJjaGlsZHJlbiIsImRlZmluZUNoYXJ0Iiwib25DaGFuZ2VUaXRsZSIsInNob3dMYWJlbHMiLCJzaG93UGl4ZWxHdWlkZXMiLCJzaG93VGl0bGUiLCJyb290UmVmIiwiX3RoaXMkcHJvcHMzJG1hdGhNbE9wIiwibWF0aE1sT3B0aW9ucyIsImxhYmVsc0NoYXJhY3RlcnNMaW1pdCIsIl9ncmFwaFByb3BzJHNpemUiLCJzaXplIiwiX2dyYXBoUHJvcHMkc2l6ZSR3aWR0IiwiX2dyYXBoUHJvcHMkc2l6ZSRoZWlnIiwiZG9tYWluIiwicmFuZ2UiLCJ0b3BQYWRkaW5nIiwibGVmdFBhZGRpbmciLCJpc0VtcHR5U3RyaW5nIiwiZXh0cmFjdFRleHRGcm9tSFRNTCIsImxlZnQiLCJpc0VtcHR5T2JqZWN0IiwicmlnaHRQYWRkaW5nIiwicmlnaHQiLCJmaW5hbFdpZHRoIiwiZmluYWxIZWlnaHQiLCJhY3RpdmVUaXRsZVBsdWdpbnMiLCJhY3R1YWxIZWlnaHQiLCJuYk9mVmVydGljYWxMaW5lcyIsInBhcnNlSW50IiwibmJPZkhvcml6b250YWxMaW5lcyIsInNpZGVHcmlkbGluZXNQYWRkaW5nIiwiY3JlYXRlRWxlbWVudCIsInN0eWxlIiwibWFyZ2luTGVmdCIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJtYXAiLCJSZWFkYWJsZSIsInJlZiIsImNsYXNzTmFtZSIsImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiwiX19odG1sIiwibWFya3VwIiwib25DaGFuZ2UiLCJwbGFjZWhvbGRlciIsInRvb2xiYXJPcHRzIiwibm9QYWRkaW5nIiwibm9Cb3JkZXIiLCJhY3RpdmVQbHVnaW5zIiwiZGlzYWJsZVNjcm9sbGJhciIsIm9uS2V5RG93biIsImhhbmRsZUtleURvd24iLCJ0ZXh0IiwidG9wIiwiZGlzYWJsZWRMYWJlbCIsImdyYXBoSGVpZ2h0IiwiZ3JhcGhXaWR0aCIsIm9uQ2hhbmdlTGFiZWwiLCJjaGFyYWN0ZXJzTGltaXQiLCJpc0NoYXJ0TGVmdExhYmVsIiwiaXNEZWZpbmVDaGFydExlZnRMYWJlbCIsInRyYW5zZm9ybSIsIm1hcmdpblRvcCIsInJldmVyc2UiLCJib3R0b20iLCJpc0NoYXJ0Qm90dG9tTGFiZWwiLCJpc0RlZmluZUNoYXJ0Qm90dG9tTGFiZWwiLCJSZWFjdCIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsInN0cmluZyIsIkNoaWxkcmVuVHlwZSIsImJvb2wiLCJHcmFwaFByb3BzVHlwZSIsImlzUmVxdWlyZWQiLCJvYmplY3QiLCJmdW5jIiwibnVtYmVyIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi9zcmMvcm9vdC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHN0eWxlZCB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvc3R5bGVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBzZWxlY3QsIG1vdXNlIH0gZnJvbSAnZDMtc2VsZWN0aW9uJztcblxuaW1wb3J0IHsgY29sb3IsIFJlYWRhYmxlIH0gZnJvbSAnQHBpZS1saWIvcmVuZGVyLXVpJztcbmltcG9ydCBFZGl0YWJsZUh0bWwgZnJvbSAnQHBpZS1saWIvZWRpdGFibGUtaHRtbCc7XG5pbXBvcnQgeyBDaGlsZHJlblR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IEdyYXBoUHJvcHNUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgTGFiZWwgZnJvbSAnLi9sYWJlbCc7XG5pbXBvcnQgeyBleHRyYWN0VGV4dEZyb21IVE1MLCBpc0VtcHR5T2JqZWN0LCBpc0VtcHR5U3RyaW5nIH0gZnJvbSAnLi91dGlscyc7XG5cbmNvbnN0IFN0eWxlZFJvb3QgPSBzdHlsZWQoJ2RpdicpKCh7IHRoZW1lIH0pID0+ICh7XG4gIGJvcmRlcjogYHNvbGlkIDFweCAke2NvbG9yLnByaW1hcnlMaWdodCgpfWAsXG4gIGNvbG9yOiBjb2xvci5kZWZhdWx0cy5URVhULFxuICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuY29tbW9uLndoaXRlLFxuICB0b3VjaEFjdGlvbjogJ25vbmUnLFxuICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgYm94U2l6aW5nOiAndW5zZXQnLCAvLyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBib3JkZXItYm94IGluIElCWCB0aGF0IGJyZWFrcyB0aGUgY29tcG9uZW50IHdpZHRoIGxheW91dFxufSkpO1xuXG5jb25zdCBXcmFwcGVyID0gc3R5bGVkKCdkaXYnKSh7XG4gIGRpc3BsYXk6ICdmbGV4JyxcbiAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG59KTtcblxuY29uc3QgRGVmaW5lQ2hhcnRTdmcgPSBzdHlsZWQoJ3N2ZycpKHtcbiAgcGFkZGluZ0xlZnQ6ICc1MHB4JyxcbiAgb3ZlcmZsb3c6ICd2aXNpYmxlJyxcbn0pO1xuXG5jb25zdCBDaGFydFN2ZyA9IHN0eWxlZCgnc3ZnJykoe1xuICBvdmVyZmxvdzogJ3Zpc2libGUnLFxufSk7XG5cbmNvbnN0IEdyYXBoQm94ID0gc3R5bGVkKCdnJykoe1xuICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgdXNlclNlbGVjdDogJ25vbmUnLFxufSk7XG5cbmNvbnN0IEdyYXBoVGl0bGUgPSBzdHlsZWQoJ2RpdicpKCh7IHRoZW1lIH0pID0+ICh7XG4gIGNvbG9yOiBjb2xvci5kZWZhdWx0cy5URVhULFxuICBmb250U2l6ZTogdGhlbWUudHlwb2dyYXBoeS5mb250U2l6ZSArIDIsXG4gIHBhZGRpbmc6IGAke3RoZW1lLnNwYWNpbmcoMS41KX0gJHt0aGVtZS5zcGFjaW5nKDAuNSl9IDBgLFxuICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAnJi5kaXNhYmxlZCc6IHtcbiAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gIH0sXG4gICcmLnJpZ2h0TWFyZ2luJzoge1xuICAgIG1hcmdpblJpZ2h0OiAnNzRweCcsXG4gIH0sXG59KSk7XG5cbmNvbnN0IENoYXJ0VGl0bGUgPSBzdHlsZWQoJ2RpdicpKCh7IHRoZW1lIH0pID0+ICh7XG4gIGNvbG9yOiBjb2xvci5kZWZhdWx0cy5URVhULFxuICBmb250U2l6ZTogdGhlbWUudHlwb2dyYXBoeS5mb250U2l6ZSArIDQsXG4gIHBhZGRpbmc6IGAke3RoZW1lLnNwYWNpbmcoMS41KX0gJHt0aGVtZS5zcGFjaW5nKDAuNSl9IDBgLFxuICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAnJi5kaXNhYmxlZCc6IHtcbiAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gIH0sXG4gICcmLnJpZ2h0TWFyZ2luJzoge1xuICAgIG1hcmdpblJpZ2h0OiAnNzRweCcsXG4gIH0sXG59KSk7XG5cbmNvbnN0IFRvcFBpeGVsR3VpZGVzID0gc3R5bGVkKCdkaXYnKSh7XG4gIGRpc3BsYXk6ICdmbGV4JyxcbiAgcGFkZGluZ1RvcDogJzZweCcsXG59KTtcblxuY29uc3QgVG9wUGl4ZWxJbmRpY2F0b3IgPSBzdHlsZWQoJ2RpdicpKHtcbiAgZGlzcGxheTogJ2ZsZXgnLFxuICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gIHdpZHRoOiAnMTAwcHgnLFxuICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gIHVzZXJTZWxlY3Q6ICdub25lJyxcbn0pO1xuXG5jb25zdCBTaWRlUGl4ZWxHdWlkZXMgPSBzdHlsZWQoJ2RpdicpKHtcbiAgd2lkdGg6ICc3MHB4JyxcbiAgZGlzcGxheTogJ2ZsZXgnLFxuICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgbWFyZ2luUmlnaHQ6ICc2cHgnLFxufSk7XG5cbmNvbnN0IFNpZGVQaXhlbEluZGljYXRvciA9IHN0eWxlZCgnZGl2Jykoe1xuICB0ZXh0QWxpZ246ICdyaWdodCcsXG4gIGhlaWdodDogJzIwcHgnLFxuICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gIHVzZXJTZWxlY3Q6ICdub25lJyxcbiAgJyY6bm90KDpsYXN0LWNoaWxkKSc6IHtcbiAgICBtYXJnaW5Cb3R0b206ICc4MHB4JyxcbiAgfSxcbn0pO1xuXG5leHBvcnQgY2xhc3MgUm9vdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICB0aXRsZUhlaWdodDogMCxcbiAgICB9O1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBudWxsO1xuICB9XG5cbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICB0aXRsZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjaGlsZHJlbjogQ2hpbGRyZW5UeXBlLFxuICAgIGRlZmluZUNoYXJ0OiBQcm9wVHlwZXMuYm9vbCxcbiAgICBkaXNhYmxlZExhYmVsczogUHJvcFR5cGVzLmJvb2wsXG4gICAgZGlzYWJsZWRUaXRsZTogUHJvcFR5cGVzLmJvb2wsXG4gICAgZ3JhcGhQcm9wczogR3JhcGhQcm9wc1R5cGUuaXNSZXF1aXJlZCxcbiAgICBpc0NoYXJ0OiBQcm9wVHlwZXMuYm9vbCxcbiAgICBsYWJlbHM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgbGFiZWxzUGxhY2Vob2xkZXJzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIG9uQ2hhbmdlVGl0bGU6IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uTW91c2VNb3ZlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBzaG93TGFiZWxzOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBzaG93VGl0bGU6IFByb3BUeXBlcy5ib29sLFxuICAgIHNob3dQaXhlbEd1aWRlczogUHJvcFR5cGVzLmJvb2wsXG4gICAgcm9vdFJlZjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25DaGFuZ2VMYWJlbHM6IFByb3BUeXBlcy5mdW5jLFxuICAgIHRpdGxlUGxhY2Vob2xkZXI6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgbWF0aE1sT3B0aW9uczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBsYWJlbHNDaGFyYWN0ZXJzTGltaXQ6IFByb3BUeXBlcy5udW1iZXIsXG4gIH07XG5cbiAgbW91c2VNb3ZlID0gKGcpID0+IHtcbiAgICBjb25zdCB7IGdyYXBoUHJvcHMsIG9uTW91c2VNb3ZlIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgaWYgKCFvbk1vdXNlTW92ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgc2NhbGUsIHNuYXAgfSA9IGdyYXBoUHJvcHM7XG4gICAgY29uc3QgY29vcmRzID0gbW91c2UoZy5ub2RlKCkpO1xuICAgIGNvbnN0IHggPSBzY2FsZS54LmludmVydChjb29yZHNbMF0pO1xuICAgIGNvbnN0IHkgPSBzY2FsZS55LmludmVydChjb29yZHNbMV0pO1xuXG4gICAgY29uc3Qgc25hcHBlZCA9IHtcbiAgICAgIHg6IHNuYXAueCh4KSxcbiAgICAgIHk6IHNuYXAueSh5KSxcbiAgICB9O1xuXG4gICAgb25Nb3VzZU1vdmUoc25hcHBlZCk7XG4gIH07XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgY29uc3QgZyA9IHNlbGVjdCh0aGlzLmcpO1xuICAgIGcub24oJ21vdXNlbW92ZScsIHRoaXMubW91c2VNb3ZlLmJpbmQodGhpcywgZykpO1xuICAgIHRoaXMubWVhc3VyZVRpdGxlSGVpZ2h0KCk7XG4gICAgdGhpcy5zZXR1cFZpc2liaWxpdHlPYnNlcnZlcigpO1xuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgY29uc3QgZyA9IHNlbGVjdCh0aGlzLmcpO1xuICAgIGcub24oJ21vdXNlbW92ZScsIG51bGwpO1xuICAgIHRoaXMuY2xlYW51cFZpc2liaWxpdHlPYnNlcnZlcigpO1xuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgIGlmIChwcmV2UHJvcHMudGl0bGUgIT09IHRoaXMucHJvcHMudGl0bGUpIHtcbiAgICAgIHRoaXMubWVhc3VyZVRpdGxlSGVpZ2h0KCk7XG4gICAgfVxuICB9XG5cbiAgb25DaGFuZ2VMYWJlbCA9IChuZXdWYWx1ZSwgc2lkZSkgPT4ge1xuICAgIGNvbnN0IHsgbGFiZWxzLCBvbkNoYW5nZUxhYmVscywgaXNDaGFydCB9ID0gdGhpcy5wcm9wcztcblxuICAgIGlmICghb25DaGFuZ2VMYWJlbHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNDaGFydCkge1xuICAgICAgaWYgKHNpZGUgPT09ICdsZWZ0Jykge1xuICAgICAgICBvbkNoYW5nZUxhYmVscygncmFuZ2UnLCBuZXdWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbkNoYW5nZUxhYmVscygnZG9tYWluJywgbmV3VmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb25DaGFuZ2VMYWJlbHMoe1xuICAgICAgLi4ubGFiZWxzLFxuICAgICAgW3NpZGVdOiBuZXdWYWx1ZSxcbiAgICB9KTtcbiAgfTtcblxuICBtZWFzdXJlVGl0bGVIZWlnaHQgPSAoKSA9PiB7XG4gICAgY29uc3QgdGl0bGVFbGVtZW50ID0gdGhpcy50aXRsZVJlZjtcbiAgICBpZiAodGl0bGVFbGVtZW50KSB7XG4gICAgICBjb25zdCB0aXRsZUhlaWdodCA9IHRpdGxlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgdGl0bGVIZWlnaHQsIHByZXZUaXRsZTogdGhpcy5wcm9wcy50aXRsZSB9KTtcblxuICAgICAgaWYgKCF0aGlzLnJlc2l6ZU9ic2VydmVyICYmIHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhpcy5zZXR1cFZpc2liaWxpdHlPYnNlcnZlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBoYW5kbGVLZXlEb3duID0gKCkgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5tZWFzdXJlVGl0bGVIZWlnaHQoKTtcbiAgICB9LCAwKTtcbiAgfTtcblxuICAvLyBoYW5kbGUgZWRnZSBjYXNlIHdoZXJlIGNoYXJ0IGlzIGhpZGRlbiB3aXRoIGRpc3BsYXk6bm9uZSBhbmQgdGhlbiBzaG93biB3aXRoIGRpc3BsYXk6YmxvY2tcbiAgc2V0dXBWaXNpYmlsaXR5T2JzZXJ2ZXIgPSAoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy50aXRsZVJlZikge1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBlbnRyeS5jb250ZW50UmVjdDtcbiAgICAgICAgICAvLyB0cmlnZ2VyIGlmIGVsZW1lbnQgYmVjb21lcyB2aXNpYmxlIGFuZCB3ZSBoYXZlbid0IG1lYXN1cmVkIHRoaXMgaGVpZ2h0IHlldFxuICAgICAgICAgIGlmICh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCkge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubWVhc3VyZVRpdGxlSGVpZ2h0KCk7XG4gICAgICAgICAgICB9LCAxMCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy50aXRsZVJlZik7XG4gICAgfVxuICB9O1xuXG4gIGNsZWFudXBWaXNpYmlsaXR5T2JzZXJ2ZXIgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMucmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBkaXNhYmxlZFRpdGxlLFxuICAgICAgZGlzYWJsZWRMYWJlbHMsXG4gICAgICBsYWJlbHMsXG4gICAgICBsYWJlbHNQbGFjZWhvbGRlcnMsXG4gICAgICB0aXRsZVBsYWNlaG9sZGVyLFxuICAgICAgZ3JhcGhQcm9wcyxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgZGVmaW5lQ2hhcnQsXG4gICAgICBvbkNoYW5nZVRpdGxlLFxuICAgICAgaXNDaGFydCxcbiAgICAgIHNob3dMYWJlbHMsXG4gICAgICBzaG93UGl4ZWxHdWlkZXMsXG4gICAgICBzaG93VGl0bGUsXG4gICAgICB0aXRsZSxcbiAgICAgIHJvb3RSZWYsXG4gICAgICBtYXRoTWxPcHRpb25zID0ge30sXG4gICAgICBsYWJlbHNDaGFyYWN0ZXJzTGltaXQsXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qge1xuICAgICAgc2l6ZTogeyB3aWR0aCA9IDUwMCwgaGVpZ2h0ID0gNTAwIH0sXG4gICAgICBkb21haW4sXG4gICAgICByYW5nZSxcbiAgICB9ID0gZ3JhcGhQcm9wcztcblxuICAgIGNvbnN0IHRvcFBhZGRpbmcgPSA0MDtcbiAgICBjb25zdCBsZWZ0UGFkZGluZyA9IGlzRW1wdHlTdHJpbmcoZXh0cmFjdFRleHRGcm9tSFRNTChsYWJlbHM/LmxlZnQpKSAmJiBpc0VtcHR5T2JqZWN0KGxhYmVsc1BsYWNlaG9sZGVycykgPyA0OCA6IDcwO1xuICAgIGNvbnN0IHJpZ2h0UGFkZGluZyA9XG4gICAgICBpc0VtcHR5U3RyaW5nKGV4dHJhY3RUZXh0RnJvbUhUTUwobGFiZWxzPy5yaWdodCkpICYmIGlzRW1wdHlPYmplY3QobGFiZWxzUGxhY2Vob2xkZXJzKSA/IDQ4IDogNzA7XG4gICAgY29uc3QgZmluYWxXaWR0aCA9IHdpZHRoICsgbGVmdFBhZGRpbmcgKyByaWdodFBhZGRpbmcgKyAoZG9tYWluLnBhZGRpbmcgfHwgMCkgKiAyO1xuICAgIGNvbnN0IGZpbmFsSGVpZ2h0ID0gaGVpZ2h0ICsgdG9wUGFkZGluZyAqIDIgKyAocmFuZ2UucGFkZGluZyB8fCAwKSAqIDI7XG5cbiAgICBjb25zdCBhY3RpdmVUaXRsZVBsdWdpbnMgPSBbXG4gICAgICAnYm9sZCcsXG4gICAgICAnaXRhbGljJyxcbiAgICAgICd1bmRlcmxpbmUnLFxuICAgICAgJ3N1cGVyc2NyaXB0JyxcbiAgICAgICdzdWJzY3JpcHQnLFxuICAgICAgJ3N0cmlrZXRocm91Z2gnLFxuICAgICAgJ21hdGgnLFxuICAgICAgLy8gJ2xhbmd1YWdlQ2hhcmFjdGVycydcbiAgICBdO1xuXG4gICAgY29uc3QgYWN0dWFsSGVpZ2h0ID0gZGVmaW5lQ2hhcnQgJiYgc2hvd1BpeGVsR3VpZGVzID8gaGVpZ2h0IC0gMTYwIDogaGVpZ2h0O1xuICAgIGNvbnN0IG5iT2ZWZXJ0aWNhbExpbmVzID0gcGFyc2VJbnQod2lkdGggLyAxMDApO1xuICAgIGNvbnN0IG5iT2ZIb3Jpem9udGFsTGluZXMgPSBwYXJzZUludChhY3R1YWxIZWlnaHQgLyAxMDApO1xuICAgIGNvbnN0IHNpZGVHcmlkbGluZXNQYWRkaW5nID0gcGFyc2VJbnQoYWN0dWFsSGVpZ2h0ICUgMTAwKTtcbiAgICBjb25zdCB7IHRpdGxlSGVpZ2h0IH0gPSB0aGlzLnN0YXRlO1xuICAgIFxuICAgIHJldHVybiAoXG4gICAgICA8U3R5bGVkUm9vdD5cbiAgICAgICAge3Nob3dQaXhlbEd1aWRlcyAmJiAoXG4gICAgICAgICAgPFRvcFBpeGVsR3VpZGVzIHN0eWxlPXt7IG1hcmdpbkxlZnQ6IGlzQ2hhcnQgPyA4MCA6IHNob3dMYWJlbHMgPyAzMCA6IDEwIH19PlxuICAgICAgICAgICAge1suLi5BcnJheShuYk9mVmVydGljYWxMaW5lcyArIDEpLmtleXMoKV0ubWFwKCh2YWx1ZSkgPT4gKFxuICAgICAgICAgICAgICA8UmVhZGFibGUgZmFsc2Uga2V5PXtgdG9wLWd1aWRlLSR7dmFsdWV9YH0+XG4gICAgICAgICAgICAgICAgPFRvcFBpeGVsSW5kaWNhdG9yPlxuICAgICAgICAgICAgICAgICAgPGRpdj57dmFsdWUgKiAxMDB9cHg8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+fDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvVG9wUGl4ZWxJbmRpY2F0b3I+XG4gICAgICAgICAgICAgIDwvUmVhZGFibGU+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L1RvcFBpeGVsR3VpZGVzPlxuICAgICAgICApfVxuICAgICAgICB7c2hvd1RpdGxlICYmXG4gICAgICAgICAgKGRpc2FibGVkVGl0bGUgPyAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIHJlZj17KHIpID0+ICh0aGlzLnRpdGxlUmVmID0gcil9XG4gICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgLi4uKGlzQ2hhcnQgJiYgeyB3aWR0aDogZmluYWxXaWR0aCB9KSxcbiAgICAgICAgICAgICAgICAuLi4oaXNFbXB0eVN0cmluZyhleHRyYWN0VGV4dEZyb21IVE1MKHRpdGxlKSkgJiYgeyBkaXNwbGF5OiAnbm9uZScgfSksXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtpc0NoYXJ0ID8gKFxuICAgICAgICAgICAgICAgIDxDaGFydFRpdGxlIGNsYXNzTmFtZT1cImRpc2FibGVkXCIgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3sgX19odG1sOiB0aXRsZSB8fCAnJyB9fSAvPlxuICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgIDxHcmFwaFRpdGxlIGNsYXNzTmFtZT1cImRpc2FibGVkXCIgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3sgX19odG1sOiB0aXRsZSB8fCAnJyB9fSAvPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxkaXYgcmVmPXsocikgPT4gKHRoaXMudGl0bGVSZWYgPSByKX0+XG4gICAgICAgICAgICAgIHtpc0NoYXJ0ID8gKFxuICAgICAgICAgICAgICAgIDxDaGFydFRpdGxlIGNsYXNzTmFtZT17c2hvd1BpeGVsR3VpZGVzID8gJ3JpZ2h0TWFyZ2luJyA6ICcnfT5cbiAgICAgICAgICAgICAgICAgIDxFZGl0YWJsZUh0bWxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e1xuICAgICAgICAgICAgICAgICAgICAgIGlzQ2hhcnQgJiYge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGZpbmFsV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1hcmt1cD17dGl0bGUgfHwgJyd9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtvbkNoYW5nZVRpdGxlfVxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17XG4gICAgICAgICAgICAgICAgICAgICAgKGRlZmluZUNoYXJ0ICYmIHRpdGxlUGxhY2Vob2xkZXIpIHx8ICghZGlzYWJsZWRUaXRsZSAmJiAnQ2xpY2sgaGVyZSB0byBhZGQgYSB0aXRsZSBmb3IgdGhpcyBncmFwaCcpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdG9vbGJhck9wdHM9e3sgbm9QYWRkaW5nOiB0cnVlLCBub0JvcmRlcjogdHJ1ZSB9fVxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVQbHVnaW5zPXthY3RpdmVUaXRsZVBsdWdpbnN9XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVTY3JvbGxiYXJcbiAgICAgICAgICAgICAgICAgICAgb25LZXlEb3duPXt0aGlzLmhhbmRsZUtleURvd259XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvQ2hhcnRUaXRsZT5cbiAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICA8R3JhcGhUaXRsZSBjbGFzc05hbWU9e3Nob3dQaXhlbEd1aWRlcyA/ICdyaWdodE1hcmdpbicgOiAnJ30+XG4gICAgICAgICAgICAgICAgICA8RWRpdGFibGVIdG1sXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXtcbiAgICAgICAgICAgICAgICAgICAgICBpc0NoYXJ0ICYmIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBmaW5hbFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtYXJrdXA9e3RpdGxlIHx8ICcnfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17b25DaGFuZ2VUaXRsZX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e1xuICAgICAgICAgICAgICAgICAgICAgIChkZWZpbmVDaGFydCAmJiB0aXRsZVBsYWNlaG9sZGVyKSB8fCAoIWRpc2FibGVkVGl0bGUgJiYgJ0NsaWNrIGhlcmUgdG8gYWRkIGEgdGl0bGUgZm9yIHRoaXMgZ3JhcGgnKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRvb2xiYXJPcHRzPXt7IG5vUGFkZGluZzogdHJ1ZSwgbm9Cb3JkZXI6IHRydWUgfX1cbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlUGx1Z2lucz17YWN0aXZlVGl0bGVQbHVnaW5zfVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlU2Nyb2xsYmFyXG4gICAgICAgICAgICAgICAgICAgIG9uS2V5RG93bj17dGhpcy5oYW5kbGVLZXlEb3dufVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L0dyYXBoVGl0bGU+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApKX1cbiAgICAgICAge3Nob3dMYWJlbHMgJiYgIWlzQ2hhcnQgJiYgKFxuICAgICAgICAgIDxMYWJlbFxuICAgICAgICAgICAgc2lkZT1cInRvcFwiXG4gICAgICAgICAgICB0ZXh0PXtsYWJlbHMudG9wfVxuICAgICAgICAgICAgZGlzYWJsZWRMYWJlbD17ZGlzYWJsZWRMYWJlbHN9XG4gICAgICAgICAgICBwbGFjZWhvbGRlcj17bGFiZWxzUGxhY2Vob2xkZXJzPy50b3B9XG4gICAgICAgICAgICBncmFwaEhlaWdodD17ZmluYWxIZWlnaHR9XG4gICAgICAgICAgICBncmFwaFdpZHRoPXtmaW5hbFdpZHRofVxuICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4gdGhpcy5vbkNoYW5nZUxhYmVsKHZhbHVlLCAndG9wJyl9XG4gICAgICAgICAgICBtYXRoTWxPcHRpb25zPXttYXRoTWxPcHRpb25zfVxuICAgICAgICAgICAgY2hhcmFjdGVyc0xpbWl0PXtsYWJlbHNDaGFyYWN0ZXJzTGltaXR9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAgPFdyYXBwZXI+XG4gICAgICAgICAge3Nob3dMYWJlbHMgJiYgKFxuICAgICAgICAgICAgPExhYmVsXG4gICAgICAgICAgICAgIHNpZGU9XCJsZWZ0XCJcbiAgICAgICAgICAgICAgdGV4dD17bGFiZWxzLmxlZnR9XG4gICAgICAgICAgICAgIGRpc2FibGVkTGFiZWw9e2Rpc2FibGVkTGFiZWxzfVxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17bGFiZWxzUGxhY2Vob2xkZXJzPy5sZWZ0fVxuICAgICAgICAgICAgICBncmFwaEhlaWdodD17ZmluYWxIZWlnaHR9XG4gICAgICAgICAgICAgIGdyYXBoV2lkdGg9e2ZpbmFsV2lkdGh9XG4gICAgICAgICAgICAgIGlzQ2hhcnRMZWZ0TGFiZWw9e2lzQ2hhcnQgJiYgIWRlZmluZUNoYXJ0fVxuICAgICAgICAgICAgICBpc0RlZmluZUNoYXJ0TGVmdExhYmVsPXtpc0NoYXJ0ICYmIGRlZmluZUNoYXJ0fVxuICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB0aGlzLm9uQ2hhbmdlTGFiZWwodmFsdWUsICdsZWZ0Jyl9XG4gICAgICAgICAgICAgIG1hdGhNbE9wdGlvbnM9e21hdGhNbE9wdGlvbnN9XG4gICAgICAgICAgICAgIGNoYXJhY3RlcnNMaW1pdD17bGFiZWxzQ2hhcmFjdGVyc0xpbWl0fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgICAgIHtkZWZpbmVDaGFydCA/IChcbiAgICAgICAgICAgIDxEZWZpbmVDaGFydFN2ZyB3aWR0aD17ZmluYWxXaWR0aH0gaGVpZ2h0PXtmaW5hbEhlaWdodH0+XG4gICAgICAgICAgICAgIDxHcmFwaEJveFxuICAgICAgICAgICAgICAgIHJlZj17KHIpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZyA9IHI7XG4gICAgICAgICAgICAgICAgICBpZiAocm9vdFJlZikge1xuICAgICAgICAgICAgICAgICAgICByb290UmVmKHIpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtPXtgdHJhbnNsYXRlKCR7bGVmdFBhZGRpbmcgKyAoZG9tYWluLnBhZGRpbmcgfHwgMCl9LCAke3RvcFBhZGRpbmcgKyAocmFuZ2UucGFkZGluZyB8fCAwKX0pYH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgICAgICAgPC9HcmFwaEJveD5cbiAgICAgICAgICAgIDwvRGVmaW5lQ2hhcnRTdmc+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxDaGFydFN2ZyB3aWR0aD17ZmluYWxXaWR0aH0gaGVpZ2h0PXtmaW5hbEhlaWdodH0+XG4gICAgICAgICAgICAgIDxHcmFwaEJveFxuICAgICAgICAgICAgICAgIHJlZj17KHIpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZyA9IHI7XG4gICAgICAgICAgICAgICAgICBpZiAocm9vdFJlZikge1xuICAgICAgICAgICAgICAgICAgICByb290UmVmKHIpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtPXtgdHJhbnNsYXRlKCR7bGVmdFBhZGRpbmcgKyAoZG9tYWluLnBhZGRpbmcgfHwgMCl9LCAke3RvcFBhZGRpbmcgKyAocmFuZ2UucGFkZGluZyB8fCAwKX0pYH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgICAgICAgPC9HcmFwaEJveD5cbiAgICAgICAgICAgIDwvQ2hhcnRTdmc+XG4gICAgICAgICAgKX1cbiAgICAgICAgICB7c2hvd0xhYmVscyAmJiAhaXNDaGFydCAmJiAoXG4gICAgICAgICAgICA8TGFiZWxcbiAgICAgICAgICAgICAgc2lkZT1cInJpZ2h0XCJcbiAgICAgICAgICAgICAgdGV4dD17bGFiZWxzLnJpZ2h0fVxuICAgICAgICAgICAgICBkaXNhYmxlZExhYmVsPXtkaXNhYmxlZExhYmVsc31cbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2xhYmVsc1BsYWNlaG9sZGVycz8ucmlnaHR9XG4gICAgICAgICAgICAgIGdyYXBoSGVpZ2h0PXtmaW5hbEhlaWdodH1cbiAgICAgICAgICAgICAgZ3JhcGhXaWR0aD17ZmluYWxXaWR0aH1cbiAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4gdGhpcy5vbkNoYW5nZUxhYmVsKHZhbHVlLCAncmlnaHQnKX1cbiAgICAgICAgICAgICAgbWF0aE1sT3B0aW9ucz17bWF0aE1sT3B0aW9uc31cbiAgICAgICAgICAgICAgY2hhcmFjdGVyc0xpbWl0PXtsYWJlbHNDaGFyYWN0ZXJzTGltaXR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgICAge3Nob3dQaXhlbEd1aWRlcyAmJiAoXG4gICAgICAgICAgICA8U2lkZVBpeGVsR3VpZGVzXG4gICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgcGFkZGluZ1RvcDogc2lkZUdyaWRsaW5lc1BhZGRpbmcsXG4gICAgICAgICAgICAgICAgbWFyZ2luVG9wOiAzMSxcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge1suLi5BcnJheShuYk9mSG9yaXpvbnRhbExpbmVzICsgMSkua2V5cygpXS5yZXZlcnNlKCkubWFwKCh2YWx1ZSkgPT4gKFxuICAgICAgICAgICAgICAgIDxSZWFkYWJsZSBmYWxzZSBrZXk9e2B0b3AtZ3VpZGUtJHt2YWx1ZX1gfT5cbiAgICAgICAgICAgICAgICAgIDxTaWRlUGl4ZWxJbmRpY2F0b3I+4pSBIHt2YWx1ZSAqIDEwMH1weDwvU2lkZVBpeGVsSW5kaWNhdG9yPlxuICAgICAgICAgICAgICAgIDwvUmVhZGFibGU+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9TaWRlUGl4ZWxHdWlkZXM+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9XcmFwcGVyPlxuICAgICAgICB7c2hvd0xhYmVscyAmJiAoXG4gICAgICAgICAgPExhYmVsXG4gICAgICAgICAgICBzaWRlPVwiYm90dG9tXCJcbiAgICAgICAgICAgIHRleHQ9e2xhYmVscy5ib3R0b219XG4gICAgICAgICAgICBkaXNhYmxlZExhYmVsPXtkaXNhYmxlZExhYmVsc31cbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtsYWJlbHNQbGFjZWhvbGRlcnM/LmJvdHRvbX1cbiAgICAgICAgICAgIGdyYXBoSGVpZ2h0PXtmaW5hbEhlaWdodH1cbiAgICAgICAgICAgIGdyYXBoV2lkdGg9e2ZpbmFsV2lkdGh9XG4gICAgICAgICAgICB0aXRsZUhlaWdodD17dGl0bGVIZWlnaHR9XG4gICAgICAgICAgICBpc0NoYXJ0Qm90dG9tTGFiZWw9e2lzQ2hhcnQgJiYgIWRlZmluZUNoYXJ0fVxuICAgICAgICAgICAgaXNEZWZpbmVDaGFydEJvdHRvbUxhYmVsPXtpc0NoYXJ0ICYmIGRlZmluZUNoYXJ0fVxuICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4gdGhpcy5vbkNoYW5nZUxhYmVsKHZhbHVlLCAnYm90dG9tJyl9XG4gICAgICAgICAgICBtYXRoTWxPcHRpb25zPXttYXRoTWxPcHRpb25zfVxuICAgICAgICAgICAgY2hhcmFjdGVyc0xpbWl0PXtsYWJlbHNDaGFyYWN0ZXJzTGltaXR9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgIDwvU3R5bGVkUm9vdD5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJvb3Q7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsVUFBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUcsWUFBQSxHQUFBSCxPQUFBO0FBRUEsSUFBQUksU0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssYUFBQSxHQUFBTixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU0sTUFBQSxHQUFBTixPQUFBO0FBRUEsSUFBQU8sTUFBQSxHQUFBUixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVEsTUFBQSxHQUFBUixPQUFBO0FBQTRFLFNBQUFTLDJCQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSx5QkFBQUMsTUFBQSxJQUFBSCxDQUFBLENBQUFHLE1BQUEsQ0FBQUMsUUFBQSxLQUFBSixDQUFBLHFCQUFBRSxDQUFBLFFBQUFHLEtBQUEsQ0FBQUMsT0FBQSxDQUFBTixDQUFBLE1BQUFFLENBQUEsR0FBQUssMkJBQUEsQ0FBQVAsQ0FBQSxNQUFBQyxDQUFBLElBQUFELENBQUEsdUJBQUFBLENBQUEsQ0FBQVEsTUFBQSxJQUFBTixDQUFBLEtBQUFGLENBQUEsR0FBQUUsQ0FBQSxPQUFBTyxFQUFBLE1BQUFDLENBQUEsWUFBQUEsRUFBQSxlQUFBQyxDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxXQUFBQSxFQUFBLFdBQUFILEVBQUEsSUFBQVQsQ0FBQSxDQUFBUSxNQUFBLEtBQUFLLElBQUEsV0FBQUEsSUFBQSxNQUFBQyxLQUFBLEVBQUFkLENBQUEsQ0FBQVMsRUFBQSxVQUFBUixDQUFBLFdBQUFBLEVBQUFELENBQUEsVUFBQUEsQ0FBQSxLQUFBZSxDQUFBLEVBQUFMLENBQUEsZ0JBQUFNLFNBQUEsaUpBQUFDLENBQUEsRUFBQUMsQ0FBQSxPQUFBQyxDQUFBLGdCQUFBUixDQUFBLFdBQUFBLEVBQUEsSUFBQVQsQ0FBQSxHQUFBQSxDQUFBLENBQUFrQixJQUFBLENBQUFwQixDQUFBLE1BQUFZLENBQUEsV0FBQUEsRUFBQSxRQUFBWixDQUFBLEdBQUFFLENBQUEsQ0FBQW1CLElBQUEsV0FBQUgsQ0FBQSxHQUFBbEIsQ0FBQSxDQUFBYSxJQUFBLEVBQUFiLENBQUEsS0FBQUMsQ0FBQSxXQUFBQSxFQUFBRCxDQUFBLElBQUFtQixDQUFBLE9BQUFGLENBQUEsR0FBQWpCLENBQUEsS0FBQWUsQ0FBQSxXQUFBQSxFQUFBLFVBQUFHLENBQUEsWUFBQWhCLENBQUEsY0FBQUEsQ0FBQSw4QkFBQWlCLENBQUEsUUFBQUYsQ0FBQTtBQUFBLFNBQUFWLDRCQUFBUCxDQUFBLEVBQUFrQixDQUFBLFFBQUFsQixDQUFBLDJCQUFBQSxDQUFBLFNBQUFzQixpQkFBQSxDQUFBdEIsQ0FBQSxFQUFBa0IsQ0FBQSxPQUFBaEIsQ0FBQSxNQUFBcUIsUUFBQSxDQUFBSCxJQUFBLENBQUFwQixDQUFBLEVBQUF3QixLQUFBLDZCQUFBdEIsQ0FBQSxJQUFBRixDQUFBLENBQUF5QixXQUFBLEtBQUF2QixDQUFBLEdBQUFGLENBQUEsQ0FBQXlCLFdBQUEsQ0FBQUMsSUFBQSxhQUFBeEIsQ0FBQSxjQUFBQSxDQUFBLEdBQUFHLEtBQUEsQ0FBQXNCLElBQUEsQ0FBQTNCLENBQUEsb0JBQUFFLENBQUEsK0NBQUEwQixJQUFBLENBQUExQixDQUFBLElBQUFvQixpQkFBQSxDQUFBdEIsQ0FBQSxFQUFBa0IsQ0FBQTtBQUFBLFNBQUFJLGtCQUFBdEIsQ0FBQSxFQUFBa0IsQ0FBQSxhQUFBQSxDQUFBLElBQUFBLENBQUEsR0FBQWxCLENBQUEsQ0FBQVEsTUFBQSxNQUFBVSxDQUFBLEdBQUFsQixDQUFBLENBQUFRLE1BQUEsWUFBQVAsQ0FBQSxNQUFBVyxDQUFBLEdBQUFQLEtBQUEsQ0FBQWEsQ0FBQSxHQUFBakIsQ0FBQSxHQUFBaUIsQ0FBQSxFQUFBakIsQ0FBQSxJQUFBVyxDQUFBLENBQUFYLENBQUEsSUFBQUQsQ0FBQSxDQUFBQyxDQUFBLFVBQUFXLENBQUE7QUFBQSxTQUFBaUIsUUFBQTVCLENBQUEsRUFBQUQsQ0FBQSxRQUFBRSxDQUFBLEdBQUE0QixNQUFBLENBQUFDLElBQUEsQ0FBQTlCLENBQUEsT0FBQTZCLE1BQUEsQ0FBQUUscUJBQUEsUUFBQWYsQ0FBQSxHQUFBYSxNQUFBLENBQUFFLHFCQUFBLENBQUEvQixDQUFBLEdBQUFELENBQUEsS0FBQWlCLENBQUEsR0FBQUEsQ0FBQSxDQUFBZ0IsTUFBQSxXQUFBakMsQ0FBQSxXQUFBOEIsTUFBQSxDQUFBSSx3QkFBQSxDQUFBakMsQ0FBQSxFQUFBRCxDQUFBLEVBQUFtQyxVQUFBLE9BQUFqQyxDQUFBLENBQUFrQyxJQUFBLENBQUFDLEtBQUEsQ0FBQW5DLENBQUEsRUFBQWUsQ0FBQSxZQUFBZixDQUFBO0FBQUEsU0FBQW9DLGNBQUFyQyxDQUFBLGFBQUFELENBQUEsTUFBQUEsQ0FBQSxHQUFBdUMsU0FBQSxDQUFBL0IsTUFBQSxFQUFBUixDQUFBLFVBQUFFLENBQUEsV0FBQXFDLFNBQUEsQ0FBQXZDLENBQUEsSUFBQXVDLFNBQUEsQ0FBQXZDLENBQUEsUUFBQUEsQ0FBQSxPQUFBNkIsT0FBQSxDQUFBQyxNQUFBLENBQUE1QixDQUFBLE9BQUFzQyxPQUFBLFdBQUF4QyxDQUFBLFFBQUF5QyxnQkFBQSxhQUFBeEMsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsQ0FBQUYsQ0FBQSxTQUFBOEIsTUFBQSxDQUFBWSx5QkFBQSxHQUFBWixNQUFBLENBQUFhLGdCQUFBLENBQUExQyxDQUFBLEVBQUE2QixNQUFBLENBQUFZLHlCQUFBLENBQUF4QyxDQUFBLEtBQUEyQixPQUFBLENBQUFDLE1BQUEsQ0FBQTVCLENBQUEsR0FBQXNDLE9BQUEsV0FBQXhDLENBQUEsSUFBQThCLE1BQUEsQ0FBQWMsY0FBQSxDQUFBM0MsQ0FBQSxFQUFBRCxDQUFBLEVBQUE4QixNQUFBLENBQUFJLHdCQUFBLENBQUFoQyxDQUFBLEVBQUFGLENBQUEsaUJBQUFDLENBQUE7QUFBQSxTQUFBNEMsV0FBQTNDLENBQUEsRUFBQWUsQ0FBQSxFQUFBaEIsQ0FBQSxXQUFBZ0IsQ0FBQSxPQUFBNkIsZ0JBQUEsYUFBQTdCLENBQUEsT0FBQThCLDJCQUFBLGFBQUE3QyxDQUFBLEVBQUE4Qyx5QkFBQSxLQUFBQyxPQUFBLENBQUFDLFNBQUEsQ0FBQWpDLENBQUEsRUFBQWhCLENBQUEsWUFBQTZDLGdCQUFBLGFBQUE1QyxDQUFBLEVBQUF1QixXQUFBLElBQUFSLENBQUEsQ0FBQW9CLEtBQUEsQ0FBQW5DLENBQUEsRUFBQUQsQ0FBQTtBQUFBLFNBQUErQywwQkFBQSxjQUFBOUMsQ0FBQSxJQUFBaUQsT0FBQSxDQUFBQyxTQUFBLENBQUFDLE9BQUEsQ0FBQWpDLElBQUEsQ0FBQTZCLE9BQUEsQ0FBQUMsU0FBQSxDQUFBQyxPQUFBLGlDQUFBakQsQ0FBQSxhQUFBOEMseUJBQUEsWUFBQUEsMEJBQUEsYUFBQTlDLENBQUE7QUFFNUUsSUFBTW9ELFVBQVUsR0FBRyxJQUFBQyxjQUFNLEVBQUMsS0FBSyxDQUFDLENBQUMsVUFBQUMsSUFBQTtFQUFBLElBQUdDLEtBQUssR0FBQUQsSUFBQSxDQUFMQyxLQUFLO0VBQUEsT0FBUTtJQUMvQ0MsTUFBTSxlQUFBQyxNQUFBLENBQWVDLGVBQUssQ0FBQ0MsWUFBWSxDQUFDLENBQUMsQ0FBRTtJQUMzQ0QsS0FBSyxFQUFFQSxlQUFLLENBQUNFLFFBQVEsQ0FBQ0MsSUFBSTtJQUMxQkMsZUFBZSxFQUFFUCxLQUFLLENBQUNRLE9BQU8sQ0FBQ0MsTUFBTSxDQUFDQyxLQUFLO0lBQzNDQyxXQUFXLEVBQUUsTUFBTTtJQUNuQkMsUUFBUSxFQUFFLFVBQVU7SUFDcEJDLFNBQVMsRUFBRSxPQUFPLENBQUU7RUFDdEIsQ0FBQztBQUFBLENBQUMsQ0FBQztBQUVILElBQU1DLE9BQU8sR0FBRyxJQUFBaEIsY0FBTSxFQUFDLEtBQUssQ0FBQyxDQUFDO0VBQzVCaUIsT0FBTyxFQUFFLE1BQU07RUFDZkgsUUFBUSxFQUFFO0FBQ1osQ0FBQyxDQUFDO0FBRUYsSUFBTUksY0FBYyxHQUFHLElBQUFsQixjQUFNLEVBQUMsS0FBSyxDQUFDLENBQUM7RUFDbkNtQixXQUFXLEVBQUUsTUFBTTtFQUNuQkMsUUFBUSxFQUFFO0FBQ1osQ0FBQyxDQUFDO0FBRUYsSUFBTUMsUUFBUSxHQUFHLElBQUFyQixjQUFNLEVBQUMsS0FBSyxDQUFDLENBQUM7RUFDN0JvQixRQUFRLEVBQUU7QUFDWixDQUFDLENBQUM7QUFFRixJQUFNRSxRQUFRLEdBQUcsSUFBQXRCLGNBQU0sRUFBQyxHQUFHLENBQUMsQ0FBQztFQUMzQnVCLE1BQU0sRUFBRSxTQUFTO0VBQ2pCQyxVQUFVLEVBQUU7QUFDZCxDQUFDLENBQUM7QUFFRixJQUFNQyxVQUFVLEdBQUcsSUFBQXpCLGNBQU0sRUFBQyxLQUFLLENBQUMsQ0FBQyxVQUFBMEIsS0FBQTtFQUFBLElBQUd4QixLQUFLLEdBQUF3QixLQUFBLENBQUx4QixLQUFLO0VBQUEsT0FBUTtJQUMvQ0csS0FBSyxFQUFFQSxlQUFLLENBQUNFLFFBQVEsQ0FBQ0MsSUFBSTtJQUMxQm1CLFFBQVEsRUFBRXpCLEtBQUssQ0FBQzBCLFVBQVUsQ0FBQ0QsUUFBUSxHQUFHLENBQUM7SUFDdkNFLE9BQU8sS0FBQXpCLE1BQUEsQ0FBS0YsS0FBSyxDQUFDNEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFBMUIsTUFBQSxDQUFJRixLQUFLLENBQUM0QixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQUk7SUFDeERDLFNBQVMsRUFBRSxRQUFRO0lBQ25CLFlBQVksRUFBRTtNQUNaQyxhQUFhLEVBQUU7SUFDakIsQ0FBQztJQUNELGVBQWUsRUFBRTtNQUNmQyxXQUFXLEVBQUU7SUFDZjtFQUNGLENBQUM7QUFBQSxDQUFDLENBQUM7QUFFSCxJQUFNQyxVQUFVLEdBQUcsSUFBQWxDLGNBQU0sRUFBQyxLQUFLLENBQUMsQ0FBQyxVQUFBbUMsS0FBQTtFQUFBLElBQUdqQyxLQUFLLEdBQUFpQyxLQUFBLENBQUxqQyxLQUFLO0VBQUEsT0FBUTtJQUMvQ0csS0FBSyxFQUFFQSxlQUFLLENBQUNFLFFBQVEsQ0FBQ0MsSUFBSTtJQUMxQm1CLFFBQVEsRUFBRXpCLEtBQUssQ0FBQzBCLFVBQVUsQ0FBQ0QsUUFBUSxHQUFHLENBQUM7SUFDdkNFLE9BQU8sS0FBQXpCLE1BQUEsQ0FBS0YsS0FBSyxDQUFDNEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFBMUIsTUFBQSxDQUFJRixLQUFLLENBQUM0QixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQUk7SUFDeERDLFNBQVMsRUFBRSxRQUFRO0lBQ25CLFlBQVksRUFBRTtNQUNaQyxhQUFhLEVBQUU7SUFDakIsQ0FBQztJQUNELGVBQWUsRUFBRTtNQUNmQyxXQUFXLEVBQUU7SUFDZjtFQUNGLENBQUM7QUFBQSxDQUFDLENBQUM7QUFFSCxJQUFNRyxjQUFjLEdBQUcsSUFBQXBDLGNBQU0sRUFBQyxLQUFLLENBQUMsQ0FBQztFQUNuQ2lCLE9BQU8sRUFBRSxNQUFNO0VBQ2ZvQixVQUFVLEVBQUU7QUFDZCxDQUFDLENBQUM7QUFFRixJQUFNQyxpQkFBaUIsR0FBRyxJQUFBdEMsY0FBTSxFQUFDLEtBQUssQ0FBQyxDQUFDO0VBQ3RDaUIsT0FBTyxFQUFFLE1BQU07RUFDZnNCLGFBQWEsRUFBRSxRQUFRO0VBQ3ZCQyxVQUFVLEVBQUUsUUFBUTtFQUNwQkMsS0FBSyxFQUFFLE9BQU87RUFDZFQsYUFBYSxFQUFFLE1BQU07RUFDckJSLFVBQVUsRUFBRTtBQUNkLENBQUMsQ0FBQztBQUVGLElBQU1rQixlQUFlLEdBQUcsSUFBQTFDLGNBQU0sRUFBQyxLQUFLLENBQUMsQ0FBQztFQUNwQ3lDLEtBQUssRUFBRSxNQUFNO0VBQ2J4QixPQUFPLEVBQUUsTUFBTTtFQUNmc0IsYUFBYSxFQUFFLFFBQVE7RUFDdkJOLFdBQVcsRUFBRTtBQUNmLENBQUMsQ0FBQztBQUVGLElBQU1VLGtCQUFrQixHQUFHLElBQUEzQyxjQUFNLEVBQUMsS0FBSyxDQUFDLENBQUM7RUFDdkMrQixTQUFTLEVBQUUsT0FBTztFQUNsQmEsTUFBTSxFQUFFLE1BQU07RUFDZFosYUFBYSxFQUFFLE1BQU07RUFDckJSLFVBQVUsRUFBRSxNQUFNO0VBQ2xCLG9CQUFvQixFQUFFO0lBQ3BCcUIsWUFBWSxFQUFFO0VBQ2hCO0FBQ0YsQ0FBQyxDQUFDO0FBQUMsSUFFVUMsSUFBSSxHQUFBQyxPQUFBLENBQUFELElBQUEsMEJBQUFFLGdCQUFBO0VBQ2YsU0FBQUYsS0FBWUcsS0FBSyxFQUFFO0lBQUEsSUFBQUMsS0FBQTtJQUFBLElBQUFDLGdCQUFBLG1CQUFBTCxJQUFBO0lBQ2pCSSxLQUFBLEdBQUE1RCxVQUFBLE9BQUF3RCxJQUFBLEdBQU1HLEtBQUs7SUFBRSxJQUFBL0QsZ0JBQUEsYUFBQWdFLEtBQUEsZUE2QkgsVUFBQ0UsQ0FBQyxFQUFLO01BQ2pCLElBQUFDLFdBQUEsR0FBb0NILEtBQUEsQ0FBS0QsS0FBSztRQUF0Q0ssVUFBVSxHQUFBRCxXQUFBLENBQVZDLFVBQVU7UUFBRUMsV0FBVyxHQUFBRixXQUFBLENBQVhFLFdBQVc7TUFFL0IsSUFBSSxDQUFDQSxXQUFXLEVBQUU7UUFDaEI7TUFDRjtNQUVBLElBQVFDLEtBQUssR0FBV0YsVUFBVSxDQUExQkUsS0FBSztRQUFFQyxJQUFJLEdBQUtILFVBQVUsQ0FBbkJHLElBQUk7TUFDbkIsSUFBTUMsTUFBTSxHQUFHLElBQUFDLGtCQUFLLEVBQUNQLENBQUMsQ0FBQ1EsSUFBSSxDQUFDLENBQUMsQ0FBQztNQUM5QixJQUFNQyxDQUFDLEdBQUdMLEtBQUssQ0FBQ0ssQ0FBQyxDQUFDQyxNQUFNLENBQUNKLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNuQyxJQUFNSyxDQUFDLEdBQUdQLEtBQUssQ0FBQ08sQ0FBQyxDQUFDRCxNQUFNLENBQUNKLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUVuQyxJQUFNTSxPQUFPLEdBQUc7UUFDZEgsQ0FBQyxFQUFFSixJQUFJLENBQUNJLENBQUMsQ0FBQ0EsQ0FBQyxDQUFDO1FBQ1pFLENBQUMsRUFBRU4sSUFBSSxDQUFDTSxDQUFDLENBQUNBLENBQUM7TUFDYixDQUFDO01BRURSLFdBQVcsQ0FBQ1MsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFBQSxJQUFBOUUsZ0JBQUEsYUFBQWdFLEtBQUEsbUJBcUJlLFVBQUNlLFFBQVEsRUFBRUMsSUFBSSxFQUFLO01BQ2xDLElBQUFDLFlBQUEsR0FBNENqQixLQUFBLENBQUtELEtBQUs7UUFBOUNtQixNQUFNLEdBQUFELFlBQUEsQ0FBTkMsTUFBTTtRQUFFQyxjQUFjLEdBQUFGLFlBQUEsQ0FBZEUsY0FBYztRQUFFQyxPQUFPLEdBQUFILFlBQUEsQ0FBUEcsT0FBTztNQUV2QyxJQUFJLENBQUNELGNBQWMsRUFBRTtRQUNuQjtNQUNGO01BRUEsSUFBSUMsT0FBTyxFQUFFO1FBQ1gsSUFBSUosSUFBSSxLQUFLLE1BQU0sRUFBRTtVQUNuQkcsY0FBYyxDQUFDLE9BQU8sRUFBRUosUUFBUSxDQUFDO1FBQ25DLENBQUMsTUFBTTtVQUNMSSxjQUFjLENBQUMsUUFBUSxFQUFFSixRQUFRLENBQUM7UUFDcEM7UUFFQTtNQUNGO01BRUFJLGNBQWMsQ0FBQXRGLGFBQUEsQ0FBQUEsYUFBQSxLQUNUcUYsTUFBTSxXQUFBbEYsZ0JBQUEsaUJBQ1JnRixJQUFJLEVBQUdELFFBQVEsRUFDakIsQ0FBQztJQUNKLENBQUM7SUFBQSxJQUFBL0UsZ0JBQUEsYUFBQWdFLEtBQUEsd0JBRW9CLFlBQU07TUFDekIsSUFBTXFCLFlBQVksR0FBR3JCLEtBQUEsQ0FBS3NCLFFBQVE7TUFDbEMsSUFBSUQsWUFBWSxFQUFFO1FBQ2hCLElBQU1FLFdBQVcsR0FBR0YsWUFBWSxDQUFDRyxZQUFZO1FBQzdDeEIsS0FBQSxDQUFLeUIsUUFBUSxDQUFDO1VBQUVGLFdBQVcsRUFBWEEsV0FBVztVQUFFRyxTQUFTLEVBQUUxQixLQUFBLENBQUtELEtBQUssQ0FBQzRCO1FBQU0sQ0FBQyxDQUFDO1FBRTNELElBQUksQ0FBQzNCLEtBQUEsQ0FBSzRCLGNBQWMsSUFBSSxPQUFPQyxjQUFjLEtBQUssV0FBVyxFQUFFO1VBQ2pFN0IsS0FBQSxDQUFLOEIsdUJBQXVCLENBQUMsQ0FBQztRQUNoQztNQUNGO0lBQ0YsQ0FBQztJQUFBLElBQUE5RixnQkFBQSxhQUFBZ0UsS0FBQSxtQkFFZSxZQUFNO01BQ3BCK0IsVUFBVSxDQUFDLFlBQU07UUFDZi9CLEtBQUEsQ0FBS2dDLGtCQUFrQixDQUFDLENBQUM7TUFDM0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDtJQUFBLElBQUFoRyxnQkFBQSxhQUFBZ0UsS0FBQSw2QkFDMEIsWUFBTTtNQUM5QixJQUFJLE9BQU82QixjQUFjLEtBQUssV0FBVyxJQUFJN0IsS0FBQSxDQUFLc0IsUUFBUSxFQUFFO1FBQzFEdEIsS0FBQSxDQUFLNEIsY0FBYyxHQUFHLElBQUlDLGNBQWMsQ0FBQyxVQUFDSSxPQUFPLEVBQUs7VUFBQSxJQUFBQyxTQUFBLEdBQUE1SSwwQkFBQSxDQUNsQzJJLE9BQU87WUFBQUUsS0FBQTtVQUFBO1lBQXpCLEtBQUFELFNBQUEsQ0FBQWhJLENBQUEsTUFBQWlJLEtBQUEsR0FBQUQsU0FBQSxDQUFBL0gsQ0FBQSxJQUFBQyxJQUFBLEdBQTJCO2NBQUEsSUFBbEJnSSxLQUFLLEdBQUFELEtBQUEsQ0FBQTlILEtBQUE7Y0FDWixJQUFBZ0ksa0JBQUEsR0FBMEJELEtBQUssQ0FBQ0UsV0FBVztnQkFBbkMvQyxLQUFLLEdBQUE4QyxrQkFBQSxDQUFMOUMsS0FBSztnQkFBRUcsTUFBTSxHQUFBMkMsa0JBQUEsQ0FBTjNDLE1BQU07Y0FDckI7Y0FDQSxJQUFJSCxLQUFLLEdBQUcsQ0FBQyxJQUFJRyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQnFDLFVBQVUsQ0FBQyxZQUFNO2tCQUNmL0IsS0FBQSxDQUFLZ0Msa0JBQWtCLENBQUMsQ0FBQztnQkFDM0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDTjtjQUNGO1lBQ0Y7VUFBQyxTQUFBTyxHQUFBO1lBQUFMLFNBQUEsQ0FBQTFJLENBQUEsQ0FBQStJLEdBQUE7VUFBQTtZQUFBTCxTQUFBLENBQUE1SCxDQUFBO1VBQUE7UUFDSCxDQUFDLENBQUM7UUFFRjBGLEtBQUEsQ0FBSzRCLGNBQWMsQ0FBQ1ksT0FBTyxDQUFDeEMsS0FBQSxDQUFLc0IsUUFBUSxDQUFDO01BQzVDO0lBQ0YsQ0FBQztJQUFBLElBQUF0RixnQkFBQSxhQUFBZ0UsS0FBQSwrQkFFMkIsWUFBTTtNQUNoQyxJQUFJQSxLQUFBLENBQUs0QixjQUFjLEVBQUU7UUFDdkI1QixLQUFBLENBQUs0QixjQUFjLENBQUNhLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDekMsS0FBQSxDQUFLNEIsY0FBYyxHQUFHLElBQUk7TUFDNUI7SUFDRixDQUFDO0lBcklDNUIsS0FBQSxDQUFLMEMsS0FBSyxHQUFHO01BQ1huQixXQUFXLEVBQUU7SUFDZixDQUFDO0lBQ0R2QixLQUFBLENBQUs0QixjQUFjLEdBQUcsSUFBSTtJQUFDLE9BQUE1QixLQUFBO0VBQzdCO0VBQUMsSUFBQTJDLFVBQUEsYUFBQS9DLElBQUEsRUFBQUUsZ0JBQUE7RUFBQSxXQUFBOEMsYUFBQSxhQUFBaEQsSUFBQTtJQUFBaUQsR0FBQTtJQUFBeEksS0FBQSxFQTRDRCxTQUFBeUksaUJBQWlCQSxDQUFBLEVBQUc7TUFDbEIsSUFBTTVDLENBQUMsR0FBRyxJQUFBNkMsbUJBQU0sRUFBQyxJQUFJLENBQUM3QyxDQUFDLENBQUM7TUFDeEJBLENBQUMsQ0FBQzhDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDQyxTQUFTLENBQUNDLElBQUksQ0FBQyxJQUFJLEVBQUVoRCxDQUFDLENBQUMsQ0FBQztNQUMvQyxJQUFJLENBQUM4QixrQkFBa0IsQ0FBQyxDQUFDO01BQ3pCLElBQUksQ0FBQ0YsdUJBQXVCLENBQUMsQ0FBQztJQUNoQztFQUFDO0lBQUFlLEdBQUE7SUFBQXhJLEtBQUEsRUFFRCxTQUFBOEksb0JBQW9CQSxDQUFBLEVBQUc7TUFDckIsSUFBTWpELENBQUMsR0FBRyxJQUFBNkMsbUJBQU0sRUFBQyxJQUFJLENBQUM3QyxDQUFDLENBQUM7TUFDeEJBLENBQUMsQ0FBQzhDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDO01BQ3ZCLElBQUksQ0FBQ0kseUJBQXlCLENBQUMsQ0FBQztJQUNsQztFQUFDO0lBQUFQLEdBQUE7SUFBQXhJLEtBQUEsRUFFRCxTQUFBZ0osa0JBQWtCQSxDQUFDQyxTQUFTLEVBQUU7TUFDNUIsSUFBSUEsU0FBUyxDQUFDM0IsS0FBSyxLQUFLLElBQUksQ0FBQzVCLEtBQUssQ0FBQzRCLEtBQUssRUFBRTtRQUN4QyxJQUFJLENBQUNLLGtCQUFrQixDQUFDLENBQUM7TUFDM0I7SUFDRjtFQUFDO0lBQUFhLEdBQUE7SUFBQXhJLEtBQUEsRUFzRUQsU0FBQWtKLE1BQU1BLENBQUEsRUFBRztNQUFBLElBQUFDLE1BQUE7TUFDUCxJQUFBQyxZQUFBLEdBa0JJLElBQUksQ0FBQzFELEtBQUs7UUFqQloyRCxhQUFhLEdBQUFELFlBQUEsQ0FBYkMsYUFBYTtRQUNiQyxjQUFjLEdBQUFGLFlBQUEsQ0FBZEUsY0FBYztRQUNkekMsTUFBTSxHQUFBdUMsWUFBQSxDQUFOdkMsTUFBTTtRQUNOMEMsa0JBQWtCLEdBQUFILFlBQUEsQ0FBbEJHLGtCQUFrQjtRQUNsQkMsZ0JBQWdCLEdBQUFKLFlBQUEsQ0FBaEJJLGdCQUFnQjtRQUNoQnpELFVBQVUsR0FBQXFELFlBQUEsQ0FBVnJELFVBQVU7UUFDVjBELFFBQVEsR0FBQUwsWUFBQSxDQUFSSyxRQUFRO1FBQ1JDLFdBQVcsR0FBQU4sWUFBQSxDQUFYTSxXQUFXO1FBQ1hDLGFBQWEsR0FBQVAsWUFBQSxDQUFiTyxhQUFhO1FBQ2I1QyxPQUFPLEdBQUFxQyxZQUFBLENBQVByQyxPQUFPO1FBQ1A2QyxVQUFVLEdBQUFSLFlBQUEsQ0FBVlEsVUFBVTtRQUNWQyxlQUFlLEdBQUFULFlBQUEsQ0FBZlMsZUFBZTtRQUNmQyxTQUFTLEdBQUFWLFlBQUEsQ0FBVFUsU0FBUztRQUNUeEMsS0FBSyxHQUFBOEIsWUFBQSxDQUFMOUIsS0FBSztRQUNMeUMsT0FBTyxHQUFBWCxZQUFBLENBQVBXLE9BQU87UUFBQUMscUJBQUEsR0FBQVosWUFBQSxDQUNQYSxhQUFhO1FBQWJBLGFBQWEsR0FBQUQscUJBQUEsY0FBRyxDQUFDLENBQUMsR0FBQUEscUJBQUE7UUFDbEJFLHFCQUFxQixHQUFBZCxZQUFBLENBQXJCYyxxQkFBcUI7TUFFdkIsSUFBQUMsZ0JBQUEsR0FJSXBFLFVBQVUsQ0FIWnFFLElBQUk7UUFBQUMscUJBQUEsR0FBQUYsZ0JBQUEsQ0FBSWpGLEtBQUs7UUFBTEEsS0FBSyxHQUFBbUYscUJBQUEsY0FBRyxHQUFHLEdBQUFBLHFCQUFBO1FBQUFDLHFCQUFBLEdBQUFILGdCQUFBLENBQUU5RSxNQUFNO1FBQU5BLE1BQU0sR0FBQWlGLHFCQUFBLGNBQUcsR0FBRyxHQUFBQSxxQkFBQTtRQUNqQ0MsTUFBTSxHQUVKeEUsVUFBVSxDQUZad0UsTUFBTTtRQUNOQyxLQUFLLEdBQ0h6RSxVQUFVLENBRFp5RSxLQUFLO01BR1AsSUFBTUMsVUFBVSxHQUFHLEVBQUU7TUFDckIsSUFBTUMsV0FBVyxHQUFHLElBQUFDLG9CQUFhLEVBQUMsSUFBQUMsMEJBQW1CLEVBQUMvRCxNQUFNLGFBQU5BLE1BQU0sdUJBQU5BLE1BQU0sQ0FBRWdFLElBQUksQ0FBQyxDQUFDLElBQUksSUFBQUMsb0JBQWEsRUFBQ3ZCLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7TUFDbkgsSUFBTXdCLFlBQVksR0FDaEIsSUFBQUosb0JBQWEsRUFBQyxJQUFBQywwQkFBbUIsRUFBQy9ELE1BQU0sYUFBTkEsTUFBTSx1QkFBTkEsTUFBTSxDQUFFbUUsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFBRixvQkFBYSxFQUFDdkIsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtNQUNsRyxJQUFNMEIsVUFBVSxHQUFHL0YsS0FBSyxHQUFHd0YsV0FBVyxHQUFHSyxZQUFZLEdBQUcsQ0FBQ1IsTUFBTSxDQUFDakcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO01BQ2pGLElBQU00RyxXQUFXLEdBQUc3RixNQUFNLEdBQUdvRixVQUFVLEdBQUcsQ0FBQyxHQUFHLENBQUNELEtBQUssQ0FBQ2xHLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztNQUV0RSxJQUFNNkcsa0JBQWtCLEdBQUcsQ0FDekIsTUFBTSxFQUNOLFFBQVEsRUFDUixXQUFXLEVBQ1gsYUFBYSxFQUNiLFdBQVcsRUFDWCxlQUFlLEVBQ2Y7TUFDQTtNQUFBLENBQ0Q7TUFFRCxJQUFNQyxZQUFZLEdBQUcxQixXQUFXLElBQUlHLGVBQWUsR0FBR3hFLE1BQU0sR0FBRyxHQUFHLEdBQUdBLE1BQU07TUFDM0UsSUFBTWdHLGlCQUFpQixHQUFHQyxRQUFRLENBQUNwRyxLQUFLLEdBQUcsR0FBRyxDQUFDO01BQy9DLElBQU1xRyxtQkFBbUIsR0FBR0QsUUFBUSxDQUFDRixZQUFZLEdBQUcsR0FBRyxDQUFDO01BQ3hELElBQU1JLG9CQUFvQixHQUFHRixRQUFRLENBQUNGLFlBQVksR0FBRyxHQUFHLENBQUM7TUFDekQsSUFBUWxFLFdBQVcsR0FBSyxJQUFJLENBQUNtQixLQUFLLENBQTFCbkIsV0FBVztNQUVuQixvQkFDRTVJLE1BQUEsWUFBQW1OLGFBQUEsQ0FBQ2pKLFVBQVUsUUFDUnFILGVBQWUsaUJBQ2R2TCxNQUFBLFlBQUFtTixhQUFBLENBQUM1RyxjQUFjO1FBQUM2RyxLQUFLLEVBQUU7VUFBRUMsVUFBVSxFQUFFNUUsT0FBTyxHQUFHLEVBQUUsR0FBRzZDLFVBQVUsR0FBRyxFQUFFLEdBQUc7UUFBRztNQUFFLEdBQ3hFLElBQUFnQyxtQkFBQSxhQUFJck0sS0FBSyxDQUFDOEwsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUNwSyxJQUFJLENBQUMsQ0FBQyxFQUFFNEssR0FBRyxDQUFDLFVBQUM3TCxLQUFLO1FBQUEsb0JBQ2xEMUIsTUFBQSxZQUFBbU4sYUFBQSxDQUFDN00sU0FBQSxDQUFBa04sUUFBUTtVQUFDLGFBQUs7VUFBQ3RELEdBQUcsZUFBQTNGLE1BQUEsQ0FBZTdDLEtBQUs7UUFBRyxnQkFDeEMxQixNQUFBLFlBQUFtTixhQUFBLENBQUMxRyxpQkFBaUIscUJBQ2hCekcsTUFBQSxZQUFBbU4sYUFBQSxjQUFNekwsS0FBSyxHQUFHLEdBQUcsRUFBQyxJQUFPLENBQUMsZUFDMUIxQixNQUFBLFlBQUFtTixhQUFBLGNBQUssR0FBTSxDQUNNLENBQ1gsQ0FBQztNQUFBLENBQ1osQ0FDYSxDQUNqQixFQUNBM0IsU0FBUyxLQUNQVCxhQUFhLGdCQUNaL0ssTUFBQSxZQUFBbU4sYUFBQTtRQUNFTSxHQUFHLEVBQUUsU0FBTEEsR0FBR0EsQ0FBRzdNLENBQUM7VUFBQSxPQUFNaUssTUFBSSxDQUFDbEMsUUFBUSxHQUFHL0gsQ0FBQztRQUFBLENBQUU7UUFDaEN3TSxLQUFLLEVBQUFsSyxhQUFBLENBQUFBLGFBQUEsS0FDQ3VGLE9BQU8sSUFBSTtVQUFFN0IsS0FBSyxFQUFFK0Y7UUFBVyxDQUFDLEdBQ2hDLElBQUFOLG9CQUFhLEVBQUMsSUFBQUMsMEJBQW1CLEVBQUN0RCxLQUFLLENBQUMsQ0FBQyxJQUFJO1VBQUU1RCxPQUFPLEVBQUU7UUFBTyxDQUFDO01BQ3BFLEdBRURxRCxPQUFPLGdCQUNOekksTUFBQSxZQUFBbU4sYUFBQSxDQUFDOUcsVUFBVTtRQUFDcUgsU0FBUyxFQUFDLFVBQVU7UUFBQ0MsdUJBQXVCLEVBQUU7VUFBRUMsTUFBTSxFQUFFNUUsS0FBSyxJQUFJO1FBQUc7TUFBRSxDQUFFLENBQUMsZ0JBRXJGaEosTUFBQSxZQUFBbU4sYUFBQSxDQUFDdkgsVUFBVTtRQUFDOEgsU0FBUyxFQUFDLFVBQVU7UUFBQ0MsdUJBQXVCLEVBQUU7VUFBRUMsTUFBTSxFQUFFNUUsS0FBSyxJQUFJO1FBQUc7TUFBRSxDQUFFLENBRW5GLENBQUMsZ0JBRU5oSixNQUFBLFlBQUFtTixhQUFBO1FBQUtNLEdBQUcsRUFBRSxTQUFMQSxHQUFHQSxDQUFHN00sQ0FBQztVQUFBLE9BQU1pSyxNQUFJLENBQUNsQyxRQUFRLEdBQUcvSCxDQUFDO1FBQUE7TUFBRSxHQUNsQzZILE9BQU8sZ0JBQ056SSxNQUFBLFlBQUFtTixhQUFBLENBQUM5RyxVQUFVO1FBQUNxSCxTQUFTLEVBQUVuQyxlQUFlLEdBQUcsYUFBYSxHQUFHO01BQUcsZ0JBQzFEdkwsTUFBQSxZQUFBbU4sYUFBQSxDQUFDNU0sYUFBQSxXQUFZO1FBQ1g2TSxLQUFLLEVBQ0gzRSxPQUFPLElBQUk7VUFDVDdCLEtBQUssRUFBRStGO1FBQ1QsQ0FDRDtRQUNEa0IsTUFBTSxFQUFFN0UsS0FBSyxJQUFJLEVBQUc7UUFDcEI4RSxRQUFRLEVBQUV6QyxhQUFjO1FBQ3hCMEMsV0FBVyxFQUNSM0MsV0FBVyxJQUFJRixnQkFBZ0IsSUFBTSxDQUFDSCxhQUFhLElBQUksMENBQ3pEO1FBQ0RpRCxXQUFXLEVBQUU7VUFBRUMsU0FBUyxFQUFFLElBQUk7VUFBRUMsUUFBUSxFQUFFO1FBQUssQ0FBRTtRQUNqREMsYUFBYSxFQUFFdEIsa0JBQW1CO1FBQ2xDdUIsZ0JBQWdCO1FBQ2hCQyxTQUFTLEVBQUUsSUFBSSxDQUFDQztNQUFjLENBQy9CLENBQ1MsQ0FBQyxnQkFFYnRPLE1BQUEsWUFBQW1OLGFBQUEsQ0FBQ3ZILFVBQVU7UUFBQzhILFNBQVMsRUFBRW5DLGVBQWUsR0FBRyxhQUFhLEdBQUc7TUFBRyxnQkFDMUR2TCxNQUFBLFlBQUFtTixhQUFBLENBQUM1TSxhQUFBLFdBQVk7UUFDWDZNLEtBQUssRUFDSDNFLE9BQU8sSUFBSTtVQUNUN0IsS0FBSyxFQUFFK0Y7UUFDVCxDQUNEO1FBQ0RrQixNQUFNLEVBQUU3RSxLQUFLLElBQUksRUFBRztRQUNwQjhFLFFBQVEsRUFBRXpDLGFBQWM7UUFDeEIwQyxXQUFXLEVBQ1IzQyxXQUFXLElBQUlGLGdCQUFnQixJQUFNLENBQUNILGFBQWEsSUFBSSwwQ0FDekQ7UUFDRGlELFdBQVcsRUFBRTtVQUFFQyxTQUFTLEVBQUUsSUFBSTtVQUFFQyxRQUFRLEVBQUU7UUFBSyxDQUFFO1FBQ2pEQyxhQUFhLEVBQUV0QixrQkFBbUI7UUFDbEN1QixnQkFBZ0I7UUFDaEJDLFNBQVMsRUFBRSxJQUFJLENBQUNDO01BQWMsQ0FDL0IsQ0FDUyxDQUVYLENBQ04sQ0FBQyxFQUNIaEQsVUFBVSxJQUFJLENBQUM3QyxPQUFPLGlCQUNyQnpJLE1BQUEsWUFBQW1OLGFBQUEsQ0FBQzFNLE1BQUEsV0FBSztRQUNKNEgsSUFBSSxFQUFDLEtBQUs7UUFDVmtHLElBQUksRUFBRWhHLE1BQU0sQ0FBQ2lHLEdBQUk7UUFDakJDLGFBQWEsRUFBRXpELGNBQWU7UUFDOUIrQyxXQUFXLEVBQUU5QyxrQkFBa0IsYUFBbEJBLGtCQUFrQix1QkFBbEJBLGtCQUFrQixDQUFFdUQsR0FBSTtRQUNyQ0UsV0FBVyxFQUFFOUIsV0FBWTtRQUN6QitCLFVBQVUsRUFBRWhDLFVBQVc7UUFDdkJtQixRQUFRLEVBQUUsU0FBVkEsUUFBUUEsQ0FBR3BNLEtBQUs7VUFBQSxPQUFLbUosTUFBSSxDQUFDK0QsYUFBYSxDQUFDbE4sS0FBSyxFQUFFLEtBQUssQ0FBQztRQUFBLENBQUM7UUFDdERpSyxhQUFhLEVBQUVBLGFBQWM7UUFDN0JrRCxlQUFlLEVBQUVqRDtNQUFzQixDQUN4QyxDQUNGLGVBQ0Q1TCxNQUFBLFlBQUFtTixhQUFBLENBQUNoSSxPQUFPLFFBQ0xtRyxVQUFVLGlCQUNUdEwsTUFBQSxZQUFBbU4sYUFBQSxDQUFDMU0sTUFBQSxXQUFLO1FBQ0o0SCxJQUFJLEVBQUMsTUFBTTtRQUNYa0csSUFBSSxFQUFFaEcsTUFBTSxDQUFDZ0UsSUFBSztRQUNsQmtDLGFBQWEsRUFBRXpELGNBQWU7UUFDOUIrQyxXQUFXLEVBQUU5QyxrQkFBa0IsYUFBbEJBLGtCQUFrQix1QkFBbEJBLGtCQUFrQixDQUFFc0IsSUFBSztRQUN0Q21DLFdBQVcsRUFBRTlCLFdBQVk7UUFDekIrQixVQUFVLEVBQUVoQyxVQUFXO1FBQ3ZCbUMsZ0JBQWdCLEVBQUVyRyxPQUFPLElBQUksQ0FBQzJDLFdBQVk7UUFDMUMyRCxzQkFBc0IsRUFBRXRHLE9BQU8sSUFBSTJDLFdBQVk7UUFDL0MwQyxRQUFRLEVBQUUsU0FBVkEsUUFBUUEsQ0FBR3BNLEtBQUs7VUFBQSxPQUFLbUosTUFBSSxDQUFDK0QsYUFBYSxDQUFDbE4sS0FBSyxFQUFFLE1BQU0sQ0FBQztRQUFBLENBQUM7UUFDdkRpSyxhQUFhLEVBQUVBLGFBQWM7UUFDN0JrRCxlQUFlLEVBQUVqRDtNQUFzQixDQUN4QyxDQUNGLEVBQ0FSLFdBQVcsZ0JBQ1ZwTCxNQUFBLFlBQUFtTixhQUFBLENBQUM5SCxjQUFjO1FBQUN1QixLQUFLLEVBQUUrRixVQUFXO1FBQUM1RixNQUFNLEVBQUU2RjtNQUFZLGdCQUNyRDVNLE1BQUEsWUFBQW1OLGFBQUEsQ0FBQzFILFFBQVE7UUFDUGdJLEdBQUcsRUFBRSxTQUFMQSxHQUFHQSxDQUFHN00sQ0FBQyxFQUFLO1VBQ1ZpSyxNQUFJLENBQUN0RCxDQUFDLEdBQUczRyxDQUFDO1VBQ1YsSUFBSTZLLE9BQU8sRUFBRTtZQUNYQSxPQUFPLENBQUM3SyxDQUFDLENBQUM7VUFDWjtRQUNGLENBQUU7UUFDRm9PLFNBQVMsZUFBQXpLLE1BQUEsQ0FBZTZILFdBQVcsSUFBSUgsTUFBTSxDQUFDakcsT0FBTyxJQUFJLENBQUMsQ0FBQyxRQUFBekIsTUFBQSxDQUFLNEgsVUFBVSxJQUFJRCxLQUFLLENBQUNsRyxPQUFPLElBQUksQ0FBQyxDQUFDO01BQUksR0FFcEdtRixRQUNPLENBQ0ksQ0FBQyxnQkFFakJuTCxNQUFBLFlBQUFtTixhQUFBLENBQUMzSCxRQUFRO1FBQUNvQixLQUFLLEVBQUUrRixVQUFXO1FBQUM1RixNQUFNLEVBQUU2RjtNQUFZLGdCQUMvQzVNLE1BQUEsWUFBQW1OLGFBQUEsQ0FBQzFILFFBQVE7UUFDUGdJLEdBQUcsRUFBRSxTQUFMQSxHQUFHQSxDQUFHN00sQ0FBQyxFQUFLO1VBQ1ZpSyxNQUFJLENBQUN0RCxDQUFDLEdBQUczRyxDQUFDO1VBQ1YsSUFBSTZLLE9BQU8sRUFBRTtZQUNYQSxPQUFPLENBQUM3SyxDQUFDLENBQUM7VUFDWjtRQUNGLENBQUU7UUFDRm9PLFNBQVMsZUFBQXpLLE1BQUEsQ0FBZTZILFdBQVcsSUFBSUgsTUFBTSxDQUFDakcsT0FBTyxJQUFJLENBQUMsQ0FBQyxRQUFBekIsTUFBQSxDQUFLNEgsVUFBVSxJQUFJRCxLQUFLLENBQUNsRyxPQUFPLElBQUksQ0FBQyxDQUFDO01BQUksR0FFcEdtRixRQUNPLENBQ0YsQ0FDWCxFQUNBRyxVQUFVLElBQUksQ0FBQzdDLE9BQU8saUJBQ3JCekksTUFBQSxZQUFBbU4sYUFBQSxDQUFDMU0sTUFBQSxXQUFLO1FBQ0o0SCxJQUFJLEVBQUMsT0FBTztRQUNaa0csSUFBSSxFQUFFaEcsTUFBTSxDQUFDbUUsS0FBTTtRQUNuQitCLGFBQWEsRUFBRXpELGNBQWU7UUFDOUIrQyxXQUFXLEVBQUU5QyxrQkFBa0IsYUFBbEJBLGtCQUFrQix1QkFBbEJBLGtCQUFrQixDQUFFeUIsS0FBTTtRQUN2Q2dDLFdBQVcsRUFBRTlCLFdBQVk7UUFDekIrQixVQUFVLEVBQUVoQyxVQUFXO1FBQ3ZCbUIsUUFBUSxFQUFFLFNBQVZBLFFBQVFBLENBQUdwTSxLQUFLO1VBQUEsT0FBS21KLE1BQUksQ0FBQytELGFBQWEsQ0FBQ2xOLEtBQUssRUFBRSxPQUFPLENBQUM7UUFBQSxDQUFDO1FBQ3hEaUssYUFBYSxFQUFFQSxhQUFjO1FBQzdCa0QsZUFBZSxFQUFFakQ7TUFBc0IsQ0FDeEMsQ0FDRixFQUNBTCxlQUFlLGlCQUNkdkwsTUFBQSxZQUFBbU4sYUFBQSxDQUFDdEcsZUFBZTtRQUNkdUcsS0FBSyxFQUFFO1VBQ0w1RyxVQUFVLEVBQUUwRyxvQkFBb0I7VUFDaEMrQixTQUFTLEVBQUU7UUFDYjtNQUFFLEdBRUQsSUFBQTNCLG1CQUFBLGFBQUlyTSxLQUFLLENBQUNnTSxtQkFBbUIsR0FBRyxDQUFDLENBQUMsQ0FBQ3RLLElBQUksQ0FBQyxDQUFDLEVBQUV1TSxPQUFPLENBQUMsQ0FBQyxDQUFDM0IsR0FBRyxDQUFDLFVBQUM3TCxLQUFLO1FBQUEsb0JBQzlEMUIsTUFBQSxZQUFBbU4sYUFBQSxDQUFDN00sU0FBQSxDQUFBa04sUUFBUTtVQUFDLGFBQUs7VUFBQ3RELEdBQUcsZUFBQTNGLE1BQUEsQ0FBZTdDLEtBQUs7UUFBRyxnQkFDeEMxQixNQUFBLFlBQUFtTixhQUFBLENBQUNyRyxrQkFBa0IsUUFBQyxTQUFFLEVBQUNwRixLQUFLLEdBQUcsR0FBRyxFQUFDLElBQXNCLENBQ2pELENBQUM7TUFBQSxDQUNaLENBQ2MsQ0FFWixDQUFDLEVBQ1Q0SixVQUFVLGlCQUNUdEwsTUFBQSxZQUFBbU4sYUFBQSxDQUFDMU0sTUFBQSxXQUFLO1FBQ0o0SCxJQUFJLEVBQUMsUUFBUTtRQUNia0csSUFBSSxFQUFFaEcsTUFBTSxDQUFDNEcsTUFBTztRQUNwQlYsYUFBYSxFQUFFekQsY0FBZTtRQUM5QitDLFdBQVcsRUFBRTlDLGtCQUFrQixhQUFsQkEsa0JBQWtCLHVCQUFsQkEsa0JBQWtCLENBQUVrRSxNQUFPO1FBQ3hDVCxXQUFXLEVBQUU5QixXQUFZO1FBQ3pCK0IsVUFBVSxFQUFFaEMsVUFBVztRQUN2Qi9ELFdBQVcsRUFBRUEsV0FBWTtRQUN6QndHLGtCQUFrQixFQUFFM0csT0FBTyxJQUFJLENBQUMyQyxXQUFZO1FBQzVDaUUsd0JBQXdCLEVBQUU1RyxPQUFPLElBQUkyQyxXQUFZO1FBQ2pEMEMsUUFBUSxFQUFFLFNBQVZBLFFBQVFBLENBQUdwTSxLQUFLO1VBQUEsT0FBS21KLE1BQUksQ0FBQytELGFBQWEsQ0FBQ2xOLEtBQUssRUFBRSxRQUFRLENBQUM7UUFBQSxDQUFDO1FBQ3pEaUssYUFBYSxFQUFFQSxhQUFjO1FBQzdCa0QsZUFBZSxFQUFFakQ7TUFBc0IsQ0FDeEMsQ0FFTyxDQUFDO0lBRWpCO0VBQUM7QUFBQSxFQTVXdUIwRCxpQkFBSyxDQUFDQyxTQUFTO0FBQUEsSUFBQWxNLGdCQUFBLGFBQTVCNEQsSUFBSSxlQVNJO0VBQ2pCK0IsS0FBSyxFQUFFd0cscUJBQVMsQ0FBQ0MsTUFBTTtFQUN2QnRFLFFBQVEsRUFBRXVFLG1CQUFZO0VBQ3RCdEUsV0FBVyxFQUFFb0UscUJBQVMsQ0FBQ0csSUFBSTtFQUMzQjNFLGNBQWMsRUFBRXdFLHFCQUFTLENBQUNHLElBQUk7RUFDOUI1RSxhQUFhLEVBQUV5RSxxQkFBUyxDQUFDRyxJQUFJO0VBQzdCbEksVUFBVSxFQUFFbUkscUJBQWMsQ0FBQ0MsVUFBVTtFQUNyQ3BILE9BQU8sRUFBRStHLHFCQUFTLENBQUNHLElBQUk7RUFDdkJwSCxNQUFNLEVBQUVpSCxxQkFBUyxDQUFDTSxNQUFNO0VBQ3hCN0Usa0JBQWtCLEVBQUV1RSxxQkFBUyxDQUFDTSxNQUFNO0VBQ3BDekUsYUFBYSxFQUFFbUUscUJBQVMsQ0FBQ08sSUFBSTtFQUM3QnJJLFdBQVcsRUFBRThILHFCQUFTLENBQUNPLElBQUk7RUFDM0J6RSxVQUFVLEVBQUVrRSxxQkFBUyxDQUFDRyxJQUFJO0VBQzFCbkUsU0FBUyxFQUFFZ0UscUJBQVMsQ0FBQ0csSUFBSTtFQUN6QnBFLGVBQWUsRUFBRWlFLHFCQUFTLENBQUNHLElBQUk7RUFDL0JsRSxPQUFPLEVBQUUrRCxxQkFBUyxDQUFDTyxJQUFJO0VBQ3ZCdkgsY0FBYyxFQUFFZ0gscUJBQVMsQ0FBQ08sSUFBSTtFQUM5QjdFLGdCQUFnQixFQUFFc0UscUJBQVMsQ0FBQ0MsTUFBTTtFQUNsQzlELGFBQWEsRUFBRTZELHFCQUFTLENBQUNNLE1BQU07RUFDL0JsRSxxQkFBcUIsRUFBRTRELHFCQUFTLENBQUNRO0FBQ25DLENBQUM7QUFBQSxJQUFBQyxRQUFBLEdBQUEvSSxPQUFBLGNBa1ZZRCxJQUFJIiwiaWdub3JlTGlzdCI6W119