UNPKG

61.2 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports["default"] = void 0;
7
8var _reactMapGl = require("react-map-gl");
9
10var _react = _interopRequireWildcard(require("react"));
11
12var _editModes = require("@nebula.gl/edit-modes");
13
14var _memoize = _interopRequireDefault(require("./memoize"));
15
16var _constants = require("./constants");
17
18var _utils = require("./edit-modes/utils");
19
20var _editModes2 = require("./edit-modes");
21
22var _Object$freeze;
23
24function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
25
26function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
27
28function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; if (obj != null) { var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
29
30function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
31
32function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
33
34function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
35
36function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
37
38function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
39
40function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
41
42function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
43
44function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
45
46function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
47
48function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
49
50function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
51
52function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
53
54var MODE_TO_HANDLER = Object.freeze((_Object$freeze = {}, _defineProperty(_Object$freeze, _constants.MODES.READ_ONLY, null), _defineProperty(_Object$freeze, _constants.MODES.SELECT, _editModes2.SelectMode), _defineProperty(_Object$freeze, _constants.MODES.EDITING, _editModes2.EditingMode), _defineProperty(_Object$freeze, _constants.MODES.DRAW_POINT, _editModes2.DrawPointMode), _defineProperty(_Object$freeze, _constants.MODES.DRAW_PATH, _editModes2.DrawLineStringMode), _defineProperty(_Object$freeze, _constants.MODES.DRAW_RECTANGLE, _editModes2.DrawRectangleMode), _defineProperty(_Object$freeze, _constants.MODES.DRAW_POLYGON, _editModes2.DrawPolygonMode), _defineProperty(_Object$freeze, _constants.MODES.DRAW_CIRCLE, _editModes2.DrawCircleMode), _Object$freeze));
55var defaultProps = {
56 mode: _constants.MODES.READ_ONLY,
57 features: null,
58 onSelect: null,
59 onUpdate: null
60};
61var defaultState = {
62 featureCollection: new _editModes.ImmutableFeatureCollection({
63 type: 'FeatureCollection',
64 features: []
65 }),
66 selectedFeatureIndex: null,
67 // index, isGuide, mapCoords, screenCoords
68 hovered: null,
69 isDragging: false,
70 didDrag: false,
71 lastPointerMoveEvent: null,
72 pointerDownPicks: null,
73 pointerDownScreenCoords: null,
74 pointerDownMapCoords: null
75};
76
77var ModeHandler =
78/*#__PURE__*/
79function (_PureComponent) {
80 _inherits(ModeHandler, _PureComponent);
81
82 function ModeHandler() {
83 var _this;
84
85 _classCallCheck(this, ModeHandler);
86
87 _this = _possibleConstructorReturn(this, _getPrototypeOf(ModeHandler).call(this));
88
89 _defineProperty(_assertThisInitialized(_this), "_events", void 0);
90
91 _defineProperty(_assertThisInitialized(_this), "_eventsRegistered", void 0);
92
93 _defineProperty(_assertThisInitialized(_this), "_modeHandler", void 0);
94
95 _defineProperty(_assertThisInitialized(_this), "_context", void 0);
96
97 _defineProperty(_assertThisInitialized(_this), "_containerRef", void 0);
98
99 _defineProperty(_assertThisInitialized(_this), "getFeatures", function () {
100 var featureCollection = _this._getFeatureCollection();
101
102 featureCollection = featureCollection && featureCollection.getObject();
103 return featureCollection && featureCollection.features;
104 });
105
106 _defineProperty(_assertThisInitialized(_this), "addFeatures", function (features) {
107 var featureCollection = _this._getFeatureCollection();
108
109 if (featureCollection) {
110 if (!Array.isArray(features)) {
111 features = [features];
112 }
113
114 featureCollection = featureCollection.addFeatures(features);
115
116 _this.setState({
117 featureCollection: featureCollection
118 });
119 }
120 });
121
122 _defineProperty(_assertThisInitialized(_this), "deleteFeatures", function (featureIndexes) {
123 var featureCollection = _this._getFeatureCollection();
124
125 var selectedFeatureIndex = _this._getSelectedFeatureIndex();
126
127 if (featureCollection) {
128 if (!Array.isArray(featureIndexes)) {
129 featureIndexes = [featureIndexes];
130 }
131
132 featureCollection = featureCollection.deleteFeatures(featureIndexes);
133 var newState = {
134 featureCollection: featureCollection
135 };
136
137 if (featureIndexes.findIndex(function (index) {
138 return selectedFeatureIndex === index;
139 }) >= 0) {
140 newState.selectedFeatureIndex = null;
141 }
142
143 _this.setState(newState);
144 }
145 });
146
147 _defineProperty(_assertThisInitialized(_this), "_getMemorizedFeatureCollection", (0, _memoize["default"])(function (_ref) {
148 var propsFeatures = _ref.propsFeatures,
149 stateFeatures = _ref.stateFeatures;
150 var features = propsFeatures || stateFeatures; // Any changes in ImmutableFeatureCollection will create a new object
151
152 if (features instanceof _editModes.ImmutableFeatureCollection) {
153 return features;
154 }
155
156 if (features && features.type === 'FeatureCollection') {
157 return new _editModes.ImmutableFeatureCollection({
158 type: 'FeatureCollection',
159 features: features.features
160 });
161 }
162
163 return new _editModes.ImmutableFeatureCollection({
164 type: 'FeatureCollection',
165 features: features || []
166 });
167 }));
168
169 _defineProperty(_assertThisInitialized(_this), "_getFeatureCollection", function () {
170 return _this._getMemorizedFeatureCollection({
171 propsFeatures: _this.props.features,
172 stateFeatures: _this.state.featureCollection
173 });
174 });
175
176 _defineProperty(_assertThisInitialized(_this), "_setupModeHandler", function () {
177 var mode = _this.props.mode;
178
179 if (!mode || mode === _constants.MODES.READ_ONLY) {
180 _this._degregisterEvents();
181
182 _this._modeHandler = null;
183 return;
184 }
185
186 _this._registerEvents();
187
188 var HandlerClass = MODE_TO_HANDLER[mode];
189 _this._modeHandler = HandlerClass ? new HandlerClass() : null;
190 });
191
192 _defineProperty(_assertThisInitialized(_this), "_clearEditingState", function () {
193 _this.setState({
194 selectedFeatureIndex: null,
195 hovered: null,
196 pointerDownPicks: null,
197 pointerDownScreenCoords: null,
198 pointerDownMapCoords: null,
199 isDragging: false,
200 didDrag: false
201 });
202 });
203
204 _defineProperty(_assertThisInitialized(_this), "_getSelectedFeatureIndex", function () {
205 if ('selectedFeatureIndex' in _this.props) {
206 return _this.props.selectedFeatureIndex;
207 }
208
209 return _this.state.selectedFeatureIndex;
210 });
211
212 _defineProperty(_assertThisInitialized(_this), "_getSelectedFeature", function (featureIndex) {
213 var features = _this.getFeatures();
214
215 featureIndex = (0, _utils.isNumeric)(featureIndex) ? featureIndex : _this._getSelectedFeatureIndex();
216 return features[featureIndex];
217 });
218
219 _defineProperty(_assertThisInitialized(_this), "_onSelect", function (selected) {
220 _this.setState({
221 selectedFeatureIndex: selected && selected.selectedFeatureIndex
222 });
223
224 if (_this.props.onSelect) {
225 _this.props.onSelect(selected);
226 }
227 });
228
229 _defineProperty(_assertThisInitialized(_this), "_onUpdate", function (editAction, isInternal) {
230 var editType = editAction.editType,
231 updatedData = editAction.updatedData,
232 editContext = editAction.editContext;
233
234 _this.setState({
235 featureCollection: new _editModes.ImmutableFeatureCollection(updatedData)
236 });
237
238 if (_this.props.onUpdate && !isInternal) {
239 _this.props.onUpdate({
240 data: updatedData && updatedData.features,
241 editType: editType,
242 editContext: editContext
243 });
244 }
245 });
246
247 _defineProperty(_assertThisInitialized(_this), "_onEdit", function (editAction) {
248 var mode = _this.props.mode;
249 var editType = editAction.editType,
250 updatedData = editAction.updatedData;
251
252 switch (editType) {
253 case _constants.EDIT_TYPE.MOVE_POSITION:
254 // intermediate feature, do not need forward to application
255 // only need update editor internal state
256 _this._onUpdate(editAction, true);
257
258 break;
259
260 case _constants.EDIT_TYPE.ADD_FEATURE:
261 _this._onUpdate(editAction);
262
263 if (mode === _constants.MODES.DRAW_PATH) {
264 var context = editAction.editContext && editAction.editContext[0] || {};
265 var screenCoords = context.screenCoords,
266 mapCoords = context.mapCoords;
267 var featureIndex = updatedData.features.length - 1;
268
269 var selectedFeature = _this._getSelectedFeature(featureIndex);
270
271 _this._onSelect({
272 selectedFeature: selectedFeature,
273 selectedFeatureIndex: featureIndex,
274 selectedEditHandleIndex: null,
275 screenCoords: screenCoords,
276 mapCoords: mapCoords
277 });
278 }
279
280 break;
281
282 case _constants.EDIT_TYPE.ADD_POSITION:
283 case _constants.EDIT_TYPE.REMOVE_POSITION:
284 case _constants.EDIT_TYPE.FINISH_MOVE_POSITION:
285 _this._onUpdate(editAction);
286
287 break;
288
289 default:
290 }
291 });
292
293 _defineProperty(_assertThisInitialized(_this), "_degregisterEvents", function () {
294 var eventManager = _this._context && _this._context.eventManager;
295
296 if (!_this._events || !eventManager) {
297 return;
298 }
299
300 if (_this._eventsRegistered) {
301 eventManager.off(_this._events);
302 _this._eventsRegistered = false;
303 }
304 });
305
306 _defineProperty(_assertThisInitialized(_this), "_registerEvents", function () {
307 var ref = _this._containerRef;
308 var eventManager = _this._context && _this._context.eventManager;
309
310 if (!_this._events || !ref || !eventManager) {
311 return;
312 }
313
314 if (_this._eventsRegistered) {
315 return;
316 }
317
318 eventManager.on(_this._events, ref);
319 _this._eventsRegistered = true;
320 });
321
322 _defineProperty(_assertThisInitialized(_this), "_onEvent", function (handler, evt, stopPropagation) {
323 var event = _this._getEvent(evt);
324
325 handler(event);
326
327 if (stopPropagation) {
328 evt.stopImmediatePropagation();
329 }
330 });
331
332 _defineProperty(_assertThisInitialized(_this), "_onClick", function (event) {
333 var mode = _this.props.mode;
334
335 if (mode === _constants.MODES.SELECT || mode === _constants.MODES.EDITING) {
336 var mapCoords = event.mapCoords,
337 screenCoords = event.screenCoords;
338 var pickedObject = event.picks && event.picks[0] && event.picks[0].object;
339
340 if (pickedObject && (0, _utils.isNumeric)(pickedObject.featureIndex)) {
341 var selectedFeatureIndex = pickedObject.featureIndex;
342
343 var selectedFeature = _this._getSelectedFeature(selectedFeatureIndex);
344
345 _this._onSelect({
346 selectedFeature: selectedFeature,
347 selectedFeatureIndex: selectedFeatureIndex,
348 selectedEditHandleIndex: pickedObject.type === _constants.ELEMENT_TYPE.EDIT_HANDLE ? pickedObject.index : null,
349 mapCoords: mapCoords,
350 screenCoords: screenCoords
351 });
352 } else {
353 _this._onSelect({
354 selectedFeature: null,
355 selectedFeatureIndex: null,
356 selectedEditHandleIndex: null,
357 mapCoords: mapCoords,
358 screenCoords: screenCoords
359 });
360 }
361 }
362
363 var modeProps = _this.getModeProps();
364
365 if (_this._modeHandler) {
366 _this._modeHandler.handleClick(event, modeProps);
367 }
368 });
369
370 _defineProperty(_assertThisInitialized(_this), "_onPointerMove", function (event) {
371 // hovering
372 var hovered = _this._getHoverState(event);
373
374 var _this$state = _this.state,
375 isDragging = _this$state.isDragging,
376 didDrag = _this$state.didDrag,
377 pointerDownPicks = _this$state.pointerDownPicks,
378 pointerDownScreenCoords = _this$state.pointerDownScreenCoords,
379 pointerDownMapCoords = _this$state.pointerDownMapCoords;
380
381 if (isDragging && !didDrag && pointerDownScreenCoords) {
382 var dx = event.screenCoords[0] - pointerDownScreenCoords[0];
383 var dy = event.screenCoords[1] - pointerDownScreenCoords[1];
384
385 if (dx * dx + dy * dy > 5) {
386 _this.setState({
387 didDrag: true
388 });
389 }
390 }
391
392 var pointerMoveEvent = _objectSpread({}, event, {
393 isDragging: isDragging,
394 pointerDownPicks: pointerDownPicks,
395 pointerDownScreenCoords: pointerDownScreenCoords,
396 pointerDownMapCoords: pointerDownMapCoords
397 }); // how to fire pointerMove event properly for circle
398 // if (this.state.didDrag) {
399
400
401 var modeProps = _this.getModeProps();
402
403 _this._modeHandler.handlePointerMove(pointerMoveEvent, modeProps); // }
404
405
406 _this.setState({
407 hovered: hovered,
408 lastPointerMoveEvent: pointerMoveEvent
409 });
410 });
411
412 _defineProperty(_assertThisInitialized(_this), "_onPointerDown", function (event) {
413 var pickedObject = event.picks && event.picks[0] && event.picks[0].object;
414
415 var startDraggingEvent = _objectSpread({}, event, {
416 pointerDownScreenCoords: event.screenCoords,
417 pointerDownMapCoords: event.mapCoords
418 });
419
420 var newState = {
421 isDragging: pickedObject && (0, _utils.isNumeric)(pickedObject.featureIndex),
422 pointerDownPicks: event.picks,
423 pointerDownScreenCoords: event.screenCoords,
424 pointerDownMapCoords: event.mapCoords
425 };
426
427 _this.setState(newState);
428
429 var modeProps = _this.getModeProps();
430
431 _this._modeHandler.handleStartDragging(startDraggingEvent, modeProps);
432 });
433
434 _defineProperty(_assertThisInitialized(_this), "_onPointerUp", function (event) {
435 var stopDraggingEvent = _objectSpread({}, event, {
436 pointerDownScreenCoords: _this.state.pointerDownScreenCoords,
437 pointerDownMapCoords: _this.state.pointerDownMapCoords
438 });
439
440 var newState = {
441 isDragging: false,
442 didDrag: false,
443 pointerDownPicks: null,
444 pointerDownScreenCoords: null,
445 pointerDownMapCoords: null
446 };
447
448 _this.setState(newState);
449
450 var modeProps = _this.getModeProps();
451
452 _this._modeHandler.handleStopDragging(stopDraggingEvent, modeProps);
453 });
454
455 _defineProperty(_assertThisInitialized(_this), "_onPan", function (event) {
456 var isDragging = _this.state.isDragging;
457
458 if (isDragging) {
459 event.sourceEvent.stopImmediatePropagation();
460 }
461 });
462
463 _defineProperty(_assertThisInitialized(_this), "project", function (pt) {
464 var viewport = _this._context && _this._context.viewport;
465 return viewport && viewport.project(pt);
466 });
467
468 _defineProperty(_assertThisInitialized(_this), "unproject", function (pt) {
469 var viewport = _this._context && _this._context.viewport;
470 return viewport && viewport.unproject(pt);
471 });
472
473 _defineProperty(_assertThisInitialized(_this), "_getHoverState", function (event) {
474 var object = event.picks && event.picks[0] && event.picks[0].object;
475
476 if (!object) {
477 return null;
478 }
479
480 return _objectSpread({
481 screenCoords: event.screenCoords,
482 mapCoords: event.mapCoords
483 }, object);
484 });
485
486 _this.state = defaultState;
487 _this._eventsRegistered = false;
488 _this._events = {
489 anyclick: function anyclick(evt) {
490 return _this._onEvent(_this._onClick, evt, true);
491 },
492 click: function click(evt) {
493 return evt.stopImmediatePropagation();
494 },
495 pointermove: function pointermove(evt) {
496 return _this._onEvent(_this._onPointerMove, evt, true);
497 },
498 pointerdown: function pointerdown(evt) {
499 return _this._onEvent(_this._onPointerDown, evt, true);
500 },
501 pointerup: function pointerup(evt) {
502 return _this._onEvent(_this._onPointerUp, evt, true);
503 },
504 panmove: function panmove(evt) {
505 return _this._onEvent(_this._onPan, evt, false);
506 },
507 panstart: function panstart(evt) {
508 return _this._onEvent(_this._onPan, evt, false);
509 },
510 panend: function panend(evt) {
511 return _this._onEvent(_this._onPan, evt, false);
512 }
513 };
514 return _this;
515 }
516
517 _createClass(ModeHandler, [{
518 key: "componentDidMount",
519 value: function componentDidMount() {
520 this._setupModeHandler();
521 }
522 }, {
523 key: "componentDidUpdate",
524 value: function componentDidUpdate(prevProps) {
525 if (prevProps.mode !== this.props.mode) {
526 this._clearEditingState();
527
528 this._setupModeHandler();
529 }
530 }
531 }, {
532 key: "componentWillUnmount",
533 value: function componentWillUnmount() {
534 this._degregisterEvents();
535 }
536 }, {
537 key: "getModeProps",
538 value: function getModeProps() {
539 var featureCollection = this._getFeatureCollection();
540
541 var lastPointerMoveEvent = this.state.lastPointerMoveEvent;
542
543 var selectedFeatureIndex = this._getSelectedFeatureIndex();
544
545 var viewport = this._context && this._context.viewport;
546 return {
547 data: featureCollection,
548 selectedIndexes: [selectedFeatureIndex],
549 lastPointerMoveEvent: lastPointerMoveEvent,
550 viewport: viewport,
551 onEdit: this._onEdit
552 };
553 }
554 /* MEMORIZERS */
555
556 }, {
557 key: "_getEvent",
558 value: function _getEvent(evt) {
559 var picked = (0, _utils.parseEventElement)(evt);
560 var screenCoords = (0, _utils.getScreenCoords)(evt);
561 var mapCoords = this.unproject(screenCoords);
562 return {
563 picks: picked ? [picked] : null,
564 screenCoords: screenCoords,
565 mapCoords: mapCoords,
566 sourceEvent: evt
567 };
568 }
569 }, {
570 key: "_isDrawing",
571 value: function _isDrawing() {
572 var mode = this.props.mode;
573 return _constants.DRAWING_MODE.findIndex(function (m) {
574 return m === mode;
575 }) >= 0;
576 }
577 }, {
578 key: "render",
579 value: function render(child) {
580 var _this2 = this;
581
582 return _react["default"].createElement(_reactMapGl._MapContext.Consumer, null, function (context) {
583 _this2._context = context;
584 var viewport = context && context.viewport;
585
586 if (!viewport || viewport.height <= 0 || viewport.width <= 0) {
587 return null;
588 }
589
590 return child;
591 });
592 }
593 }]);
594
595 return ModeHandler;
596}(_react.PureComponent);
597
598exports["default"] = ModeHandler;
599
600_defineProperty(ModeHandler, "defaultProps", defaultProps);
601
602ModeHandler.displayName = 'ModeHandler';
603//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tb2RlLWhhbmRsZXIuanMiXSwibmFtZXMiOlsiTU9ERV9UT19IQU5ETEVSIiwiT2JqZWN0IiwiZnJlZXplIiwiTU9ERVMiLCJSRUFEX09OTFkiLCJTRUxFQ1QiLCJTZWxlY3RNb2RlIiwiRURJVElORyIsIkVkaXRpbmdNb2RlIiwiRFJBV19QT0lOVCIsIkRyYXdQb2ludE1vZGUiLCJEUkFXX1BBVEgiLCJEcmF3TGluZVN0cmluZ01vZGUiLCJEUkFXX1JFQ1RBTkdMRSIsIkRyYXdSZWN0YW5nbGVNb2RlIiwiRFJBV19QT0xZR09OIiwiRHJhd1BvbHlnb25Nb2RlIiwiRFJBV19DSVJDTEUiLCJEcmF3Q2lyY2xlTW9kZSIsImRlZmF1bHRQcm9wcyIsIm1vZGUiLCJmZWF0dXJlcyIsIm9uU2VsZWN0Iiwib25VcGRhdGUiLCJkZWZhdWx0U3RhdGUiLCJmZWF0dXJlQ29sbGVjdGlvbiIsIkltbXV0YWJsZUZlYXR1cmVDb2xsZWN0aW9uIiwidHlwZSIsInNlbGVjdGVkRmVhdHVyZUluZGV4IiwiaG92ZXJlZCIsImlzRHJhZ2dpbmciLCJkaWREcmFnIiwibGFzdFBvaW50ZXJNb3ZlRXZlbnQiLCJwb2ludGVyRG93blBpY2tzIiwicG9pbnRlckRvd25TY3JlZW5Db29yZHMiLCJwb2ludGVyRG93bk1hcENvb3JkcyIsIk1vZGVIYW5kbGVyIiwiX2dldEZlYXR1cmVDb2xsZWN0aW9uIiwiZ2V0T2JqZWN0IiwiQXJyYXkiLCJpc0FycmF5IiwiYWRkRmVhdHVyZXMiLCJzZXRTdGF0ZSIsImZlYXR1cmVJbmRleGVzIiwiX2dldFNlbGVjdGVkRmVhdHVyZUluZGV4IiwiZGVsZXRlRmVhdHVyZXMiLCJuZXdTdGF0ZSIsImZpbmRJbmRleCIsImluZGV4IiwicHJvcHNGZWF0dXJlcyIsInN0YXRlRmVhdHVyZXMiLCJfZ2V0TWVtb3JpemVkRmVhdHVyZUNvbGxlY3Rpb24iLCJwcm9wcyIsInN0YXRlIiwiX2RlZ3JlZ2lzdGVyRXZlbnRzIiwiX21vZGVIYW5kbGVyIiwiX3JlZ2lzdGVyRXZlbnRzIiwiSGFuZGxlckNsYXNzIiwiZmVhdHVyZUluZGV4IiwiZ2V0RmVhdHVyZXMiLCJzZWxlY3RlZCIsImVkaXRBY3Rpb24iLCJpc0ludGVybmFsIiwiZWRpdFR5cGUiLCJ1cGRhdGVkRGF0YSIsImVkaXRDb250ZXh0IiwiZGF0YSIsIkVESVRfVFlQRSIsIk1PVkVfUE9TSVRJT04iLCJfb25VcGRhdGUiLCJBRERfRkVBVFVSRSIsImNvbnRleHQiLCJzY3JlZW5Db29yZHMiLCJtYXBDb29yZHMiLCJsZW5ndGgiLCJzZWxlY3RlZEZlYXR1cmUiLCJfZ2V0U2VsZWN0ZWRGZWF0dXJlIiwiX29uU2VsZWN0Iiwic2VsZWN0ZWRFZGl0SGFuZGxlSW5kZXgiLCJBRERfUE9TSVRJT04iLCJSRU1PVkVfUE9TSVRJT04iLCJGSU5JU0hfTU9WRV9QT1NJVElPTiIsImV2ZW50TWFuYWdlciIsIl9jb250ZXh0IiwiX2V2ZW50cyIsIl9ldmVudHNSZWdpc3RlcmVkIiwib2ZmIiwicmVmIiwiX2NvbnRhaW5lclJlZiIsIm9uIiwiaGFuZGxlciIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsImV2ZW50IiwiX2dldEV2ZW50Iiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwicGlja2VkT2JqZWN0IiwicGlja3MiLCJvYmplY3QiLCJFTEVNRU5UX1RZUEUiLCJFRElUX0hBTkRMRSIsIm1vZGVQcm9wcyIsImdldE1vZGVQcm9wcyIsImhhbmRsZUNsaWNrIiwiX2dldEhvdmVyU3RhdGUiLCJkeCIsImR5IiwicG9pbnRlck1vdmVFdmVudCIsImhhbmRsZVBvaW50ZXJNb3ZlIiwic3RhcnREcmFnZ2luZ0V2ZW50IiwiaGFuZGxlU3RhcnREcmFnZ2luZyIsInN0b3BEcmFnZ2luZ0V2ZW50IiwiaGFuZGxlU3RvcERyYWdnaW5nIiwic291cmNlRXZlbnQiLCJwdCIsInZpZXdwb3J0IiwicHJvamVjdCIsInVucHJvamVjdCIsImFueWNsaWNrIiwiX29uRXZlbnQiLCJfb25DbGljayIsImNsaWNrIiwicG9pbnRlcm1vdmUiLCJfb25Qb2ludGVyTW92ZSIsInBvaW50ZXJkb3duIiwiX29uUG9pbnRlckRvd24iLCJwb2ludGVydXAiLCJfb25Qb2ludGVyVXAiLCJwYW5tb3ZlIiwiX29uUGFuIiwicGFuc3RhcnQiLCJwYW5lbmQiLCJfc2V0dXBNb2RlSGFuZGxlciIsInByZXZQcm9wcyIsIl9jbGVhckVkaXRpbmdTdGF0ZSIsInNlbGVjdGVkSW5kZXhlcyIsIm9uRWRpdCIsIl9vbkVkaXQiLCJwaWNrZWQiLCJEUkFXSU5HX01PREUiLCJtIiwiY2hpbGQiLCJoZWlnaHQiLCJ3aWR0aCIsIlB1cmVDb21wb25lbnQiLCJkaXNwbGF5TmFtZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQUtBOztBQUVBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVUEsSUFBTUEsZUFBZSxHQUFHQyxNQUFNLENBQUNDLE1BQVAsdURBQ3JCQyxpQkFBTUMsU0FEZSxFQUNILElBREcsbUNBRXJCRCxpQkFBTUUsTUFGZSxFQUVOQyxzQkFGTSxtQ0FHckJILGlCQUFNSSxPQUhlLEVBR0xDLHVCQUhLLG1DQUlyQkwsaUJBQU1NLFVBSmUsRUFJRkMseUJBSkUsbUNBS3JCUCxpQkFBTVEsU0FMZSxFQUtIQyw4QkFMRyxtQ0FNckJULGlCQUFNVSxjQU5lLEVBTUVDLDZCQU5GLG1DQU9yQlgsaUJBQU1ZLFlBUGUsRUFPQUMsMkJBUEEsbUNBUXJCYixpQkFBTWMsV0FSZSxFQVFEQywwQkFSQyxtQkFBeEI7QUFXQSxJQUFNQyxZQUFZLEdBQUc7QUFDbkJDLEVBQUFBLElBQUksRUFBRWpCLGlCQUFNQyxTQURPO0FBRW5CaUIsRUFBQUEsUUFBUSxFQUFFLElBRlM7QUFHbkJDLEVBQUFBLFFBQVEsRUFBRSxJQUhTO0FBSW5CQyxFQUFBQSxRQUFRLEVBQUU7QUFKUyxDQUFyQjtBQU9BLElBQU1DLFlBQVksR0FBRztBQUNuQkMsRUFBQUEsaUJBQWlCLEVBQUUsSUFBSUMscUNBQUosQ0FBK0I7QUFDaERDLElBQUFBLElBQUksRUFBRSxtQkFEMEM7QUFFaEROLElBQUFBLFFBQVEsRUFBRTtBQUZzQyxHQUEvQixDQURBO0FBTW5CTyxFQUFBQSxvQkFBb0IsRUFBRSxJQU5IO0FBUW5CO0FBQ0FDLEVBQUFBLE9BQU8sRUFBRSxJQVRVO0FBV25CQyxFQUFBQSxVQUFVLEVBQUUsS0FYTztBQVluQkMsRUFBQUEsT0FBTyxFQUFFLEtBWlU7QUFjbkJDLEVBQUFBLG9CQUFvQixFQUFFLElBZEg7QUFnQm5CQyxFQUFBQSxnQkFBZ0IsRUFBRSxJQWhCQztBQWlCbkJDLEVBQUFBLHVCQUF1QixFQUFFLElBakJOO0FBa0JuQkMsRUFBQUEsb0JBQW9CLEVBQUU7QUFsQkgsQ0FBckI7O0lBcUJxQkMsVzs7Ozs7QUFHbkIseUJBQWM7QUFBQTs7QUFBQTs7QUFDWjs7QUFEWTs7QUFBQTs7QUFBQTs7QUFBQTs7QUFBQTs7QUFBQSxrRUFzQ0EsWUFBTTtBQUNsQixVQUFJWCxpQkFBaUIsR0FBRyxNQUFLWSxxQkFBTCxFQUF4Qjs7QUFDQVosTUFBQUEsaUJBQWlCLEdBQUdBLGlCQUFpQixJQUFJQSxpQkFBaUIsQ0FBQ2EsU0FBbEIsRUFBekM7QUFDQSxhQUFPYixpQkFBaUIsSUFBSUEsaUJBQWlCLENBQUNKLFFBQTlDO0FBQ0QsS0ExQ2E7O0FBQUEsa0VBNENBLFVBQUNBLFFBQUQsRUFBbUM7QUFDL0MsVUFBSUksaUJBQWlCLEdBQUcsTUFBS1kscUJBQUwsRUFBeEI7O0FBQ0EsVUFBSVosaUJBQUosRUFBdUI7QUFDckIsWUFBSSxDQUFDYyxLQUFLLENBQUNDLE9BQU4sQ0FBY25CLFFBQWQsQ0FBTCxFQUE4QjtBQUM1QkEsVUFBQUEsUUFBUSxHQUFHLENBQUNBLFFBQUQsQ0FBWDtBQUNEOztBQUVESSxRQUFBQSxpQkFBaUIsR0FBR0EsaUJBQWlCLENBQUNnQixXQUFsQixDQUE4QnBCLFFBQTlCLENBQXBCOztBQUNBLGNBQUtxQixRQUFMLENBQWM7QUFBRWpCLFVBQUFBLGlCQUFpQixFQUFqQkE7QUFBRixTQUFkO0FBQ0Q7QUFDRixLQXREYTs7QUFBQSxxRUF3REcsVUFBQ2tCLGNBQUQsRUFBdUM7QUFDdEQsVUFBSWxCLGlCQUFpQixHQUFHLE1BQUtZLHFCQUFMLEVBQXhCOztBQUNBLFVBQU1ULG9CQUFvQixHQUFHLE1BQUtnQix3QkFBTCxFQUE3Qjs7QUFDQSxVQUFJbkIsaUJBQUosRUFBdUI7QUFDckIsWUFBSSxDQUFDYyxLQUFLLENBQUNDLE9BQU4sQ0FBY0csY0FBZCxDQUFMLEVBQW9DO0FBQ2xDQSxVQUFBQSxjQUFjLEdBQUcsQ0FBQ0EsY0FBRCxDQUFqQjtBQUNEOztBQUNEbEIsUUFBQUEsaUJBQWlCLEdBQUdBLGlCQUFpQixDQUFDb0IsY0FBbEIsQ0FBaUNGLGNBQWpDLENBQXBCO0FBQ0EsWUFBTUcsUUFBYSxHQUFHO0FBQUVyQixVQUFBQSxpQkFBaUIsRUFBakJBO0FBQUYsU0FBdEI7O0FBQ0EsWUFBSWtCLGNBQWMsQ0FBQ0ksU0FBZixDQUF5QixVQUFBQyxLQUFLO0FBQUEsaUJBQUlwQixvQkFBb0IsS0FBS29CLEtBQTdCO0FBQUEsU0FBOUIsS0FBcUUsQ0FBekUsRUFBNEU7QUFDMUVGLFVBQUFBLFFBQVEsQ0FBQ2xCLG9CQUFULEdBQWdDLElBQWhDO0FBQ0Q7O0FBQ0QsY0FBS2MsUUFBTCxDQUFjSSxRQUFkO0FBQ0Q7QUFDRixLQXRFYTs7QUFBQSxxRkF5Rm1CLHlCQUFRLGdCQUEyQztBQUFBLFVBQXhDRyxhQUF3QyxRQUF4Q0EsYUFBd0M7QUFBQSxVQUF6QkMsYUFBeUIsUUFBekJBLGFBQXlCO0FBQ2xGLFVBQU03QixRQUFRLEdBQUc0QixhQUFhLElBQUlDLGFBQWxDLENBRGtGLENBRWxGOztBQUNBLFVBQUk3QixRQUFRLFlBQVlLLHFDQUF4QixFQUFvRDtBQUNsRCxlQUFPTCxRQUFQO0FBQ0Q7O0FBRUQsVUFBSUEsUUFBUSxJQUFJQSxRQUFRLENBQUNNLElBQVQsS0FBa0IsbUJBQWxDLEVBQXVEO0FBQ3JELGVBQU8sSUFBSUQscUNBQUosQ0FBK0I7QUFDcENDLFVBQUFBLElBQUksRUFBRSxtQkFEOEI7QUFFcENOLFVBQUFBLFFBQVEsRUFBRUEsUUFBUSxDQUFDQTtBQUZpQixTQUEvQixDQUFQO0FBSUQ7O0FBRUQsYUFBTyxJQUFJSyxxQ0FBSixDQUErQjtBQUNwQ0MsUUFBQUEsSUFBSSxFQUFFLG1CQUQ4QjtBQUVwQ04sUUFBQUEsUUFBUSxFQUFFQSxRQUFRLElBQUk7QUFGYyxPQUEvQixDQUFQO0FBSUQsS0FsQmdDLENBekZuQjs7QUFBQSw0RUE2R1UsWUFBTTtBQUM1QixhQUFPLE1BQUs4Qiw4QkFBTCxDQUFvQztBQUN6Q0YsUUFBQUEsYUFBYSxFQUFFLE1BQUtHLEtBQUwsQ0FBVy9CLFFBRGU7QUFFekM2QixRQUFBQSxhQUFhLEVBQUUsTUFBS0csS0FBTCxDQUFXNUI7QUFGZSxPQUFwQyxDQUFQO0FBSUQsS0FsSGE7O0FBQUEsd0VBb0hNLFlBQU07QUFDeEIsVUFBTUwsSUFBSSxHQUFHLE1BQUtnQyxLQUFMLENBQVdoQyxJQUF4Qjs7QUFFQSxVQUFJLENBQUNBLElBQUQsSUFBU0EsSUFBSSxLQUFLakIsaUJBQU1DLFNBQTVCLEVBQXVDO0FBQ3JDLGNBQUtrRCxrQkFBTDs7QUFDQSxjQUFLQyxZQUFMLEdBQW9CLElBQXBCO0FBQ0E7QUFDRDs7QUFFRCxZQUFLQyxlQUFMOztBQUVBLFVBQU1DLFlBQVksR0FBR3pELGVBQWUsQ0FBQ29CLElBQUQsQ0FBcEM7QUFDQSxZQUFLbUMsWUFBTCxHQUFvQkUsWUFBWSxHQUFHLElBQUlBLFlBQUosRUFBSCxHQUF3QixJQUF4RDtBQUNELEtBaklhOztBQUFBLHlFQW9JTyxZQUFNO0FBQ3pCLFlBQUtmLFFBQUwsQ0FBYztBQUNaZCxRQUFBQSxvQkFBb0IsRUFBRSxJQURWO0FBR1pDLFFBQUFBLE9BQU8sRUFBRSxJQUhHO0FBS1pJLFFBQUFBLGdCQUFnQixFQUFFLElBTE47QUFNWkMsUUFBQUEsdUJBQXVCLEVBQUUsSUFOYjtBQU9aQyxRQUFBQSxvQkFBb0IsRUFBRSxJQVBWO0FBU1pMLFFBQUFBLFVBQVUsRUFBRSxLQVRBO0FBVVpDLFFBQUFBLE9BQU8sRUFBRTtBQVZHLE9BQWQ7QUFZRCxLQWpKYTs7QUFBQSwrRUFtSmEsWUFBTTtBQUMvQixVQUFJLDBCQUEwQixNQUFLcUIsS0FBbkMsRUFBMEM7QUFDeEMsZUFBTyxNQUFLQSxLQUFMLENBQVd4QixvQkFBbEI7QUFDRDs7QUFDRCxhQUFPLE1BQUt5QixLQUFMLENBQVd6QixvQkFBbEI7QUFDRCxLQXhKYTs7QUFBQSwwRUEwSlEsVUFBQzhCLFlBQUQsRUFBMkI7QUFDL0MsVUFBTXJDLFFBQVEsR0FBRyxNQUFLc0MsV0FBTCxFQUFqQjs7QUFDQUQsTUFBQUEsWUFBWSxHQUFHLHNCQUFVQSxZQUFWLElBQTBCQSxZQUExQixHQUF5QyxNQUFLZCx3QkFBTCxFQUF4RDtBQUNBLGFBQU92QixRQUFRLENBQUNxQyxZQUFELENBQWY7QUFDRCxLQTlKYTs7QUFBQSxnRUFnS0YsVUFBQ0UsUUFBRCxFQUE0QjtBQUN0QyxZQUFLbEIsUUFBTCxDQUFjO0FBQUVkLFFBQUFBLG9CQUFvQixFQUFFZ0MsUUFBUSxJQUFJQSxRQUFRLENBQUNoQztBQUE3QyxPQUFkOztBQUNBLFVBQUksTUFBS3dCLEtBQUwsQ0FBVzlCLFFBQWYsRUFBeUI7QUFDdkIsY0FBSzhCLEtBQUwsQ0FBVzlCLFFBQVgsQ0FBb0JzQyxRQUFwQjtBQUNEO0FBQ0YsS0FyS2E7O0FBQUEsZ0VBdUtGLFVBQUNDLFVBQUQsRUFBeUJDLFVBQXpCLEVBQWtEO0FBQUEsVUFDcERDLFFBRG9ELEdBQ2JGLFVBRGEsQ0FDcERFLFFBRG9EO0FBQUEsVUFDMUNDLFdBRDBDLEdBQ2JILFVBRGEsQ0FDMUNHLFdBRDBDO0FBQUEsVUFDN0JDLFdBRDZCLEdBQ2JKLFVBRGEsQ0FDN0JJLFdBRDZCOztBQUU1RCxZQUFLdkIsUUFBTCxDQUFjO0FBQUVqQixRQUFBQSxpQkFBaUIsRUFBRSxJQUFJQyxxQ0FBSixDQUErQnNDLFdBQS9CO0FBQXJCLE9BQWQ7O0FBQ0EsVUFBSSxNQUFLWixLQUFMLENBQVc3QixRQUFYLElBQXVCLENBQUN1QyxVQUE1QixFQUF3QztBQUN0QyxjQUFLVixLQUFMLENBQVc3QixRQUFYLENBQW9CO0FBQ2xCMkMsVUFBQUEsSUFBSSxFQUFFRixXQUFXLElBQUlBLFdBQVcsQ0FBQzNDLFFBRGY7QUFFbEIwQyxVQUFBQSxRQUFRLEVBQVJBLFFBRmtCO0FBR2xCRSxVQUFBQSxXQUFXLEVBQVhBO0FBSGtCLFNBQXBCO0FBS0Q7QUFDRixLQWpMYTs7QUFBQSw4REFtTEosVUFBQ0osVUFBRCxFQUE0QjtBQUFBLFVBQzVCekMsSUFENEIsR0FDbkIsTUFBS2dDLEtBRGMsQ0FDNUJoQyxJQUQ0QjtBQUFBLFVBRTVCMkMsUUFGNEIsR0FFRkYsVUFGRSxDQUU1QkUsUUFGNEI7QUFBQSxVQUVsQkMsV0FGa0IsR0FFRkgsVUFGRSxDQUVsQkcsV0FGa0I7O0FBSXBDLGNBQVFELFFBQVI7QUFDRSxhQUFLSSxxQkFBVUMsYUFBZjtBQUNFO0FBQ0E7QUFDQSxnQkFBS0MsU0FBTCxDQUFlUixVQUFmLEVBQTJCLElBQTNCOztBQUNBOztBQUNGLGFBQUtNLHFCQUFVRyxXQUFmO0FBQ0UsZ0JBQUtELFNBQUwsQ0FBZVIsVUFBZjs7QUFDQSxjQUFJekMsSUFBSSxLQUFLakIsaUJBQU1RLFNBQW5CLEVBQThCO0FBQzVCLGdCQUFNNEQsT0FBTyxHQUFJVixVQUFVLENBQUNJLFdBQVgsSUFBMEJKLFVBQVUsQ0FBQ0ksV0FBWCxDQUF1QixDQUF2QixDQUEzQixJQUF5RCxFQUF6RTtBQUQ0QixnQkFFcEJPLFlBRm9CLEdBRVFELE9BRlIsQ0FFcEJDLFlBRm9CO0FBQUEsZ0JBRU5DLFNBRk0sR0FFUUYsT0FGUixDQUVORSxTQUZNO0FBRzVCLGdCQUFNZixZQUFZLEdBQUdNLFdBQVcsQ0FBQzNDLFFBQVosQ0FBcUJxRCxNQUFyQixHQUE4QixDQUFuRDs7QUFDQSxnQkFBTUMsZUFBZSxHQUFHLE1BQUtDLG1CQUFMLENBQXlCbEIsWUFBekIsQ0FBeEI7O0FBQ0Esa0JBQUttQixTQUFMLENBQWU7QUFDYkYsY0FBQUEsZUFBZSxFQUFmQSxlQURhO0FBRWIvQyxjQUFBQSxvQkFBb0IsRUFBRThCLFlBRlQ7QUFHYm9CLGNBQUFBLHVCQUF1QixFQUFFLElBSFo7QUFJYk4sY0FBQUEsWUFBWSxFQUFaQSxZQUphO0FBS2JDLGNBQUFBLFNBQVMsRUFBVEE7QUFMYSxhQUFmO0FBT0Q7O0FBQ0Q7O0FBQ0YsYUFBS04scUJBQVVZLFlBQWY7QUFDQSxhQUFLWixxQkFBVWEsZUFBZjtBQUNBLGFBQUtiLHFCQUFVYyxvQkFBZjtBQUNFLGdCQUFLWixTQUFMLENBQWVSLFVBQWY7O0FBQ0E7O0FBRUY7QUE1QkY7QUE4QkQsS0FyTmE7O0FBQUEseUVBd05PLFlBQU07QUFDekIsVUFBTXFCLFlBQVksR0FBRyxNQUFLQyxRQUFMLElBQWlCLE1BQUtBLFFBQUwsQ0FBY0QsWUFBcEQ7O0FBQ0EsVUFBSSxDQUFDLE1BQUtFLE9BQU4sSUFBaUIsQ0FBQ0YsWUFBdEIsRUFBb0M7QUFDbEM7QUFDRDs7QUFFRCxVQUFJLE1BQUtHLGlCQUFULEVBQTRCO0FBQzFCSCxRQUFBQSxZQUFZLENBQUNJLEdBQWIsQ0FBaUIsTUFBS0YsT0FBdEI7QUFDQSxjQUFLQyxpQkFBTCxHQUF5QixLQUF6QjtBQUNEO0FBQ0YsS0FsT2E7O0FBQUEsc0VBb09JLFlBQU07QUFDdEIsVUFBTUUsR0FBRyxHQUFHLE1BQUtDLGFBQWpCO0FBQ0EsVUFBTU4sWUFBWSxHQUFHLE1BQUtDLFFBQUwsSUFBaUIsTUFBS0EsUUFBTCxDQUFjRCxZQUFwRDs7QUFDQSxVQUFJLENBQUMsTUFBS0UsT0FBTixJQUFpQixDQUFDRyxHQUFsQixJQUF5QixDQUFDTCxZQUE5QixFQUE0QztBQUMxQztBQUNEOztBQUVELFVBQUksTUFBS0csaUJBQVQsRUFBNEI7QUFDMUI7QUFDRDs7QUFFREgsTUFBQUEsWUFBWSxDQUFDTyxFQUFiLENBQWdCLE1BQUtMLE9BQXJCLEVBQThCRyxHQUE5QjtBQUNBLFlBQUtGLGlCQUFMLEdBQXlCLElBQXpCO0FBQ0QsS0FqUGE7O0FBQUEsK0RBbVBILFVBQUNLLE9BQUQsRUFBb0JDLEdBQXBCLEVBQXVDQyxlQUF2QyxFQUFvRTtBQUM3RSxVQUFNQyxLQUFLLEdBQUcsTUFBS0MsU0FBTCxDQUFlSCxHQUFmLENBQWQ7O0FBQ0FELE1BQUFBLE9BQU8sQ0FBQ0csS0FBRCxDQUFQOztBQUVBLFVBQUlELGVBQUosRUFBcUI7QUFDbkJELFFBQUFBLEdBQUcsQ0FBQ0ksd0JBQUo7QUFDRDtBQUNGLEtBMVBhOztBQUFBLCtEQTRQSCxVQUFDRixLQUFELEVBQXNCO0FBQUEsVUFDdkJ6RSxJQUR1QixHQUNkLE1BQUtnQyxLQURTLENBQ3ZCaEMsSUFEdUI7O0FBRS9CLFVBQUlBLElBQUksS0FBS2pCLGlCQUFNRSxNQUFmLElBQXlCZSxJQUFJLEtBQUtqQixpQkFBTUksT0FBNUMsRUFBcUQ7QUFBQSxZQUMzQ2tFLFNBRDJDLEdBQ2ZvQixLQURlLENBQzNDcEIsU0FEMkM7QUFBQSxZQUNoQ0QsWUFEZ0MsR0FDZnFCLEtBRGUsQ0FDaENyQixZQURnQztBQUVuRCxZQUFNd0IsWUFBWSxHQUFHSCxLQUFLLENBQUNJLEtBQU4sSUFBZUosS0FBSyxDQUFDSSxLQUFOLENBQVksQ0FBWixDQUFmLElBQWlDSixLQUFLLENBQUNJLEtBQU4sQ0FBWSxDQUFaLEVBQWVDLE1BQXJFOztBQUNBLFlBQUlGLFlBQVksSUFBSSxzQkFBVUEsWUFBWSxDQUFDdEMsWUFBdkIsQ0FBcEIsRUFBMEQ7QUFDeEQsY0FBTTlCLG9CQUFvQixHQUFHb0UsWUFBWSxDQUFDdEMsWUFBMUM7O0FBQ0EsY0FBTWlCLGVBQWUsR0FBRyxNQUFLQyxtQkFBTCxDQUF5QmhELG9CQUF6QixDQUF4Qjs7QUFDQSxnQkFBS2lELFNBQUwsQ0FBZTtBQUNiRixZQUFBQSxlQUFlLEVBQWZBLGVBRGE7QUFFYi9DLFlBQUFBLG9CQUFvQixFQUFwQkEsb0JBRmE7QUFHYmtELFlBQUFBLHVCQUF1QixFQUNyQmtCLFlBQVksQ0FBQ3JFLElBQWIsS0FBc0J3RSx3QkFBYUMsV0FBbkMsR0FBaURKLFlBQVksQ0FBQ2hELEtBQTlELEdBQXNFLElBSjNEO0FBS2J5QixZQUFBQSxTQUFTLEVBQVRBLFNBTGE7QUFNYkQsWUFBQUEsWUFBWSxFQUFaQTtBQU5hLFdBQWY7QUFRRCxTQVhELE1BV087QUFDTCxnQkFBS0ssU0FBTCxDQUFlO0FBQ2JGLFlBQUFBLGVBQWUsRUFBRSxJQURKO0FBRWIvQyxZQUFBQSxvQkFBb0IsRUFBRSxJQUZUO0FBR2JrRCxZQUFBQSx1QkFBdUIsRUFBRSxJQUhaO0FBSWJMLFlBQUFBLFNBQVMsRUFBVEEsU0FKYTtBQUtiRCxZQUFBQSxZQUFZLEVBQVpBO0FBTGEsV0FBZjtBQU9EO0FBQ0Y7O0FBRUQsVUFBTTZCLFNBQVMsR0FBRyxNQUFLQyxZQUFMLEVBQWxCOztBQUNBLFVBQUcsTUFBSy9DLFlBQVIsRUFBc0I7QUFDcEIsY0FBS0EsWUFBTCxDQUFrQmdELFdBQWxCLENBQThCVixLQUE5QixFQUFxQ1EsU0FBckM7QUFDRDtBQUNGLEtBM1JhOztBQUFBLHFFQTZSRyxVQUFDUixLQUFELEVBQXNCO0FBQ3JDO0FBQ0EsVUFBTWhFLE9BQU8sR0FBRyxNQUFLMkUsY0FBTCxDQUFvQlgsS0FBcEIsQ0FBaEI7O0FBRnFDLHdCQVNqQyxNQUFLeEMsS0FUNEI7QUFBQSxVQUluQ3ZCLFVBSm1DLGVBSW5DQSxVQUptQztBQUFBLFVBS25DQyxPQUxtQyxlQUtuQ0EsT0FMbUM7QUFBQSxVQU1uQ0UsZ0JBTm1DLGVBTW5DQSxnQkFObUM7QUFBQSxVQU9uQ0MsdUJBUG1DLGVBT25DQSx1QkFQbUM7QUFBQSxVQVFuQ0Msb0JBUm1DLGVBUW5DQSxvQkFSbUM7O0FBV3JDLFVBQUlMLFVBQVUsSUFBSSxDQUFDQyxPQUFmLElBQTBCRyx1QkFBOUIsRUFBdUQ7QUFDckQsWUFBTXVFLEVBQUUsR0FBR1osS0FBSyxDQUFDckIsWUFBTixDQUFtQixDQUFuQixJQUF3QnRDLHVCQUF1QixDQUFDLENBQUQsQ0FBMUQ7QUFDQSxZQUFNd0UsRUFBRSxHQUFHYixLQUFLLENBQUNyQixZQUFOLENBQW1CLENBQW5CLElBQXdCdEMsdUJBQXVCLENBQUMsQ0FBRCxDQUExRDs7QUFDQSxZQUFJdUUsRUFBRSxHQUFHQSxFQUFMLEdBQVVDLEVBQUUsR0FBR0EsRUFBZixHQUFvQixDQUF4QixFQUEyQjtBQUN6QixnQkFBS2hFLFFBQUwsQ0FBYztBQUFFWCxZQUFBQSxPQUFPLEVBQUU7QUFBWCxXQUFkO0FBQ0Q7QUFDRjs7QUFFRCxVQUFNNEUsZ0JBQWdCLHFCQUNqQmQsS0FEaUI7QUFFcEIvRCxRQUFBQSxVQUFVLEVBQVZBLFVBRm9CO0FBR3BCRyxRQUFBQSxnQkFBZ0IsRUFBaEJBLGdCQUhvQjtBQUlwQkMsUUFBQUEsdUJBQXVCLEVBQXZCQSx1QkFKb0I7QUFLcEJDLFFBQUFBLG9CQUFvQixFQUFwQkE7QUFMb0IsUUFBdEIsQ0FuQnFDLENBMEJyQztBQUNBOzs7QUFDRSxVQUFNa0UsU0FBUyxHQUFHLE1BQUtDLFlBQUwsRUFBbEI7O0FBQ0EsWUFBSy9DLFlBQUwsQ0FBa0JxRCxpQkFBbEIsQ0FBb0NELGdCQUFwQyxFQUFzRE4sU0FBdEQsRUE3Qm1DLENBOEJyQzs7O0FBRUEsWUFBSzNELFFBQUwsQ0FBYztBQUNaYixRQUFBQSxPQUFPLEVBQVBBLE9BRFk7QUFFWkcsUUFBQUEsb0JBQW9CLEVBQUUyRTtBQUZWLE9BQWQ7QUFJRCxLQWpVYTs7QUFBQSxxRUFtVUcsVUFBQ2QsS0FBRCxFQUFzQjtBQUNyQyxVQUFNRyxZQUFZLEdBQUdILEtBQUssQ0FBQ0ksS0FBTixJQUFlSixLQUFLLENBQUNJLEtBQU4sQ0FBWSxDQUFaLENBQWYsSUFBaUNKLEtBQUssQ0FBQ0ksS0FBTixDQUFZLENBQVosRUFBZUMsTUFBckU7O0FBQ0EsVUFBTVcsa0JBQWtCLHFCQUNuQmhCLEtBRG1CO0FBRXRCM0QsUUFBQUEsdUJBQXVCLEVBQUUyRCxLQUFLLENBQUNyQixZQUZUO0FBR3RCckMsUUFBQUEsb0JBQW9CLEVBQUUwRCxLQUFLLENBQUNwQjtBQUhOLFFBQXhCOztBQU1BLFVBQU0zQixRQUFRLEdBQUc7QUFDZmhCLFFBQUFBLFVBQVUsRUFBRWtFLFlBQVksSUFBSSxzQkFBVUEsWUFBWSxDQUFDdEMsWUFBdkIsQ0FEYjtBQUVmekIsUUFBQUEsZ0JBQWdCLEVBQUU0RCxLQUFLLENBQUNJLEtBRlQ7QUFHZi9ELFFBQUFBLHVCQUF1QixFQUFFMkQsS0FBSyxDQUFDckIsWUFIaEI7QUFJZnJDLFFBQUFBLG9CQUFvQixFQUFFMEQsS0FBSyxDQUFDcEI7QUFKYixPQUFqQjs7QUFPQSxZQUFLL0IsUUFBTCxDQUFjSSxRQUFkOztBQUVBLFVBQU11RCxTQUFTLEdBQUcsTUFBS0MsWUFBTCxFQUFsQjs7QUFDQSxZQUFLL0MsWUFBTCxDQUFrQnVELG1CQUFsQixDQUFzQ0Qsa0JBQXRDLEVBQTBEUixTQUExRDtBQUNELEtBdFZhOztBQUFBLG1FQXdWQyxVQUFDUixLQUFELEVBQXlCO0FBQ3RDLFVBQU1rQixpQkFBaUIscUJBQ2xCbEIsS0FEa0I7QUFFckIzRCxRQUFBQSx1QkFBdUIsRUFBRSxNQUFLbUIsS0FBTCxDQUFXbkIsdUJBRmY7QUFHckJDLFFBQUFBLG9CQUFvQixFQUFFLE1BQUtrQixLQUFMLENBQVdsQjtBQUhaLFFBQXZCOztBQU1BLFVBQU1XLFFBQVEsR0FBRztBQUNmaEIsUUFBQUEsVUFBVSxFQUFFLEtBREc7QUFFZkMsUUFBQUEsT0FBTyxFQUFFLEtBRk07QUFHZkUsUUFBQUEsZ0JBQWdCLEVBQUUsSUFISDtBQUlmQyxRQUFBQSx1QkFBdUIsRUFBRSxJQUpWO0FBS2ZDLFFBQUFBLG9CQUFvQixFQUFFO0FBTFAsT0FBakI7O0FBUUEsWUFBS08sUUFBTCxDQUFjSSxRQUFkOztBQUVBLFVBQU11RCxTQUFTLEdBQUcsTUFBS0MsWUFBTCxFQUFsQjs7QUFDQSxZQUFLL0MsWUFBTCxDQUFrQnlELGtCQUFsQixDQUFxQ0QsaUJBQXJDLEVBQXdEVixTQUF4RDtBQUNELEtBM1dhOztBQUFBLDZEQTZXTCxVQUFDUixLQUFELEVBQXNCO0FBQUEsVUFDckIvRCxVQURxQixHQUNOLE1BQUt1QixLQURDLENBQ3JCdkIsVUFEcUI7O0FBRTdCLFVBQUlBLFVBQUosRUFBZ0I7QUFDZCtELFFBQUFBLEtBQUssQ0FBQ29CLFdBQU4sQ0FBa0JsQix3QkFBbEI7QUFDRDtBQUNGLEtBbFhhOztBQUFBLDhEQXFYSixVQUFDbUIsRUFBRCxFQUFrQjtBQUMxQixVQUFNQyxRQUFRLEdBQUcsTUFBS2hDLFFBQUwsSUFBaUIsTUFBS0EsUUFBTCxDQUFjZ0MsUUFBaEQ7QUFDQSxhQUFPQSxRQUFRLElBQUlBLFFBQVEsQ0FBQ0MsT0FBVCxDQUFpQkYsRUFBakIsQ0FBbkI7QUFDRCxLQXhYYTs7QUFBQSxnRUEwWEYsVUFBQ0EsRUFBRCxFQUFrQjtBQUM1QixVQUFNQyxRQUFRLEdBQUcsTUFBS2hDLFFBQUwsSUFBaUIsTUFBS0EsUUFBTCxDQUFjZ0MsUUFBaEQ7QUFDQSxhQUFPQSxRQUFRLElBQUlBLFFBQVEsQ0FBQ0UsU0FBVCxDQUFtQkgsRUFBbkIsQ0FBbkI7QUFDRCxLQTdYYTs7QUFBQSxxRUE0WUcsVUFBQ3JCLEtBQUQsRUFBc0I7QUFDckMsVUFBTUssTUFBTSxHQUFHTCxLQUFLLENBQUNJLEtBQU4sSUFBZUosS0FBSyxDQUFDSSxLQUFOLENBQVksQ0FBWixDQUFmLElBQWlDSixLQUFLLENBQUNJLEtBQU4sQ0FBWSxDQUFaLEVBQWVDLE1BQS9EOztBQUNBLFVBQUksQ0FBQ0EsTUFBTCxFQUFhO0FBQ1gsZUFBTyxJQUFQO0FBQ0Q7O0FBRUQ7QUFDRTFCLFFBQUFBLFlBQVksRUFBRXFCLEtBQUssQ0FBQ3JCLFlBRHRCO0FBRUVDLFFBQUFBLFNBQVMsRUFBRW9CLEtBQUssQ0FBQ3BCO0FBRm5CLFNBR0t5QixNQUhMO0FBS0QsS0F2WmE7O0FBRVosVUFBSzdDLEtBQUwsR0FBYTdCLFlBQWI7QUFDQSxVQUFLNkQsaUJBQUwsR0FBeUIsS0FBekI7QUFFQSxVQUFLRCxPQUFMLEdBQWU7QUFDYmtDLE1BQUFBLFFBQVEsRUFBRSxrQkFBQTNCLEdBQUc7QUFBQSxlQUFJLE1BQUs0QixRQUFMLENBQWMsTUFBS0MsUUFBbkIsRUFBNkI3QixHQUE3QixFQUFrQyxJQUFsQyxDQUFKO0FBQUEsT0FEQTtBQUViOEIsTUFBQUEsS0FBSyxFQUFFLGVBQUE5QixHQUFHO0FBQUEsZUFBSUEsR0FBRyxDQUFDSSx3QkFBSixFQUFKO0FBQUEsT0FGRztBQUdiMkIsTUFBQUEsV0FBVyxFQUFFLHFCQUFBL0IsR0FBRztBQUFBLGVBQUksTUFBSzRCLFFBQUwsQ0FBYyxNQUFLSSxjQUFuQixFQUFtQ2hDLEdBQW5DLEVBQXdDLElBQXhDLENBQUo7QUFBQSxPQUhIO0FBSWJpQyxNQUFBQSxXQUFXLEVBQUUscUJBQUFqQyxHQUFHO0FBQUEsZUFBSSxNQUFLNEIsUUFBTCxDQUFjLE1BQUtNLGNBQW5CLEVBQW1DbEMsR0FBbkMsRUFBd0MsSUFBeEMsQ0FBSjtBQUFBLE9BSkg7QUFLYm1DLE1BQUFBLFNBQVMsRUFBRSxtQkFBQW5DLEdBQUc7QUFBQSxlQUFJLE1BQUs0QixRQUFMLENBQWMsTUFBS1EsWUFBbkIsRUFBaUNwQyxHQUFqQyxFQUFzQyxJQUF0QyxDQUFKO0FBQUEsT0FMRDtBQU1icUMsTUFBQUEsT0FBTyxFQUFFLGlCQUFBckMsR0FBRztBQUFBLGVBQUksTUFBSzRCLFFBQUwsQ0FBYyxNQUFLVSxNQUFuQixFQUEyQnRDLEdBQTNCLEVBQWdDLEtBQWhDLENBQUo7QUFBQSxPQU5DO0FBT2J1QyxNQUFBQSxRQUFRLEVBQUUsa0JBQUF2QyxHQUFHO0FBQUEsZUFBSSxNQUFLNEIsUUFBTCxDQUFjLE1BQUtVLE1BQW5CLEVBQTJCdEMsR0FBM0IsRUFBZ0MsS0FBaEMsQ0FBSjtBQUFBLE9BUEE7QUFRYndDLE1BQUFBLE1BQU0sRUFBRSxnQkFBQXhDLEdBQUc7QUFBQSxlQUFJLE1BQUs0QixRQUFMLENBQWMsTUFBS1UsTUFBbkIsRUFBMkJ0QyxHQUEzQixFQUFnQyxLQUFoQyxDQUFKO0FBQUE7QUFSRSxLQUFmO0FBTFk7QUFlYjs7Ozt3Q0FFbUI7QUFDbEIsV0FBS3lDLGlCQUFMO0FBQ0Q7Ozt1Q0FFa0JDLFMsRUFBd0I7QUFDekMsVUFBSUEsU0FBUyxDQUFDakgsSUFBVixLQUFtQixLQUFLZ0MsS0FBTCxDQUFXaEMsSUFBbEMsRUFBd0M7QUFDdEMsYUFBS2tILGtCQUFMOztBQUNBLGFBQUtGLGlCQUFMO0FBQ0Q7QUFDRjs7OzJDQUVzQjtBQUNyQixXQUFLOUUsa0JBQUw7QUFDRDs7O21DQTBDYztBQUNiLFVBQU03QixpQkFBaUIsR0FBRyxLQUFLWSxxQkFBTCxFQUExQjs7QUFEYSxVQUdMTCxvQkFISyxHQUdvQixLQUFLcUIsS0FIekIsQ0FHTHJCLG9CQUhLOztBQUliLFVBQU1KLG9CQUFvQixHQUFHLEtBQUtnQix3QkFBTCxFQUE3Qjs7QUFDQSxVQUFNdUUsUUFBUSxHQUFHLEtBQUtoQyxRQUFMLElBQWlCLEtBQUtBLFFBQUwsQ0FBY2dDLFFBQWhEO0FBRUEsYUFBTztBQUNMakQsUUFBQUEsSUFBSSxFQUFFekMsaUJBREQ7QUFFTDhHLFFBQUFBLGVBQWUsRUFBRSxDQUFDM0csb0JBQUQsQ0FGWjtBQUdMSSxRQUFBQSxvQkFBb0IsRUFBcEJBLG9CQUhLO0FBSUxtRixRQUFBQSxRQUFRLEVBQVJBLFFBSks7QUFLTHFCLFFBQUFBLE1BQU0sRUFBRSxLQUFLQztBQUxSLE9BQVA7QUFPRDtBQUVEOzs7OzhCQXVTVTlDLEcsRUFBbUI7QUFDM0IsVUFBTStDLE1BQU0sR0FBRyw4QkFBa0IvQyxHQUFsQixDQUFmO0FBQ0EsVUFBTW5CLFlBQVksR0FBRyw0QkFBZ0JtQixHQUFoQixDQUFyQjtBQUNBLFVBQU1sQixTQUFTLEdBQUcsS0FBSzRDLFNBQUwsQ0FBZTdDLFlBQWYsQ0FBbEI7QUFFQSxhQUFPO0FBQ0x5QixRQUFBQSxLQUFLLEVBQUV5QyxNQUFNLEdBQUcsQ0FBQ0EsTUFBRCxDQUFILEdBQWMsSUFEdEI7QUFFTGxFLFFBQUFBLFlBQVksRUFBWkEsWUFGSztBQUdMQyxRQUFBQSxTQUFTLEVBQVRBLFNBSEs7QUFJTHdDLFFBQUFBLFdBQVcsRUFBRXRCO0FBSlIsT0FBUDtBQU1EOzs7aUNBZVk7QUFBQSxVQUNIdkUsSUFERyxHQUNNLEtBQUtnQyxLQURYLENBQ0hoQyxJQURHO0FBRVgsYUFBT3VILHdCQUFhNUYsU0FBYixDQUF1QixVQUFBNkYsQ0FBQztBQUFBLGVBQUlBLENBQUMsS0FBS3hILElBQVY7QUFBQSxPQUF4QixLQUEyQyxDQUFsRDtBQUNEOzs7MkJBRU15SCxLLEVBQVk7QUFBQTs7QUFDakIsYUFDRSxnQ0FBQyx1QkFBRCxDQUFZLFFBQVosUUFDRyxVQUFBdEUsT0FBTyxFQUFJO0FBQ1YsUUFBQSxNQUFJLENBQUNZLFFBQUwsR0FBZ0JaLE9BQWhCO0FBQ0EsWUFBTTRDLFFBQVEsR0FBRzVDLE9BQU8sSUFBSUEsT0FBTyxDQUFDNEMsUUFBcEM7O0FBRUEsWUFBSSxDQUFDQSxRQUFELElBQWFBLFFBQVEsQ0FBQzJCLE1BQVQsSUFBbUIsQ0FBaEMsSUFBcUMzQixRQUFRLENBQUM0QixLQUFULElBQWtCLENBQTNELEVBQThEO0FBQzVELGlCQUFPLElBQVA7QUFDRDs7QUFFRCxlQUFPRixLQUFQO0FBQ0QsT0FWSCxDQURGO0FBY0Q7Ozs7RUFoYnNDRyxvQjs7OztnQkFBcEI1RyxXLGtCQUNHakIsWTs7QUFrYnhCaUIsV0FBVyxDQUFDNkcsV0FBWixHQUEwQixhQUExQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEBmbG93XG5pbXBvcnQgeyBfTWFwQ29udGV4dCBhcyBNYXBDb250ZXh0IH0gZnJvbSAncmVhY3QtbWFwLWdsJztcbmltcG9ydCBSZWFjdCwgeyBQdXJlQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgSW1tdXRhYmxlRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICdAbmVidWxhLmdsL2VkaXQtbW9kZXMnO1xuXG5pbXBvcnQgdHlwZSB7IEZlYXR1cmUsIFBvc2l0aW9uLCBFZGl0QWN0aW9uIH0gZnJvbSAnQG5lYnVsYS5nbC9lZGl0LW1vZGVzJztcbmltcG9ydCB0eXBlIHsgTWpvbG5pckV2ZW50IH0gZnJvbSAnbWpvbG5pci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VFdmVudCwgRWRpdG9yUHJvcHMsIEVkaXRvclN0YXRlLCBTZWxlY3RBY3Rpb24gfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCBtZW1vaXplIGZyb20gJy4vbWVtb2l6ZSc7XG5cbmltcG9ydCB7IERSQVdJTkdfTU9ERSwgRURJVF9UWVBFLCBFTEVNRU5UX1RZUEUsIE1PREVTIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0U2NyZWVuQ29vcmRzLCBpc051bWVyaWMsIHBhcnNlRXZlbnRFbGVtZW50IH0gZnJvbSAnLi9lZGl0LW1vZGVzL3V0aWxzJztcbmltcG9ydCB7XG4gIFNlbGVjdE1vZGUsXG4gIEVkaXRpbmdNb2RlLFxuICBEcmF3UG9pbnRNb2RlLFxuICBEcmF3TGluZVN0cmluZ01vZGUsXG4gIERyYXdSZWN0YW5nbGVNb2RlLFxuICBEcmF3UG9seWdvbk1vZGUsXG4gIERyYXdDaXJjbGVNb2RlLFxufSBmcm9tICcuL2VkaXQtbW9kZXMnO1xuXG5jb25zdCBNT0RFX1RPX0hBTkRMRVIgPSBPYmplY3QuZnJlZXplKHtcbiAgW01PREVTLlJFQURfT05MWV06IG51bGwsXG4gIFtNT0RFUy5TRUxFQ1RdOiBTZWxlY3RNb2RlLFxuICBbTU9ERVMuRURJVElOR106IEVkaXRpbmdNb2RlLFxuICBbTU9ERVMuRFJBV19QT0lOVF06IERyYXdQb2ludE1vZGUsXG4gIFtNT0RFUy5EUkFXX1BBVEhdOiBEcmF3TGluZVN0cmluZ01vZGUsXG4gIFtNT0RFUy5EUkFXX1JFQ1RBTkdMRV06IERyYXdSZWN0YW5nbGVNb2RlLFxuICBbTU9ERVMuRFJBV19QT0xZR09OXTogRHJhd1BvbHlnb25Nb2RlLFxuICBbTU9ERVMuRFJBV19DSVJDTEVdOiBEcmF3Q2lyY2xlTW9kZVxufSk7XG5cbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgbW9kZTogTU9ERVMuUkVBRF9PTkxZLFxuICBmZWF0dXJlczogbnVsbCxcbiAgb25TZWxlY3Q6IG51bGwsXG4gIG9uVXBkYXRlOiBudWxsXG59O1xuXG5jb25zdCBkZWZhdWx0U3RhdGUgPSB7XG4gIGZlYXR1cmVDb2xsZWN0aW9uOiBuZXcgSW1tdXRhYmxlRmVhdHVyZUNvbGxlY3Rpb24oe1xuICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgZmVhdHVyZXM6IFtdXG4gIH0pLFxuXG4gIHNlbGVjdGVkRmVhdHVyZUluZGV4OiBudWxsLFxuXG4gIC8vIGluZGV4LCBpc0d1aWRlLCBtYXBDb29yZHMsIHNjcmVlbkNvb3Jkc1xuICBob3ZlcmVkOiBudWxsLFxuXG4gIGlzRHJhZ2dpbmc6IGZhbHNlLFxuICBkaWREcmFnOiBmYWxzZSxcblxuICBsYXN0UG9pbnRlck1vdmVFdmVudDogbnVsbCxcblxuICBwb2ludGVyRG93blBpY2tzOiBudWxsLFxuICBwb2ludGVyRG93blNjcmVlbkNvb3JkczogbnVsbCxcbiAgcG9pbnRlckRvd25NYXBDb29yZHM6IG51bGxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZGVIYW5kbGVyIGV4dGVuZHMgUHVyZUNvbXBvbmVudDxFZGl0b3JQcm9wcywgRWRpdG9yU3RhdGU+IHtcbiAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc3RhdGUgPSBkZWZhdWx0U3RhdGU7XG4gICAgdGhpcy5fZXZlbnRzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5fZXZlbnRzID0ge1xuICAgICAgYW55Y2xpY2s6IGV2dCA9PiB0aGlzLl9vbkV2ZW50KHRoaXMuX29uQ2xpY2ssIGV2dCwgdHJ1ZSksXG4gICAgICBjbGljazogZXZ0ID0+IGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSxcbiAgICAgIHBvaW50ZXJtb3ZlOiBldnQgPT4gdGhpcy5fb25FdmVudCh0aGlzLl9vblBvaW50ZXJNb3ZlLCBldnQsIHRydWUpLFxuICAgICAgcG9pbnRlcmRvd246IGV2dCA9PiB0aGlzLl9vbkV2ZW50KHRoaXMuX29uUG9pbnRlckRvd24sIGV2dCwgdHJ1ZSksXG4gICAgICBwb2ludGVydXA6IGV2dCA9PiB0aGlzLl9vbkV2ZW50KHRoaXMuX29uUG9pbnRlclVwLCBldnQsIHRydWUpLFxuICAgICAgcGFubW92ZTogZXZ0ID0+IHRoaXMuX29uRXZlbnQodGhpcy5fb25QYW4sIGV2dCwgZmFsc2UpLFxuICAgICAgcGFuc3RhcnQ6IGV2dCA9PiB0aGlzLl9vbkV2ZW50KHRoaXMuX29uUGFuLCBldnQsIGZhbHNlKSxcbiAgICAgIHBhbmVuZDogZXZ0ID0+IHRoaXMuX29uRXZlbnQodGhpcy5fb25QYW4sIGV2dCwgZmFsc2UpXG4gICAgfTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMuX3NldHVwTW9kZUhhbmRsZXIoKTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHM6IEVkaXRvclByb3BzKSB7XG4gICAgaWYgKHByZXZQcm9wcy5tb2RlICE9PSB0aGlzLnByb3BzLm1vZGUpIHtcbiAgICAgIHRoaXMuX2NsZWFyRWRpdGluZ1N0YXRlKCk7XG4gICAgICB0aGlzLl9zZXR1cE1vZGVIYW5kbGVyKCk7XG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5fZGVncmVnaXN0ZXJFdmVudHMoKTtcbiAgfVxuXG4gIF9ldmVudHM6IGFueTtcbiAgX2V2ZW50c1JlZ2lzdGVyZWQ6IGJvb2xlYW47XG4gIF9tb2RlSGFuZGxlcjogYW55O1xuICBfY29udGV4dDogP01hcENvbnRleHQ7XG4gIF9jb250YWluZXJSZWY6ID9IVE1MRWxlbWVudDtcblxuICBnZXRGZWF0dXJlcyA9ICgpID0+IHtcbiAgICBsZXQgZmVhdHVyZUNvbGxlY3Rpb24gPSB0aGlzLl9nZXRGZWF0dXJlQ29sbGVjdGlvbigpO1xuICAgIGZlYXR1cmVDb2xsZWN0aW9uID0gZmVhdHVyZUNvbGxlY3Rpb24gJiYgZmVhdHVyZUNvbGxlY3Rpb24uZ2V0T2JqZWN0KCk7XG4gICAgcmV0dXJuIGZlYXR1cmVDb2xsZWN0aW9uICYmIGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzO1xuICB9O1xuXG4gIGFkZEZlYXR1cmVzID0gKGZlYXR1cmVzOiBGZWF0dXJlIHwgRmVhdHVyZVtdKSA9PiB7XG4gICAgbGV0IGZlYXR1cmVDb2xsZWN0aW9uID0gdGhpcy5fZ2V0RmVhdHVyZUNvbGxlY3Rpb24oKTtcbiAgICBpZiAoZmVhdHVyZUNvbGxlY3Rpb24pIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShmZWF0dXJlcykpIHtcbiAgICAgICAgZmVhdHVyZXMgPSBbZmVhdHVyZXNdO1xuICAgICAgfVxuXG4gICAgICBmZWF0dXJlQ29sbGVjdGlvbiA9IGZlYXR1cmVDb2xsZWN0aW9uLmFkZEZlYXR1cmVzKGZlYXR1cmVzKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBmZWF0dXJlQ29sbGVjdGlvbiB9KTtcbiAgICB9XG4gIH07XG5cbiAgZGVsZXRlRmVhdHVyZXMgPSAoZmVhdHVyZUluZGV4ZXM6IG51bWJlciB8IG51bWJlcltdKSA9PiB7XG4gICAgbGV0IGZlYXR1cmVDb2xsZWN0aW9uID0gdGhpcy5fZ2V0RmVhdHVyZUNvbGxlY3Rpb24oKTtcbiAgICBjb25zdCBzZWxlY3RlZEZlYXR1cmVJbmRleCA9IHRoaXMuX2dldFNlbGVjdGVkRmVhdHVyZUluZGV4KCk7XG4gICAgaWYgKGZlYXR1cmVDb2xsZWN0aW9uKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmVhdHVyZUluZGV4ZXMpKSB7XG4gICAgICAgIGZlYXR1cmVJbmRleGVzID0gW2ZlYXR1cmVJbmRleGVzXTtcbiAgICAgIH1cbiAgICAgIGZlYXR1cmVDb2xsZWN0aW9uID0gZmVhdHVyZUNvbGxlY3Rpb24uZGVsZXRlRmVhdHVyZXMoZmVhdHVyZUluZGV4ZXMpO1xuICAgICAgY29uc3QgbmV3U3RhdGU6IGFueSA9IHsgZmVhdHVyZUNvbGxlY3Rpb24gfTtcbiAgICAgIGlmIChmZWF0dXJlSW5kZXhlcy5maW5kSW5kZXgoaW5kZXggPT4gc2VsZWN0ZWRGZWF0dXJlSW5kZXggPT09IGluZGV4KSA+PSAwKSB7XG4gICAgICAgIG5ld1N0YXRlLnNlbGVjdGVkRmVhdHVyZUluZGV4ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgIH1cbiAgfTtcblxuICBnZXRNb2RlUHJvcHMoKSB7XG4gICAgY29uc3QgZmVhdHVyZUNvbGxlY3Rpb24gPSB0aGlzLl9nZXRGZWF0dXJlQ29sbGVjdGlvbigpO1xuXG4gICAgY29uc3QgeyBsYXN0UG9pbnRlck1vdmVFdmVudCB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBzZWxlY3RlZEZlYXR1cmVJbmRleCA9IHRoaXMuX2dldFNlbGVjdGVkRmVhdHVyZUluZGV4KCk7XG4gICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLl9jb250ZXh0ICYmIHRoaXMuX2NvbnRleHQudmlld3BvcnQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogZmVhdHVyZUNvbGxlY3Rpb24sXG4gICAgICBzZWxlY3RlZEluZGV4ZXM6IFtzZWxlY3RlZEZlYXR1cmVJbmRleF0sXG4gICAgICBsYXN0UG9pbnRlck1vdmVFdmVudCxcbiAgICAgIHZpZXdwb3J0LFxuICAgICAgb25FZGl0OiB0aGlzLl9vbkVkaXRcbiAgICB9O1xuICB9XG5cbiAgLyogTUVNT1JJWkVSUyAqL1xuICBfZ2V0TWVtb3JpemVkRmVhdHVyZUNvbGxlY3Rpb24gPSBtZW1vaXplKCh7IHByb3BzRmVhdHVyZXMsIHN0YXRlRmVhdHVyZXMgfTogYW55KSA9PiB7XG4gICAgY29uc3QgZmVhdHVyZXMgPSBwcm9wc0ZlYXR1cmVzIHx8IHN0YXRlRmVhdHVyZXM7XG4gICAgLy8gQW55IGNoYW5nZXMgaW4gSW1tdXRhYmxlRmVhdHVyZUNvbGxlY3Rpb24gd2lsbCBjcmVhdGUgYSBuZXcgb2JqZWN0XG4gICAgaWYgKGZlYXR1cmVzIGluc3RhbmNlb2YgSW1tdXRhYmxlRmVhdHVyZUNvbGxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBmZWF0dXJlcztcbiAgICB9XG5cbiAgICBpZiAoZmVhdHVyZXMgJiYgZmVhdHVyZXMudHlwZSA9PT0gJ0ZlYXR1cmVDb2xsZWN0aW9uJykge1xuICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVGZWF0dXJlQ29sbGVjdGlvbih7XG4gICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgIGZlYXR1cmVzOiBmZWF0dXJlcy5mZWF0dXJlc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbW11dGFibGVGZWF0dXJlQ29sbGVjdGlvbih7XG4gICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgZmVhdHVyZXM6IGZlYXR1cmVzIHx8IFtdXG4gICAgfSk7XG4gIH0pO1xuXG4gIF9nZXRGZWF0dXJlQ29sbGVjdGlvbiA9ICgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0TWVtb3JpemVkRmVhdHVyZUNvbGxlY3Rpb24oe1xuICAgICAgcHJvcHNGZWF0dXJlczogdGhpcy5wcm9wcy5mZWF0dXJlcyxcbiAgICAgIHN0YXRlRmVhdHVyZXM6IHRoaXMuc3RhdGUuZmVhdHVyZUNvbGxlY3Rpb25cbiAgICB9KTtcbiAgfTtcblxuICBfc2V0dXBNb2RlSGFuZGxlciA9ICgpID0+IHtcbiAgICBjb25zdCBtb2RlID0gdGhpcy5wcm9wcy5tb2RlO1xuXG4gICAgaWYgKCFtb2RlIHx8IG1vZGUgPT09IE1PREVTLlJFQURfT05MWSkge1xuICAgICAgdGhpcy5fZGVncmVnaXN0ZXJFdmVudHMoKTtcbiAgICAgIHRoaXMuX21vZGVIYW5kbGVyID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWdpc3RlckV2ZW50cygpO1xuXG4gICAgY29uc3QgSGFuZGxlckNsYXNzID0gTU9ERV9UT19IQU5ETEVSW21vZGVdO1xuICAgIHRoaXMuX21vZGVIYW5kbGVyID0gSGFuZGxlckNsYXNzID8gbmV3IEhhbmRsZXJDbGFzcygpIDogbnVsbDtcbiAgfTtcblxuICAvKiBFRElUSU5HIE9QRVJBVElPTlMgKi9cbiAgX2NsZWFyRWRpdGluZ1N0YXRlID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc2VsZWN0ZWRGZWF0dXJlSW5kZXg6IG51bGwsXG5cbiAgICAgIGhvdmVyZWQ6IG51bGwsXG5cbiAgICAgIHBvaW50ZXJEb3duUGlja3M6IG51bGwsXG4gICAgICBwb2ludGVyRG93blNjcmVlbkNvb3JkczogbnVsbCxcbiAgICAgIHBvaW50ZXJEb3duTWFwQ29vcmRzOiBudWxsLFxuXG4gICAgICBpc0RyYWdnaW5nOiBmYWxzZSxcbiAgICAgIGRpZERyYWc6IGZhbHNlXG4gICAgfSk7XG4gIH07XG5cbiAgX2dldFNlbGVjdGVkRmVhdHVyZUluZGV4ID0gKCkgPT4ge1xuICAgIGlmICgnc2VsZWN0ZWRGZWF0dXJlSW5kZXgnIGluIHRoaXMucHJvcHMpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLnNlbGVjdGVkRmVhdHVyZUluZGV4O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5zZWxlY3RlZEZlYXR1cmVJbmRleDtcbiAgfTtcblxuICBfZ2V0U2VsZWN0ZWRGZWF0dXJlID0gKGZlYXR1cmVJbmRleDogP251bWJlcikgPT4ge1xuICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5nZXRGZWF0dXJlcygpO1xuICAgIGZlYXR1cmVJbmRleCA9IGlzTnVtZXJpYyhmZWF0dXJlSW5kZXgpID8gZmVhdHVyZUluZGV4IDogdGhpcy5fZ2V0U2VsZWN0ZWRGZWF0dXJlSW5kZXgoKTtcbiAgICByZXR1cm4gZmVhdHVyZXNbZmVhdHVyZUluZGV4XTtcbiAgfTtcblxuICBfb25TZWxlY3QgPSAoc2VsZWN0ZWQ6IFNlbGVjdEFjdGlvbikgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBzZWxlY3RlZEZlYXR1cmVJbmRleDogc2VsZWN0ZWQgJiYgc2VsZWN0ZWQuc2VsZWN0ZWRGZWF0dXJlSW5kZXggfSk7XG4gICAgaWYgKHRoaXMucHJvcHMub25TZWxlY3QpIHtcbiAgICAgIHRoaXMucHJvcHMub25TZWxlY3Qoc2VsZWN0ZWQpO1xuICAgIH1cbiAgfTtcblxuICBfb25VcGRhdGUgPSAoZWRpdEFjdGlvbjogRWRpdEFjdGlvbiwgaXNJbnRlcm5hbDogP2Jvb2xlYW4pID0+IHtcbiAgICBjb25zdCB7IGVkaXRUeXBlLCB1cGRhdGVkRGF0YSwgZWRpdENvbnRleHQgfSA9IGVkaXRBY3Rpb247XG4gICAgdGhpcy5zZXRTdGF0ZSh7IGZlYXR1cmVDb2xsZWN0aW9uOiBuZXcgSW1tdXRhYmxlRmVhdHVyZUNvbGxlY3Rpb24odXBkYXRlZERhdGEpIH0pO1xuICAgIGlmICh0aGlzLnByb3BzLm9uVXBkYXRlICYmICFpc0ludGVybmFsKSB7XG4gICAgICB0aGlzLnByb3BzLm9uVXBkYXRlKHtcbiAgICAgICAgZGF0YTogdXBkYXRlZERhdGEgJiYgdXBkYXRlZERhdGEuZmVhdHVyZXMsXG4gICAgICAgIGVkaXRUeXBlLFxuICAgICAgICBlZGl0Q29udGV4dFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIF9vbkVkaXQgPSAoZWRpdEFjdGlvbjogRWRpdEFjdGlvbikgPT4ge1xuICAgIGNvbnN0IHsgbW9kZSB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IGVkaXRUeXBlLCB1cGRhdGVkRGF0YSB9ID0gZWRpdEFjdGlvbjtcblxuICAgIHN3aXRjaCAoZWRpdFR5cGUpIHtcbiAgICAgIGNhc2UgRURJVF9UWVBFLk1PVkVfUE9TSVRJT046XG4gICAgICAgIC8vIGludGVybWVkaWF0ZSBmZWF0dXJlLCBkbyBub3QgbmVlZCBmb3J3YXJkIHRvIGFwcGxpY2F0aW9uXG4gICAgICAgIC8vIG9ubHkgbmVlZCB1cGRhdGUgZWRpdG9yIGludGVybmFsIHN0YXRlXG4gICAgICAgIHRoaXMuX29uVXBkYXRlKGVkaXRBY3Rpb24sIHRydWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRURJVF9UWVBFLkFERF9GRUFUVVJFOlxuICAgICAgICB0aGlzLl9vblVwZGF0ZShlZGl0QWN0aW9uKTtcbiAgICAgICAgaWYgKG1vZGUgPT09IE1PREVTLkRSQVdfUEFUSCkge1xuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSAoZWRpdEFjdGlvbi5lZGl0Q29udGV4dCAmJiBlZGl0QWN0aW9uLmVkaXRDb250ZXh0WzBdKSB8fCB7fTtcbiAgICAgICAgICBjb25zdCB7IHNjcmVlbkNvb3JkcywgbWFwQ29vcmRzIH0gPSBjb250ZXh0O1xuICAgICAgICAgIGNvbnN0IGZlYXR1cmVJbmRleCA9IHVwZGF0ZWREYXRhLmZlYXR1cmVzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRGZWF0dXJlID0gdGhpcy5fZ2V0U2VsZWN0ZWRGZWF0dXJlKGZlYXR1cmVJbmRleCk7XG4gICAgICAgICAgdGhpcy5fb25TZWxlY3Qoe1xuICAgICAgICAgICAgc2VsZWN0ZWRGZWF0dXJlLFxuICAgICAgICAgICAgc2VsZWN0ZWRGZWF0dXJlSW5kZXg6IGZlYXR1cmVJbmRleCxcbiAgICAgICAgICAgIHNlbGVjdGVkRWRpdEhhbmRsZUluZGV4OiBudWxsLFxuICAgICAgICAgICAgc2NyZWVuQ29vcmRzLFxuICAgICAgICAgICAgbWFwQ29vcmRzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVESVRfVFlQRS5BRERfUE9TSVRJT046XG4gICAgICBjYXNlIEVESVRfVFlQRS5SRU1PVkVfUE9TSVRJT046XG4gICAgICBjYXNlIEVESVRfVFlQRS5GSU5JU0hfTU9WRV9QT1NJVElPTjpcbiAgICAgICAgdGhpcy5fb25VcGRhdGUoZWRpdEFjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfTtcblxuICAvKiBFVkVOVFMgKi9cbiAgX2RlZ3JlZ2lzdGVyRXZlbnRzID0gKCkgPT4ge1xuICAgIGNvbnN0IGV2ZW50TWFuYWdlciA9IHRoaXMuX2NvbnRleHQgJiYgdGhpcy5fY29udGV4dC5ldmVudE1hbmFnZXI7XG4gICAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIWV2ZW50TWFuYWdlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9ldmVudHNSZWdpc3RlcmVkKSB7XG4gICAgICBldmVudE1hbmFnZXIub2ZmKHRoaXMuX2V2ZW50cyk7XG4gICAgICB0aGlzLl9ldmVudHNSZWdpc3RlcmVkID0gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIF9yZWdpc3RlckV2ZW50cyA9ICgpID0+IHtcbiAgICBjb25zdCByZWYgPSB0aGlzLl9jb250YWluZXJSZWY7XG4gICAgY29uc3QgZXZlbnRNYW5hZ2VyID0gdGhpcy5fY29udGV4dCAmJiB0aGlzLl9jb250ZXh0LmV2ZW50TWFuYWdlcjtcbiAgICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhcmVmIHx8ICFldmVudE1hbmFnZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZXZlbnRzUmVnaXN0ZXJlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50TWFuYWdlci5vbih0aGlzLl9ldmVudHMsIHJlZik7XG4gICAgdGhpcy5fZXZlbnRzUmVnaXN0ZXJlZCA9IHRydWU7XG4gIH07XG5cbiAgX29uRXZlbnQgPSAoaGFuZGxlcjogRnVuY3Rpb24sIGV2dDogTWpvbG5pckV2ZW50LCBzdG9wUHJvcGFnYXRpb246IGJvb2xlYW4pID0+IHtcbiAgICBjb25zdCBldmVudCA9IHRoaXMuX2dldEV2ZW50KGV2dCk7XG4gICAgaGFuZGxlcihldmVudCk7XG5cbiAgICBpZiAoc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICBldnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9O1xuXG4gIF9vbkNsaWNrID0gKGV2ZW50OiBCYXNlRXZlbnQpID0+IHtcbiAgICBjb25zdCB7IG1vZGUgfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKG1vZGUgPT09IE1PREVTLlNFTEVDVCB8fCBtb2RlID09PSBNT0RFUy5FRElUSU5HKSB7XG4gICAgICBjb25zdCB7IG1hcENvb3Jkcywgc2NyZWVuQ29vcmRzIH0gPSBldmVudDtcbiAgICAgIGNvbnN0IHBpY2tlZE9iamVjdCA9IGV2ZW50LnBpY2tzICYmIGV2ZW50LnBpY2tzWzBdICYmIGV2ZW50LnBpY2tzWzBdLm9iamVjdDtcbiAgICAgIGlmIChwaWNrZWRPYmplY3QgJiYgaXNOdW1lcmljKHBpY2tlZE9iamVjdC5mZWF0dXJlSW5kZXgpKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRmVhdHVyZUluZGV4ID0gcGlja2VkT2JqZWN0LmZlYXR1cmVJbmRleDtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRGZWF0dXJlID0gdGhpcy5fZ2V0U2VsZWN0ZWRGZWF0dXJlKHNlbGVjdGVkRmVhdHVyZUluZGV4KTtcbiAgICAgICAgdGhpcy5fb25TZWxlY3Qoe1xuICAgICAgICAgIHNlbGVjdGVkRmVhdHVyZSxcbiAgICAgICAgICBzZWxlY3RlZEZlYXR1cmVJbmRleCxcbiAgICAgICAgICBzZWxlY3RlZEVkaXRIYW5kbGVJbmRleDpcbiAgICAgICAgICAgIHBpY2tlZE9iamVjdC50eXBlID09PSBFTEVNRU5UX1RZUEUuRURJVF9IQU5ETEUgPyBwaWNrZWRPYmplY3QuaW5kZXggOiBudWxsLFxuICAgICAgICAgIG1hcENvb3JkcyxcbiAgICAgICAgICBzY3JlZW5Db29yZHNcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9vblNlbGVjdCh7XG4gICAgICAgICAgc2VsZWN0ZWRGZWF0dXJlOiBudWxsLFxuICAgICAgICAgIHNlbGVjdGVkRmVhdHVyZUluZGV4OiBudWxsLFxuICAgICAgICAgIHNlbGVjdGVkRWRpdEhhbmRsZUluZGV4OiBudWxsLFxuICAgICAgICAgIG1hcENvb3JkcyxcbiAgICAgICAgICBzY3JlZW5Db29yZHNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbW9kZVByb3BzID0gdGhpcy5nZXRNb2RlUHJvcHMoKTtcbiAgICBpZih0aGlzLl9tb2RlSGFuZGxlcikge1xuICAgICAgdGhpcy5fbW9kZUhhbmRsZXIuaGFuZGxlQ2xpY2soZXZlbnQsIG1vZGVQcm9wcyk7XG4gICAgfVxuICB9O1xuXG4gIF9vblBvaW50ZXJNb3ZlID0gKGV2ZW50OiBCYXNlRXZlbnQpID0+IHtcbiAgICAvLyBob3ZlcmluZ1xuICAgIGNvbnN0IGhvdmVyZWQgPSB0aGlzLl9nZXRIb3ZlclN0YXRlKGV2ZW50KTtcbiAgICBjb25zdCB7XG4gICAgICBpc0RyYWdnaW5nLFxuICAgICAgZGlkRHJhZyxcbiAgICAgIHBvaW50ZXJEb3duUGlja3MsXG4gICAgICBwb2ludGVyRG93blNjcmVlbkNvb3JkcyxcbiAgICAgIHBvaW50ZXJEb3duTWFwQ29vcmRzXG4gICAgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICBpZiAoaXNEcmFnZ2luZyAmJiAhZGlkRHJhZyAmJiBwb2ludGVyRG93blNjcmVlbkNvb3Jkcykge1xuICAgICAgY29uc3QgZHggPSBldmVudC5zY3JlZW5Db29yZHNbMF0gLSBwb2ludGVyRG93blNjcmVlbkNvb3Jkc1swXTtcbiAgICAgIGNvbnN0IGR5ID0gZXZlbnQuc2NyZWVuQ29vcmRzWzFdIC0gcG9pbnRlckRvd25TY3JlZW5Db29yZHNbMV07XG4gICAgICBpZiAoZHggKiBkeCArIGR5ICogZHkgPiA1KSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBkaWREcmFnOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBvaW50ZXJNb3ZlRXZlbnQgPSB7XG4gICAgICAuLi5ldmVudCxcbiAgICAgIGlzRHJhZ2dpbmcsXG4gICAgICBwb2ludGVyRG93blBpY2tzLFxuICAgICAgcG9pbnRlckRvd25TY3JlZW5Db29yZHMsXG4gICAgICBwb2ludGVyRG93bk1hcENvb3Jkc1xuICAgIH07XG4gICAgLy8gaG93IHRvIGZpcmUgcG9pbnRlck1vdmUgZXZlbnQgcHJvcGVybHkgZm9yIGNpcmNsZVxuICAgIC8vIGlmICh0aGlzLnN0YXRlLmRpZERyYWcpIHtcbiAgICAgIGNvbnN0IG1vZGVQcm9wcyA9IHRoaXMuZ2V0TW9kZVByb3BzKCk7XG4gICAgICB0aGlzLl9tb2RlSGFuZGxlci5oYW5kbGVQb2ludGVyTW92ZShwb2ludGVyTW92ZUV2ZW50LCBtb2RlUHJvcHMpO1xuICAgIC8vIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgaG92ZXJlZCxcbiAgICAgIGxhc3RQb2ludGVyTW92ZUV2ZW50OiBwb2ludGVyTW92ZUV2ZW50XG4gICAgfSk7XG4gIH07XG5cbiAgX29uUG9pbnRlckRvd24gPSAoZXZlbnQ6IEJhc2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IHBpY2tlZE9iamVjdCA9IGV2ZW50LnBpY2tzICYmIGV2ZW50LnBpY2tzWzBdICYmIGV2ZW50LnBpY2tzWzBdLm9iamVjdDtcbiAgICBjb25zdCBzdGFydERyYWdnaW5nRXZlbnQgPSB7XG4gICAgICAuLi5ldmVudCxcbiAgICAgIHBvaW50ZXJEb3duU2NyZWVuQ29vcmRzOiBldmVudC5zY3JlZW5Db29yZHMsXG4gICAgICBwb2ludGVyRG93bk1hcENvb3JkczogZXZlbnQubWFwQ29vcmRzXG4gICAgfTtcblxuICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgaXNEcmFnZ2luZzogcGlja2VkT2JqZWN0ICYmIGlzTnVtZXJpYyhwaWNrZWRPYmplY3QuZmVhdHVyZUluZGV4KSxcbiAgICAgIHBvaW50ZXJEb3duUGlja3M6IGV2ZW50LnBpY2tzLFxuICAgICAgcG9pbnRlckRvd25TY3JlZW5Db29yZHM6IGV2ZW50LnNjcmVlbkNvb3JkcyxcbiAgICAgIHBvaW50ZXJEb3duTWFwQ29vcmRzOiBldmVudC5tYXBDb29yZHNcbiAgICB9O1xuXG4gICAgdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSk7XG5cbiAgICBjb25zdCBtb2RlUHJvcHMgPSB0aGlzLmdldE1vZGVQcm9wcygpO1xuICAgIHRoaXMuX21vZGVIYW5kbGVyLmhhbmRsZVN0YXJ0RHJhZ2dpbmcoc3RhcnREcmFnZ2luZ0V2ZW50LCBtb2RlUHJvcHMpO1xuICB9O1xuXG4gIF9vblBvaW50ZXJVcCA9IChldmVudDogTWpvbG5pckV2ZW50KSA9PiB7XG4gICAgY29uc3Qgc3RvcERyYWdnaW5nRXZlbnQgPSB7XG4gICAgICAuLi5ldmVudCxcbiAgICAgIHBvaW50ZXJEb3duU2NyZWVuQ29vcmRzOiB0aGlzLnN0YXRlLnBvaW50ZXJEb3duU2NyZWVuQ29vcmRzLFxuICAgICAgcG9pbnRlckRvd25NYXBDb29yZHM6IHRoaXMuc3RhdGUucG9pbnRlckRvd25NYXBDb29yZHNcbiAgICB9O1xuXG4gICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICBpc0RyYWdnaW5nOiBmYWxzZSxcbiAgICAgIGRpZERyYWc6IGZhbHNlLFxuICAgICAgcG9pbnRlckRvd25QaWNrczogbnVsbCxcbiAgICAgIHBvaW50ZXJEb3duU2NyZWVuQ29vcmRzOiBudWxsLFxuICAgICAgcG9pbnRlckRvd25NYXBDb29yZHM6IG51bGxcbiAgICB9O1xuXG4gICAgdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSk7XG5cbiAgICBjb25zdCBtb2RlUHJvcHMgPSB0aGlzLmdldE1vZGVQcm9wcygpO1xuICAgIHRoaXMuX21vZGVIYW5kbGVyLmhhbmRsZVN0b3BEcmFnZ2luZyhzdG9wRHJhZ2dpbmdFdmVudCwgbW9kZVByb3BzKTtcbiAgfTtcblxuICBfb25QYW4gPSAoZXZlbnQ6IEJhc2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IHsgaXNEcmFnZ2luZyB9ID0gdGhpcy5zdGF0ZTtcbiAgICBpZiAoaXNEcmFnZ2luZykge1xuICAgICAgZXZlbnQuc291cmNlRXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9O1xuXG4gIC8qIEhFTFBFUlMgKi9cbiAgcHJvamVjdCA9IChwdDogUG9zaXRpb24pID0+IHtcbiAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMuX2NvbnRleHQgJiYgdGhpcy5fY29udGV4dC52aWV3cG9ydDtcbiAgICByZXR1cm4gdmlld3BvcnQgJiYgdmlld3BvcnQucHJvamVjdChwdCk7XG4gIH07XG5cbiAgdW5wcm9qZWN0ID0gKHB0OiBQb3NpdGlvbikgPT4ge1xuICAgIGNvbnN0IHZpZXdwb3J0ID0gdGhpcy5fY29udGV4dCAmJiB0aGlzLl9jb250ZXh0LnZpZXdwb3J0O1xuICAgIHJldHVybiB2aWV3cG9ydCAmJiB2aWV3cG9ydC51bnByb2plY3QocHQpO1xuICB9O1xuXG4gIF9nZXRFdmVudChldnQ6IE1qb2xuaXJFdmVudCkge1xuICAgIGNvbnN0IHBpY2tlZCA9IHBhcnNlRXZlbnRFbGVtZW50KGV2dCk7XG4gICAgY29uc3Qgc2NyZWVuQ29vcmRzID0gZ2V0U2NyZWVuQ29vcmRzKGV2dCk7XG4gICAgY29uc3QgbWFwQ29vcmRzID0gdGhpcy51bnByb2plY3Qoc2NyZWVuQ29vcmRzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBwaWNrczogcGlja2VkID8gW3BpY2tlZF0gOiBudWxsLFxuICAgICAgc2NyZWVuQ29vcmRzLFxuICAgICAgbWFwQ29vcmRzLFxuICAgICAgc291cmNlRXZlbnQ6IGV2dFxuICAgIH07XG4gIH1cblxuICBfZ2V0SG92ZXJTdGF0ZSA9IChldmVudDogQmFzZUV2ZW50KSA9PiB7XG4gICAgY29uc3Qgb2JqZWN0ID0gZXZlbnQucGlja3MgJiYgZXZlbnQucGlja3NbMF0gJiYgZXZlbnQucGlja3NbMF0ub2JqZWN0O1xuICAgIGlmICghb2JqZWN0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2NyZWVuQ29vcmRzOiBldmVudC5zY3JlZW5Db29yZHMsXG4gICAgICBtYXBDb29yZHM6IGV2ZW50Lm1hcENvb3JkcyxcbiAgICAgIC4uLm9iamVjdFxuICAgIH07XG4gIH07XG5cbiAgX2lzRHJhd2luZygpIHtcbiAgICBjb25zdCB7IG1vZGUgfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIERSQVdJTkdfTU9ERS5maW5kSW5kZXgobSA9PiBtID09PSBtb2RlKSA+PSAwO1xuICB9XG5cbiAgcmVuZGVyKGNoaWxkOiBhbnkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPE1hcENvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgIHtjb250ZXh0ID0+IHtcbiAgICAgICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgICBjb25zdCB2aWV3cG9ydCA9IGNvbnRleHQgJiYgY29udGV4dC52aWV3cG9ydDtcblxuICAgICAgICAgIGlmICghdmlld3BvcnQgfHwgdmlld3BvcnQuaGVpZ2h0IDw9IDAgfHwgdmlld3BvcnQud2lkdGggPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICB9fVxuICAgICAgPC9NYXBDb250ZXh0LkNvbnN1bWVyPlxuICAgICk7XG4gIH1cbn1cblxuTW9kZUhhbmRsZXIuZGlzcGxheU5hbWUgPSAnTW9kZUhhbmRsZXInO1xuIl19
\No newline at end of file