{"version":3,"sources":["wwwroot/js/membership/node_modules/browser-pack/_prelude.js","wwwroot/js/membership/Scripts/pages/membership/index.js","wwwroot/js/membership/Scripts/src/api.js","wwwroot/js/membership/Scripts/src/common.js","wwwroot/js/membership/Scripts/src/errors.js","wwwroot/js/membership/Scripts/src/freeze-ui.js","wwwroot/js/membership/Scripts/src/localStorage.js","wwwroot/js/membership/Scripts/src/notifications.js","wwwroot/js/membership/node_modules/@babel/runtime/helpers/asyncToGenerator.js","wwwroot/js/membership/node_modules/@babel/runtime/helpers/classCallCheck.js","wwwroot/js/membership/node_modules/@babel/runtime/helpers/createClass.js","wwwroot/js/membership/node_modules/@babel/runtime/helpers/defineProperty.js","wwwroot/js/membership/node_modules/@babel/runtime/helpers/interopRequireDefault.js","wwwroot/js/membership/node_modules/@babel/runtime/regenerator/index.js","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Draggable/DragEvent/DragEvent.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Draggable/Draggable.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Draggable/DraggableEvent/DraggableEvent.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Draggable/Emitter/Emitter.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Draggable/Plugins/Announcement/Announcement.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Draggable/Plugins/Focusable/Focusable.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Draggable/Plugins/Mirror/Mirror.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Draggable/Plugins/Mirror/MirrorEvent/MirrorEvent.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Draggable/Plugins/Scrollable/Scrollable.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Draggable/Sensors/DragSensor/DragSensor.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Draggable/Sensors/ForceTouchSensor/ForceTouchSensor.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Draggable/Sensors/MouseSensor/MouseSensor.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Draggable/Sensors/Sensor/Sensor.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Draggable/Sensors/SensorEvent/SensorEvent.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Draggable/Sensors/TouchSensor/TouchSensor.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Draggable/Sensors/index.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Droppable/Droppable.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Droppable/DroppableEvent/DroppableEvent.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Plugins/Collidable/Collidable.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Plugins/Collidable/CollidableEvent/CollidableEvent.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Plugins/ResizeMirror/ResizeMirror.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Plugins/Snappable/Snappable.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Plugins/Snappable/SnappableEvent/SnappableEvent.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Plugins/SortAnimation/SortAnimation.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Plugins/SwapAnimation/SwapAnimation.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Plugins/index.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Sortable/Sortable.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Sortable/SortableEvent/SortableEvent.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Swappable/Swappable.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/Swappable/SwappableEvent/SwappableEvent.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/_virtual/_rollupPluginBabelHelpers.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/index.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/shared/AbstractEvent/AbstractEvent.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/shared/AbstractPlugin/AbstractPlugin.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/shared/utils/closest/closest.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/shared/utils/decorators/AutoBind.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/shared/utils/distance/distance.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/shared/utils/requestNextAnimationFrame/requestNextAnimationFrame.cjs","wwwroot/js/membership/node_modules/@shopify/draggable/build/cjs/shared/utils/touchCoords/touchCoords.cjs","wwwroot/js/membership/node_modules/regenerator-runtime/runtime.js"],"names":[],"mappings":"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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1bA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjeA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"index.min.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i {\n\n initCancelAutoRenew();\n\n if (typeof Sortable === \"undefined\")\n return;\n\n const sortable = new Sortable(document.querySelector(\"#packages\"), {\n draggable: \"[data-package-id]\",\n handle: \"[data-package-id] .handle\",\n mirror: {\n appendTo: \"body\",\n constrainDimensions: true\n }\n });\n\n sortable.on(\"sortable:stop\", async (e) => {\n\n try {\n FreezeUI.Freeze();\n await api.post(\"?Handler=SetOrder\", {\n id: e.data.dragEvent.data.originalSource.dataset.packageId,\n newIndex: e.data.newIndex,\n oldIndex: e.data.oldIndex\n });\n\n Notifications.showSuccess({ message: \"Saved!\" });\n } catch (err) {\n console.error(err);\n Notifications.showError({ message: \"There was a problem saving the new order. Please try again later.\" })\n } finally {\n FreezeUI.UnFreeze();\n }\n });\n});\n\nconst initCancelAutoRenew = () => {\n document.querySelector(\"[data-cancel-renewal]\")?.addEventListener(\"click\", e => {\n e.preventDefault();\n\n Notifications.confirm.fire({\n text: `Are you sure you want to cancel your renewal? This cannot be undone and you will need to rejoin manually.`\n })\n .then(async result => {\n if (result.isConfirmed) {\n FreezeUI.Freeze();\n\n try {\n await authApi.post(\"?Handler=CancelRenewal\")\n .then(result => {\n Notifications.setNotificationCookie(\"The renewal has been cancelled.\")\n location.reload();\n })\n .catch(err => {\n trackException(err);\n Notifications.showError({ message: \"There was a problem cancelling the renewal.\" })\n });\n\n } catch (err) {\n\n }\n }\n });\n })\n}\n","import {LocalStorage} from \"./localStorage\";\nimport {requestVerificationToken} from \"./common\";\n\nexport const apiVersion = \"2023-02-21\";\n\nexport const api = axios.create({\n headers: {\n \"RequestVerificationToken\": requestVerificationToken,\n \"x-api-version\": apiVersion\n }\n});\n\nexport const authApi = axios.create({\n headers: {\n \"RequestVerificationToken\": requestVerificationToken,\n \"x-api-version\": apiVersion\n }\n});\n\nauthApi.interceptors.request.use(\n config => {\n const token = LocalStorage.getToken();\n if (token) {\n config.headers['Authorization'] = `Bearer ${token}`;\n }\n return config;\n },\n error => {\n Promise.reject(error)\n });\n\nauthApi.interceptors.response.use((response) => {\n return response\n },\n function (error) {\n const originalRequest = error.config;\n if (error.response.status === 401 && !originalRequest._retry) {\n\n originalRequest._retry = true;\n return axios.post('/api/token', new URLSearchParams({ grant_type: 'client_credentials' }), { headers: {\"x-api-version\": apiVersion}})\n .then(res => {\n if (res.status === 200 && res.data.access_token) {\n LocalStorage.setToken(res.data);\n originalRequest.headers.Authorization = `Bearer ${res.data.access_token}`;\n\n return axios(originalRequest);\n }\n });\n }\n return Promise.reject(error);\n });\n","export const requestVerificationToken = document.querySelector('input[name=\"__RequestVerificationToken\"]')?.value;\n\nexport function addCommas(value) {\n return value.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n}\n\nexport function sanitizeUrl(url) {\n return url.toLowerCase()\n .replace(/ /g, '-')\n .replace(/[^\\w-]+/g, '');\n}\n\nexport function truncateString(str, num) {\n if (str.length <= num) {\n return str;\n }\n return str.slice(0, num) + '...';\n}\n\nexport let pathAndQuery = location.pathname + location.search + location.hash;\n\nexport let returnUrlQueryString = `returnurl=${encodeURIComponent(pathAndQuery)}`;\n\nexport const archivedBadge = \"Archived\";\n\nexport const slideUp = (el, speed, callback) => {\n KTUtil.slideUp(el, speed ?? 250, callback);\n}\n\nexport const slideDown = (el, speed, callback) => {\n KTUtil.slideDown(el, speed ?? 250, callback);\n}\n\nexport const show = (el, display) => {\n if (typeof el !== 'undefined' && el) {\n el.style.display = (display ? display : 'block');\n }\n}\n\nexport const hide = (el) => {\n if (typeof el !== 'undefined' && el) {\n el.style.display = 'none';\n }\n}\n\nexport function createUUID() {\n return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n}\n\nexport function currentCulture() {\n return document.getElementById(\"currentCulture\")?.value ?? \"en-gb\";\n}\n\nexport function currentCurrency() {\n return document.getElementById(\"currentCurrency\")?.value ?? \"£\";\n}\n\nexport function getCurrencySymbol() {\n return (0).toLocaleString(currentCulture(), {\n style: 'currency',\n currency: currentCurrency(),\n minimumFractionDigits: 0,\n maximumFractionDigits: 0\n }).replace(/\\d/g, '').trim();\n}\n\nexport function formatCurrency(amount) {\n return new Intl.NumberFormat(currentCulture(), {\n style: \"currency\",\n currency: currentCurrency(),\n }).format(amount);\n}\n","export const trackException = (err) => {\n if (typeof appInsights !== 'undefined') {\n appInsights.trackException(err);\n } else {\n console.log(err);\n }\n}\n","export class FreezeUI {\n\n static isFrozen = false;\n\n static Freeze = (options) => {\n\n if(this.isFrozen)\n return;\n\n const freezeHtml = document.createElement('div');\n freezeHtml.classList.add('freeze-ui');\n\n let parent = document.querySelector(options?.selector) || document.body;\n freezeHtml.setAttribute('data-text', options?.text || 'Please wait');\n if (document.querySelector(options?.selector)) {\n freezeHtml.style.position = 'absolute';\n\n this.isFrozen = true;\n }\n\n parent.appendChild(freezeHtml);\n };\n\n static UnFreeze = () => {\n let element = document.querySelector('.freeze-ui');\n if (element) {\n element.classList.add('is-unfreezing');\n setTimeout(() => {\n if (element) {\n element.classList.remove('is-unfreezing');\n element.parentElement?.removeChild(element);\n\n this.isFrozen = false;\n }\n }, 250);\n }\n };\n}\n","// LocalStorageService.js\nexport class LocalStorage {\n\n static setToken(tokenObj) {\n localStorage.setItem(\"token\", tokenObj.access_token);\n localStorage.setItem(\"expires\", tokenObj.expires);\n }\n\n static getToken() {\n return localStorage.getItem(\"token\");\n }\n\n static clearToken() {\n localStorage.removeItem(\"token\");\n localStorage.removeItem(\"expiration\");\n }\n}\n","export class Notifications {\n\n static notificationCookieName = \".clubpal.toast\";\n static alertCookieName = \".clubpal.alert\";\n\n static init() {\n window.addEventListener('load', function () {\n\n const notificationCookie = Notifications.getCookie(Notifications.notificationCookieName);\n if (notificationCookie) {\n\n let values = Notifications.parseQuery(notificationCookie);\n if (values[\"message\"]) {\n showMessage({message: values[\"message\"], type: values[\"type\"]});\n\n Notifications.setCookie(Notifications.notificationCookieName, \"\", -1);\n }\n }\n\n const alertCookie = Notifications.getCookie(Notifications.alertCookieName);\n if (alertCookie) {\n\n let values = Notifications.parseQuery(alertCookie);\n if (values[\"message\"]) {\n Notifications.alert.fire({ title: values[\"title\"], html: values[\"message\"]});\n }\n Notifications.setCookie(Notifications.alertCookieName, \"\", -1);\n }\n });\n }\n\n static setNotificationCookie(title) {\n Notifications.setCookie(btoa(`message=${title}&type=success`), 1);\n }\n\n /**\n *\n * @param {object} options - Options\n * @param {string} options.message - The message for the notification\n * @param {string} [options.title] - An optional title for the notification\n * @param {number} [options.timeout] - The time in milliseconds to show the notification. Set to 0 to not auto-hide.\n */\n static showSuccess = (options) => {\n options.type = \"success\";\n\n showMessage(options);\n }\n\n /**\n *\n * @param {object} options - Options\n * @param {string} options.message - The message for the notification\n * @param {string} [options.title] - An optional title for the notification\n * @param {number} [options.timeout] - The time in milliseconds to show the notification. Set to 0 to not auto-hide.\n */\n static showError = (options) => {\n options.type = \"error\";\n\n showMessage(options);\n }\n\n /**\n *\n * @param {object} options - Options\n * @param {string} options.message - The message for the notification\n * @param {string} [options.title] - An optional title for the notification\n * @param {number} [options.timeout] - The time in milliseconds to show the notification. Set to 0 to not auto-hide.\n */\n static showWarning = (options) => {\n options.type = \"warning\";\n\n showMessage(options);\n }\n\n /**\n *\n * @param {object} options - Options\n * @param {string} options.message - The message for the notification\n * @param {string} [options.title] - An optional title for the notification\n * @param {number} [options.timeout] - The time in milliseconds to show the notification. Set to 0 to not auto-hide.\n */\n static showInfo = (options) => {\n options.type = \"warning\";\n\n showMessage(options);\n }\n\n static confirm = Swal?.mixin({\n showConfirmButton: true,\n showDenyButton: true,\n reverseButtons: true,\n customClass: {\n actions: \"d-flex justify-content-between w-100\",\n confirmButton: \"px-10 btn btn-primary d-flex align-items-center\",\n denyButton: \"px-10 btn btn-danger d-flex align-items-center\",\n input: ''\n },\n confirmButtonText: ' Yes',\n denyButtonText: ' No',\n });\n\n static alert = Swal.mixin({\n showConfirmButton: true,\n showDenyButton: false,\n reverseButtons: false,\n customClass: {\n actions: \"d-flex justify-content-center w-100\",\n confirmButton: \"px-10 btn btn-light-primary d-flex align-items-center\",\n input: ''\n },\n confirmButtonText: 'OK!'\n });\n\n static setCookie(cookieName, value, minutes) {\n let expires = \"\";\n if (minutes) {\n const date = new Date();\n date.setTime(date.getTime() + (minutes * 60 * 1000));\n expires = \"; expires=\" + date.toUTCString();\n }\n\n document.cookie = cookieName + \"=\" + (value || \"\") + expires + \"; path=/\";\n }\n\n static getCookie(cookieName) {\n let nameEQ = cookieName + \"=\";\n let ca = document.cookie.split(';');\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) === ' ') c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) === 0) {\n let value = decodeURIComponent(c.substring(nameEQ.length, c.length));\n return atob(value);\n }\n }\n\n return null;\n }\n\n static parseQuery(queryString) {\n let query = {};\n let pairs = (queryString[0] === '?' ? queryString.substr(1) : queryString).split('&');\n for (let i = 0; i < pairs.length; i++) {\n let pair = pairs[i].split('=');\n query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || '');\n }\n return query;\n }\n}\n\nlet container;\n\nconst alertTemplate = Handlebars.compile(`\n
\n {{#if title}}\n
{{title}}
\n {{/if}}\n
\n
\n {{message}}\n
\n \n
\n
\n
\n`);\n\nconst ensureContainer = () => {\n if(container)\n return container;\n\n container = document.createElement(\"div\");\n container.id = \"snackbar\";\n\n document.body.appendChild(container);\n\n return container;\n};\n\n/**\n *\n * @param {object} options - Options\n * @param {string} options.message - The message for the notification\n * @param {(\"success\" | \"warning\" | \"error\" | \"info\")} options.type - The type of notification to display. Options are success, warning, error, info.\n * @param {string} [options.title] - An optional title for the notification\n * @param {number} [options.timeout] - The time in milliseconds to show the notification. Set to 0 to not auto-hide.\n */\n\nconst showMessage = (options) => {\n\n const timeout = options.timeout ?? 5000;\n\n const alert = document.createElement(\"div\");\n alert.innerHTML = alertTemplate(options);\n\n ensureContainer().appendChild(alert);\n alert.className = `snack ${options.type} show`;\n\n const closeButton = alert.querySelector(\"a.close\");\n closeButton.addEventListener(\"click\", (e) => {\n e.preventDefault();\n\n hideAlert();\n });\n\n if(timeout > 0) {\n setTimeout(hideAlert, timeout);\n }\n\n function hideAlert() {\n alert.remove();\n }\n};\n\n","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nfunction _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}\n\nmodule.exports = _asyncToGenerator;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nmodule.exports = _defineProperty;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\n\nmodule.exports = _interopRequireDefault;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","module.exports = require(\"regenerator-runtime\");\n","'use strict';\n\nvar AbstractEvent = require('../../shared/AbstractEvent/AbstractEvent.cjs');\n\nclass DragEvent extends AbstractEvent.AbstractEvent {\n\n constructor(data) {\n super(data);\n this.data = data;\n }\n\n get source() {\n return this.data.source;\n }\n\n get originalSource() {\n return this.data.originalSource;\n }\n\n get mirror() {\n return this.data.mirror;\n }\n\n get sourceContainer() {\n return this.data.sourceContainer;\n }\n\n get sensorEvent() {\n return this.data.sensorEvent;\n }\n\n get originalEvent() {\n if (this.sensorEvent) {\n return this.sensorEvent.originalEvent;\n }\n return null;\n }\n}\n\nDragEvent.type = 'drag';\nclass DragStartEvent extends DragEvent {}\n\nDragStartEvent.type = 'drag:start';\nDragStartEvent.cancelable = true;\nclass DragMoveEvent extends DragEvent {}\n\nDragMoveEvent.type = 'drag:move';\n\nclass DragOverEvent extends DragEvent {\n\n get overContainer() {\n return this.data.overContainer;\n }\n\n get over() {\n return this.data.over;\n }\n}\nDragOverEvent.type = 'drag:over';\nDragOverEvent.cancelable = true;\nfunction isDragOverEvent(event) {\n return event.type === DragOverEvent.type;\n}\n\nclass DragOutEvent extends DragEvent {\n\n get overContainer() {\n return this.data.overContainer;\n }\n\n get over() {\n return this.data.over;\n }\n}\n\nDragOutEvent.type = 'drag:out';\n\nclass DragOverContainerEvent extends DragEvent {\n\n get overContainer() {\n return this.data.overContainer;\n }\n}\n\nDragOverContainerEvent.type = 'drag:over:container';\n\nclass DragOutContainerEvent extends DragEvent {\n\n get overContainer() {\n return this.data.overContainer;\n }\n}\n\nDragOutContainerEvent.type = 'drag:out:container';\n\nclass DragPressureEvent extends DragEvent {\n\n get pressure() {\n return this.data.pressure;\n }\n}\n\nDragPressureEvent.type = 'drag:pressure';\nclass DragStopEvent extends DragEvent {}\n\nDragStopEvent.type = 'drag:stop';\nDragStopEvent.cancelable = true;\nclass DragStoppedEvent extends DragEvent {}\nDragStoppedEvent.type = 'drag:stopped';\n\nexports.DragEvent = DragEvent;\nexports.DragMoveEvent = DragMoveEvent;\nexports.DragOutContainerEvent = DragOutContainerEvent;\nexports.DragOutEvent = DragOutEvent;\nexports.DragOverContainerEvent = DragOverContainerEvent;\nexports.DragOverEvent = DragOverEvent;\nexports.DragPressureEvent = DragPressureEvent;\nexports.DragStartEvent = DragStartEvent;\nexports.DragStopEvent = DragStopEvent;\nexports.DragStoppedEvent = DragStoppedEvent;\nexports.isDragOverEvent = isDragOverEvent;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar closest = require('../shared/utils/closest/closest.cjs');\nvar Announcement = require('./Plugins/Announcement/Announcement.cjs');\nvar Focusable = require('./Plugins/Focusable/Focusable.cjs');\nvar Mirror = require('./Plugins/Mirror/Mirror.cjs');\nvar Scrollable = require('./Plugins/Scrollable/Scrollable.cjs');\nvar Emitter = require('./Emitter/Emitter.cjs');\nvar MouseSensor = require('./Sensors/MouseSensor/MouseSensor.cjs');\nvar TouchSensor = require('./Sensors/TouchSensor/TouchSensor.cjs');\nrequire('./Sensors/SensorEvent/SensorEvent.cjs');\nvar DraggableEvent = require('./DraggableEvent/DraggableEvent.cjs');\nvar DragEvent = require('./DragEvent/DragEvent.cjs');\n\nconst onDragStart = Symbol('onDragStart');\nconst onDragMove = Symbol('onDragMove');\nconst onDragStop = Symbol('onDragStop');\nconst onDragPressure = Symbol('onDragPressure');\nconst dragStop = Symbol('dragStop');\n\nconst defaultAnnouncements = {\n 'drag:start': event => `Picked up ${event.source.textContent.trim() || event.source.id || 'draggable element'}`,\n 'drag:stop': event => `Released ${event.source.textContent.trim() || event.source.id || 'draggable element'}`\n};\nconst defaultClasses = {\n 'container:dragging': 'draggable-container--is-dragging',\n 'source:dragging': 'draggable-source--is-dragging',\n 'source:placed': 'draggable-source--placed',\n 'container:placed': 'draggable-container--placed',\n 'body:dragging': 'draggable--is-dragging',\n 'draggable:over': 'draggable--over',\n 'container:over': 'draggable-container--over',\n 'source:original': 'draggable--original',\n mirror: 'draggable-mirror'\n};\nconst defaultOptions = {\n draggable: '.draggable-source',\n handle: null,\n delay: {},\n distance: 0,\n placedTimeout: 800,\n plugins: [],\n sensors: [],\n exclude: {\n plugins: [],\n sensors: []\n }\n};\n\nclass Draggable {\n\n constructor(containers = [document.body], options = {}) {\n\n if (containers instanceof NodeList || containers instanceof Array) {\n this.containers = [...containers];\n } else if (containers instanceof HTMLElement) {\n this.containers = [containers];\n } else {\n throw new Error('Draggable containers are expected to be of type `NodeList`, `HTMLElement[]` or `HTMLElement`');\n }\n this.options = {\n ...defaultOptions,\n ...options,\n classes: {\n ...defaultClasses,\n ...(options.classes || {})\n },\n announcements: {\n ...defaultAnnouncements,\n ...(options.announcements || {})\n },\n exclude: {\n plugins: options.exclude && options.exclude.plugins || [],\n sensors: options.exclude && options.exclude.sensors || []\n }\n };\n\n this.emitter = new Emitter.default();\n\n this.dragging = false;\n\n this.plugins = [];\n\n this.sensors = [];\n this[onDragStart] = this[onDragStart].bind(this);\n this[onDragMove] = this[onDragMove].bind(this);\n this[onDragStop] = this[onDragStop].bind(this);\n this[onDragPressure] = this[onDragPressure].bind(this);\n this[dragStop] = this[dragStop].bind(this);\n document.addEventListener('drag:start', this[onDragStart], true);\n document.addEventListener('drag:move', this[onDragMove], true);\n document.addEventListener('drag:stop', this[onDragStop], true);\n document.addEventListener('drag:pressure', this[onDragPressure], true);\n const defaultPlugins = Object.values(Draggable.Plugins).filter(Plugin => !this.options.exclude.plugins.includes(Plugin));\n const defaultSensors = Object.values(Draggable.Sensors).filter(sensor => !this.options.exclude.sensors.includes(sensor));\n this.addPlugin(...[...defaultPlugins, ...this.options.plugins]);\n this.addSensor(...[...defaultSensors, ...this.options.sensors]);\n const draggableInitializedEvent = new DraggableEvent.DraggableInitializedEvent({\n draggable: this\n });\n this.on('mirror:created', ({\n mirror\n }) => this.mirror = mirror);\n this.on('mirror:destroy', () => this.mirror = null);\n this.trigger(draggableInitializedEvent);\n }\n\n destroy() {\n document.removeEventListener('drag:start', this[onDragStart], true);\n document.removeEventListener('drag:move', this[onDragMove], true);\n document.removeEventListener('drag:stop', this[onDragStop], true);\n document.removeEventListener('drag:pressure', this[onDragPressure], true);\n const draggableDestroyEvent = new DraggableEvent.DraggableDestroyEvent({\n draggable: this\n });\n this.trigger(draggableDestroyEvent);\n this.removePlugin(...this.plugins.map(plugin => plugin.constructor));\n this.removeSensor(...this.sensors.map(sensor => sensor.constructor));\n }\n\n addPlugin(...plugins) {\n const activePlugins = plugins.map(Plugin => new Plugin(this));\n activePlugins.forEach(plugin => plugin.attach());\n this.plugins = [...this.plugins, ...activePlugins];\n return this;\n }\n\n removePlugin(...plugins) {\n const removedPlugins = this.plugins.filter(plugin => plugins.includes(plugin.constructor));\n removedPlugins.forEach(plugin => plugin.detach());\n this.plugins = this.plugins.filter(plugin => !plugins.includes(plugin.constructor));\n return this;\n }\n\n addSensor(...sensors) {\n const activeSensors = sensors.map(Sensor => new Sensor(this.containers, this.options));\n activeSensors.forEach(sensor => sensor.attach());\n this.sensors = [...this.sensors, ...activeSensors];\n return this;\n }\n\n removeSensor(...sensors) {\n const removedSensors = this.sensors.filter(sensor => sensors.includes(sensor.constructor));\n removedSensors.forEach(sensor => sensor.detach());\n this.sensors = this.sensors.filter(sensor => !sensors.includes(sensor.constructor));\n return this;\n }\n\n addContainer(...containers) {\n this.containers = [...this.containers, ...containers];\n this.sensors.forEach(sensor => sensor.addContainer(...containers));\n return this;\n }\n\n removeContainer(...containers) {\n this.containers = this.containers.filter(container => !containers.includes(container));\n this.sensors.forEach(sensor => sensor.removeContainer(...containers));\n return this;\n }\n\n on(type, ...callbacks) {\n this.emitter.on(type, ...callbacks);\n return this;\n }\n\n off(type, callback) {\n this.emitter.off(type, callback);\n return this;\n }\n\n trigger(event) {\n this.emitter.trigger(event);\n return this;\n }\n\n getClassNameFor(name) {\n return this.getClassNamesFor(name)[0];\n }\n\n getClassNamesFor(name) {\n const classNames = this.options.classes[name];\n if (classNames instanceof Array) {\n return classNames;\n } else if (typeof classNames === 'string' || classNames instanceof String) {\n return [classNames];\n } else {\n return [];\n }\n }\n\n isDragging() {\n return Boolean(this.dragging);\n }\n\n getDraggableElements() {\n return this.containers.reduce((current, container) => {\n return [...current, ...this.getDraggableElementsForContainer(container)];\n }, []);\n }\n\n getDraggableElementsForContainer(container) {\n const allDraggableElements = container.querySelectorAll(this.options.draggable);\n return [...allDraggableElements].filter(childElement => {\n return childElement !== this.originalSource && childElement !== this.mirror;\n });\n }\n\n cancel() {\n this[dragStop]();\n }\n\n [onDragStart](event) {\n const sensorEvent = getSensorEvent(event);\n const {\n target,\n container,\n originalSource\n } = sensorEvent;\n if (!this.containers.includes(container)) {\n return;\n }\n if (this.options.handle && target && !closest.default(target, this.options.handle)) {\n sensorEvent.cancel();\n return;\n }\n this.originalSource = originalSource;\n this.sourceContainer = container;\n if (this.lastPlacedSource && this.lastPlacedContainer) {\n clearTimeout(this.placedTimeoutID);\n this.lastPlacedSource.classList.remove(...this.getClassNamesFor('source:placed'));\n this.lastPlacedContainer.classList.remove(...this.getClassNamesFor('container:placed'));\n }\n this.source = this.originalSource.cloneNode(true);\n this.originalSource.parentNode.insertBefore(this.source, this.originalSource);\n this.originalSource.style.display = 'none';\n const dragStartEvent = new DragEvent.DragStartEvent({\n source: this.source,\n originalSource: this.originalSource,\n sourceContainer: container,\n sensorEvent\n });\n this.trigger(dragStartEvent);\n this.dragging = !dragStartEvent.canceled();\n if (dragStartEvent.canceled()) {\n this.source.remove();\n this.originalSource.style.display = null;\n return;\n }\n this.originalSource.classList.add(...this.getClassNamesFor('source:original'));\n this.source.classList.add(...this.getClassNamesFor('source:dragging'));\n this.sourceContainer.classList.add(...this.getClassNamesFor('container:dragging'));\n document.body.classList.add(...this.getClassNamesFor('body:dragging'));\n applyUserSelect(document.body, 'none');\n requestAnimationFrame(() => {\n const oldSensorEvent = getSensorEvent(event);\n const newSensorEvent = oldSensorEvent.clone({\n target: this.source\n });\n this[onDragMove]({\n ...event,\n detail: newSensorEvent\n });\n });\n }\n\n [onDragMove](event) {\n if (!this.dragging) {\n return;\n }\n const sensorEvent = getSensorEvent(event);\n const {\n container\n } = sensorEvent;\n let target = sensorEvent.target;\n const dragMoveEvent = new DragEvent.DragMoveEvent({\n source: this.source,\n originalSource: this.originalSource,\n sourceContainer: container,\n sensorEvent\n });\n this.trigger(dragMoveEvent);\n if (dragMoveEvent.canceled()) {\n sensorEvent.cancel();\n }\n target = closest.default(target, this.options.draggable);\n const withinCorrectContainer = closest.default(sensorEvent.target, this.containers);\n const overContainer = sensorEvent.overContainer || withinCorrectContainer;\n const isLeavingContainer = this.currentOverContainer && overContainer !== this.currentOverContainer;\n const isLeavingDraggable = this.currentOver && target !== this.currentOver;\n const isOverContainer = overContainer && this.currentOverContainer !== overContainer;\n const isOverDraggable = withinCorrectContainer && target && this.currentOver !== target;\n if (isLeavingDraggable) {\n const dragOutEvent = new DragEvent.DragOutEvent({\n source: this.source,\n originalSource: this.originalSource,\n sourceContainer: container,\n sensorEvent,\n over: this.currentOver,\n overContainer: this.currentOverContainer\n });\n this.currentOver.classList.remove(...this.getClassNamesFor('draggable:over'));\n this.currentOver = null;\n this.trigger(dragOutEvent);\n }\n if (isLeavingContainer) {\n const dragOutContainerEvent = new DragEvent.DragOutContainerEvent({\n source: this.source,\n originalSource: this.originalSource,\n sourceContainer: container,\n sensorEvent,\n overContainer: this.currentOverContainer\n });\n this.currentOverContainer.classList.remove(...this.getClassNamesFor('container:over'));\n this.currentOverContainer = null;\n this.trigger(dragOutContainerEvent);\n }\n if (isOverContainer) {\n overContainer.classList.add(...this.getClassNamesFor('container:over'));\n const dragOverContainerEvent = new DragEvent.DragOverContainerEvent({\n source: this.source,\n originalSource: this.originalSource,\n sourceContainer: container,\n sensorEvent,\n overContainer\n });\n this.currentOverContainer = overContainer;\n this.trigger(dragOverContainerEvent);\n }\n if (isOverDraggable) {\n target.classList.add(...this.getClassNamesFor('draggable:over'));\n const dragOverEvent = new DragEvent.DragOverEvent({\n source: this.source,\n originalSource: this.originalSource,\n sourceContainer: container,\n sensorEvent,\n overContainer,\n over: target\n });\n this.currentOver = target;\n this.trigger(dragOverEvent);\n }\n }\n\n [dragStop](event) {\n if (!this.dragging) {\n return;\n }\n this.dragging = false;\n const dragStopEvent = new DragEvent.DragStopEvent({\n source: this.source,\n originalSource: this.originalSource,\n sensorEvent: event ? event.sensorEvent : null,\n sourceContainer: this.sourceContainer\n });\n this.trigger(dragStopEvent);\n if (!dragStopEvent.canceled()) this.source.parentNode.insertBefore(this.originalSource, this.source);\n this.source.remove();\n this.originalSource.style.display = '';\n this.source.classList.remove(...this.getClassNamesFor('source:dragging'));\n this.originalSource.classList.remove(...this.getClassNamesFor('source:original'));\n this.originalSource.classList.add(...this.getClassNamesFor('source:placed'));\n this.sourceContainer.classList.add(...this.getClassNamesFor('container:placed'));\n this.sourceContainer.classList.remove(...this.getClassNamesFor('container:dragging'));\n document.body.classList.remove(...this.getClassNamesFor('body:dragging'));\n applyUserSelect(document.body, '');\n if (this.currentOver) {\n this.currentOver.classList.remove(...this.getClassNamesFor('draggable:over'));\n }\n if (this.currentOverContainer) {\n this.currentOverContainer.classList.remove(...this.getClassNamesFor('container:over'));\n }\n this.lastPlacedSource = this.originalSource;\n this.lastPlacedContainer = this.sourceContainer;\n this.placedTimeoutID = setTimeout(() => {\n if (this.lastPlacedSource) {\n this.lastPlacedSource.classList.remove(...this.getClassNamesFor('source:placed'));\n }\n if (this.lastPlacedContainer) {\n this.lastPlacedContainer.classList.remove(...this.getClassNamesFor('container:placed'));\n }\n this.lastPlacedSource = null;\n this.lastPlacedContainer = null;\n }, this.options.placedTimeout);\n const dragStoppedEvent = new DragEvent.DragStoppedEvent({\n source: this.source,\n originalSource: this.originalSource,\n sensorEvent: event ? event.sensorEvent : null,\n sourceContainer: this.sourceContainer\n });\n this.trigger(dragStoppedEvent);\n this.source = null;\n this.originalSource = null;\n this.currentOverContainer = null;\n this.currentOver = null;\n this.sourceContainer = null;\n }\n\n [onDragStop](event) {\n this[dragStop](event);\n }\n\n [onDragPressure](event) {\n if (!this.dragging) {\n return;\n }\n const sensorEvent = getSensorEvent(event);\n const source = this.source || closest.default(sensorEvent.originalEvent.target, this.options.draggable);\n const dragPressureEvent = new DragEvent.DragPressureEvent({\n sensorEvent,\n source,\n pressure: sensorEvent.pressure\n });\n this.trigger(dragPressureEvent);\n }\n}\n\nDraggable.Plugins = {\n Announcement: Announcement.default,\n Focusable: Focusable.default,\n Mirror: Mirror.default,\n Scrollable: Scrollable.default\n};\n\nDraggable.Sensors = {\n MouseSensor: MouseSensor.default,\n TouchSensor: TouchSensor.default\n};\nfunction getSensorEvent(event) {\n return event.detail;\n}\nfunction applyUserSelect(element, value) {\n element.style.webkitUserSelect = value;\n element.style.mozUserSelect = value;\n element.style.msUserSelect = value;\n element.style.oUserSelect = value;\n element.style.userSelect = value;\n}\n\nexports.default = Draggable;\nexports.defaultOptions = defaultOptions;\n","'use strict';\n\nvar AbstractEvent = require('../../shared/AbstractEvent/AbstractEvent.cjs');\n\nclass DraggableEvent extends AbstractEvent.AbstractEvent {\n\n get draggable() {\n return this.data.draggable;\n }\n}\n\nDraggableEvent.type = 'draggable';\nclass DraggableInitializedEvent extends DraggableEvent {}\n\nDraggableInitializedEvent.type = 'draggable:initialize';\nclass DraggableDestroyEvent extends DraggableEvent {}\nDraggableDestroyEvent.type = 'draggable:destroy';\n\nexports.DraggableDestroyEvent = DraggableDestroyEvent;\nexports.DraggableEvent = DraggableEvent;\nexports.DraggableInitializedEvent = DraggableInitializedEvent;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nclass Emitter {\n constructor() {\n this.callbacks = {};\n }\n\n on(type, ...callbacks) {\n if (!this.callbacks[type]) {\n this.callbacks[type] = [];\n }\n this.callbacks[type].push(...callbacks);\n return this;\n }\n\n off(type, callback) {\n if (!this.callbacks[type]) {\n return null;\n }\n const copy = this.callbacks[type].slice(0);\n for (let i = 0; i < copy.length; i++) {\n if (callback === copy[i]) {\n this.callbacks[type].splice(i, 1);\n }\n }\n return this;\n }\n\n trigger(event) {\n if (!this.callbacks[event.type]) {\n return null;\n }\n const callbacks = [...this.callbacks[event.type]];\n const caughtErrors = [];\n for (let i = callbacks.length - 1; i >= 0; i--) {\n const callback = callbacks[i];\n try {\n callback(event);\n } catch (error) {\n caughtErrors.push(error);\n }\n }\n if (caughtErrors.length) {\n\n console.error(`Draggable caught errors while triggering '${event.type}'`, caughtErrors);\n\n }\n\n return this;\n }\n}\n\nexports.default = Emitter;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar AbstractPlugin = require('../../../shared/AbstractPlugin/AbstractPlugin.cjs');\n\nconst onInitialize = Symbol('onInitialize');\nconst onDestroy = Symbol('onDestroy');\nconst announceEvent = Symbol('announceEvent');\nconst announceMessage = Symbol('announceMessage');\nconst ARIA_RELEVANT = 'aria-relevant';\nconst ARIA_ATOMIC = 'aria-atomic';\nconst ARIA_LIVE = 'aria-live';\nconst ROLE = 'role';\n\nconst defaultOptions = {\n expire: 7000\n};\n\nclass Announcement extends AbstractPlugin.AbstractPlugin {\n\n constructor(draggable) {\n super(draggable);\n\n this.options = {\n ...defaultOptions,\n ...this.getOptions()\n };\n\n this.originalTriggerMethod = this.draggable.trigger;\n this[onInitialize] = this[onInitialize].bind(this);\n this[onDestroy] = this[onDestroy].bind(this);\n }\n\n attach() {\n this.draggable.on('draggable:initialize', this[onInitialize]);\n }\n\n detach() {\n this.draggable.off('draggable:destroy', this[onDestroy]);\n }\n\n getOptions() {\n return this.draggable.options.announcements || {};\n }\n\n [announceEvent](event) {\n const message = this.options[event.type];\n if (message && typeof message === 'string') {\n this[announceMessage](message);\n }\n if (message && typeof message === 'function') {\n this[announceMessage](message(event));\n }\n }\n\n [announceMessage](message) {\n announce(message, {\n expire: this.options.expire\n });\n }\n\n [onInitialize]() {\n\n this.draggable.trigger = event => {\n try {\n this[announceEvent](event);\n } finally {\n\n this.originalTriggerMethod.call(this.draggable, event);\n }\n };\n }\n\n [onDestroy]() {\n this.draggable.trigger = this.originalTriggerMethod;\n }\n}\n\nconst liveRegion = createRegion();\n\nfunction announce(message, {\n expire\n}) {\n const element = document.createElement('div');\n element.textContent = message;\n liveRegion.appendChild(element);\n return setTimeout(() => {\n liveRegion.removeChild(element);\n }, expire);\n}\n\nfunction createRegion() {\n const element = document.createElement('div');\n element.setAttribute('id', 'draggable-live-region');\n element.setAttribute(ARIA_RELEVANT, 'additions');\n element.setAttribute(ARIA_ATOMIC, 'true');\n element.setAttribute(ARIA_LIVE, 'assertive');\n element.setAttribute(ROLE, 'log');\n element.style.position = 'fixed';\n element.style.width = '1px';\n element.style.height = '1px';\n element.style.top = '-1px';\n element.style.overflow = 'hidden';\n return element;\n}\n\ndocument.addEventListener('DOMContentLoaded', () => {\n document.body.appendChild(liveRegion);\n});\n\nexports.default = Announcement;\nexports.defaultOptions = defaultOptions;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar AbstractPlugin = require('../../../shared/AbstractPlugin/AbstractPlugin.cjs');\n\nconst onInitialize = Symbol('onInitialize');\nconst onDestroy = Symbol('onDestroy');\n\nconst defaultOptions = {};\n\nclass Focusable extends AbstractPlugin.AbstractPlugin {\n\n constructor(draggable) {\n super(draggable);\n\n this.options = {\n ...defaultOptions,\n ...this.getOptions()\n };\n this[onInitialize] = this[onInitialize].bind(this);\n this[onDestroy] = this[onDestroy].bind(this);\n }\n\n attach() {\n this.draggable.on('draggable:initialize', this[onInitialize]).on('draggable:destroy', this[onDestroy]);\n }\n\n detach() {\n this.draggable.off('draggable:initialize', this[onInitialize]).off('draggable:destroy', this[onDestroy]);\n\n this[onDestroy]();\n }\n\n getOptions() {\n return this.draggable.options.focusable || {};\n }\n\n getElements() {\n return [...this.draggable.containers, ...this.draggable.getDraggableElements()];\n }\n\n [onInitialize]() {\n\n requestAnimationFrame(() => {\n this.getElements().forEach(element => decorateElement(element));\n });\n }\n\n [onDestroy]() {\n\n requestAnimationFrame(() => {\n this.getElements().forEach(element => stripElement(element));\n });\n }\n}\n\nconst elementsWithMissingTabIndex = [];\n\nfunction decorateElement(element) {\n const hasMissingTabIndex = Boolean(!element.getAttribute('tabindex') && element.tabIndex === -1);\n if (hasMissingTabIndex) {\n elementsWithMissingTabIndex.push(element);\n element.tabIndex = 0;\n }\n}\n\nfunction stripElement(element) {\n const tabIndexElementPosition = elementsWithMissingTabIndex.indexOf(element);\n if (tabIndexElementPosition !== -1) {\n element.tabIndex = -1;\n elementsWithMissingTabIndex.splice(tabIndexElementPosition, 1);\n }\n}\n\nexports.default = Focusable;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar AbstractPlugin = require('../../../shared/AbstractPlugin/AbstractPlugin.cjs');\nvar MirrorEvent = require('./MirrorEvent/MirrorEvent.cjs');\n\nconst onDragStart = Symbol('onDragStart');\nconst onDragMove = Symbol('onDragMove');\nconst onDragStop = Symbol('onDragStop');\nconst onMirrorCreated = Symbol('onMirrorCreated');\nconst onMirrorMove = Symbol('onMirrorMove');\nconst onScroll = Symbol('onScroll');\nconst getAppendableContainer = Symbol('getAppendableContainer');\n\nconst defaultOptions = {\n constrainDimensions: false,\n xAxis: true,\n yAxis: true,\n cursorOffsetX: null,\n cursorOffsetY: null,\n thresholdX: null,\n thresholdY: null\n};\n\nclass Mirror extends AbstractPlugin.AbstractPlugin {\n\n constructor(draggable) {\n super(draggable);\n\n this.options = {\n ...defaultOptions,\n ...this.getOptions()\n };\n\n this.scrollOffset = {\n x: 0,\n y: 0\n };\n\n this.initialScrollOffset = {\n x: window.scrollX,\n y: window.scrollY\n };\n this[onDragStart] = this[onDragStart].bind(this);\n this[onDragMove] = this[onDragMove].bind(this);\n this[onDragStop] = this[onDragStop].bind(this);\n this[onMirrorCreated] = this[onMirrorCreated].bind(this);\n this[onMirrorMove] = this[onMirrorMove].bind(this);\n this[onScroll] = this[onScroll].bind(this);\n }\n\n attach() {\n this.draggable.on('drag:start', this[onDragStart]).on('drag:move', this[onDragMove]).on('drag:stop', this[onDragStop]).on('mirror:created', this[onMirrorCreated]).on('mirror:move', this[onMirrorMove]);\n }\n\n detach() {\n this.draggable.off('drag:start', this[onDragStart]).off('drag:move', this[onDragMove]).off('drag:stop', this[onDragStop]).off('mirror:created', this[onMirrorCreated]).off('mirror:move', this[onMirrorMove]);\n }\n\n getOptions() {\n return this.draggable.options.mirror || {};\n }\n [onDragStart](dragEvent) {\n if (dragEvent.canceled()) {\n return;\n }\n if ('ontouchstart' in window) {\n document.addEventListener('scroll', this[onScroll], true);\n }\n this.initialScrollOffset = {\n x: window.scrollX,\n y: window.scrollY\n };\n const {\n source,\n originalSource,\n sourceContainer,\n sensorEvent\n } = dragEvent;\n\n this.lastMirrorMovedClient = {\n x: sensorEvent.clientX,\n y: sensorEvent.clientY\n };\n const mirrorCreateEvent = new MirrorEvent.MirrorCreateEvent({\n source,\n originalSource,\n sourceContainer,\n sensorEvent,\n dragEvent\n });\n this.draggable.trigger(mirrorCreateEvent);\n if (isNativeDragEvent(sensorEvent) || mirrorCreateEvent.canceled()) {\n return;\n }\n const appendableContainer = this[getAppendableContainer](source) || sourceContainer;\n this.mirror = source.cloneNode(true);\n const mirrorCreatedEvent = new MirrorEvent.MirrorCreatedEvent({\n source,\n originalSource,\n sourceContainer,\n sensorEvent,\n dragEvent,\n mirror: this.mirror\n });\n const mirrorAttachedEvent = new MirrorEvent.MirrorAttachedEvent({\n source,\n originalSource,\n sourceContainer,\n sensorEvent,\n dragEvent,\n mirror: this.mirror\n });\n this.draggable.trigger(mirrorCreatedEvent);\n appendableContainer.appendChild(this.mirror);\n this.draggable.trigger(mirrorAttachedEvent);\n }\n [onDragMove](dragEvent) {\n if (!this.mirror || dragEvent.canceled()) {\n return;\n }\n const {\n source,\n originalSource,\n sourceContainer,\n sensorEvent\n } = dragEvent;\n let passedThreshX = true;\n let passedThreshY = true;\n if (this.options.thresholdX || this.options.thresholdY) {\n const {\n x: lastX,\n y: lastY\n } = this.lastMirrorMovedClient;\n if (Math.abs(lastX - sensorEvent.clientX) < this.options.thresholdX) {\n passedThreshX = false;\n } else {\n this.lastMirrorMovedClient.x = sensorEvent.clientX;\n }\n if (Math.abs(lastY - sensorEvent.clientY) < this.options.thresholdY) {\n passedThreshY = false;\n } else {\n this.lastMirrorMovedClient.y = sensorEvent.clientY;\n }\n if (!passedThreshX && !passedThreshY) {\n return;\n }\n }\n const mirrorMoveEvent = new MirrorEvent.MirrorMoveEvent({\n source,\n originalSource,\n sourceContainer,\n sensorEvent,\n dragEvent,\n mirror: this.mirror,\n passedThreshX,\n passedThreshY\n });\n this.draggable.trigger(mirrorMoveEvent);\n }\n [onDragStop](dragEvent) {\n if ('ontouchstart' in window) {\n document.removeEventListener('scroll', this[onScroll], true);\n }\n this.initialScrollOffset = {\n x: 0,\n y: 0\n };\n this.scrollOffset = {\n x: 0,\n y: 0\n };\n if (!this.mirror) {\n return;\n }\n const {\n source,\n sourceContainer,\n sensorEvent\n } = dragEvent;\n const mirrorDestroyEvent = new MirrorEvent.MirrorDestroyEvent({\n source,\n mirror: this.mirror,\n sourceContainer,\n sensorEvent,\n dragEvent\n });\n this.draggable.trigger(mirrorDestroyEvent);\n if (!mirrorDestroyEvent.canceled()) {\n this.mirror.remove();\n }\n }\n [onScroll]() {\n this.scrollOffset = {\n x: window.scrollX - this.initialScrollOffset.x,\n y: window.scrollY - this.initialScrollOffset.y\n };\n }\n\n [onMirrorCreated]({\n mirror,\n source,\n sensorEvent\n }) {\n const mirrorClasses = this.draggable.getClassNamesFor('mirror');\n const setState = ({\n mirrorOffset,\n initialX,\n initialY,\n ...args\n }) => {\n this.mirrorOffset = mirrorOffset;\n this.initialX = initialX;\n this.initialY = initialY;\n this.lastMovedX = initialX;\n this.lastMovedY = initialY;\n return {\n mirrorOffset,\n initialX,\n initialY,\n ...args\n };\n };\n mirror.style.display = 'none';\n const initialState = {\n mirror,\n source,\n sensorEvent,\n mirrorClasses,\n scrollOffset: this.scrollOffset,\n options: this.options,\n passedThreshX: true,\n passedThreshY: true\n };\n return Promise.resolve(initialState)\n\n .then(computeMirrorDimensions).then(calculateMirrorOffset).then(resetMirror).then(addMirrorClasses).then(positionMirror({\n initial: true\n })).then(removeMirrorID).then(setState);\n }\n\n [onMirrorMove](mirrorEvent) {\n if (mirrorEvent.canceled()) {\n return null;\n }\n const setState = ({\n lastMovedX,\n lastMovedY,\n ...args\n }) => {\n this.lastMovedX = lastMovedX;\n this.lastMovedY = lastMovedY;\n return {\n lastMovedX,\n lastMovedY,\n ...args\n };\n };\n const triggerMoved = args => {\n const mirrorMovedEvent = new MirrorEvent.MirrorMovedEvent({\n source: mirrorEvent.source,\n originalSource: mirrorEvent.originalSource,\n sourceContainer: mirrorEvent.sourceContainer,\n sensorEvent: mirrorEvent.sensorEvent,\n dragEvent: mirrorEvent.dragEvent,\n mirror: this.mirror,\n passedThreshX: mirrorEvent.passedThreshX,\n passedThreshY: mirrorEvent.passedThreshY\n });\n this.draggable.trigger(mirrorMovedEvent);\n return args;\n };\n const initialState = {\n mirror: mirrorEvent.mirror,\n sensorEvent: mirrorEvent.sensorEvent,\n mirrorOffset: this.mirrorOffset,\n options: this.options,\n initialX: this.initialX,\n initialY: this.initialY,\n scrollOffset: this.scrollOffset,\n passedThreshX: mirrorEvent.passedThreshX,\n passedThreshY: mirrorEvent.passedThreshY,\n lastMovedX: this.lastMovedX,\n lastMovedY: this.lastMovedY\n };\n return Promise.resolve(initialState).then(positionMirror({\n raf: true\n })).then(setState).then(triggerMoved);\n }\n\n [getAppendableContainer](source) {\n const appendTo = this.options.appendTo;\n if (typeof appendTo === 'string') {\n return document.querySelector(appendTo);\n } else if (appendTo instanceof HTMLElement) {\n return appendTo;\n } else if (typeof appendTo === 'function') {\n return appendTo(source);\n } else {\n return source.parentNode;\n }\n }\n}\n\nfunction computeMirrorDimensions({\n source,\n ...args\n}) {\n return withPromise(resolve => {\n const sourceRect = source.getBoundingClientRect();\n resolve({\n source,\n sourceRect,\n ...args\n });\n });\n}\n\nfunction calculateMirrorOffset({\n sensorEvent,\n sourceRect,\n options,\n ...args\n}) {\n return withPromise(resolve => {\n const top = options.cursorOffsetY === null ? sensorEvent.clientY - sourceRect.top : options.cursorOffsetY;\n const left = options.cursorOffsetX === null ? sensorEvent.clientX - sourceRect.left : options.cursorOffsetX;\n const mirrorOffset = {\n top,\n left\n };\n resolve({\n sensorEvent,\n sourceRect,\n mirrorOffset,\n options,\n ...args\n });\n });\n}\n\nfunction resetMirror({\n mirror,\n source,\n options,\n ...args\n}) {\n return withPromise(resolve => {\n let offsetHeight;\n let offsetWidth;\n if (options.constrainDimensions) {\n const computedSourceStyles = getComputedStyle(source);\n offsetHeight = computedSourceStyles.getPropertyValue('height');\n offsetWidth = computedSourceStyles.getPropertyValue('width');\n }\n mirror.style.display = null;\n mirror.style.position = 'fixed';\n mirror.style.pointerEvents = 'none';\n mirror.style.top = 0;\n mirror.style.left = 0;\n mirror.style.margin = 0;\n if (options.constrainDimensions) {\n mirror.style.height = offsetHeight;\n mirror.style.width = offsetWidth;\n }\n resolve({\n mirror,\n source,\n options,\n ...args\n });\n });\n}\n\nfunction addMirrorClasses({\n mirror,\n mirrorClasses,\n ...args\n}) {\n return withPromise(resolve => {\n mirror.classList.add(...mirrorClasses);\n resolve({\n mirror,\n mirrorClasses,\n ...args\n });\n });\n}\n\nfunction removeMirrorID({\n mirror,\n ...args\n}) {\n return withPromise(resolve => {\n mirror.removeAttribute('id');\n delete mirror.id;\n resolve({\n mirror,\n ...args\n });\n });\n}\n\nfunction positionMirror({\n withFrame = false,\n initial = false\n} = {}) {\n return ({\n mirror,\n sensorEvent,\n mirrorOffset,\n initialY,\n initialX,\n scrollOffset,\n options,\n passedThreshX,\n passedThreshY,\n lastMovedX,\n lastMovedY,\n ...args\n }) => {\n return withPromise(resolve => {\n const result = {\n mirror,\n sensorEvent,\n mirrorOffset,\n options,\n ...args\n };\n if (mirrorOffset) {\n const x = passedThreshX ? Math.round((sensorEvent.clientX - mirrorOffset.left - scrollOffset.x) / (options.thresholdX || 1)) * (options.thresholdX || 1) : Math.round(lastMovedX);\n const y = passedThreshY ? Math.round((sensorEvent.clientY - mirrorOffset.top - scrollOffset.y) / (options.thresholdY || 1)) * (options.thresholdY || 1) : Math.round(lastMovedY);\n if (options.xAxis && options.yAxis || initial) {\n mirror.style.transform = `translate3d(${x}px, ${y}px, 0)`;\n } else if (options.xAxis && !options.yAxis) {\n mirror.style.transform = `translate3d(${x}px, ${initialY}px, 0)`;\n } else if (options.yAxis && !options.xAxis) {\n mirror.style.transform = `translate3d(${initialX}px, ${y}px, 0)`;\n }\n if (initial) {\n result.initialX = x;\n result.initialY = y;\n }\n result.lastMovedX = x;\n result.lastMovedY = y;\n }\n resolve(result);\n }, {\n frame: withFrame\n });\n };\n}\n\nfunction withPromise(callback, {\n raf = false\n} = {}) {\n return new Promise((resolve, reject) => {\n if (raf) {\n requestAnimationFrame(() => {\n callback(resolve, reject);\n });\n } else {\n callback(resolve, reject);\n }\n });\n}\n\nfunction isNativeDragEvent(sensorEvent) {\n return /^drag/.test(sensorEvent.originalEvent.type);\n}\n\nexports.default = Mirror;\nexports.defaultOptions = defaultOptions;\nexports.getAppendableContainer = getAppendableContainer;\nexports.onDragMove = onDragMove;\nexports.onDragStart = onDragStart;\nexports.onDragStop = onDragStop;\nexports.onMirrorCreated = onMirrorCreated;\nexports.onMirrorMove = onMirrorMove;\nexports.onScroll = onScroll;\n","'use strict';\n\nvar AbstractEvent = require('../../../../shared/AbstractEvent/AbstractEvent.cjs');\n\nclass MirrorEvent extends AbstractEvent.AbstractEvent {\n\n constructor(data) {\n super(data);\n this.data = data;\n }\n\n get source() {\n return this.data.source;\n }\n\n get originalSource() {\n return this.data.originalSource;\n }\n\n get sourceContainer() {\n return this.data.sourceContainer;\n }\n\n get sensorEvent() {\n return this.data.sensorEvent;\n }\n\n get dragEvent() {\n return this.data.dragEvent;\n }\n\n get originalEvent() {\n if (this.sensorEvent) {\n return this.sensorEvent.originalEvent;\n }\n return null;\n }\n}\n\nclass MirrorCreateEvent extends MirrorEvent {}\nMirrorCreateEvent.type = 'mirror:create';\n\nclass MirrorCreatedEvent extends MirrorEvent {\n\n get mirror() {\n return this.data.mirror;\n }\n}\nMirrorCreatedEvent.type = 'mirror:created';\n\nclass MirrorAttachedEvent extends MirrorEvent {\n\n get mirror() {\n return this.data.mirror;\n }\n}\nMirrorAttachedEvent.type = 'mirror:attached';\n\nclass MirrorMoveEvent extends MirrorEvent {\n\n get mirror() {\n return this.data.mirror;\n }\n\n get passedThreshX() {\n return this.data.passedThreshX;\n }\n\n get passedThreshY() {\n return this.data.passedThreshY;\n }\n}\nMirrorMoveEvent.type = 'mirror:move';\nMirrorMoveEvent.cancelable = true;\n\nclass MirrorMovedEvent extends MirrorEvent {\n\n get mirror() {\n return this.data.mirror;\n }\n\n get passedThreshX() {\n return this.data.passedThreshX;\n }\n\n get passedThreshY() {\n return this.data.passedThreshY;\n }\n}\nMirrorMovedEvent.type = 'mirror:moved';\n\nclass MirrorDestroyEvent extends MirrorEvent {\n\n get mirror() {\n return this.data.mirror;\n }\n}\nMirrorDestroyEvent.type = 'mirror:destroy';\nMirrorDestroyEvent.cancelable = true;\n\nexports.MirrorAttachedEvent = MirrorAttachedEvent;\nexports.MirrorCreateEvent = MirrorCreateEvent;\nexports.MirrorCreatedEvent = MirrorCreatedEvent;\nexports.MirrorDestroyEvent = MirrorDestroyEvent;\nexports.MirrorEvent = MirrorEvent;\nexports.MirrorMoveEvent = MirrorMoveEvent;\nexports.MirrorMovedEvent = MirrorMovedEvent;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar AbstractPlugin = require('../../../shared/AbstractPlugin/AbstractPlugin.cjs');\nvar closest = require('../../../shared/utils/closest/closest.cjs');\n\nconst onDragStart = Symbol('onDragStart');\nconst onDragMove = Symbol('onDragMove');\nconst onDragStop = Symbol('onDragStop');\nconst scroll = Symbol('scroll');\n\nconst defaultOptions = {\n speed: 6,\n sensitivity: 50,\n scrollableElements: []\n};\n\nclass Scrollable extends AbstractPlugin.AbstractPlugin {\n\n constructor(draggable) {\n super(draggable);\n\n this.options = {\n ...defaultOptions,\n ...this.getOptions()\n };\n\n this.currentMousePosition = null;\n\n this.scrollAnimationFrame = null;\n\n this.scrollableElement = null;\n\n this.findScrollableElementFrame = null;\n this[onDragStart] = this[onDragStart].bind(this);\n this[onDragMove] = this[onDragMove].bind(this);\n this[onDragStop] = this[onDragStop].bind(this);\n this[scroll] = this[scroll].bind(this);\n }\n\n attach() {\n this.draggable.on('drag:start', this[onDragStart]).on('drag:move', this[onDragMove]).on('drag:stop', this[onDragStop]);\n }\n\n detach() {\n this.draggable.off('drag:start', this[onDragStart]).off('drag:move', this[onDragMove]).off('drag:stop', this[onDragStop]);\n }\n\n getOptions() {\n return this.draggable.options.scrollable || {};\n }\n\n getScrollableElement(target) {\n if (this.hasDefinedScrollableElements()) {\n return closest.default(target, this.options.scrollableElements) || document.documentElement;\n } else {\n return closestScrollableElement(target);\n }\n }\n\n hasDefinedScrollableElements() {\n return Boolean(this.options.scrollableElements.length !== 0);\n }\n\n [onDragStart](dragEvent) {\n this.findScrollableElementFrame = requestAnimationFrame(() => {\n this.scrollableElement = this.getScrollableElement(dragEvent.source);\n });\n }\n\n [onDragMove](dragEvent) {\n this.findScrollableElementFrame = requestAnimationFrame(() => {\n this.scrollableElement = this.getScrollableElement(dragEvent.sensorEvent.target);\n });\n if (!this.scrollableElement) {\n return;\n }\n const sensorEvent = dragEvent.sensorEvent;\n const scrollOffset = {\n x: 0,\n y: 0\n };\n if ('ontouchstart' in window) {\n scrollOffset.y = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;\n scrollOffset.x = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0;\n }\n this.currentMousePosition = {\n clientX: sensorEvent.clientX - scrollOffset.x,\n clientY: sensorEvent.clientY - scrollOffset.y\n };\n this.scrollAnimationFrame = requestAnimationFrame(this[scroll]);\n }\n\n [onDragStop]() {\n cancelAnimationFrame(this.scrollAnimationFrame);\n cancelAnimationFrame(this.findScrollableElementFrame);\n this.scrollableElement = null;\n this.scrollAnimationFrame = null;\n this.findScrollableElementFrame = null;\n this.currentMousePosition = null;\n }\n\n [scroll]() {\n if (!this.scrollableElement || !this.currentMousePosition) {\n return;\n }\n cancelAnimationFrame(this.scrollAnimationFrame);\n const {\n speed,\n sensitivity\n } = this.options;\n const rect = this.scrollableElement.getBoundingClientRect();\n const bottomCutOff = rect.bottom > window.innerHeight;\n const topCutOff = rect.top < 0;\n const cutOff = topCutOff || bottomCutOff;\n const documentScrollingElement = getDocumentScrollingElement();\n const scrollableElement = this.scrollableElement;\n const clientX = this.currentMousePosition.clientX;\n const clientY = this.currentMousePosition.clientY;\n if (scrollableElement !== document.body && scrollableElement !== document.documentElement && !cutOff) {\n const {\n offsetHeight,\n offsetWidth\n } = scrollableElement;\n if (rect.top + offsetHeight - clientY < sensitivity) {\n scrollableElement.scrollTop += speed;\n } else if (clientY - rect.top < sensitivity) {\n scrollableElement.scrollTop -= speed;\n }\n if (rect.left + offsetWidth - clientX < sensitivity) {\n scrollableElement.scrollLeft += speed;\n } else if (clientX - rect.left < sensitivity) {\n scrollableElement.scrollLeft -= speed;\n }\n } else {\n const {\n innerHeight,\n innerWidth\n } = window;\n if (clientY < sensitivity) {\n documentScrollingElement.scrollTop -= speed;\n } else if (innerHeight - clientY < sensitivity) {\n documentScrollingElement.scrollTop += speed;\n }\n if (clientX < sensitivity) {\n documentScrollingElement.scrollLeft -= speed;\n } else if (innerWidth - clientX < sensitivity) {\n documentScrollingElement.scrollLeft += speed;\n }\n }\n this.scrollAnimationFrame = requestAnimationFrame(this[scroll]);\n }\n}\n\nfunction hasOverflow(element) {\n const overflowRegex = /(auto|scroll)/;\n const computedStyles = getComputedStyle(element, null);\n const overflow = computedStyles.getPropertyValue('overflow') + computedStyles.getPropertyValue('overflow-y') + computedStyles.getPropertyValue('overflow-x');\n return overflowRegex.test(overflow);\n}\n\nfunction isStaticallyPositioned(element) {\n const position = getComputedStyle(element).getPropertyValue('position');\n return position === 'static';\n}\n\nfunction closestScrollableElement(element) {\n if (!element) {\n return getDocumentScrollingElement();\n }\n const position = getComputedStyle(element).getPropertyValue('position');\n const excludeStaticParents = position === 'absolute';\n const scrollableElement = closest.default(element, parent => {\n if (excludeStaticParents && isStaticallyPositioned(parent)) {\n return false;\n }\n return hasOverflow(parent);\n });\n if (position === 'fixed' || !scrollableElement) {\n return getDocumentScrollingElement();\n } else {\n return scrollableElement;\n }\n}\n\nfunction getDocumentScrollingElement() {\n return document.scrollingElement || document.documentElement;\n}\n\nexports.default = Scrollable;\nexports.defaultOptions = defaultOptions;\nexports.onDragMove = onDragMove;\nexports.onDragStart = onDragStart;\nexports.onDragStop = onDragStop;\nexports.scroll = scroll;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar closest = require('../../../shared/utils/closest/closest.cjs');\nvar Sensor = require('../Sensor/Sensor.cjs');\nvar SensorEvent = require('../SensorEvent/SensorEvent.cjs');\n\nconst onMouseDown = Symbol('onMouseDown');\nconst onMouseUp = Symbol('onMouseUp');\nconst onDragStart = Symbol('onDragStart');\nconst onDragOver = Symbol('onDragOver');\nconst onDragEnd = Symbol('onDragEnd');\nconst onDrop = Symbol('onDrop');\nconst reset = Symbol('reset');\n\nclass DragSensor extends Sensor.default {\n\n constructor(containers = [], options = {}) {\n super(containers, options);\n\n this.mouseDownTimeout = null;\n\n this.draggableElement = null;\n\n this.nativeDraggableElement = null;\n this[onMouseDown] = this[onMouseDown].bind(this);\n this[onMouseUp] = this[onMouseUp].bind(this);\n this[onDragStart] = this[onDragStart].bind(this);\n this[onDragOver] = this[onDragOver].bind(this);\n this[onDragEnd] = this[onDragEnd].bind(this);\n this[onDrop] = this[onDrop].bind(this);\n }\n\n attach() {\n document.addEventListener('mousedown', this[onMouseDown], true);\n }\n\n detach() {\n document.removeEventListener('mousedown', this[onMouseDown], true);\n }\n\n [onDragStart](event) {\n\n event.dataTransfer.setData('text', '');\n event.dataTransfer.effectAllowed = this.options.type;\n const target = document.elementFromPoint(event.clientX, event.clientY);\n const originalSource = this.draggableElement;\n if (!originalSource) {\n return;\n }\n const dragStartEvent = new SensorEvent.DragStartSensorEvent({\n clientX: event.clientX,\n clientY: event.clientY,\n target,\n originalSource,\n container: this.currentContainer,\n originalEvent: event\n });\n\n setTimeout(() => {\n this.trigger(this.currentContainer, dragStartEvent);\n if (dragStartEvent.canceled()) {\n this.dragging = false;\n } else {\n this.dragging = true;\n }\n }, 0);\n }\n\n [onDragOver](event) {\n if (!this.dragging) {\n return;\n }\n const target = document.elementFromPoint(event.clientX, event.clientY);\n const container = this.currentContainer;\n const dragMoveEvent = new SensorEvent.DragMoveSensorEvent({\n clientX: event.clientX,\n clientY: event.clientY,\n target,\n container,\n originalEvent: event\n });\n this.trigger(container, dragMoveEvent);\n if (!dragMoveEvent.canceled()) {\n event.preventDefault();\n event.dataTransfer.dropEffect = this.options.type;\n }\n }\n\n [onDragEnd](event) {\n if (!this.dragging) {\n return;\n }\n document.removeEventListener('mouseup', this[onMouseUp], true);\n const target = document.elementFromPoint(event.clientX, event.clientY);\n const container = this.currentContainer;\n const dragStopEvent = new SensorEvent.DragStopSensorEvent({\n clientX: event.clientX,\n clientY: event.clientY,\n target,\n container,\n originalEvent: event\n });\n this.trigger(container, dragStopEvent);\n this.dragging = false;\n this.startEvent = null;\n this[reset]();\n }\n\n [onDrop](event) {\n event.preventDefault();\n }\n\n [onMouseDown](event) {\n\n if (event.target && (event.target.form || event.target.contenteditable)) {\n return;\n }\n const target = event.target;\n this.currentContainer = closest.default(target, this.containers);\n if (!this.currentContainer) {\n return;\n }\n if (this.options.handle && target && !closest.default(target, this.options.handle)) {\n return;\n }\n const originalSource = closest.default(target, this.options.draggable);\n if (!originalSource) {\n return;\n }\n const nativeDraggableElement = closest.default(event.target, element => element.draggable);\n if (nativeDraggableElement) {\n nativeDraggableElement.draggable = false;\n this.nativeDraggableElement = nativeDraggableElement;\n }\n document.addEventListener('mouseup', this[onMouseUp], true);\n document.addEventListener('dragstart', this[onDragStart], false);\n document.addEventListener('dragover', this[onDragOver], false);\n document.addEventListener('dragend', this[onDragEnd], false);\n document.addEventListener('drop', this[onDrop], false);\n this.startEvent = event;\n this.mouseDownTimeout = setTimeout(() => {\n originalSource.draggable = true;\n this.draggableElement = originalSource;\n }, this.delay.drag);\n }\n\n [onMouseUp]() {\n this[reset]();\n }\n\n [reset]() {\n clearTimeout(this.mouseDownTimeout);\n document.removeEventListener('mouseup', this[onMouseUp], true);\n document.removeEventListener('dragstart', this[onDragStart], false);\n document.removeEventListener('dragover', this[onDragOver], false);\n document.removeEventListener('dragend', this[onDragEnd], false);\n document.removeEventListener('drop', this[onDrop], false);\n if (this.nativeDraggableElement) {\n this.nativeDraggableElement.draggable = true;\n this.nativeDraggableElement = null;\n }\n if (this.draggableElement) {\n this.draggableElement.draggable = false;\n this.draggableElement = null;\n }\n }\n}\n\nexports.default = DragSensor;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar closest = require('../../../shared/utils/closest/closest.cjs');\nvar Sensor = require('../Sensor/Sensor.cjs');\nvar SensorEvent = require('../SensorEvent/SensorEvent.cjs');\n\nconst onMouseForceWillBegin = Symbol('onMouseForceWillBegin');\nconst onMouseForceDown = Symbol('onMouseForceDown');\nconst onMouseDown = Symbol('onMouseDown');\nconst onMouseForceChange = Symbol('onMouseForceChange');\nconst onMouseMove = Symbol('onMouseMove');\nconst onMouseUp = Symbol('onMouseUp');\nconst onMouseForceGlobalChange = Symbol('onMouseForceGlobalChange');\n\nclass ForceTouchSensor extends Sensor.default {\n\n constructor(containers = [], options = {}) {\n super(containers, options);\n\n this.mightDrag = false;\n this[onMouseForceWillBegin] = this[onMouseForceWillBegin].bind(this);\n this[onMouseForceDown] = this[onMouseForceDown].bind(this);\n this[onMouseDown] = this[onMouseDown].bind(this);\n this[onMouseForceChange] = this[onMouseForceChange].bind(this);\n this[onMouseMove] = this[onMouseMove].bind(this);\n this[onMouseUp] = this[onMouseUp].bind(this);\n }\n\n attach() {\n for (const container of this.containers) {\n container.addEventListener('webkitmouseforcewillbegin', this[onMouseForceWillBegin], false);\n container.addEventListener('webkitmouseforcedown', this[onMouseForceDown], false);\n container.addEventListener('mousedown', this[onMouseDown], true);\n container.addEventListener('webkitmouseforcechanged', this[onMouseForceChange], false);\n }\n document.addEventListener('mousemove', this[onMouseMove]);\n document.addEventListener('mouseup', this[onMouseUp]);\n }\n\n detach() {\n for (const container of this.containers) {\n container.removeEventListener('webkitmouseforcewillbegin', this[onMouseForceWillBegin], false);\n container.removeEventListener('webkitmouseforcedown', this[onMouseForceDown], false);\n container.removeEventListener('mousedown', this[onMouseDown], true);\n container.removeEventListener('webkitmouseforcechanged', this[onMouseForceChange], false);\n }\n document.removeEventListener('mousemove', this[onMouseMove]);\n document.removeEventListener('mouseup', this[onMouseUp]);\n }\n\n [onMouseForceWillBegin](event) {\n event.preventDefault();\n this.mightDrag = true;\n }\n\n [onMouseForceDown](event) {\n if (this.dragging) {\n return;\n }\n const target = document.elementFromPoint(event.clientX, event.clientY);\n const container = event.currentTarget;\n if (this.options.handle && target && !closest.default(target, this.options.handle)) {\n return;\n }\n const originalSource = closest.default(target, this.options.draggable);\n if (!originalSource) {\n return;\n }\n const dragStartEvent = new SensorEvent.DragStartSensorEvent({\n clientX: event.clientX,\n clientY: event.clientY,\n target,\n container,\n originalSource,\n originalEvent: event\n });\n this.trigger(container, dragStartEvent);\n this.currentContainer = container;\n this.dragging = !dragStartEvent.canceled();\n this.mightDrag = false;\n }\n\n [onMouseUp](event) {\n if (!this.dragging) {\n return;\n }\n const dragStopEvent = new SensorEvent.DragStopSensorEvent({\n clientX: event.clientX,\n clientY: event.clientY,\n target: null,\n container: this.currentContainer,\n originalEvent: event\n });\n this.trigger(this.currentContainer, dragStopEvent);\n this.currentContainer = null;\n this.dragging = false;\n this.mightDrag = false;\n }\n\n [onMouseDown](event) {\n if (!this.mightDrag) {\n return;\n }\n\n event.stopPropagation();\n event.stopImmediatePropagation();\n event.preventDefault();\n }\n\n [onMouseMove](event) {\n if (!this.dragging) {\n return;\n }\n const target = document.elementFromPoint(event.clientX, event.clientY);\n const dragMoveEvent = new SensorEvent.DragMoveSensorEvent({\n clientX: event.clientX,\n clientY: event.clientY,\n target,\n container: this.currentContainer,\n originalEvent: event\n });\n this.trigger(this.currentContainer, dragMoveEvent);\n }\n\n [onMouseForceChange](event) {\n if (this.dragging) {\n return;\n }\n const target = event.target;\n const container = event.currentTarget;\n const dragPressureEvent = new SensorEvent.DragPressureSensorEvent({\n pressure: event.webkitForce,\n clientX: event.clientX,\n clientY: event.clientY,\n target,\n container,\n originalEvent: event\n });\n this.trigger(container, dragPressureEvent);\n }\n\n [onMouseForceGlobalChange](event) {\n if (!this.dragging) {\n return;\n }\n const target = event.target;\n const dragPressureEvent = new SensorEvent.DragPressureSensorEvent({\n pressure: event.webkitForce,\n clientX: event.clientX,\n clientY: event.clientY,\n target,\n container: this.currentContainer,\n originalEvent: event\n });\n this.trigger(this.currentContainer, dragPressureEvent);\n }\n}\n\nexports.default = ForceTouchSensor;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar closest = require('../../../shared/utils/closest/closest.cjs');\nvar distance = require('../../../shared/utils/distance/distance.cjs');\nvar Sensor = require('../Sensor/Sensor.cjs');\nvar SensorEvent = require('../SensorEvent/SensorEvent.cjs');\n\nconst onContextMenuWhileDragging = Symbol('onContextMenuWhileDragging');\nconst onMouseDown = Symbol('onMouseDown');\nconst onMouseMove = Symbol('onMouseMove');\nconst onMouseUp = Symbol('onMouseUp');\nconst startDrag = Symbol('startDrag');\nconst onDistanceChange = Symbol('onDistanceChange');\n\nclass MouseSensor extends Sensor.default {\n\n constructor(containers = [], options = {}) {\n super(containers, options);\n\n this.mouseDownTimeout = null;\n\n this.pageX = null;\n\n this.pageY = null;\n this[onContextMenuWhileDragging] = this[onContextMenuWhileDragging].bind(this);\n this[onMouseDown] = this[onMouseDown].bind(this);\n this[onMouseMove] = this[onMouseMove].bind(this);\n this[onMouseUp] = this[onMouseUp].bind(this);\n this[startDrag] = this[startDrag].bind(this);\n this[onDistanceChange] = this[onDistanceChange].bind(this);\n }\n\n attach() {\n document.addEventListener('mousedown', this[onMouseDown], true);\n }\n\n detach() {\n document.removeEventListener('mousedown', this[onMouseDown], true);\n }\n\n [onMouseDown](event) {\n if (event.button !== 0 || event.ctrlKey || event.metaKey) {\n return;\n }\n const container = closest.default(event.target, this.containers);\n if (!container) {\n return;\n }\n if (this.options.handle && event.target && !closest.default(event.target, this.options.handle)) {\n return;\n }\n const originalSource = closest.default(event.target, this.options.draggable);\n if (!originalSource) {\n return;\n }\n const {\n delay\n } = this;\n const {\n pageX,\n pageY\n } = event;\n Object.assign(this, {\n pageX,\n pageY\n });\n this.onMouseDownAt = Date.now();\n this.startEvent = event;\n this.currentContainer = container;\n this.originalSource = originalSource;\n document.addEventListener('mouseup', this[onMouseUp]);\n document.addEventListener('dragstart', preventNativeDragStart);\n document.addEventListener('mousemove', this[onDistanceChange]);\n this.mouseDownTimeout = window.setTimeout(() => {\n this[onDistanceChange]({\n pageX: this.pageX,\n pageY: this.pageY\n });\n }, delay.mouse);\n }\n\n [startDrag]() {\n const startEvent = this.startEvent;\n const container = this.currentContainer;\n const originalSource = this.originalSource;\n const dragStartEvent = new SensorEvent.DragStartSensorEvent({\n clientX: startEvent.clientX,\n clientY: startEvent.clientY,\n target: startEvent.target,\n container,\n originalSource,\n originalEvent: startEvent\n });\n this.trigger(this.currentContainer, dragStartEvent);\n this.dragging = !dragStartEvent.canceled();\n if (this.dragging) {\n document.addEventListener('contextmenu', this[onContextMenuWhileDragging], true);\n document.addEventListener('mousemove', this[onMouseMove]);\n }\n }\n\n [onDistanceChange](event) {\n const {\n pageX,\n pageY\n } = event;\n const {\n distance: distance$1\n } = this.options;\n const {\n startEvent,\n delay\n } = this;\n Object.assign(this, {\n pageX,\n pageY\n });\n if (!this.currentContainer) {\n return;\n }\n const timeElapsed = Date.now() - this.onMouseDownAt;\n const distanceTravelled = distance.default(startEvent.pageX, startEvent.pageY, pageX, pageY) || 0;\n clearTimeout(this.mouseDownTimeout);\n if (timeElapsed < delay.mouse) {\n\n document.removeEventListener('mousemove', this[onDistanceChange]);\n } else if (distanceTravelled >= distance$1) {\n document.removeEventListener('mousemove', this[onDistanceChange]);\n this[startDrag]();\n }\n }\n\n [onMouseMove](event) {\n if (!this.dragging) {\n return;\n }\n const target = document.elementFromPoint(event.clientX, event.clientY);\n const dragMoveEvent = new SensorEvent.DragMoveSensorEvent({\n clientX: event.clientX,\n clientY: event.clientY,\n target,\n container: this.currentContainer,\n originalEvent: event\n });\n this.trigger(this.currentContainer, dragMoveEvent);\n }\n\n [onMouseUp](event) {\n clearTimeout(this.mouseDownTimeout);\n if (event.button !== 0) {\n return;\n }\n document.removeEventListener('mouseup', this[onMouseUp]);\n document.removeEventListener('dragstart', preventNativeDragStart);\n document.removeEventListener('mousemove', this[onDistanceChange]);\n if (!this.dragging) {\n return;\n }\n const target = document.elementFromPoint(event.clientX, event.clientY);\n const dragStopEvent = new SensorEvent.DragStopSensorEvent({\n clientX: event.clientX,\n clientY: event.clientY,\n target,\n container: this.currentContainer,\n originalEvent: event\n });\n this.trigger(this.currentContainer, dragStopEvent);\n document.removeEventListener('contextmenu', this[onContextMenuWhileDragging], true);\n document.removeEventListener('mousemove', this[onMouseMove]);\n this.currentContainer = null;\n this.dragging = false;\n this.startEvent = null;\n }\n\n [onContextMenuWhileDragging](event) {\n event.preventDefault();\n }\n}\nfunction preventNativeDragStart(event) {\n event.preventDefault();\n}\n\nexports.default = MouseSensor;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nconst defaultDelay = {\n mouse: 0,\n drag: 0,\n touch: 100\n};\n\nclass Sensor {\n\n constructor(containers = [], options = {}) {\n\n this.containers = [...containers];\n\n this.options = {\n ...options\n };\n\n this.dragging = false;\n\n this.currentContainer = null;\n\n this.originalSource = null;\n\n this.startEvent = null;\n\n this.delay = calcDelay(options.delay);\n }\n\n attach() {\n return this;\n }\n\n detach() {\n return this;\n }\n\n addContainer(...containers) {\n this.containers = [...this.containers, ...containers];\n }\n\n removeContainer(...containers) {\n this.containers = this.containers.filter(container => !containers.includes(container));\n }\n\n trigger(element, sensorEvent) {\n const event = document.createEvent('Event');\n event.detail = sensorEvent;\n event.initEvent(sensorEvent.type, true, true);\n element.dispatchEvent(event);\n this.lastEvent = sensorEvent;\n return sensorEvent;\n }\n}\n\nfunction calcDelay(optionsDelay) {\n const delay = {};\n if (optionsDelay === undefined) {\n return {\n ...defaultDelay\n };\n }\n if (typeof optionsDelay === 'number') {\n for (const key in defaultDelay) {\n if (Object.prototype.hasOwnProperty.call(defaultDelay, key)) {\n delay[key] = optionsDelay;\n }\n }\n return delay;\n }\n for (const key in defaultDelay) {\n if (Object.prototype.hasOwnProperty.call(defaultDelay, key)) {\n if (optionsDelay[key] === undefined) {\n delay[key] = defaultDelay[key];\n } else {\n delay[key] = optionsDelay[key];\n }\n }\n }\n return delay;\n}\n\nexports.default = Sensor;\n","'use strict';\n\nvar AbstractEvent = require('../../../shared/AbstractEvent/AbstractEvent.cjs');\n\nclass SensorEvent extends AbstractEvent.AbstractEvent {\n\n get originalEvent() {\n return this.data.originalEvent;\n }\n\n get clientX() {\n return this.data.clientX;\n }\n\n get clientY() {\n return this.data.clientY;\n }\n\n get target() {\n return this.data.target;\n }\n\n get container() {\n return this.data.container;\n }\n\n get originalSource() {\n return this.data.originalSource;\n }\n\n get pressure() {\n return this.data.pressure;\n }\n}\n\nclass DragStartSensorEvent extends SensorEvent {}\n\nDragStartSensorEvent.type = 'drag:start';\nclass DragMoveSensorEvent extends SensorEvent {}\n\nDragMoveSensorEvent.type = 'drag:move';\nclass DragStopSensorEvent extends SensorEvent {}\n\nDragStopSensorEvent.type = 'drag:stop';\nclass DragPressureSensorEvent extends SensorEvent {}\nDragPressureSensorEvent.type = 'drag:pressure';\n\nexports.DragMoveSensorEvent = DragMoveSensorEvent;\nexports.DragPressureSensorEvent = DragPressureSensorEvent;\nexports.DragStartSensorEvent = DragStartSensorEvent;\nexports.DragStopSensorEvent = DragStopSensorEvent;\nexports.SensorEvent = SensorEvent;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar closest = require('../../../shared/utils/closest/closest.cjs');\nvar distance = require('../../../shared/utils/distance/distance.cjs');\nvar touchCoords = require('../../../shared/utils/touchCoords/touchCoords.cjs');\nvar Sensor = require('../Sensor/Sensor.cjs');\nvar SensorEvent = require('../SensorEvent/SensorEvent.cjs');\n\nconst onTouchStart = Symbol('onTouchStart');\nconst onTouchEnd = Symbol('onTouchEnd');\nconst onTouchMove = Symbol('onTouchMove');\nconst startDrag = Symbol('startDrag');\nconst onDistanceChange = Symbol('onDistanceChange');\n\nlet preventScrolling = false;\n\nwindow.addEventListener('touchmove', event => {\n if (!preventScrolling) {\n return;\n }\n\n event.preventDefault();\n}, {\n passive: false\n});\n\nclass TouchSensor extends Sensor.default {\n\n constructor(containers = [], options = {}) {\n super(containers, options);\n\n this.currentScrollableParent = null;\n\n this.tapTimeout = null;\n\n this.touchMoved = false;\n\n this.pageX = null;\n\n this.pageY = null;\n this[onTouchStart] = this[onTouchStart].bind(this);\n this[onTouchEnd] = this[onTouchEnd].bind(this);\n this[onTouchMove] = this[onTouchMove].bind(this);\n this[startDrag] = this[startDrag].bind(this);\n this[onDistanceChange] = this[onDistanceChange].bind(this);\n }\n\n attach() {\n document.addEventListener('touchstart', this[onTouchStart]);\n }\n\n detach() {\n document.removeEventListener('touchstart', this[onTouchStart]);\n }\n\n [onTouchStart](event) {\n const container = closest.default(event.target, this.containers);\n if (!container) {\n return;\n }\n if (this.options.handle && event.target && !closest.default(event.target, this.options.handle)) {\n return;\n }\n const originalSource = closest.default(event.target, this.options.draggable);\n if (!originalSource) {\n return;\n }\n const {\n distance = 0\n } = this.options;\n const {\n delay\n } = this;\n const {\n pageX,\n pageY\n } = touchCoords.default(event);\n Object.assign(this, {\n pageX,\n pageY\n });\n this.onTouchStartAt = Date.now();\n this.startEvent = event;\n this.currentContainer = container;\n this.originalSource = originalSource;\n document.addEventListener('touchend', this[onTouchEnd]);\n document.addEventListener('touchcancel', this[onTouchEnd]);\n document.addEventListener('touchmove', this[onDistanceChange]);\n container.addEventListener('contextmenu', onContextMenu);\n if (distance) {\n preventScrolling = true;\n }\n this.tapTimeout = window.setTimeout(() => {\n this[onDistanceChange]({\n touches: [{\n pageX: this.pageX,\n pageY: this.pageY\n }]\n });\n }, delay.touch);\n }\n\n [startDrag]() {\n const startEvent = this.startEvent;\n const container = this.currentContainer;\n const touch = touchCoords.default(startEvent);\n const originalSource = this.originalSource;\n const dragStartEvent = new SensorEvent.DragStartSensorEvent({\n clientX: touch.pageX,\n clientY: touch.pageY,\n target: startEvent.target,\n container,\n originalSource,\n originalEvent: startEvent\n });\n this.trigger(this.currentContainer, dragStartEvent);\n this.dragging = !dragStartEvent.canceled();\n if (this.dragging) {\n document.addEventListener('touchmove', this[onTouchMove]);\n }\n preventScrolling = this.dragging;\n }\n\n [onDistanceChange](event) {\n const {\n distance: distance$1\n } = this.options;\n const {\n startEvent,\n delay\n } = this;\n const start = touchCoords.default(startEvent);\n const current = touchCoords.default(event);\n const timeElapsed = Date.now() - this.onTouchStartAt;\n const distanceTravelled = distance.default(start.pageX, start.pageY, current.pageX, current.pageY);\n Object.assign(this, current);\n clearTimeout(this.tapTimeout);\n if (timeElapsed < delay.touch) {\n\n document.removeEventListener('touchmove', this[onDistanceChange]);\n } else if (distanceTravelled >= distance$1) {\n document.removeEventListener('touchmove', this[onDistanceChange]);\n this[startDrag]();\n }\n }\n\n [onTouchMove](event) {\n if (!this.dragging) {\n return;\n }\n const {\n pageX,\n pageY\n } = touchCoords.default(event);\n const target = document.elementFromPoint(pageX - window.scrollX, pageY - window.scrollY);\n const dragMoveEvent = new SensorEvent.DragMoveSensorEvent({\n clientX: pageX,\n clientY: pageY,\n target,\n container: this.currentContainer,\n originalEvent: event\n });\n this.trigger(this.currentContainer, dragMoveEvent);\n }\n\n [onTouchEnd](event) {\n clearTimeout(this.tapTimeout);\n preventScrolling = false;\n document.removeEventListener('touchend', this[onTouchEnd]);\n document.removeEventListener('touchcancel', this[onTouchEnd]);\n document.removeEventListener('touchmove', this[onDistanceChange]);\n if (this.currentContainer) {\n this.currentContainer.removeEventListener('contextmenu', onContextMenu);\n }\n if (!this.dragging) {\n return;\n }\n document.removeEventListener('touchmove', this[onTouchMove]);\n const {\n pageX,\n pageY\n } = touchCoords.default(event);\n const target = document.elementFromPoint(pageX - window.scrollX, pageY - window.scrollY);\n event.preventDefault();\n const dragStopEvent = new SensorEvent.DragStopSensorEvent({\n clientX: pageX,\n clientY: pageY,\n target,\n container: this.currentContainer,\n originalEvent: event\n });\n this.trigger(this.currentContainer, dragStopEvent);\n this.currentContainer = null;\n this.dragging = false;\n this.startEvent = null;\n }\n}\nfunction onContextMenu(event) {\n event.preventDefault();\n event.stopPropagation();\n}\n\nexports.default = TouchSensor;\n","'use strict';\n\nvar Sensor = require('./Sensor/Sensor.cjs');\nvar MouseSensor = require('./MouseSensor/MouseSensor.cjs');\nvar TouchSensor = require('./TouchSensor/TouchSensor.cjs');\nvar DragSensor = require('./DragSensor/DragSensor.cjs');\nvar ForceTouchSensor = require('./ForceTouchSensor/ForceTouchSensor.cjs');\nvar SensorEvent = require('./SensorEvent/SensorEvent.cjs');\n\n\n\nexports.Sensor = Sensor.default;\nexports.MouseSensor = MouseSensor.default;\nexports.TouchSensor = TouchSensor.default;\nexports.DragSensor = DragSensor.default;\nexports.ForceTouchSensor = ForceTouchSensor.default;\nexports.DragMoveSensorEvent = SensorEvent.DragMoveSensorEvent;\nexports.DragPressureSensorEvent = SensorEvent.DragPressureSensorEvent;\nexports.DragStartSensorEvent = SensorEvent.DragStartSensorEvent;\nexports.DragStopSensorEvent = SensorEvent.DragStopSensorEvent;\nexports.SensorEvent = SensorEvent.SensorEvent;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar closest = require('../shared/utils/closest/closest.cjs');\nvar Draggable = require('../Draggable/Draggable.cjs');\nrequire('../Draggable/DragEvent/DragEvent.cjs');\nrequire('../Draggable/DraggableEvent/DraggableEvent.cjs');\nrequire('../Draggable/Plugins/Announcement/Announcement.cjs');\nrequire('../Draggable/Plugins/Mirror/MirrorEvent/MirrorEvent.cjs');\nrequire('../Draggable/Sensors/SensorEvent/SensorEvent.cjs');\nrequire('../Draggable/Sensors/TouchSensor/TouchSensor.cjs');\nvar DroppableEvent = require('./DroppableEvent/DroppableEvent.cjs');\n\nconst onDragStart = Symbol('onDragStart');\nconst onDragMove = Symbol('onDragMove');\nconst onDragStop = Symbol('onDragStop');\nconst dropInDropzone = Symbol('dropInDropZone');\nconst returnToOriginalDropzone = Symbol('returnToOriginalDropzone');\nconst closestDropzone = Symbol('closestDropzone');\nconst getDropzones = Symbol('getDropzones');\n\nfunction onDroppableDroppedDefaultAnnouncement({\n dragEvent,\n dropzone\n}) {\n const sourceText = dragEvent.source.textContent.trim() || dragEvent.source.id || 'draggable element';\n const dropzoneText = dropzone.textContent.trim() || dropzone.id || 'droppable element';\n return `Dropped ${sourceText} into ${dropzoneText}`;\n}\n\nfunction onDroppableReturnedDefaultAnnouncement({\n dragEvent,\n dropzone\n}) {\n const sourceText = dragEvent.source.textContent.trim() || dragEvent.source.id || 'draggable element';\n const dropzoneText = dropzone.textContent.trim() || dropzone.id || 'droppable element';\n return `Returned ${sourceText} from ${dropzoneText}`;\n}\n\nconst defaultAnnouncements = {\n 'droppable:dropped': onDroppableDroppedDefaultAnnouncement,\n 'droppable:returned': onDroppableReturnedDefaultAnnouncement\n};\nconst defaultClasses = {\n 'droppable:active': 'draggable-dropzone--active',\n 'droppable:occupied': 'draggable-dropzone--occupied'\n};\nconst defaultOptions = {\n dropzone: '.draggable-droppable'\n};\n\nclass Droppable extends Draggable.default {\n\n constructor(containers = [], options = {}) {\n super(containers, {\n ...defaultOptions,\n ...options,\n classes: {\n ...defaultClasses,\n ...(options.classes || {})\n },\n announcements: {\n ...defaultAnnouncements,\n ...(options.announcements || {})\n }\n });\n\n this.dropzones = null;\n\n this.lastDropzone = null;\n\n this.initialDropzone = null;\n this[onDragStart] = this[onDragStart].bind(this);\n this[onDragMove] = this[onDragMove].bind(this);\n this[onDragStop] = this[onDragStop].bind(this);\n this.on('drag:start', this[onDragStart]).on('drag:move', this[onDragMove]).on('drag:stop', this[onDragStop]);\n }\n\n destroy() {\n super.destroy();\n this.off('drag:start', this[onDragStart]).off('drag:move', this[onDragMove]).off('drag:stop', this[onDragStop]);\n }\n\n [onDragStart](event) {\n if (event.canceled()) {\n return;\n }\n this.dropzones = [...this[getDropzones]()];\n const dropzone = closest.default(event.sensorEvent.target, this.options.dropzone);\n if (!dropzone) {\n event.cancel();\n return;\n }\n const droppableStartEvent = new DroppableEvent.DroppableStartEvent({\n dragEvent: event,\n dropzone\n });\n this.trigger(droppableStartEvent);\n if (droppableStartEvent.canceled()) {\n event.cancel();\n return;\n }\n this.initialDropzone = dropzone;\n for (const dropzoneElement of this.dropzones) {\n if (dropzoneElement.classList.contains(this.getClassNameFor('droppable:occupied'))) {\n continue;\n }\n dropzoneElement.classList.add(...this.getClassNamesFor('droppable:active'));\n }\n }\n\n [onDragMove](event) {\n if (event.canceled()) {\n return;\n }\n const dropzone = this[closestDropzone](event.sensorEvent.target);\n const overEmptyDropzone = dropzone && !dropzone.classList.contains(this.getClassNameFor('droppable:occupied'));\n if (overEmptyDropzone && this[dropInDropzone](event, dropzone)) {\n this.lastDropzone = dropzone;\n } else if ((!dropzone || dropzone === this.initialDropzone) && this.lastDropzone) {\n this[returnToOriginalDropzone](event);\n this.lastDropzone = null;\n }\n }\n\n [onDragStop](event) {\n const droppableStopEvent = new DroppableEvent.DroppableStopEvent({\n dragEvent: event,\n dropzone: this.lastDropzone || this.initialDropzone\n });\n this.trigger(droppableStopEvent);\n const occupiedClasses = this.getClassNamesFor('droppable:occupied');\n for (const dropzone of this.dropzones) {\n dropzone.classList.remove(...this.getClassNamesFor('droppable:active'));\n }\n if (this.lastDropzone && this.lastDropzone !== this.initialDropzone) {\n this.initialDropzone.classList.remove(...occupiedClasses);\n }\n this.dropzones = null;\n this.lastDropzone = null;\n this.initialDropzone = null;\n }\n\n [dropInDropzone](event, dropzone) {\n const droppableDroppedEvent = new DroppableEvent.DroppableDroppedEvent({\n dragEvent: event,\n dropzone\n });\n this.trigger(droppableDroppedEvent);\n if (droppableDroppedEvent.canceled()) {\n return false;\n }\n const occupiedClasses = this.getClassNamesFor('droppable:occupied');\n if (this.lastDropzone) {\n this.lastDropzone.classList.remove(...occupiedClasses);\n }\n dropzone.appendChild(event.source);\n dropzone.classList.add(...occupiedClasses);\n return true;\n }\n\n [returnToOriginalDropzone](event) {\n const droppableReturnedEvent = new DroppableEvent.DroppableReturnedEvent({\n dragEvent: event,\n dropzone: this.lastDropzone\n });\n this.trigger(droppableReturnedEvent);\n if (droppableReturnedEvent.canceled()) {\n return;\n }\n this.initialDropzone.appendChild(event.source);\n this.lastDropzone.classList.remove(...this.getClassNamesFor('droppable:occupied'));\n }\n\n [closestDropzone](target) {\n if (!this.dropzones) {\n return null;\n }\n return closest.default(target, this.dropzones);\n }\n\n [getDropzones]() {\n const dropzone = this.options.dropzone;\n if (typeof dropzone === 'string') {\n return document.querySelectorAll(dropzone);\n } else if (dropzone instanceof NodeList || dropzone instanceof Array) {\n return dropzone;\n } else if (typeof dropzone === 'function') {\n return dropzone();\n } else {\n return [];\n }\n }\n}\n\nexports.default = Droppable;\n","'use strict';\n\nvar AbstractEvent = require('../../shared/AbstractEvent/AbstractEvent.cjs');\n\nclass DroppableEvent extends AbstractEvent.AbstractEvent {\n\n constructor(data) {\n super(data);\n this.data = data;\n }\n\n get dragEvent() {\n return this.data.dragEvent;\n }\n}\nDroppableEvent.type = 'droppable';\n\nclass DroppableStartEvent extends DroppableEvent {\n\n get dropzone() {\n return this.data.dropzone;\n }\n}\nDroppableStartEvent.type = 'droppable:start';\nDroppableStartEvent.cancelable = true;\n\nclass DroppableDroppedEvent extends DroppableEvent {\n\n get dropzone() {\n return this.data.dropzone;\n }\n}\nDroppableDroppedEvent.type = 'droppable:dropped';\nDroppableDroppedEvent.cancelable = true;\n\nclass DroppableReturnedEvent extends DroppableEvent {\n\n get dropzone() {\n return this.data.dropzone;\n }\n}\nDroppableReturnedEvent.type = 'droppable:returned';\nDroppableReturnedEvent.cancelable = true;\n\nclass DroppableStopEvent extends DroppableEvent {\n\n get dropzone() {\n return this.data.dropzone;\n }\n}\nDroppableStopEvent.type = 'droppable:stop';\nDroppableStopEvent.cancelable = true;\n\nexports.DroppableDroppedEvent = DroppableDroppedEvent;\nexports.DroppableEvent = DroppableEvent;\nexports.DroppableReturnedEvent = DroppableReturnedEvent;\nexports.DroppableStartEvent = DroppableStartEvent;\nexports.DroppableStopEvent = DroppableStopEvent;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar AbstractPlugin = require('../../shared/AbstractPlugin/AbstractPlugin.cjs');\nvar closest = require('../../shared/utils/closest/closest.cjs');\nvar CollidableEvent = require('./CollidableEvent/CollidableEvent.cjs');\n\nconst onDragMove = Symbol('onDragMove');\nconst onDragStop = Symbol('onDragStop');\nconst onRequestAnimationFrame = Symbol('onRequestAnimationFrame');\n\nclass Collidable extends AbstractPlugin.AbstractPlugin {\n\n constructor(draggable) {\n super(draggable);\n\n this.currentlyCollidingElement = null;\n\n this.lastCollidingElement = null;\n\n this.currentAnimationFrame = null;\n this[onDragMove] = this[onDragMove].bind(this);\n this[onDragStop] = this[onDragStop].bind(this);\n this[onRequestAnimationFrame] = this[onRequestAnimationFrame].bind(this);\n }\n\n attach() {\n this.draggable.on('drag:move', this[onDragMove]).on('drag:stop', this[onDragStop]);\n }\n\n detach() {\n this.draggable.off('drag:move', this[onDragMove]).off('drag:stop', this[onDragStop]);\n }\n\n getCollidables() {\n const collidables = this.draggable.options.collidables;\n if (typeof collidables === 'string') {\n return Array.prototype.slice.call(document.querySelectorAll(collidables));\n } else if (collidables instanceof NodeList || collidables instanceof Array) {\n return Array.prototype.slice.call(collidables);\n } else if (collidables instanceof HTMLElement) {\n return [collidables];\n } else if (typeof collidables === 'function') {\n return collidables();\n } else {\n return [];\n }\n }\n\n [onDragMove](event) {\n const target = event.sensorEvent.target;\n this.currentAnimationFrame = requestAnimationFrame(this[onRequestAnimationFrame](target));\n if (this.currentlyCollidingElement) {\n event.cancel();\n }\n const collidableInEvent = new CollidableEvent.CollidableInEvent({\n dragEvent: event,\n collidingElement: this.currentlyCollidingElement\n });\n const collidableOutEvent = new CollidableEvent.CollidableOutEvent({\n dragEvent: event,\n collidingElement: this.lastCollidingElement\n });\n const enteringCollidable = Boolean(this.currentlyCollidingElement && this.lastCollidingElement !== this.currentlyCollidingElement);\n const leavingCollidable = Boolean(!this.currentlyCollidingElement && this.lastCollidingElement);\n if (enteringCollidable) {\n if (this.lastCollidingElement) {\n this.draggable.trigger(collidableOutEvent);\n }\n this.draggable.trigger(collidableInEvent);\n } else if (leavingCollidable) {\n this.draggable.trigger(collidableOutEvent);\n }\n this.lastCollidingElement = this.currentlyCollidingElement;\n }\n\n [onDragStop](event) {\n const lastCollidingElement = this.currentlyCollidingElement || this.lastCollidingElement;\n const collidableOutEvent = new CollidableEvent.CollidableOutEvent({\n dragEvent: event,\n collidingElement: lastCollidingElement\n });\n if (lastCollidingElement) {\n this.draggable.trigger(collidableOutEvent);\n }\n this.lastCollidingElement = null;\n this.currentlyCollidingElement = null;\n }\n\n [onRequestAnimationFrame](target) {\n return () => {\n const collidables = this.getCollidables();\n this.currentlyCollidingElement = closest.default(target, element => collidables.includes(element));\n };\n }\n}\n\nexports.default = Collidable;\n","'use strict';\n\nvar AbstractEvent = require('../../../shared/AbstractEvent/AbstractEvent.cjs');\n\nclass CollidableEvent extends AbstractEvent.AbstractEvent {\n\n constructor(data) {\n super(data);\n this.data = data;\n }\n\n get dragEvent() {\n return this.data.dragEvent;\n }\n}\nCollidableEvent.type = 'collidable';\n\nclass CollidableInEvent extends CollidableEvent {\n\n get collidingElement() {\n return this.data.collidingElement;\n }\n}\nCollidableInEvent.type = 'collidable:in';\n\nclass CollidableOutEvent extends CollidableEvent {\n\n get collidingElement() {\n return this.data.collidingElement;\n }\n}\nCollidableOutEvent.type = 'collidable:out';\n\nexports.CollidableEvent = CollidableEvent;\nexports.CollidableInEvent = CollidableInEvent;\nexports.CollidableOutEvent = CollidableOutEvent;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar _rollupPluginBabelHelpers = require('../../_virtual/_rollupPluginBabelHelpers.cjs');\nvar AbstractPlugin = require('../../shared/AbstractPlugin/AbstractPlugin.cjs');\nvar AutoBind = require('../../shared/utils/decorators/AutoBind.cjs');\nvar requestNextAnimationFrame = require('../../shared/utils/requestNextAnimationFrame/requestNextAnimationFrame.cjs');\nvar DragEvent = require('../../Draggable/DragEvent/DragEvent.cjs');\n\nvar _initProto, _class;\n\nconst defaultOptions = {};\n\nclass ResizeMirror extends AbstractPlugin.AbstractPlugin {\n\n constructor(draggable) {\n _initProto(super(draggable));\n\n this.lastWidth = 0;\n\n this.lastHeight = 0;\n\n this.mirror = null;\n }\n\n attach() {\n this.draggable.on('mirror:created', this.onMirrorCreated).on('drag:over', this.onDragOver).on('drag:over:container', this.onDragOver);\n }\n\n detach() {\n this.draggable.off('mirror:created', this.onMirrorCreated).off('mirror:destroy', this.onMirrorDestroy).off('drag:over', this.onDragOver).off('drag:over:container', this.onDragOver);\n }\n\n getOptions() {\n return this.draggable.options.resizeMirror || {};\n }\n\n onMirrorCreated({\n mirror\n }) {\n this.mirror = mirror;\n }\n\n onMirrorDestroy() {\n this.mirror = null;\n }\n\n onDragOver(dragEvent) {\n this.resize(dragEvent);\n }\n\n resize(dragEvent) {\n requestAnimationFrame(() => {\n let over = null;\n const {\n overContainer\n } = dragEvent;\n if (this.mirror == null || this.mirror.parentNode == null) {\n return;\n }\n if (this.mirror.parentNode !== overContainer) {\n overContainer.appendChild(this.mirror);\n }\n if (DragEvent.isDragOverEvent(dragEvent)) {\n over = dragEvent.over;\n }\n const overElement = over || this.draggable.getDraggableElementsForContainer(overContainer)[0];\n if (!overElement) {\n return;\n }\n requestNextAnimationFrame.default(() => {\n const overRect = overElement.getBoundingClientRect();\n if (this.mirror == null || this.lastHeight === overRect.height && this.lastWidth === overRect.width) {\n return;\n }\n this.mirror.style.width = `${overRect.width}px`;\n this.mirror.style.height = `${overRect.height}px`;\n this.lastWidth = overRect.width;\n this.lastHeight = overRect.height;\n });\n });\n }\n}\n_class = ResizeMirror;\n[_initProto] = _rollupPluginBabelHelpers.applyDecs2305(_class, [[AutoBind.AutoBind, 2, \"onMirrorCreated\"], [AutoBind.AutoBind, 2, \"onMirrorDestroy\"], [AutoBind.AutoBind, 2, \"onDragOver\"]], [], 0, void 0, AbstractPlugin.AbstractPlugin).e;\n\nexports.default = ResizeMirror;\nexports.defaultOptions = defaultOptions;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar AbstractPlugin = require('../../shared/AbstractPlugin/AbstractPlugin.cjs');\nvar SnappableEvent = require('./SnappableEvent/SnappableEvent.cjs');\n\nconst onDragStart = Symbol('onDragStart');\nconst onDragStop = Symbol('onDragStop');\nconst onDragOver = Symbol('onDragOver');\nconst onDragOut = Symbol('onDragOut');\nconst onMirrorCreated = Symbol('onMirrorCreated');\nconst onMirrorDestroy = Symbol('onMirrorDestroy');\n\nclass Snappable extends AbstractPlugin.AbstractPlugin {\n\n constructor(draggable) {\n super(draggable);\n\n this.firstSource = null;\n\n this.mirror = null;\n this[onDragStart] = this[onDragStart].bind(this);\n this[onDragStop] = this[onDragStop].bind(this);\n this[onDragOver] = this[onDragOver].bind(this);\n this[onDragOut] = this[onDragOut].bind(this);\n this[onMirrorCreated] = this[onMirrorCreated].bind(this);\n this[onMirrorDestroy] = this[onMirrorDestroy].bind(this);\n }\n\n attach() {\n this.draggable.on('drag:start', this[onDragStart]).on('drag:stop', this[onDragStop]).on('drag:over', this[onDragOver]).on('drag:out', this[onDragOut]).on('droppable:over', this[onDragOver]).on('droppable:out', this[onDragOut]).on('mirror:created', this[onMirrorCreated]).on('mirror:destroy', this[onMirrorDestroy]);\n }\n\n detach() {\n this.draggable.off('drag:start', this[onDragStart]).off('drag:stop', this[onDragStop]).off('drag:over', this[onDragOver]).off('drag:out', this[onDragOut]).off('droppable:over', this[onDragOver]).off('droppable:out', this[onDragOut]).off('mirror:created', this[onMirrorCreated]).off('mirror:destroy', this[onMirrorDestroy]);\n }\n\n [onDragStart](event) {\n if (event.canceled()) {\n return;\n }\n this.firstSource = event.source;\n }\n\n [onDragStop]() {\n this.firstSource = null;\n }\n\n [onDragOver](event) {\n if (event.canceled()) {\n return;\n }\n const source = event.source || event.dragEvent.source;\n if (source === this.firstSource) {\n this.firstSource = null;\n return;\n }\n const snapInEvent = new SnappableEvent.SnapInEvent({\n dragEvent: event,\n snappable: event.over || event.droppable\n });\n this.draggable.trigger(snapInEvent);\n if (snapInEvent.canceled()) {\n return;\n }\n if (this.mirror) {\n this.mirror.style.display = 'none';\n }\n source.classList.remove(...this.draggable.getClassNamesFor('source:dragging'));\n source.classList.add(...this.draggable.getClassNamesFor('source:placed'));\n\n setTimeout(() => {\n source.classList.remove(...this.draggable.getClassNamesFor('source:placed'));\n }, this.draggable.options.placedTimeout);\n }\n\n [onDragOut](event) {\n if (event.canceled()) {\n return;\n }\n const source = event.source || event.dragEvent.source;\n const snapOutEvent = new SnappableEvent.SnapOutEvent({\n dragEvent: event,\n snappable: event.over || event.droppable\n });\n this.draggable.trigger(snapOutEvent);\n if (snapOutEvent.canceled()) {\n return;\n }\n if (this.mirror) {\n this.mirror.style.display = '';\n }\n source.classList.add(...this.draggable.getClassNamesFor('source:dragging'));\n }\n\n [onMirrorCreated]({\n mirror\n }) {\n this.mirror = mirror;\n }\n\n [onMirrorDestroy]() {\n this.mirror = null;\n }\n}\n\nexports.default = Snappable;\n","'use strict';\n\nvar AbstractEvent = require('../../../shared/AbstractEvent/AbstractEvent.cjs');\n\nclass SnapEvent extends AbstractEvent.AbstractEvent {\n\n get dragEvent() {\n return this.data.dragEvent;\n }\n\n get snappable() {\n return this.data.snappable;\n }\n}\n\nSnapEvent.type = 'snap';\nclass SnapInEvent extends SnapEvent {}\n\nSnapInEvent.type = 'snap:in';\nSnapInEvent.cancelable = true;\nclass SnapOutEvent extends SnapEvent {}\nSnapOutEvent.type = 'snap:out';\nSnapOutEvent.cancelable = true;\n\nexports.SnapEvent = SnapEvent;\nexports.SnapInEvent = SnapInEvent;\nexports.SnapOutEvent = SnapOutEvent;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar AbstractPlugin = require('../../shared/AbstractPlugin/AbstractPlugin.cjs');\n\nconst onSortableSorted = Symbol('onSortableSorted');\nconst onSortableSort = Symbol('onSortableSort');\n\nconst defaultOptions = {\n duration: 150,\n easingFunction: 'ease-in-out'\n};\n\nclass SortAnimation extends AbstractPlugin.AbstractPlugin {\n\n constructor(draggable) {\n super(draggable);\n\n this.options = {\n ...defaultOptions,\n ...this.getOptions()\n };\n\n this.lastAnimationFrame = null;\n this.lastElements = [];\n this[onSortableSorted] = this[onSortableSorted].bind(this);\n this[onSortableSort] = this[onSortableSort].bind(this);\n }\n\n attach() {\n this.draggable.on('sortable:sort', this[onSortableSort]);\n this.draggable.on('sortable:sorted', this[onSortableSorted]);\n }\n\n detach() {\n this.draggable.off('sortable:sort', this[onSortableSort]);\n this.draggable.off('sortable:sorted', this[onSortableSorted]);\n }\n\n getOptions() {\n return this.draggable.options.sortAnimation || {};\n }\n\n [onSortableSort]({\n dragEvent\n }) {\n const {\n sourceContainer\n } = dragEvent;\n const elements = this.draggable.getDraggableElementsForContainer(sourceContainer);\n this.lastElements = Array.from(elements).map(el => {\n return {\n domEl: el,\n offsetTop: el.offsetTop,\n offsetLeft: el.offsetLeft\n };\n });\n }\n\n [onSortableSorted]({\n oldIndex,\n newIndex\n }) {\n if (oldIndex === newIndex) {\n return;\n }\n const effectedElements = [];\n let start;\n let end;\n let num;\n if (oldIndex > newIndex) {\n start = newIndex;\n end = oldIndex - 1;\n num = 1;\n } else {\n start = oldIndex + 1;\n end = newIndex;\n num = -1;\n }\n for (let i = start; i <= end; i++) {\n const from = this.lastElements[i];\n const to = this.lastElements[i + num];\n effectedElements.push({\n from,\n to\n });\n }\n cancelAnimationFrame(this.lastAnimationFrame);\n\n this.lastAnimationFrame = requestAnimationFrame(() => {\n effectedElements.forEach(element => animate(element, this.options));\n });\n }\n}\n\nfunction animate({\n from,\n to\n}, {\n duration,\n easingFunction\n}) {\n const domEl = from.domEl;\n const x = from.offsetLeft - to.offsetLeft;\n const y = from.offsetTop - to.offsetTop;\n domEl.style.pointerEvents = 'none';\n domEl.style.transform = `translate3d(${x}px, ${y}px, 0)`;\n requestAnimationFrame(() => {\n domEl.addEventListener('transitionend', resetElementOnTransitionEnd);\n domEl.style.transition = `transform ${duration}ms ${easingFunction}`;\n domEl.style.transform = '';\n });\n}\n\nfunction resetElementOnTransitionEnd(event) {\n event.target.style.transition = '';\n event.target.style.pointerEvents = '';\n event.target.removeEventListener('transitionend', resetElementOnTransitionEnd);\n}\n\nexports.default = SortAnimation;\nexports.defaultOptions = defaultOptions;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar _rollupPluginBabelHelpers = require('../../_virtual/_rollupPluginBabelHelpers.cjs');\nvar AbstractPlugin = require('../../shared/AbstractPlugin/AbstractPlugin.cjs');\nvar AutoBind = require('../../shared/utils/decorators/AutoBind.cjs');\n\nvar _initProto, _class;\n\nconst defaultOptions = {\n duration: 150,\n easingFunction: 'ease-in-out',\n horizontal: false\n};\n\nclass SwapAnimation extends AbstractPlugin.AbstractPlugin {\n\n constructor(draggable) {\n _initProto(super(draggable));\n\n this.options = {\n ...defaultOptions,\n ...this.getOptions()\n };\n\n this.lastAnimationFrame = null;\n }\n\n attach() {\n this.draggable.on('sortable:sorted', this.onSortableSorted);\n }\n\n detach() {\n this.draggable.off('sortable:sorted', this.onSortableSorted);\n }\n\n getOptions() {\n return this.draggable.options.swapAnimation || {};\n }\n\n onSortableSorted({\n oldIndex,\n newIndex,\n dragEvent\n }) {\n const {\n source,\n over\n } = dragEvent;\n if (this.lastAnimationFrame) {\n cancelAnimationFrame(this.lastAnimationFrame);\n }\n\n this.lastAnimationFrame = requestAnimationFrame(() => {\n if (oldIndex >= newIndex) {\n animate(source, over, this.options);\n } else {\n animate(over, source, this.options);\n }\n });\n }\n}\n\n_class = SwapAnimation;\n[_initProto] = _rollupPluginBabelHelpers.applyDecs2305(_class, [[AutoBind.AutoBind, 2, \"onSortableSorted\"]], [], 0, void 0, AbstractPlugin.AbstractPlugin).e;\nfunction animate(from, to, {\n duration,\n easingFunction,\n horizontal\n}) {\n for (const element of [from, to]) {\n element.style.pointerEvents = 'none';\n }\n if (horizontal) {\n const width = from.offsetWidth;\n from.style.transform = `translate3d(${width}px, 0, 0)`;\n to.style.transform = `translate3d(-${width}px, 0, 0)`;\n } else {\n const height = from.offsetHeight;\n from.style.transform = `translate3d(0, ${height}px, 0)`;\n to.style.transform = `translate3d(0, -${height}px, 0)`;\n }\n requestAnimationFrame(() => {\n for (const element of [from, to]) {\n element.addEventListener('transitionend', resetElementOnTransitionEnd);\n element.style.transition = `transform ${duration}ms ${easingFunction}`;\n element.style.transform = '';\n }\n });\n}\n\nfunction resetElementOnTransitionEnd(event) {\n if (event.target == null || !isHTMLElement(event.target)) {\n return;\n }\n event.target.style.transition = '';\n event.target.style.pointerEvents = '';\n event.target.removeEventListener('transitionend', resetElementOnTransitionEnd);\n}\nfunction isHTMLElement(eventTarget) {\n return Boolean('style' in eventTarget);\n}\n\nexports.default = SwapAnimation;\nexports.defaultOptions = defaultOptions;\n","'use strict';\n\nvar Collidable = require('./Collidable/Collidable.cjs');\nrequire('./Collidable/CollidableEvent/CollidableEvent.cjs');\nvar ResizeMirror = require('./ResizeMirror/ResizeMirror.cjs');\nvar Snappable = require('./Snappable/Snappable.cjs');\nrequire('./Snappable/SnappableEvent/SnappableEvent.cjs');\nvar SwapAnimation = require('./SwapAnimation/SwapAnimation.cjs');\nvar SortAnimation = require('./SortAnimation/SortAnimation.cjs');\n\n\n\nexports.Collidable = Collidable.default;\nexports.ResizeMirror = ResizeMirror.default;\nexports.defaultResizeMirrorOptions = ResizeMirror.defaultOptions;\nexports.Snappable = Snappable.default;\nexports.SwapAnimation = SwapAnimation.default;\nexports.defaultSwapAnimationOptions = SwapAnimation.defaultOptions;\nexports.SortAnimation = SortAnimation.default;\nexports.defaultSortAnimationOptions = SortAnimation.defaultOptions;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar Draggable = require('../Draggable/Draggable.cjs');\nrequire('../Draggable/DragEvent/DragEvent.cjs');\nrequire('../Draggable/DraggableEvent/DraggableEvent.cjs');\nrequire('../Draggable/Plugins/Announcement/Announcement.cjs');\nrequire('../Draggable/Plugins/Mirror/MirrorEvent/MirrorEvent.cjs');\nrequire('../Draggable/Sensors/SensorEvent/SensorEvent.cjs');\nrequire('../Draggable/Sensors/TouchSensor/TouchSensor.cjs');\nvar SortableEvent = require('./SortableEvent/SortableEvent.cjs');\n\nconst onDragStart = Symbol('onDragStart');\nconst onDragOverContainer = Symbol('onDragOverContainer');\nconst onDragOver = Symbol('onDragOver');\nconst onDragStop = Symbol('onDragStop');\n\nfunction onSortableSortedDefaultAnnouncement({\n dragEvent\n}) {\n const sourceText = dragEvent.source.textContent.trim() || dragEvent.source.id || 'sortable element';\n if (dragEvent.over) {\n const overText = dragEvent.over.textContent.trim() || dragEvent.over.id || 'sortable element';\n const isFollowing = dragEvent.source.compareDocumentPosition(dragEvent.over) & Node.DOCUMENT_POSITION_FOLLOWING;\n if (isFollowing) {\n return `Placed ${sourceText} after ${overText}`;\n } else {\n return `Placed ${sourceText} before ${overText}`;\n }\n } else {\n\n return `Placed ${sourceText} into a different container`;\n }\n}\n\nconst defaultAnnouncements = {\n 'sortable:sorted': onSortableSortedDefaultAnnouncement\n};\n\nclass Sortable extends Draggable.default {\n\n constructor(containers = [], options = {}) {\n super(containers, {\n ...options,\n announcements: {\n ...defaultAnnouncements,\n ...(options.announcements || {})\n }\n });\n\n this.startIndex = null;\n\n this.startContainer = null;\n this[onDragStart] = this[onDragStart].bind(this);\n this[onDragOverContainer] = this[onDragOverContainer].bind(this);\n this[onDragOver] = this[onDragOver].bind(this);\n this[onDragStop] = this[onDragStop].bind(this);\n this.on('drag:start', this[onDragStart]).on('drag:over:container', this[onDragOverContainer]).on('drag:over', this[onDragOver]).on('drag:stop', this[onDragStop]);\n }\n\n destroy() {\n super.destroy();\n this.off('drag:start', this[onDragStart]).off('drag:over:container', this[onDragOverContainer]).off('drag:over', this[onDragOver]).off('drag:stop', this[onDragStop]);\n }\n\n index(element) {\n return this.getSortableElementsForContainer(element.parentNode).indexOf(element);\n }\n\n getSortableElementsForContainer(container) {\n const allSortableElements = container.querySelectorAll(this.options.draggable);\n return [...allSortableElements].filter(childElement => {\n return childElement !== this.originalSource && childElement !== this.mirror && childElement.parentNode === container;\n });\n }\n\n [onDragStart](event) {\n this.startContainer = event.source.parentNode;\n this.startIndex = this.index(event.source);\n const sortableStartEvent = new SortableEvent.SortableStartEvent({\n dragEvent: event,\n startIndex: this.startIndex,\n startContainer: this.startContainer\n });\n this.trigger(sortableStartEvent);\n if (sortableStartEvent.canceled()) {\n event.cancel();\n }\n }\n\n [onDragOverContainer](event) {\n if (event.canceled()) {\n return;\n }\n const {\n source,\n over,\n overContainer\n } = event;\n const oldIndex = this.index(source);\n const sortableSortEvent = new SortableEvent.SortableSortEvent({\n dragEvent: event,\n currentIndex: oldIndex,\n source,\n over\n });\n this.trigger(sortableSortEvent);\n if (sortableSortEvent.canceled()) {\n return;\n }\n const children = this.getSortableElementsForContainer(overContainer);\n const moves = move({\n source,\n over,\n overContainer,\n children\n });\n if (!moves) {\n return;\n }\n const {\n oldContainer,\n newContainer\n } = moves;\n const newIndex = this.index(event.source);\n const sortableSortedEvent = new SortableEvent.SortableSortedEvent({\n dragEvent: event,\n oldIndex,\n newIndex,\n oldContainer,\n newContainer\n });\n this.trigger(sortableSortedEvent);\n }\n\n [onDragOver](event) {\n if (event.over === event.originalSource || event.over === event.source) {\n return;\n }\n const {\n source,\n over,\n overContainer\n } = event;\n const oldIndex = this.index(source);\n const sortableSortEvent = new SortableEvent.SortableSortEvent({\n dragEvent: event,\n currentIndex: oldIndex,\n source,\n over\n });\n this.trigger(sortableSortEvent);\n if (sortableSortEvent.canceled()) {\n return;\n }\n const children = this.getDraggableElementsForContainer(overContainer);\n const moves = move({\n source,\n over,\n overContainer,\n children\n });\n if (!moves) {\n return;\n }\n const {\n oldContainer,\n newContainer\n } = moves;\n const newIndex = this.index(source);\n const sortableSortedEvent = new SortableEvent.SortableSortedEvent({\n dragEvent: event,\n oldIndex,\n newIndex,\n oldContainer,\n newContainer\n });\n this.trigger(sortableSortedEvent);\n }\n\n [onDragStop](event) {\n const sortableStopEvent = new SortableEvent.SortableStopEvent({\n dragEvent: event,\n oldIndex: this.startIndex,\n newIndex: this.index(event.source),\n oldContainer: this.startContainer,\n newContainer: event.source.parentNode\n });\n this.trigger(sortableStopEvent);\n this.startIndex = null;\n this.startContainer = null;\n }\n}\nfunction index(element) {\n return Array.prototype.indexOf.call(element.parentNode.children, element);\n}\nfunction move({\n source,\n over,\n overContainer,\n children\n}) {\n const emptyOverContainer = !children.length;\n const differentContainer = source.parentNode !== overContainer;\n const sameContainer = over && source.parentNode === over.parentNode;\n if (emptyOverContainer) {\n return moveInsideEmptyContainer(source, overContainer);\n } else if (sameContainer) {\n return moveWithinContainer(source, over);\n } else if (differentContainer) {\n return moveOutsideContainer(source, over, overContainer);\n } else {\n return null;\n }\n}\nfunction moveInsideEmptyContainer(source, overContainer) {\n const oldContainer = source.parentNode;\n overContainer.appendChild(source);\n return {\n oldContainer,\n newContainer: overContainer\n };\n}\nfunction moveWithinContainer(source, over) {\n const oldIndex = index(source);\n const newIndex = index(over);\n if (oldIndex < newIndex) {\n source.parentNode.insertBefore(source, over.nextElementSibling);\n } else {\n source.parentNode.insertBefore(source, over);\n }\n return {\n oldContainer: source.parentNode,\n newContainer: source.parentNode\n };\n}\nfunction moveOutsideContainer(source, over, overContainer) {\n const oldContainer = source.parentNode;\n if (over) {\n over.parentNode.insertBefore(source, over);\n } else {\n\n overContainer.appendChild(source);\n }\n return {\n oldContainer,\n newContainer: source.parentNode\n };\n}\n\nexports.default = Sortable;\n","'use strict';\n\nvar AbstractEvent = require('../../shared/AbstractEvent/AbstractEvent.cjs');\n\nclass SortableEvent extends AbstractEvent.AbstractEvent {\n\n constructor(data) {\n super(data);\n this.data = data;\n }\n\n get dragEvent() {\n return this.data.dragEvent;\n }\n}\nSortableEvent.type = 'sortable';\n\nclass SortableStartEvent extends SortableEvent {\n\n get startIndex() {\n return this.data.startIndex;\n }\n\n get startContainer() {\n return this.data.startContainer;\n }\n}\nSortableStartEvent.type = 'sortable:start';\nSortableStartEvent.cancelable = true;\n\nclass SortableSortEvent extends SortableEvent {\n\n get currentIndex() {\n return this.data.currentIndex;\n }\n\n get over() {\n return this.data.over;\n }\n\n get overContainer() {\n return this.data.dragEvent.overContainer;\n }\n}\nSortableSortEvent.type = 'sortable:sort';\nSortableSortEvent.cancelable = true;\n\nclass SortableSortedEvent extends SortableEvent {\n\n get oldIndex() {\n return this.data.oldIndex;\n }\n\n get newIndex() {\n return this.data.newIndex;\n }\n\n get oldContainer() {\n return this.data.oldContainer;\n }\n\n get newContainer() {\n return this.data.newContainer;\n }\n}\nSortableSortedEvent.type = 'sortable:sorted';\n\nclass SortableStopEvent extends SortableEvent {\n\n get oldIndex() {\n return this.data.oldIndex;\n }\n\n get newIndex() {\n return this.data.newIndex;\n }\n\n get oldContainer() {\n return this.data.oldContainer;\n }\n\n get newContainer() {\n return this.data.newContainer;\n }\n}\nSortableStopEvent.type = 'sortable:stop';\n\nexports.SortableEvent = SortableEvent;\nexports.SortableSortEvent = SortableSortEvent;\nexports.SortableSortedEvent = SortableSortedEvent;\nexports.SortableStartEvent = SortableStartEvent;\nexports.SortableStopEvent = SortableStopEvent;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar Draggable = require('../Draggable/Draggable.cjs');\nrequire('../Draggable/DragEvent/DragEvent.cjs');\nrequire('../Draggable/DraggableEvent/DraggableEvent.cjs');\nrequire('../Draggable/Plugins/Announcement/Announcement.cjs');\nrequire('../Draggable/Plugins/Mirror/MirrorEvent/MirrorEvent.cjs');\nrequire('../Draggable/Sensors/SensorEvent/SensorEvent.cjs');\nrequire('../Draggable/Sensors/TouchSensor/TouchSensor.cjs');\nvar SwappableEvent = require('./SwappableEvent/SwappableEvent.cjs');\n\nconst onDragStart = Symbol('onDragStart');\nconst onDragOver = Symbol('onDragOver');\nconst onDragStop = Symbol('onDragStop');\n\nfunction onSwappableSwappedDefaultAnnouncement({\n dragEvent,\n swappedElement\n}) {\n const sourceText = dragEvent.source.textContent.trim() || dragEvent.source.id || 'swappable element';\n const overText = swappedElement.textContent.trim() || swappedElement.id || 'swappable element';\n return `Swapped ${sourceText} with ${overText}`;\n}\n\nconst defaultAnnouncements = {\n 'swappabled:swapped': onSwappableSwappedDefaultAnnouncement\n};\n\nclass Swappable extends Draggable.default {\n\n constructor(containers = [], options = {}) {\n super(containers, {\n ...options,\n announcements: {\n ...defaultAnnouncements,\n ...(options.announcements || {})\n }\n });\n\n this.lastOver = null;\n this[onDragStart] = this[onDragStart].bind(this);\n this[onDragOver] = this[onDragOver].bind(this);\n this[onDragStop] = this[onDragStop].bind(this);\n this.on('drag:start', this[onDragStart]).on('drag:over', this[onDragOver]).on('drag:stop', this[onDragStop]);\n }\n\n destroy() {\n super.destroy();\n this.off('drag:start', this._onDragStart).off('drag:over', this._onDragOver).off('drag:stop', this._onDragStop);\n }\n\n [onDragStart](event) {\n const swappableStartEvent = new SwappableEvent.SwappableStartEvent({\n dragEvent: event\n });\n this.trigger(swappableStartEvent);\n if (swappableStartEvent.canceled()) {\n event.cancel();\n }\n }\n\n [onDragOver](event) {\n if (event.over === event.originalSource || event.over === event.source || event.canceled()) {\n return;\n }\n const swappableSwapEvent = new SwappableEvent.SwappableSwapEvent({\n dragEvent: event,\n over: event.over,\n overContainer: event.overContainer\n });\n this.trigger(swappableSwapEvent);\n if (swappableSwapEvent.canceled()) {\n return;\n }\n\n if (this.lastOver && this.lastOver !== event.over) {\n swap(this.lastOver, event.source);\n }\n if (this.lastOver === event.over) {\n this.lastOver = null;\n } else {\n this.lastOver = event.over;\n }\n swap(event.source, event.over);\n const swappableSwappedEvent = new SwappableEvent.SwappableSwappedEvent({\n dragEvent: event,\n swappedElement: event.over\n });\n this.trigger(swappableSwappedEvent);\n }\n\n [onDragStop](event) {\n const swappableStopEvent = new SwappableEvent.SwappableStopEvent({\n dragEvent: event\n });\n this.trigger(swappableStopEvent);\n this.lastOver = null;\n }\n}\nfunction withTempElement(callback) {\n const tmpElement = document.createElement('div');\n callback(tmpElement);\n tmpElement.remove();\n}\nfunction swap(source, over) {\n const overParent = over.parentNode;\n const sourceParent = source.parentNode;\n withTempElement(tmpElement => {\n sourceParent.insertBefore(tmpElement, source);\n overParent.insertBefore(source, over);\n sourceParent.insertBefore(over, tmpElement);\n });\n}\n\nexports.default = Swappable;\n","'use strict';\n\nvar AbstractEvent = require('../../shared/AbstractEvent/AbstractEvent.cjs');\n\nclass SwappableEvent extends AbstractEvent.AbstractEvent {\n\n constructor(data) {\n super(data);\n this.data = data;\n }\n\n get dragEvent() {\n return this.data.dragEvent;\n }\n}\n\nSwappableEvent.type = 'swappable';\nclass SwappableStartEvent extends SwappableEvent {}\nSwappableStartEvent.type = 'swappable:start';\nSwappableStartEvent.cancelable = true;\n\nclass SwappableSwapEvent extends SwappableEvent {\n\n get over() {\n return this.data.over;\n }\n\n get overContainer() {\n return this.data.overContainer;\n }\n}\nSwappableSwapEvent.type = 'swappable:swap';\nSwappableSwapEvent.cancelable = true;\n\nclass SwappableSwappedEvent extends SwappableEvent {\n\n get swappedElement() {\n return this.data.swappedElement;\n }\n}\n\nSwappableSwappedEvent.type = 'swappable:swapped';\nclass SwappableStopEvent extends SwappableEvent {}\nSwappableStopEvent.type = 'swappable:stop';\n\nexports.SwappableEvent = SwappableEvent;\nexports.SwappableStartEvent = SwappableStartEvent;\nexports.SwappableStopEvent = SwappableStopEvent;\nexports.SwappableSwapEvent = SwappableSwapEvent;\nexports.SwappableSwappedEvent = SwappableSwappedEvent;\n","'use strict';\n\nfunction createAddInitializerMethod(e, t) {\n return function (r) {\n assertNotFinished(t, \"addInitializer\"), assertCallable(r, \"An initializer\"), e.push(r);\n };\n}\nfunction assertInstanceIfPrivate(e, t) {\n if (!e(t)) throw new TypeError(\"Attempted to access private element on non-instance\");\n}\nfunction memberDec(e, t, r, a, n, i, s, o, c, l, u) {\n var f;\n switch (i) {\n case 1:\n f = \"accessor\";\n break;\n case 2:\n f = \"method\";\n break;\n case 3:\n f = \"getter\";\n break;\n case 4:\n f = \"setter\";\n break;\n default:\n f = \"field\";\n }\n var d,\n p,\n h = {\n kind: f,\n name: o ? \"#\" + r : r,\n static: s,\n private: o,\n metadata: u\n },\n v = {\n v: !1\n };\n if (0 !== i && (h.addInitializer = createAddInitializerMethod(n, v)), o || 0 !== i && 2 !== i) {\n if (2 === i) d = function (e) {\n return assertInstanceIfPrivate(l, e), a.value;\n };else {\n var y = 0 === i || 1 === i;\n (y || 3 === i) && (d = o ? function (e) {\n return assertInstanceIfPrivate(l, e), a.get.call(e);\n } : function (e) {\n return a.get.call(e);\n }), (y || 4 === i) && (p = o ? function (e, t) {\n assertInstanceIfPrivate(l, e), a.set.call(e, t);\n } : function (e, t) {\n a.set.call(e, t);\n });\n }\n } else d = function (e) {\n return e[r];\n }, 0 === i && (p = function (e, t) {\n e[r] = t;\n });\n var m = o ? l.bind() : function (e) {\n return r in e;\n };\n h.access = d && p ? {\n get: d,\n set: p,\n has: m\n } : d ? {\n get: d,\n has: m\n } : {\n set: p,\n has: m\n };\n try {\n return e.call(t, c, h);\n } finally {\n v.v = !0;\n }\n}\nfunction assertNotFinished(e, t) {\n if (e.v) throw new Error(\"attempted to call \" + t + \" after decoration was finished\");\n}\nfunction assertCallable(e, t) {\n if (\"function\" != typeof e) throw new TypeError(t + \" must be a function\");\n}\nfunction assertValidReturnValue(e, t) {\n var r = typeof t;\n if (1 === e) {\n if (\"object\" !== r || null === t) throw new TypeError(\"accessor decorators must return an object with get, set, or init properties or void 0\");\n void 0 !== t.get && assertCallable(t.get, \"accessor.get\"), void 0 !== t.set && assertCallable(t.set, \"accessor.set\"), void 0 !== t.init && assertCallable(t.init, \"accessor.init\");\n } else if (\"function\" !== r) {\n var a;\n throw a = 0 === e ? \"field\" : 5 === e ? \"class\" : \"method\", new TypeError(a + \" decorators must return a function or void 0\");\n }\n}\nfunction curryThis1(e) {\n return function () {\n return e(this);\n };\n}\nfunction curryThis2(e) {\n return function (t) {\n e(this, t);\n };\n}\nfunction applyMemberDec(e, t, r, a, n, i, s, o, c, l, u) {\n var f,\n d,\n p,\n h,\n v,\n y,\n m = r[0];\n a || Array.isArray(m) || (m = [m]), o ? f = 0 === i || 1 === i ? {\n get: curryThis1(r[3]),\n set: curryThis2(r[4])\n } : 3 === i ? {\n get: r[3]\n } : 4 === i ? {\n set: r[3]\n } : {\n value: r[3]\n } : 0 !== i && (f = Object.getOwnPropertyDescriptor(t, n)), 1 === i ? p = {\n get: f.get,\n set: f.set\n } : 2 === i ? p = f.value : 3 === i ? p = f.get : 4 === i && (p = f.set);\n for (var g = a ? 2 : 1, b = m.length - 1; b >= 0; b -= g) {\n var I;\n if (void 0 !== (h = memberDec(m[b], a ? m[b - 1] : void 0, n, f, c, i, s, o, p, l, u))) assertValidReturnValue(i, h), 0 === i ? I = h : 1 === i ? (I = h.init, v = h.get || p.get, y = h.set || p.set, p = {\n get: v,\n set: y\n }) : p = h, void 0 !== I && (void 0 === d ? d = I : \"function\" == typeof d ? d = [d, I] : d.push(I));\n }\n if (0 === i || 1 === i) {\n if (void 0 === d) d = function (e, t) {\n return t;\n };else if (\"function\" != typeof d) {\n var w = d;\n d = function (e, t) {\n for (var r = t, a = w.length - 1; a >= 0; a--) r = w[a].call(e, r);\n return r;\n };\n } else {\n var M = d;\n d = function (e, t) {\n return M.call(e, t);\n };\n }\n e.push(d);\n }\n 0 !== i && (1 === i ? (f.get = p.get, f.set = p.set) : 2 === i ? f.value = p : 3 === i ? f.get = p : 4 === i && (f.set = p), o ? 1 === i ? (e.push(function (e, t) {\n return p.get.call(e, t);\n }), e.push(function (e, t) {\n return p.set.call(e, t);\n })) : 2 === i ? e.push(p) : e.push(function (e, t) {\n return p.call(e, t);\n }) : Object.defineProperty(t, n, f));\n}\nfunction applyMemberDecs(e, t, r, a) {\n for (var n, i, s, o = [], c = new Map(), l = new Map(), u = 0; u < t.length; u++) {\n var f = t[u];\n if (Array.isArray(f)) {\n var d,\n p,\n h = f[1],\n v = f[2],\n y = f.length > 3,\n m = 16 & h,\n g = !!(8 & h),\n b = r;\n if (h &= 7, g ? (d = e, 0 !== h && (p = i = i || []), y && !s && (s = function (t) {\n return _checkInRHS(t) === e;\n }), b = s) : (d = e.prototype, 0 !== h && (p = n = n || [])), 0 !== h && !y) {\n var I = g ? l : c,\n w = I.get(v) || 0;\n if (!0 === w || 3 === w && 4 !== h || 4 === w && 3 !== h) throw new Error(\"Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: \" + v);\n I.set(v, !(!w && h > 2) || h);\n }\n applyMemberDec(o, d, f, m, v, h, g, y, p, b, a);\n }\n }\n return pushInitializers(o, n), pushInitializers(o, i), o;\n}\nfunction pushInitializers(e, t) {\n t && e.push(function (e) {\n for (var r = 0; r < t.length; r++) t[r].call(e);\n return e;\n });\n}\nfunction applyClassDecs(e, t, r, a) {\n if (t.length) {\n for (var n = [], i = e, s = e.name, o = r ? 2 : 1, c = t.length - 1; c >= 0; c -= o) {\n var l = {\n v: !1\n };\n try {\n var u = t[c].call(r ? t[c - 1] : void 0, i, {\n kind: \"class\",\n name: s,\n addInitializer: createAddInitializerMethod(n, l),\n metadata: a\n });\n } finally {\n l.v = !0;\n }\n void 0 !== u && (assertValidReturnValue(5, u), i = u);\n }\n return [defineMetadata(i, a), function () {\n for (var e = 0; e < n.length; e++) n[e].call(i);\n }];\n }\n}\nfunction defineMetadata(e, t) {\n return Object.defineProperty(e, Symbol.metadata || Symbol.for(\"Symbol.metadata\"), {\n configurable: !0,\n enumerable: !0,\n value: t\n });\n}\nfunction _applyDecs2305(e, t, r, a, n, i) {\n if (arguments.length >= 6) var s = i[Symbol.metadata || Symbol.for(\"Symbol.metadata\")];\n var o = Object.create(void 0 === s ? null : s),\n c = applyMemberDecs(e, t, n, o);\n return r.length || defineMetadata(e, o), {\n e: c,\n get c() {\n return applyClassDecs(e, r, a, o);\n }\n };\n}\nfunction _checkInRHS(e) {\n if (Object(e) !== e) throw TypeError(\"right-hand side of 'in' should be an object, got \" + (null !== e ? typeof e : \"null\"));\n return e;\n}\n\nexports.applyDecs2305 = _applyDecs2305;\nexports.checkInRHS = _checkInRHS;\n","'use strict';\n\nvar AbstractEvent = require('./shared/AbstractEvent/AbstractEvent.cjs');\nvar AbstractPlugin = require('./shared/AbstractPlugin/AbstractPlugin.cjs');\nvar index = require('./Draggable/Sensors/index.cjs');\nvar index$1 = require('./Plugins/index.cjs');\nvar Draggable = require('./Draggable/Draggable.cjs');\nrequire('./Draggable/DragEvent/DragEvent.cjs');\nrequire('./Draggable/DraggableEvent/DraggableEvent.cjs');\nrequire('./Draggable/Plugins/Announcement/Announcement.cjs');\nrequire('./Draggable/Plugins/Mirror/MirrorEvent/MirrorEvent.cjs');\nvar Droppable = require('./Droppable/Droppable.cjs');\nrequire('./Droppable/DroppableEvent/DroppableEvent.cjs');\nvar Swappable = require('./Swappable/Swappable.cjs');\nrequire('./Swappable/SwappableEvent/SwappableEvent.cjs');\nvar Sortable = require('./Sortable/Sortable.cjs');\nrequire('./Sortable/SortableEvent/SortableEvent.cjs');\n\n\n\nexports.BaseEvent = AbstractEvent.AbstractEvent;\nexports.BasePlugin = AbstractPlugin.AbstractPlugin;\nexports.Sensors = index;\nexports.Plugins = index$1;\nexports.Draggable = Draggable.default;\nexports.Droppable = Droppable.default;\nexports.Swappable = Swappable.default;\nexports.Sortable = Sortable.default;\n","'use strict';\n\nclass AbstractEvent {\n\n constructor(data) {\n\n this._canceled = false;\n this.data = data;\n }\n\n get type() {\n return this.constructor.type;\n }\n\n get cancelable() {\n return this.constructor.cancelable;\n }\n\n cancel() {\n this._canceled = true;\n }\n\n canceled() {\n return this._canceled;\n }\n\n clone(data) {\n return new this.constructor({\n ...this.data,\n ...data\n });\n }\n}\n\nAbstractEvent.type = 'event';\n\nAbstractEvent.cancelable = false;\n\nexports.AbstractEvent = AbstractEvent;\n","'use strict';\n\nclass AbstractPlugin {\n\n constructor(draggable) {\n this.draggable = draggable;\n }\n\n attach() {\n throw new Error('Not Implemented');\n }\n\n detach() {\n throw new Error('Not Implemented');\n }\n}\n\nexports.AbstractPlugin = AbstractPlugin;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction closest(node, value) {\n if (node == null) {\n return null;\n }\n function conditionFn(currentNode) {\n if (currentNode == null || value == null) {\n return false;\n } else if (isSelector(value)) {\n return Element.prototype.matches.call(currentNode, value);\n } else if (isNodeList(value)) {\n return [...value].includes(currentNode);\n } else if (isElement(value)) {\n return value === currentNode;\n } else if (isFunction(value)) {\n return value(currentNode);\n } else {\n return false;\n }\n }\n let current = node;\n do {\n current = current.correspondingUseElement || current.correspondingElement || current;\n if (conditionFn(current)) {\n return current;\n }\n current = current?.parentNode || null;\n } while (current != null && current !== document.body && current !== document);\n return null;\n}\nfunction isSelector(value) {\n return Boolean(typeof value === 'string');\n}\nfunction isNodeList(value) {\n return Boolean(value instanceof NodeList || value instanceof Array);\n}\nfunction isElement(value) {\n return Boolean(value instanceof Node);\n}\nfunction isFunction(value) {\n return Boolean(typeof value === 'function');\n}\n\nexports.default = closest;\n","'use strict';\n\nfunction AutoBind(originalMethod, {\n name,\n addInitializer\n}) {\n addInitializer(function () {\n\n this[name] = originalMethod.bind(this);\n\n });\n}\n\nexports.AutoBind = AutoBind;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction distance(x1, y1, x2, y2) {\n return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n}\n\nexports.default = distance;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction requestNextAnimationFrame(callback) {\n return requestAnimationFrame(() => {\n requestAnimationFrame(callback);\n });\n}\n\nexports.default = requestNextAnimationFrame;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction touchCoords(event) {\n const {\n touches,\n changedTouches\n } = event;\n return touches && touches[0] || changedTouches && changedTouches[0];\n}\n\nexports.default = touchCoords;\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = GeneratorFunctionPrototype;\n define(Gp, \"constructor\", GeneratorFunctionPrototype);\n define(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction);\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n });\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n define(Gp, iteratorSymbol, function() {\n return this;\n });\n\n define(Gp, \"toString\", function() {\n return \"[object Generator]\";\n });\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, in modern engines\n // we can explicitly access globalThis. In older engines we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJTY3JpcHRzL3BhZ2VzL21lbWJlcnNoaXAvaW5kZXguanMiLCJTY3JpcHRzL3NyYy9hcGkuanMiLCJTY3JpcHRzL3NyYy9jb21tb24uanMiLCJTY3JpcHRzL3NyYy9lcnJvcnMuanMiLCJTY3JpcHRzL3NyYy9mcmVlemUtdWkuanMiLCJTY3JpcHRzL3NyYy9sb2NhbFN0b3JhZ2UuanMiLCJTY3JpcHRzL3NyYy9ub3RpZmljYXRpb25zLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3MuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdC5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9Ac2hvcGlmeS9kcmFnZ2FibGUvYnVpbGQvY2pzL0RyYWdnYWJsZS9EcmFnRXZlbnQvRHJhZ0V2ZW50LmNqcyIsIm5vZGVfbW9kdWxlcy9Ac2hvcGlmeS9kcmFnZ2FibGUvYnVpbGQvY2pzL0RyYWdnYWJsZS9EcmFnZ2FibGUuY2pzIiwibm9kZV9tb2R1bGVzL0BzaG9waWZ5L2RyYWdnYWJsZS9idWlsZC9janMvRHJhZ2dhYmxlL0RyYWdnYWJsZUV2ZW50L0RyYWdnYWJsZUV2ZW50LmNqcyIsIm5vZGVfbW9kdWxlcy9Ac2hvcGlmeS9kcmFnZ2FibGUvYnVpbGQvY2pzL0RyYWdnYWJsZS9FbWl0dGVyL0VtaXR0ZXIuY2pzIiwibm9kZV9tb2R1bGVzL0BzaG9waWZ5L2RyYWdnYWJsZS9idWlsZC9janMvRHJhZ2dhYmxlL1BsdWdpbnMvQW5ub3VuY2VtZW50L0Fubm91bmNlbWVudC5janMiLCJub2RlX21vZHVsZXMvQHNob3BpZnkvZHJhZ2dhYmxlL2J1aWxkL2Nqcy9EcmFnZ2FibGUvUGx1Z2lucy9Gb2N1c2FibGUvRm9jdXNhYmxlLmNqcyIsIm5vZGVfbW9kdWxlcy9Ac2hvcGlmeS9kcmFnZ2FibGUvYnVpbGQvY2pzL0RyYWdnYWJsZS9QbHVnaW5zL01pcnJvci9NaXJyb3IuY2pzIiwibm9kZV9tb2R1bGVzL0BzaG9waWZ5L2RyYWdnYWJsZS9idWlsZC9janMvRHJhZ2dhYmxlL1BsdWdpbnMvTWlycm9yL01pcnJvckV2ZW50L01pcnJvckV2ZW50LmNqcyIsIm5vZGVfbW9kdWxlcy9Ac2hvcGlmeS9kcmFnZ2FibGUvYnVpbGQvY2pzL0RyYWdnYWJsZS9QbHVnaW5zL1Njcm9sbGFibGUvU2Nyb2xsYWJsZS5janMiLCJub2RlX21vZHVsZXMvQHNob3BpZnkvZHJhZ2dhYmxlL2J1aWxkL2Nqcy9EcmFnZ2FibGUvU2Vuc29ycy9EcmFnU2Vuc29yL0RyYWdTZW5zb3IuY2pzIiwibm9kZV9tb2R1bGVzL0BzaG9waWZ5L2RyYWdnYWJsZS9idWlsZC9janMvRHJhZ2dhYmxlL1NlbnNvcnMvRm9yY2VUb3VjaFNlbnNvci9Gb3JjZVRvdWNoU2Vuc29yLmNqcyIsIm5vZGVfbW9kdWxlcy9Ac2hvcGlmeS9kcmFnZ2FibGUvYnVpbGQvY2pzL0RyYWdnYWJsZS9TZW5zb3JzL01vdXNlU2Vuc29yL01vdXNlU2Vuc29yLmNqcyIsIm5vZGVfbW9kdWxlcy9Ac2hvcGlmeS9kcmFnZ2FibGUvYnVpbGQvY2pzL0RyYWdnYWJsZS9TZW5zb3JzL1NlbnNvci9TZW5zb3IuY2pzIiwibm9kZV9tb2R1bGVzL0BzaG9waWZ5L2RyYWdnYWJsZS9idWlsZC9janMvRHJhZ2dhYmxlL1NlbnNvcnMvU2Vuc29yRXZlbnQvU2Vuc29yRXZlbnQuY2pzIiwibm9kZV9tb2R1bGVzL0BzaG9waWZ5L2RyYWdnYWJsZS9idWlsZC9janMvRHJhZ2dhYmxlL1NlbnNvcnMvVG91Y2hTZW5zb3IvVG91Y2hTZW5zb3IuY2pzIiwibm9kZV9tb2R1bGVzL0BzaG9waWZ5L2RyYWdnYWJsZS9idWlsZC9janMvRHJhZ2dhYmxlL1NlbnNvcnMvaW5kZXguY2pzIiwibm9kZV9tb2R1bGVzL0BzaG9waWZ5L2RyYWdnYWJsZS9idWlsZC9janMvRHJvcHBhYmxlL0Ryb3BwYWJsZS5janMiLCJub2RlX21vZHVsZXMvQHNob3BpZnkvZHJhZ2dhYmxlL2J1aWxkL2Nqcy9Ecm9wcGFibGUvRHJvcHBhYmxlRXZlbnQvRHJvcHBhYmxlRXZlbnQuY2pzIiwibm9kZV9tb2R1bGVzL0BzaG9waWZ5L2RyYWdnYWJsZS9idWlsZC9janMvUGx1Z2lucy9Db2xsaWRhYmxlL0NvbGxpZGFibGUuY2pzIiwibm9kZV9tb2R1bGVzL0BzaG9waWZ5L2RyYWdnYWJsZS9idWlsZC9janMvUGx1Z2lucy9Db2xsaWRhYmxlL0NvbGxpZGFibGVFdmVudC9Db2xsaWRhYmxlRXZlbnQuY2pzIiwibm9kZV9tb2R1bGVzL0BzaG9waWZ5L2RyYWdnYWJsZS9idWlsZC9janMvUGx1Z2lucy9SZXNpemVNaXJyb3IvUmVzaXplTWlycm9yLmNqcyIsIm5vZGVfbW9kdWxlcy9Ac2hvcGlmeS9kcmFnZ2FibGUvYnVpbGQvY2pzL1BsdWdpbnMvU25hcHBhYmxlL1NuYXBwYWJsZS5janMiLCJub2RlX21vZHVsZXMvQHNob3BpZnkvZHJhZ2dhYmxlL2J1aWxkL2Nqcy9QbHVnaW5zL1NuYXBwYWJsZS9TbmFwcGFibGVFdmVudC9TbmFwcGFibGVFdmVudC5janMiLCJub2RlX21vZHVsZXMvQHNob3BpZnkvZHJhZ2dhYmxlL2J1aWxkL2Nqcy9QbHVnaW5zL1NvcnRBbmltYXRpb24vU29ydEFuaW1hdGlvbi5janMiLCJub2RlX21vZHVsZXMvQHNob3BpZnkvZHJhZ2dhYmxlL2J1aWxkL2Nqcy9QbHVnaW5zL1N3YXBBbmltYXRpb24vU3dhcEFuaW1hdGlvbi5janMiLCJub2RlX21vZHVsZXMvQHNob3BpZnkvZHJhZ2dhYmxlL2J1aWxkL2Nqcy9QbHVnaW5zL2luZGV4LmNqcyIsIm5vZGVfbW9kdWxlcy9Ac2hvcGlmeS9kcmFnZ2FibGUvYnVpbGQvY2pzL1NvcnRhYmxlL1NvcnRhYmxlLmNqcyIsIm5vZGVfbW9kdWxlcy9Ac2hvcGlmeS9kcmFnZ2FibGUvYnVpbGQvY2pzL1NvcnRhYmxlL1NvcnRhYmxlRXZlbnQvU29ydGFibGVFdmVudC5janMiLCJub2RlX21vZHVsZXMvQHNob3BpZnkvZHJhZ2dhYmxlL2J1aWxkL2Nqcy9Td2FwcGFibGUvU3dhcHBhYmxlLmNqcyIsIm5vZGVfbW9kdWxlcy9Ac2hvcGlmeS9kcmFnZ2FibGUvYnVpbGQvY2pzL1N3YXBwYWJsZS9Td2FwcGFibGVFdmVudC9Td2FwcGFibGVFdmVudC5janMiLCJub2RlX21vZHVsZXMvQHNob3BpZnkvZHJhZ2dhYmxlL2J1aWxkL2Nqcy9fdmlydHVhbC9fcm9sbHVwUGx1Z2luQmFiZWxIZWxwZXJzLmNqcyIsIm5vZGVfbW9kdWxlcy9Ac2hvcGlmeS9kcmFnZ2FibGUvYnVpbGQvY2pzL2luZGV4LmNqcyIsIm5vZGVfbW9kdWxlcy9Ac2hvcGlmeS9kcmFnZ2FibGUvYnVpbGQvY2pzL3NoYXJlZC9BYnN0cmFjdEV2ZW50L0Fic3RyYWN0RXZlbnQuY2pzIiwibm9kZV9tb2R1bGVzL0BzaG9waWZ5L2RyYWdnYWJsZS9idWlsZC9janMvc2hhcmVkL0Fic3RyYWN0UGx1Z2luL0Fic3RyYWN0UGx1Z2luLmNqcyIsIm5vZGVfbW9kdWxlcy9Ac2hvcGlmeS9kcmFnZ2FibGUvYnVpbGQvY2pzL3NoYXJlZC91dGlscy9jbG9zZXN0L2Nsb3Nlc3QuY2pzIiwibm9kZV9tb2R1bGVzL0BzaG9waWZ5L2RyYWdnYWJsZS9idWlsZC9janMvc2hhcmVkL3V0aWxzL2RlY29yYXRvcnMvQXV0b0JpbmQuY2pzIiwibm9kZV9tb2R1bGVzL0BzaG9waWZ5L2RyYWdnYWJsZS9idWlsZC9janMvc2hhcmVkL3V0aWxzL2Rpc3RhbmNlL2Rpc3RhbmNlLmNqcyIsIm5vZGVfbW9kdWxlcy9Ac2hvcGlmeS9kcmFnZ2FibGUvYnVpbGQvY2pzL3NoYXJlZC91dGlscy9yZXF1ZXN0TmV4dEFuaW1hdGlvbkZyYW1lL3JlcXVlc3ROZXh0QW5pbWF0aW9uRnJhbWUuY2pzIiwibm9kZV9tb2R1bGVzL0BzaG9waWZ5L2RyYWdnYWJsZS9idWlsZC9janMvc2hhcmVkL3V0aWxzL3RvdWNoQ29vcmRzL3RvdWNoQ29vcmRzLmNqcyIsIm5vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztBQ0FBLElBQUEsSUFBQSxHQUFBLE9BQUE7QUFDQSxJQUFBLGNBQUEsR0FBQSxPQUFBO0FBQ0EsSUFBQSxTQUFBLEdBQUEsT0FBQTtBQUNBLElBQUEsVUFBQSxHQUFBLE9BQUE7QUFDQSxJQUFBLE9BQUEsR0FBQSxPQUFBO0FBRUEsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLFlBQU07RUFFaEQsbUJBQW1CLENBQUMsQ0FBQztFQUVyQixJQUFJLE9BQU8sbUJBQVEsS0FBSyxXQUFXLEVBQy9CO0VBRUosSUFBTSxRQUFRLEdBQUcsSUFBSSxtQkFBUSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEVBQUU7SUFDL0QsU0FBUyxFQUFFLG1CQUFtQjtJQUM5QixNQUFNLEVBQUUsMkJBQTJCO0lBQ25DLE1BQU0sRUFBRTtNQUNKLFFBQVEsRUFBRSxNQUFNO01BQ2hCLG1CQUFtQixFQUFFO0lBQ3pCO0VBQ0osQ0FBQyxDQUFDO0VBRUYsUUFBUSxDQUFDLEVBQUUsQ0FBQyxlQUFlO0lBQUEsSUFBQSxJQUFBLE9BQUEsa0JBQUEsMEJBQUEsWUFBQSxZQUFBLElBQUEsQ0FBRSxTQUFBLFFBQU8sQ0FBQztNQUFBLE9BQUEsWUFBQSxZQUFBLElBQUEsVUFBQSxTQUFBLFFBQUE7UUFBQSxrQkFBQSxRQUFBLENBQUEsSUFBQSxHQUFBLFFBQUEsQ0FBQSxJQUFBO1VBQUE7WUFBQSxRQUFBLENBQUEsSUFBQTtZQUc3QixrQkFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQUMsUUFBQSxDQUFBLElBQUE7WUFBQSxPQUNaLFFBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7Y0FDaEMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFNBQVM7Y0FDMUQsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUTtjQUN6QixRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNyQixDQUFDLENBQUM7VUFBQTtZQUVGLDRCQUFhLENBQUMsV0FBVyxDQUFDO2NBQUUsT0FBTyxFQUFFO1lBQVMsQ0FBQyxDQUFDO1lBQUMsUUFBQSxDQUFBLElBQUE7WUFBQTtVQUFBO1lBQUEsUUFBQSxDQUFBLElBQUE7WUFBQSxRQUFBLENBQUEsRUFBQSxHQUFBLFFBQUE7WUFFakQsT0FBTyxDQUFDLEtBQUssQ0FBQSxRQUFBLENBQUEsRUFBSSxDQUFDO1lBQ2xCLDRCQUFhLENBQUMsU0FBUyxDQUFDO2NBQUUsT0FBTyxFQUFFO1lBQW9FLENBQUMsQ0FBQztVQUFBO1lBQUEsUUFBQSxDQUFBLElBQUE7WUFFekcsa0JBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUFDLE9BQUEsUUFBQSxDQUFBLE1BQUE7VUFBQTtVQUFBO1lBQUEsT0FBQSxRQUFBLENBQUEsSUFBQTtRQUFBO01BQUEsR0FBQSxPQUFBO0lBQUEsQ0FFM0I7SUFBQSxpQkFBQSxFQUFBO01BQUEsT0FBQSxJQUFBLENBQUEsS0FBQSxPQUFBLFNBQUE7SUFBQTtFQUFBLElBQUM7QUFDTixDQUFDLENBQUM7QUFFRixJQUFNLG1CQUFtQixHQUFHLFNBQXRCLG1CQUFtQixDQUFBLEVBQVM7RUFBQSxJQUFBLHFCQUFBO0VBQzlCLENBQUEscUJBQUEsR0FBQSxRQUFRLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLGNBQUEscUJBQUEsZUFBL0MscUJBQUEsQ0FBaUQsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFVBQUEsQ0FBQyxFQUFJO0lBQzVFLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUVsQiw0QkFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7TUFDdkIsSUFBSTtJQUNSLENBQUMsQ0FBQyxDQUNHLElBQUk7TUFBQSxJQUFBLEtBQUEsT0FBQSxrQkFBQSwwQkFBQSxZQUFBLFlBQUEsSUFBQSxDQUFDLFNBQUEsU0FBTSxNQUFNO1FBQUEsT0FBQSxZQUFBLFlBQUEsSUFBQSxVQUFBLFVBQUEsU0FBQTtVQUFBLGtCQUFBLFNBQUEsQ0FBQSxJQUFBLEdBQUEsU0FBQSxDQUFBLElBQUE7WUFBQTtjQUFBLEtBQ1YsTUFBTSxDQUFDLFdBQVc7Z0JBQUEsU0FBQSxDQUFBLElBQUE7Z0JBQUE7Y0FBQTtjQUNsQixrQkFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2NBQUMsU0FBQSxDQUFBLElBQUE7Y0FBQSxTQUFBLENBQUEsSUFBQTtjQUFBLE9BR1IsWUFBTyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUN2QyxJQUFJLENBQUMsVUFBQSxNQUFNLEVBQUk7Z0JBQ1osNEJBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxpQ0FBaUMsQ0FBQztnQkFDdEUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2NBQ3JCLENBQUMsQ0FBQyxTQUNJLENBQUMsVUFBQSxHQUFHLEVBQUk7Z0JBQ1YsSUFBQSxzQkFBYyxFQUFDLEdBQUcsQ0FBQztnQkFDbkIsNEJBQWEsQ0FBQyxTQUFTLENBQUM7a0JBQUUsT0FBTyxFQUFFO2dCQUE4QyxDQUFDLENBQUM7Y0FDdkYsQ0FBQyxDQUFDO1lBQUE7Y0FBQSxTQUFBLENBQUEsSUFBQTtjQUFBO1lBQUE7Y0FBQSxTQUFBLENBQUEsSUFBQTtjQUFBLFNBQUEsQ0FBQSxFQUFBLEdBQUEsU0FBQTtZQUFBO1lBQUE7Y0FBQSxPQUFBLFNBQUEsQ0FBQSxJQUFBO1VBQUE7UUFBQSxHQUFBLFFBQUE7TUFBQSxDQU1qQjtNQUFBLGlCQUFBLEdBQUE7UUFBQSxPQUFBLEtBQUEsQ0FBQSxLQUFBLE9BQUEsU0FBQTtNQUFBO0lBQUEsSUFBQztFQUNWLENBQUMsQ0FBQztBQUNOLENBQUM7Ozs7Ozs7OztBQ3RFRCxJQUFBLGFBQUEsR0FBQSxPQUFBO0FBQ0EsSUFBQSxPQUFBLEdBQUEsT0FBQTtBQUVPLElBQU0sVUFBVSxHQUFBLE9BQUEsQ0FBQSxVQUFBLEdBQUcsWUFBWTtBQUUvQixJQUFNLEdBQUcsR0FBQSxPQUFBLENBQUEsR0FBQSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7RUFDNUIsT0FBTyxFQUFFO0lBQ0wsMEJBQTBCLEVBQUUsZ0NBQXdCO0lBQ3BELGVBQWUsRUFBRTtFQUNyQjtBQUNKLENBQUMsQ0FBQztBQUVLLElBQU0sT0FBTyxHQUFBLE9BQUEsQ0FBQSxPQUFBLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztFQUNoQyxPQUFPLEVBQUU7SUFDTCwwQkFBMEIsRUFBRSxnQ0FBd0I7SUFDcEQsZUFBZSxFQUFFO0VBQ3JCO0FBQ0osQ0FBQyxDQUFDO0FBRUYsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUM1QixVQUFBLE1BQU0sRUFBSTtFQUNOLElBQU0sS0FBSyxHQUFHLDBCQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7RUFDckMsSUFBSSxLQUFLLEVBQUU7SUFDUCxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxhQUFBLE1BQUEsQ0FBYSxLQUFLLENBQUU7RUFDdkQ7RUFDQSxPQUFPLE1BQU07QUFDakIsQ0FBQyxFQUNELFVBQUEsS0FBSyxFQUFJO0VBQ0wsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7QUFDekIsQ0FBQyxDQUFDO0FBRU4sT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQUMsUUFBUSxFQUFLO0VBQ3hDLE9BQU8sUUFBUTtBQUNuQixDQUFDLEVBQ0QsVUFBVSxLQUFLLEVBQUU7RUFDYixJQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsTUFBTTtFQUNwQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUU7SUFFMUQsZUFBZSxDQUFDLE1BQU0sR0FBRyxJQUFJO0lBQzdCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxlQUFlLENBQUM7TUFBRSxVQUFVLEVBQUU7SUFBcUIsQ0FBQyxDQUFDLEVBQUU7TUFBRSxPQUFPLEVBQUU7UUFBQyxlQUFlLEVBQUU7TUFBVTtJQUFDLENBQUMsQ0FBQyxDQUNoSSxJQUFJLENBQUMsVUFBQSxHQUFHLEVBQUk7TUFDVCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1FBQzdDLDBCQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDL0IsZUFBZSxDQUFDLE9BQU8sQ0FBQyxhQUFhLGFBQUEsTUFBQSxDQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFFO1FBRXpFLE9BQU8sS0FBSyxDQUFDLGVBQWUsQ0FBQztNQUNqQztJQUNKLENBQUMsQ0FBQztFQUNWO0VBQ0EsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztBQUNoQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbERDLElBQU0sd0JBQXdCLEdBQUEsT0FBQSxDQUFBLHdCQUFBLElBQUEscUJBQUEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLDBDQUEwQyxDQUFDLGNBQUEscUJBQUEsdUJBQWxFLHFCQUFBLENBQW9FLEtBQUs7QUFFMUcsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFO0VBQzdCLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFLEdBQUcsQ0FBQztBQUNqRTtBQUVPLFNBQVMsV0FBVyxDQUFDLEdBQUcsRUFBRTtFQUM3QixPQUFPLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUNuQixPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUNsQixPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztBQUNoQztBQUVPLFNBQVMsY0FBYyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7RUFDckMsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRTtJQUNuQixPQUFPLEdBQUc7RUFDZDtFQUNBLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsS0FBSztBQUNwQztBQUVPLElBQUksWUFBWSxHQUFBLE9BQUEsQ0FBQSxZQUFBLEdBQUcsUUFBUSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJO0FBRXRFLElBQUksb0JBQW9CLEdBQUEsT0FBQSxDQUFBLG9CQUFBLGdCQUFBLE1BQUEsQ0FBZ0Isa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUU7QUFFMUUsSUFBTSxhQUFhLEdBQUEsT0FBQSxDQUFBLGFBQUEsR0FBRywyREFBMkQ7QUFFakYsSUFBTSxPQUFPLEdBQUEsT0FBQSxDQUFBLE9BQUEsR0FBRyxTQUFWLE9BQU8sQ0FBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBSztFQUM1QyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxLQUFLLGFBQUwsS0FBSyxjQUFMLEtBQUssR0FBSSxHQUFHLEVBQUUsUUFBUSxDQUFDO0FBQzlDLENBQUM7QUFFTSxJQUFNLFNBQVMsR0FBQSxPQUFBLENBQUEsU0FBQSxHQUFHLFNBQVosU0FBUyxDQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFLO0VBQzlDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEtBQUssYUFBTCxLQUFLLGNBQUwsS0FBSyxHQUFJLEdBQUcsRUFBRSxRQUFRLENBQUM7QUFDaEQsQ0FBQztBQUVNLElBQU0sSUFBSSxHQUFBLE9BQUEsQ0FBQSxJQUFBLEdBQUcsU0FBUCxJQUFJLENBQUksRUFBRSxFQUFFLE9BQU8sRUFBSztFQUNqQyxJQUFJLE9BQU8sRUFBRSxLQUFLLFdBQVcsSUFBSSxFQUFFLEVBQUU7SUFDakMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUksT0FBTyxHQUFHLE9BQU8sR0FBRyxPQUFRO0VBQ3BEO0FBQ0osQ0FBQztBQUVNLElBQU0sSUFBSSxHQUFBLE9BQUEsQ0FBQSxJQUFBLEdBQUcsU0FBUCxJQUFJLENBQUksRUFBRSxFQUFLO0VBQ3hCLElBQUksT0FBTyxFQUFFLEtBQUssV0FBVyxJQUFJLEVBQUUsRUFBRTtJQUNqQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNO0VBQzdCO0FBQ0osQ0FBQztBQUVNLFNBQVMsVUFBVSxDQUFBLEVBQUc7RUFDekIsT0FBTyxrQ0FBa0MsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxFQUFFO0lBQ3BFLElBQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO01BQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBSTtJQUNyRSxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO0VBQ3pCLENBQUMsQ0FBQztBQUNOO0FBRU8sU0FBUyxjQUFjLENBQUEsRUFBRztFQUFBLElBQUEscUJBQUEsRUFBQSxzQkFBQTtFQUM3QixRQUFBLHFCQUFBLElBQUEsc0JBQUEsR0FBTyxRQUFRLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLGNBQUEsc0JBQUEsdUJBQXpDLHNCQUFBLENBQTJDLEtBQUssY0FBQSxxQkFBQSxjQUFBLHFCQUFBLEdBQUksT0FBTztBQUN0RTtBQUVPLFNBQVMsZUFBZSxDQUFBLEVBQUc7RUFBQSxJQUFBLHNCQUFBLEVBQUEsc0JBQUE7RUFDOUIsUUFBQSxzQkFBQSxJQUFBLHNCQUFBLEdBQU8sUUFBUSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFBLHNCQUFBLHVCQUExQyxzQkFBQSxDQUE0QyxLQUFLLGNBQUEsc0JBQUEsY0FBQSxzQkFBQSxHQUFJLEdBQUc7QUFDbkU7QUFFTyxTQUFTLGlCQUFpQixDQUFBLEVBQUc7RUFDaEMsT0FBUSxDQUFDLEVBQUUsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUU7SUFDeEMsS0FBSyxFQUFFLFVBQVU7SUFDakIsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzNCLHFCQUFxQixFQUFFLENBQUM7SUFDeEIscUJBQXFCLEVBQUU7RUFDM0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQztBQUVPLFNBQVMsY0FBYyxDQUFDLE1BQU0sRUFBRTtFQUNuQyxPQUFPLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFO0lBQzNDLEtBQUssRUFBRSxVQUFVO0lBQ2pCLFFBQVEsRUFBRSxlQUFlLENBQUM7RUFDOUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUNyQjs7Ozs7Ozs7O0FDMUVPLElBQU0sY0FBYyxHQUFBLE9BQUEsQ0FBQSxjQUFBLEdBQUcsU0FBakIsY0FBYyxDQUFJLEdBQUcsRUFBSztFQUNuQyxJQUFJLE9BQU8sV0FBVyxLQUFLLFdBQVcsRUFBRTtJQUNwQyxXQUFXLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQztFQUNuQyxDQUFDLE1BQU07SUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztFQUNwQjtBQUNKLENBQUM7Ozs7Ozs7Ozs7Ozs7O0lDTmEsUUFBUSxHQUFBLE9BQUEsQ0FBQSxRQUFBLG9CQUFBLGFBQUEsc0JBQUEsU0FBQTtFQUFBLElBQUEsZ0JBQUEsbUJBQUEsUUFBQTtBQUFBO0FBQUEsU0FBQSxHQUFSLFFBQVE7QUFBQSxJQUFBLGdCQUFBLGFBQVIsUUFBUSxjQUVBLEtBQUs7QUFBQSxJQUFBLGdCQUFBLGFBRmIsUUFBUSxZQUlGLFVBQUMsT0FBTyxFQUFLO0VBRXpCLElBQUcsU0FBQSxDQUFLLFFBQVEsRUFDWjtFQUVKLElBQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO0VBQ2hELFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztFQUVyQyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxRQUFRLENBQUMsSUFBSSxRQUFRLENBQUMsSUFBSTtFQUN2RSxVQUFVLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxJQUFJLEtBQUksYUFBYSxDQUFDO0VBQ3BFLElBQUksUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsUUFBUSxDQUFDLEVBQUU7SUFDM0MsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsVUFBVTtJQUV0QyxTQUFBLENBQUssUUFBUSxHQUFHLElBQUk7RUFDeEI7RUFFQSxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQztBQUNsQyxDQUFDO0FBQUEsSUFBQSxnQkFBQSxhQXJCUyxRQUFRLGNBdUJBLFlBQU07RUFDcEIsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUM7RUFDbEQsSUFBSSxPQUFPLEVBQUU7SUFDVCxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUM7SUFDdEMsVUFBVSxDQUFDLFlBQU07TUFDYixJQUFJLE9BQU8sRUFBRTtRQUFBLElBQUEscUJBQUE7UUFDVCxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUM7UUFDekMsQ0FBQSxxQkFBQSxHQUFBLE9BQU8sQ0FBQyxhQUFhLGNBQUEscUJBQUEsZUFBckIscUJBQUEsQ0FBdUIsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUUzQyxTQUFBLENBQUssUUFBUSxHQUFHLEtBQUs7TUFDekI7SUFDSixDQUFDLEVBQUUsR0FBRyxDQUFDO0VBQ1g7QUFDSixDQUFDOzs7Ozs7Ozs7Ozs7QUNwQ0w7QUFBQSxJQUNhLFlBQVksR0FBQSxPQUFBLENBQUEsWUFBQTtFQUFBLFNBQUEsYUFBQTtJQUFBLElBQUEsZ0JBQUEsbUJBQUEsWUFBQTtFQUFBO0VBQUEsV0FBQSxhQUFBLGFBQUEsWUFBQTtJQUFBLEdBQUE7SUFBQSxLQUFBLEVBRXJCLFNBQU8sUUFBUSxDQUFDLFFBQVEsRUFBRTtNQUN0QixZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDO01BQ3BELFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFDckQ7RUFBQztJQUFBLEdBQUE7SUFBQSxLQUFBLEVBRUQsU0FBTyxRQUFRLENBQUEsRUFBRztNQUNkLE9BQU8sWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDeEM7RUFBQztJQUFBLEdBQUE7SUFBQSxLQUFBLEVBRUQsU0FBTyxVQUFVLENBQUEsRUFBRztNQUNoQixZQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztNQUNoQyxZQUFZLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQztJQUN6QztFQUFDO0FBQUE7Ozs7Ozs7Ozs7Ozs7O0lDZlMsYUFBYSxHQUFBLE9BQUEsQ0FBQSxhQUFBO0VBQUEsU0FBQSxjQUFBO0lBQUEsSUFBQSxnQkFBQSxtQkFBQSxhQUFBO0VBQUE7RUFBQSxXQUFBLGFBQUEsYUFBQSxhQUFBO0lBQUEsR0FBQTtJQUFBLEtBQUEsRUFLdkIsU0FBTyxJQUFJLENBQUEsRUFBRztNQUNWLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsWUFBWTtRQUV4QyxJQUFNLGtCQUFrQixHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDO1FBQ3hGLElBQUksa0JBQWtCLEVBQUU7VUFFcEIsSUFBSSxNQUFNLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQztVQUN6RCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNuQixXQUFXLENBQUM7Y0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQztjQUFFLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTTtZQUFDLENBQUMsQ0FBQztZQUUvRCxhQUFhLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7VUFDekU7UUFDSjtRQUVBLElBQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQztRQUMxRSxJQUFJLFdBQVcsRUFBRTtVQUViLElBQUksT0FBTSxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDO1VBQ2xELElBQUksT0FBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ25CLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO2NBQUUsS0FBSyxFQUFFLE9BQU0sQ0FBQyxPQUFPLENBQUM7Y0FBRSxJQUFJLEVBQUUsT0FBTSxDQUFDLFNBQVM7WUFBQyxDQUFDLENBQUM7VUFDaEY7VUFDQSxhQUFhLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2xFO01BQ0osQ0FBQyxDQUFDO0lBQ047RUFBQztJQUFBLEdBQUE7SUFBQSxLQUFBLEVBRUQsU0FBTyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUU7TUFDaEMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFlBQUEsTUFBQSxDQUFZLEtBQUssa0JBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyRTs7SUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU5JO0lBQUEsR0FBQTtJQUFBLEtBQUEsRUE4RUEsU0FBTyxTQUFTLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUU7TUFDekMsSUFBSSxPQUFPLEdBQUcsRUFBRTtNQUNoQixJQUFJLE9BQU8sRUFBRTtRQUNULElBQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBSSxPQUFPLEdBQUcsRUFBRSxHQUFHLElBQUssQ0FBQztRQUNwRCxPQUFPLEdBQUcsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztNQUMvQztNQUVBLFFBQVEsQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLEdBQUcsSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDLEdBQUcsT0FBTyxHQUFHLFVBQVU7SUFDN0U7RUFBQztJQUFBLEdBQUE7SUFBQSxLQUFBLEVBRUQsU0FBTyxTQUFTLENBQUMsVUFBVSxFQUFFO01BQ3pCLElBQUksTUFBTSxHQUFHLFVBQVUsR0FBRyxHQUFHO01BQzdCLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztNQUNuQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNoQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2IsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN4RCxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO1VBQ3pCLElBQUksS0FBSyxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7VUFDcEUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3RCO01BQ0o7TUFFQSxPQUFPLElBQUk7SUFDZjtFQUFDO0lBQUEsR0FBQTtJQUFBLEtBQUEsRUFFRCxTQUFPLFVBQVUsQ0FBQyxXQUFXLEVBQUU7TUFDM0IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO01BQ2QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUM7TUFDckYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbkMsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDOUIsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztNQUMxRTtNQUNBLE9BQU8sS0FBSztJQUNoQjtFQUFDO0FBQUE7QUFBQSxJQUFBLGdCQUFBLGFBbkpTLGFBQWEsNEJBRVMsZ0JBQWdCO0FBQUEsSUFBQSxnQkFBQSxhQUZ0QyxhQUFhLHFCQUdFLGdCQUFnQjtBQUFBLElBQUEsZ0JBQUEsYUFIL0IsYUFBYSxpQkEwQ0YsVUFBQyxPQUFPLEVBQUs7RUFDOUIsT0FBTyxDQUFDLElBQUksR0FBRyxTQUFTO0VBRXhCLFdBQVcsQ0FBQyxPQUFPLENBQUM7QUFDeEIsQ0FBQztBQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkksSUFBQSxnQkFBQSxhQWhEVSxhQUFhLGVBdURKLFVBQUMsT0FBTyxFQUFLO0VBQzVCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsT0FBTztFQUV0QixXQUFXLENBQUMsT0FBTyxDQUFDO0FBQ3hCLENBQUM7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5JLElBQUEsZ0JBQUEsYUE3RFUsYUFBYSxpQkFvRUYsVUFBQyxPQUFPLEVBQUs7RUFDOUIsT0FBTyxDQUFDLElBQUksR0FBRyxTQUFTO0VBRXhCLFdBQVcsQ0FBQyxPQUFPLENBQUM7QUFDeEIsQ0FBQztBQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkksSUFBQSxnQkFBQSxhQTFFVSxhQUFhLGNBaUZMLFVBQUMsT0FBTyxFQUFLO0VBQzNCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsU0FBUztFQUV4QixXQUFXLENBQUMsT0FBTyxDQUFDO0FBQ3hCLENBQUM7QUFBQSxJQUFBLGdCQUFBLGFBckZTLGFBQWEsY0FBQSxLQUFBLEdBdUZOLElBQUksY0FBQSxLQUFBLHVCQUFKLEtBQUEsQ0FBTSxLQUFLLENBQUM7RUFDekIsaUJBQWlCLEVBQUUsSUFBSTtFQUN2QixjQUFjLEVBQUUsSUFBSTtFQUNwQixjQUFjLEVBQUUsSUFBSTtFQUNwQixXQUFXLEVBQUU7SUFDVCxPQUFPLEVBQUUsc0NBQXNDO0lBQy9DLGFBQWEsRUFBRSxpREFBaUQ7SUFDaEUsVUFBVSxFQUFFLGdEQUFnRDtJQUM1RCxLQUFLLEVBQUU7RUFDWCxDQUFDO0VBQ0QsaUJBQWlCLEVBQUUsNkNBQTZDO0VBQ2hFLGNBQWMsRUFBRTtBQUNwQixDQUFDLENBQUM7QUFBQSxJQUFBLGdCQUFBLGFBbkdRLGFBQWEsV0FxR1IsSUFBSSxDQUFDLEtBQUssQ0FBQztFQUN0QixpQkFBaUIsRUFBRSxJQUFJO0VBQ3ZCLGNBQWMsRUFBRSxLQUFLO0VBQ3JCLGNBQWMsRUFBRSxLQUFLO0VBQ3JCLFdBQVcsRUFBRTtJQUNULE9BQU8sRUFBRSxxQ0FBcUM7SUFDOUMsYUFBYSxFQUFFLHVEQUF1RDtJQUN0RSxLQUFLLEVBQUU7RUFDWCxDQUFDO0VBQ0QsaUJBQWlCLEVBQUU7QUFDdkIsQ0FBQyxDQUFDO0FBdUNOLElBQUksU0FBUztBQUViLElBQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxPQUFPLDhlQWF2QyxDQUFDO0FBRUYsSUFBTSxlQUFlLEdBQUcsU0FBbEIsZUFBZSxDQUFBLEVBQVM7RUFDMUIsSUFBRyxTQUFTLEVBQ1IsT0FBTyxTQUFTO0VBRXBCLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztFQUN6QyxTQUFTLENBQUMsRUFBRSxHQUFHLFVBQVU7RUFFekIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO0VBRXBDLE9BQU8sU0FBUztBQUNwQixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBTSxXQUFXLEdBQUcsU0FBZCxXQUFXLENBQUksT0FBTyxFQUFLO0VBQUEsSUFBQSxnQkFBQTtFQUU3QixJQUFNLE9BQU8sSUFBQSxnQkFBQSxHQUFHLE9BQU8sQ0FBQyxPQUFPLGNBQUEsZ0JBQUEsY0FBQSxnQkFBQSxHQUFJLElBQUk7RUFFdkMsSUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7RUFDM0MsS0FBSyxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDO0VBRXhDLGVBQWUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztFQUNwQyxLQUFLLENBQUMsU0FBUyxZQUFBLE1BQUEsQ0FBWSxPQUFPLENBQUMsSUFBSSxVQUFPO0VBRTlDLElBQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO0VBQ2xELFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsVUFBQyxDQUFDLEVBQUs7SUFDekMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRWxCLFNBQVMsQ0FBQyxDQUFDO0VBQ2YsQ0FBQyxDQUFDO0VBRUYsSUFBRyxPQUFPLEdBQUcsQ0FBQyxFQUFFO0lBQ1osVUFBVSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUM7RUFDbEM7RUFFQSxTQUFTLFNBQVMsQ0FBQSxFQUFHO0lBQ2pCLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztFQUNsQjtBQUNKLENBQUM7OztBQ3BORDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMWJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDamVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1UEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNySEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCJpbXBvcnQge2FwaSwgYXV0aEFwaX0gZnJvbSBcIi4uLy4uL3NyYy9hcGlcIjtcbmltcG9ydCB7Tm90aWZpY2F0aW9uc30gZnJvbSBcIi4uLy4uL3NyYy9ub3RpZmljYXRpb25zXCI7XG5pbXBvcnQge0ZyZWV6ZVVJfSBmcm9tIFwiLi4vLi4vc3JjL2ZyZWV6ZS11aVwiO1xuaW1wb3J0IHtTb3J0YWJsZX0gZnJvbSAnQHNob3BpZnkvZHJhZ2dhYmxlJztcbmltcG9ydCB7dHJhY2tFeGNlcHRpb259IGZyb20gXCIuLi8uLi9zcmMvZXJyb3JzXCI7XG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsICgpID0+IHtcblxuICAgIGluaXRDYW5jZWxBdXRvUmVuZXcoKTtcblxuICAgIGlmICh0eXBlb2YgU29ydGFibGUgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgIHJldHVybjtcblxuICAgIGNvbnN0IHNvcnRhYmxlID0gbmV3IFNvcnRhYmxlKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjcGFja2FnZXNcIiksIHtcbiAgICAgICAgZHJhZ2dhYmxlOiBcIltkYXRhLXBhY2thZ2UtaWRdXCIsXG4gICAgICAgIGhhbmRsZTogXCJbZGF0YS1wYWNrYWdlLWlkXSAuaGFuZGxlXCIsXG4gICAgICAgIG1pcnJvcjoge1xuICAgICAgICAgICAgYXBwZW5kVG86IFwiYm9keVwiLFxuICAgICAgICAgICAgY29uc3RyYWluRGltZW5zaW9uczogdHJ1ZVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBzb3J0YWJsZS5vbihcInNvcnRhYmxlOnN0b3BcIiwgYXN5bmMgKGUpID0+IHtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgRnJlZXplVUkuRnJlZXplKCk7XG4gICAgICAgICAgICBhd2FpdCBhcGkucG9zdChcIj9IYW5kbGVyPVNldE9yZGVyXCIsIHtcbiAgICAgICAgICAgICAgICBpZDogZS5kYXRhLmRyYWdFdmVudC5kYXRhLm9yaWdpbmFsU291cmNlLmRhdGFzZXQucGFja2FnZUlkLFxuICAgICAgICAgICAgICAgIG5ld0luZGV4OiBlLmRhdGEubmV3SW5kZXgsXG4gICAgICAgICAgICAgICAgb2xkSW5kZXg6IGUuZGF0YS5vbGRJbmRleFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIE5vdGlmaWNhdGlvbnMuc2hvd1N1Y2Nlc3MoeyBtZXNzYWdlOiBcIlNhdmVkIVwiIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIE5vdGlmaWNhdGlvbnMuc2hvd0Vycm9yKHsgbWVzc2FnZTogXCJUaGVyZSB3YXMgYSBwcm9ibGVtIHNhdmluZyB0aGUgbmV3IG9yZGVyLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLlwiIH0pXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBGcmVlemVVSS5VbkZyZWV6ZSgpO1xuICAgICAgICB9XG4gICAgfSk7XG59KTtcblxuY29uc3QgaW5pdENhbmNlbEF1dG9SZW5ldyA9ICgpID0+IHtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiW2RhdGEtY2FuY2VsLXJlbmV3YWxdXCIpPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBOb3RpZmljYXRpb25zLmNvbmZpcm0uZmlyZSh7XG4gICAgICAgICAgICB0ZXh0OiBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNhbmNlbCB5b3VyIHJlbmV3YWw/IFRoaXMgY2Fubm90IGJlIHVuZG9uZSBhbmQgeW91IHdpbGwgbmVlZCB0byByZWpvaW4gbWFudWFsbHkuYFxuICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oYXN5bmMgcmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzQ29uZmlybWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIEZyZWV6ZVVJLkZyZWV6ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBhdXRoQXBpLnBvc3QoXCI/SGFuZGxlcj1DYW5jZWxSZW5ld2FsXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9ucy5zZXROb3RpZmljYXRpb25Db29raWUoXCJUaGUgcmVuZXdhbCBoYXMgYmVlbiBjYW5jZWxsZWQuXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrRXhjZXB0aW9uKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbnMuc2hvd0Vycm9yKHsgbWVzc2FnZTogXCJUaGVyZSB3YXMgYSBwcm9ibGVtIGNhbmNlbGxpbmcgdGhlIHJlbmV3YWwuXCIgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfSlcbn1cbiIsImltcG9ydCB7TG9jYWxTdG9yYWdlfSBmcm9tIFwiLi9sb2NhbFN0b3JhZ2VcIjtcbmltcG9ydCB7cmVxdWVzdFZlcmlmaWNhdGlvblRva2VufSBmcm9tIFwiLi9jb21tb25cIjtcblxuZXhwb3J0IGNvbnN0IGFwaVZlcnNpb24gPSBcIjIwMjMtMDItMjFcIjtcblxuZXhwb3J0IGNvbnN0IGFwaSA9IGF4aW9zLmNyZWF0ZSh7XG4gICAgaGVhZGVyczoge1xuICAgICAgICBcIlJlcXVlc3RWZXJpZmljYXRpb25Ub2tlblwiOiByZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW4sXG4gICAgICAgIFwieC1hcGktdmVyc2lvblwiOiBhcGlWZXJzaW9uXG4gICAgfVxufSk7XG5cbmV4cG9ydCBjb25zdCBhdXRoQXBpID0gYXhpb3MuY3JlYXRlKHtcbiAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuXCI6IHJlcXVlc3RWZXJpZmljYXRpb25Ub2tlbixcbiAgICAgICAgXCJ4LWFwaS12ZXJzaW9uXCI6IGFwaVZlcnNpb25cbiAgICB9XG59KTtcblxuYXV0aEFwaS5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoXG4gICAgY29uZmlnID0+IHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSBMb2NhbFN0b3JhZ2UuZ2V0VG9rZW4oKTtcbiAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICBjb25maWcuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gYEJlYXJlciAke3Rva2VufWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9LFxuICAgIGVycm9yID0+IHtcbiAgICAgICAgUHJvbWlzZS5yZWplY3QoZXJyb3IpXG4gICAgfSk7XG5cbmF1dGhBcGkuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlXG4gICAgfSxcbiAgICBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxSZXF1ZXN0ID0gZXJyb3IuY29uZmlnO1xuICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2Uuc3RhdHVzID09PSA0MDEgJiYgIW9yaWdpbmFsUmVxdWVzdC5fcmV0cnkpIHtcblxuICAgICAgICAgICAgb3JpZ2luYWxSZXF1ZXN0Ll9yZXRyeSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gYXhpb3MucG9zdCgnL2FwaS90b2tlbicsIG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBncmFudF90eXBlOiAnY2xpZW50X2NyZWRlbnRpYWxzJyB9KSwgeyBoZWFkZXJzOiB7XCJ4LWFwaS12ZXJzaW9uXCI6IGFwaVZlcnNpb259fSlcbiAgICAgICAgICAgICAgICAudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzLnN0YXR1cyA9PT0gMjAwICYmIHJlcy5kYXRhLmFjY2Vzc190b2tlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxTdG9yYWdlLnNldFRva2VuKHJlcy5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsUmVxdWVzdC5oZWFkZXJzLkF1dGhvcml6YXRpb24gPSBgQmVhcmVyICR7cmVzLmRhdGEuYWNjZXNzX3Rva2VufWA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBheGlvcyhvcmlnaW5hbFJlcXVlc3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9KTtcbiIsImV4cG9ydCBjb25zdCByZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwiX19SZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW5cIl0nKT8udmFsdWU7XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRDb21tYXModmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCAnLCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVVcmwodXJsKSB7XG4gICAgcmV0dXJuIHVybC50b0xvd2VyQ2FzZSgpXG4gICAgICAgIC5yZXBsYWNlKC8gL2csICctJylcbiAgICAgICAgLnJlcGxhY2UoL1teXFx3LV0rL2csICcnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRydW5jYXRlU3RyaW5nKHN0ciwgbnVtKSB7XG4gICAgaWYgKHN0ci5sZW5ndGggPD0gbnVtKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIHJldHVybiBzdHIuc2xpY2UoMCwgbnVtKSArICcuLi4nO1xufVxuXG5leHBvcnQgbGV0IHBhdGhBbmRRdWVyeSA9IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoICsgbG9jYXRpb24uaGFzaDtcblxuZXhwb3J0IGxldCByZXR1cm5VcmxRdWVyeVN0cmluZyA9IGByZXR1cm51cmw9JHtlbmNvZGVVUklDb21wb25lbnQocGF0aEFuZFF1ZXJ5KX1gO1xuXG5leHBvcnQgY29uc3QgYXJjaGl2ZWRCYWRnZSA9IFwiPHNwYW4gY2xhc3M9XFxcImJhZGdlIGJhZGdlLWxpZ2h0LXByaW1hcnlcXFwiPkFyY2hpdmVkPC9zcGFuPlwiO1xuXG5leHBvcnQgY29uc3Qgc2xpZGVVcCA9IChlbCwgc3BlZWQsIGNhbGxiYWNrKSA9PiB7XG4gICAgS1RVdGlsLnNsaWRlVXAoZWwsIHNwZWVkID8/IDI1MCwgY2FsbGJhY2spO1xufVxuXG5leHBvcnQgY29uc3Qgc2xpZGVEb3duID0gKGVsLCBzcGVlZCwgY2FsbGJhY2spID0+IHtcbiAgICBLVFV0aWwuc2xpZGVEb3duKGVsLCBzcGVlZCA/PyAyNTAsIGNhbGxiYWNrKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNob3cgPSAoZWwsIGRpc3BsYXkpID0+IHtcbiAgICBpZiAodHlwZW9mIGVsICE9PSAndW5kZWZpbmVkJyAmJiBlbCkge1xuICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gKGRpc3BsYXkgPyBkaXNwbGF5IDogJ2Jsb2NrJyk7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgaGlkZSA9IChlbCkgPT4ge1xuICAgIGlmICh0eXBlb2YgZWwgIT09ICd1bmRlZmluZWQnICYmIGVsKSB7XG4gICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVVVJRCgpIHtcbiAgICByZXR1cm4gJ3h4eHh4eHh4eHh4eDR4eHh5eHh4eHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIGNvbnN0IHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3VycmVudEN1bHR1cmUoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY3VycmVudEN1bHR1cmVcIik/LnZhbHVlID8/IFwiZW4tZ2JcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1cnJlbnRDdXJyZW5jeSgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjdXJyZW50Q3VycmVuY3lcIik/LnZhbHVlID8/IFwiwqNcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbmN5U3ltYm9sKCkge1xuICAgIHJldHVybiAoMCkudG9Mb2NhbGVTdHJpbmcoY3VycmVudEN1bHR1cmUoKSwge1xuICAgICAgICBzdHlsZTogJ2N1cnJlbmN5JyxcbiAgICAgICAgY3VycmVuY3k6IGN1cnJlbnRDdXJyZW5jeSgpLFxuICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IDAsXG4gICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogMFxuICAgIH0pLnJlcGxhY2UoL1xcZC9nLCAnJykudHJpbSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0Q3VycmVuY3koYW1vdW50KSB7XG4gICAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdChjdXJyZW50Q3VsdHVyZSgpLCB7XG4gICAgICAgIHN0eWxlOiBcImN1cnJlbmN5XCIsXG4gICAgICAgIGN1cnJlbmN5OiBjdXJyZW50Q3VycmVuY3koKSxcbiAgICB9KS5mb3JtYXQoYW1vdW50KTtcbn1cbiIsImV4cG9ydCBjb25zdCB0cmFja0V4Y2VwdGlvbiA9IChlcnIpID0+IHtcbiAgICBpZiAodHlwZW9mIGFwcEluc2lnaHRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBhcHBJbnNpZ2h0cy50cmFja0V4Y2VwdGlvbihlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgfVxufVxuIiwi77u/ZXhwb3J0IGNsYXNzIEZyZWV6ZVVJIHtcblxuICAgIHN0YXRpYyBpc0Zyb3plbiA9IGZhbHNlO1xuXG4gICAgc3RhdGljIEZyZWV6ZSA9IChvcHRpb25zKSA9PiB7XG5cbiAgICAgICAgaWYodGhpcy5pc0Zyb3plbilcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBmcmVlemVIdG1sID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGZyZWV6ZUh0bWwuY2xhc3NMaXN0LmFkZCgnZnJlZXplLXVpJyk7XG5cbiAgICAgICAgbGV0IHBhcmVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iob3B0aW9ucz8uc2VsZWN0b3IpIHx8IGRvY3VtZW50LmJvZHk7XG4gICAgICAgIGZyZWV6ZUh0bWwuc2V0QXR0cmlidXRlKCdkYXRhLXRleHQnLCBvcHRpb25zPy50ZXh0IHx8ICdQbGVhc2Ugd2FpdCcpO1xuICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihvcHRpb25zPy5zZWxlY3RvcikpIHtcbiAgICAgICAgICAgIGZyZWV6ZUh0bWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXG4gICAgICAgICAgICB0aGlzLmlzRnJvemVuID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChmcmVlemVIdG1sKTtcbiAgICB9O1xuXG4gICAgc3RhdGljIFVuRnJlZXplID0gKCkgPT4ge1xuICAgICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mcmVlemUtdWknKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaXMtdW5mcmVlemluZycpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdpcy11bmZyZWV6aW5nJyk7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucGFyZW50RWxlbWVudD8ucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Zyb3plbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDI1MCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuIiwiLy8gTG9jYWxTdG9yYWdlU2VydmljZS5qc1xuZXhwb3J0IGNsYXNzIExvY2FsU3RvcmFnZSB7XG5cbiAgICBzdGF0aWMgc2V0VG9rZW4odG9rZW5PYmopIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJ0b2tlblwiLCB0b2tlbk9iai5hY2Nlc3NfdG9rZW4pO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImV4cGlyZXNcIiwgdG9rZW5PYmouZXhwaXJlcyk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFRva2VuKCkge1xuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ0b2tlblwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY2xlYXJUb2tlbigpIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJ0b2tlblwiKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJleHBpcmF0aW9uXCIpO1xuICAgIH1cbn1cbiIsIu+7v2V4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25zIHtcblxuICAgIHN0YXRpYyBub3RpZmljYXRpb25Db29raWVOYW1lID0gXCIuY2x1YnBhbC50b2FzdFwiO1xuICAgIHN0YXRpYyBhbGVydENvb2tpZU5hbWUgPSBcIi5jbHVicGFsLmFsZXJ0XCI7XG5cbiAgICBzdGF0aWMgaW5pdCgpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbkNvb2tpZSA9IE5vdGlmaWNhdGlvbnMuZ2V0Q29va2llKE5vdGlmaWNhdGlvbnMubm90aWZpY2F0aW9uQ29va2llTmFtZSk7XG4gICAgICAgICAgICBpZiAobm90aWZpY2F0aW9uQ29va2llKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gTm90aWZpY2F0aW9ucy5wYXJzZVF1ZXJ5KG5vdGlmaWNhdGlvbkNvb2tpZSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlc1tcIm1lc3NhZ2VcIl0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2Uoe21lc3NhZ2U6IHZhbHVlc1tcIm1lc3NhZ2VcIl0sIHR5cGU6IHZhbHVlc1tcInR5cGVcIl19KTtcblxuICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25zLnNldENvb2tpZShOb3RpZmljYXRpb25zLm5vdGlmaWNhdGlvbkNvb2tpZU5hbWUsIFwiXCIsIC0xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGFsZXJ0Q29va2llID0gTm90aWZpY2F0aW9ucy5nZXRDb29raWUoTm90aWZpY2F0aW9ucy5hbGVydENvb2tpZU5hbWUpO1xuICAgICAgICAgICAgaWYgKGFsZXJ0Q29va2llKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gTm90aWZpY2F0aW9ucy5wYXJzZVF1ZXJ5KGFsZXJ0Q29va2llKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVzW1wibWVzc2FnZVwiXSkge1xuICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25zLmFsZXJ0LmZpcmUoeyB0aXRsZTogdmFsdWVzW1widGl0bGVcIl0sIGh0bWw6IHZhbHVlc1tcIm1lc3NhZ2VcIl19KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgTm90aWZpY2F0aW9ucy5zZXRDb29raWUoTm90aWZpY2F0aW9ucy5hbGVydENvb2tpZU5hbWUsIFwiXCIsIC0xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIHNldE5vdGlmaWNhdGlvbkNvb2tpZSh0aXRsZSkge1xuICAgICAgICBOb3RpZmljYXRpb25zLnNldENvb2tpZShidG9hKGBtZXNzYWdlPSR7dGl0bGV9JnR5cGU9c3VjY2Vzc2ApLCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gT3B0aW9uc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm1lc3NhZ2UgLSBUaGUgbWVzc2FnZSBmb3IgdGhlIG5vdGlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy50aXRsZV0gLSBBbiBvcHRpb25hbCB0aXRsZSBmb3IgdGhlIG5vdGlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy50aW1lb3V0XSAtIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBzaG93IHRoZSBub3RpZmljYXRpb24uIFNldCB0byAwIHRvIG5vdCBhdXRvLWhpZGUuXG4gICAgICovXG4gICAgc3RhdGljIHNob3dTdWNjZXNzID0gKG9wdGlvbnMpID0+IHtcbiAgICAgICAgb3B0aW9ucy50eXBlID0gXCJzdWNjZXNzXCI7XG5cbiAgICAgICAgc2hvd01lc3NhZ2Uob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5tZXNzYWdlIC0gVGhlIG1lc3NhZ2UgZm9yIHRoZSBub3RpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudGl0bGVdIC0gQW4gb3B0aW9uYWwgdGl0bGUgZm9yIHRoZSBub3RpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGltZW91dF0gLSBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gc2hvdyB0aGUgbm90aWZpY2F0aW9uLiBTZXQgdG8gMCB0byBub3QgYXV0by1oaWRlLlxuICAgICAqL1xuICAgIHN0YXRpYyBzaG93RXJyb3IgPSAob3B0aW9ucykgPT4ge1xuICAgICAgICBvcHRpb25zLnR5cGUgPSBcImVycm9yXCI7XG5cbiAgICAgICAgc2hvd01lc3NhZ2Uob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5tZXNzYWdlIC0gVGhlIG1lc3NhZ2UgZm9yIHRoZSBub3RpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudGl0bGVdIC0gQW4gb3B0aW9uYWwgdGl0bGUgZm9yIHRoZSBub3RpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGltZW91dF0gLSBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gc2hvdyB0aGUgbm90aWZpY2F0aW9uLiBTZXQgdG8gMCB0byBub3QgYXV0by1oaWRlLlxuICAgICAqL1xuICAgIHN0YXRpYyBzaG93V2FybmluZyA9IChvcHRpb25zKSA9PiB7XG4gICAgICAgIG9wdGlvbnMudHlwZSA9IFwid2FybmluZ1wiO1xuXG4gICAgICAgIHNob3dNZXNzYWdlKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubWVzc2FnZSAtIFRoZSBtZXNzYWdlIGZvciB0aGUgbm90aWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnRpdGxlXSAtIEFuIG9wdGlvbmFsIHRpdGxlIGZvciB0aGUgbm90aWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnRpbWVvdXRdIC0gVGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHNob3cgdGhlIG5vdGlmaWNhdGlvbi4gU2V0IHRvIDAgdG8gbm90IGF1dG8taGlkZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgc2hvd0luZm8gPSAob3B0aW9ucykgPT4ge1xuICAgICAgICBvcHRpb25zLnR5cGUgPSBcIndhcm5pbmdcIjtcblxuICAgICAgICBzaG93TWVzc2FnZShvcHRpb25zKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29uZmlybSA9IFN3YWw/Lm1peGluKHtcbiAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IHRydWUsXG4gICAgICAgIHNob3dEZW55QnV0dG9uOiB0cnVlLFxuICAgICAgICByZXZlcnNlQnV0dG9uczogdHJ1ZSxcbiAgICAgICAgY3VzdG9tQ2xhc3M6IHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHctMTAwXCIsXG4gICAgICAgICAgICBjb25maXJtQnV0dG9uOiBcInB4LTEwIGJ0biBidG4tcHJpbWFyeSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIsXG4gICAgICAgICAgICBkZW55QnV0dG9uOiBcInB4LTEwIGJ0biBidG4tZGFuZ2VyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIixcbiAgICAgICAgICAgIGlucHV0OiAnJ1xuICAgICAgICB9LFxuICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJzxpIGNsYXNzPVwiYmkgYmktY2hlY2stY2lyY2xlIGZzLTNcIj48L2k+IFllcycsXG4gICAgICAgIGRlbnlCdXR0b25UZXh0OiAnPGkgY2xhc3M9XCJiaSBiaS14LWNpcmNsZSBmcy0zXCI+PC9pPiBObycsXG4gICAgfSk7XG5cbiAgICBzdGF0aWMgYWxlcnQgPSBTd2FsLm1peGluKHtcbiAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IHRydWUsXG4gICAgICAgIHNob3dEZW55QnV0dG9uOiBmYWxzZSxcbiAgICAgICAgcmV2ZXJzZUJ1dHRvbnM6IGZhbHNlLFxuICAgICAgICBjdXN0b21DbGFzczoge1xuICAgICAgICAgICAgYWN0aW9uczogXCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciB3LTEwMFwiLFxuICAgICAgICAgICAgY29uZmlybUJ1dHRvbjogXCJweC0xMCBidG4gYnRuLWxpZ2h0LXByaW1hcnkgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiLFxuICAgICAgICAgICAgaW5wdXQ6ICcnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAnT0shJ1xuICAgIH0pO1xuXG4gICAgc3RhdGljIHNldENvb2tpZShjb29raWVOYW1lLCB2YWx1ZSwgbWludXRlcykge1xuICAgICAgICBsZXQgZXhwaXJlcyA9IFwiXCI7XG4gICAgICAgIGlmIChtaW51dGVzKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIChtaW51dGVzICogNjAgKiAxMDAwKSk7XG4gICAgICAgICAgICBleHBpcmVzID0gXCI7IGV4cGlyZXM9XCIgKyBkYXRlLnRvVVRDU3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBkb2N1bWVudC5jb29raWUgPSBjb29raWVOYW1lICsgXCI9XCIgKyAodmFsdWUgfHwgXCJcIikgKyBleHBpcmVzICsgXCI7IHBhdGg9L1wiO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRDb29raWUoY29va2llTmFtZSkge1xuICAgICAgICBsZXQgbmFtZUVRID0gY29va2llTmFtZSArIFwiPVwiO1xuICAgICAgICBsZXQgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGMgPSBjYVtpXTtcbiAgICAgICAgICAgIHdoaWxlIChjLmNoYXJBdCgwKSA9PT0gJyAnKSBjID0gYy5zdWJzdHJpbmcoMSwgYy5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKGMuaW5kZXhPZihuYW1lRVEpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KGMuc3Vic3RyaW5nKG5hbWVFUS5sZW5ndGgsIGMubGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF0b2IodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlUXVlcnkocXVlcnlTdHJpbmcpIHtcbiAgICAgICAgbGV0IHF1ZXJ5ID0ge307XG4gICAgICAgIGxldCBwYWlycyA9IChxdWVyeVN0cmluZ1swXSA9PT0gJz8nID8gcXVlcnlTdHJpbmcuc3Vic3RyKDEpIDogcXVlcnlTdHJpbmcpLnNwbGl0KCcmJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBwYWlyID0gcGFpcnNbaV0uc3BsaXQoJz0nKTtcbiAgICAgICAgICAgIHF1ZXJ5W2RlY29kZVVSSUNvbXBvbmVudChwYWlyWzBdKV0gPSBkZWNvZGVVUklDb21wb25lbnQocGFpclsxXSB8fCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHF1ZXJ5O1xuICAgIH1cbn1cblxubGV0IGNvbnRhaW5lcjtcblxuY29uc3QgYWxlcnRUZW1wbGF0ZSA9IEhhbmRsZWJhcnMuY29tcGlsZShgXG4gICAgPGRpdj5cbiAgICAgICAge3sjaWYgdGl0bGV9fVxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtNSBmdy1ib2xkIG1iLTJcIj57e3RpdGxlfX08L2Rpdj5cbiAgICAgICAge3svaWZ9fVxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBmcy02XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTFcIj5cbiAgICAgICAgICAgICAgICB7e21lc3NhZ2V9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YSBjbGFzcz1cImNsb3NlXCIgaHJlZj1cIiNcIj48aSBjbGFzcz1cImJpLXggZnMtMnggdGV4dC1ncmF5LTUwMFwiPjwvaT48L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyLWNvbnRhaW5lclwiPjxkaXYgY2xhc3M9XCJ0aW1lci1wcm9ncmVzcy1iYXIgdy01MFwiPC9kaXY+XG4gICAgPC9kaXY+XG5gKTtcblxuY29uc3QgZW5zdXJlQ29udGFpbmVyID0gKCkgPT4ge1xuICAgIGlmKGNvbnRhaW5lcilcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcblxuICAgIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY29udGFpbmVyLmlkID0gXCJzbmFja2JhclwiO1xuXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuXG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gT3B0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubWVzc2FnZSAtIFRoZSBtZXNzYWdlIGZvciB0aGUgbm90aWZpY2F0aW9uXG4gKiBAcGFyYW0geyhcInN1Y2Nlc3NcIiB8IFwid2FybmluZ1wiIHwgXCJlcnJvclwiIHwgXCJpbmZvXCIpfSBvcHRpb25zLnR5cGUgLSBUaGUgdHlwZSBvZiBub3RpZmljYXRpb24gdG8gZGlzcGxheS4gT3B0aW9ucyBhcmUgc3VjY2Vzcywgd2FybmluZywgZXJyb3IsIGluZm8uXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudGl0bGVdIC0gQW4gb3B0aW9uYWwgdGl0bGUgZm9yIHRoZSBub3RpZmljYXRpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy50aW1lb3V0XSAtIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBzaG93IHRoZSBub3RpZmljYXRpb24uIFNldCB0byAwIHRvIG5vdCBhdXRvLWhpZGUuXG4gKi9cblxuY29uc3Qgc2hvd01lc3NhZ2UgPSAob3B0aW9ucykgPT4ge1xuXG4gICAgY29uc3QgdGltZW91dCA9IG9wdGlvbnMudGltZW91dCA/PyA1MDAwO1xuXG4gICAgY29uc3QgYWxlcnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGFsZXJ0LmlubmVySFRNTCA9IGFsZXJ0VGVtcGxhdGUob3B0aW9ucyk7XG5cbiAgICBlbnN1cmVDb250YWluZXIoKS5hcHBlbmRDaGlsZChhbGVydCk7XG4gICAgYWxlcnQuY2xhc3NOYW1lID0gYHNuYWNrICR7b3B0aW9ucy50eXBlfSBzaG93YDtcblxuICAgIGNvbnN0IGNsb3NlQnV0dG9uID0gYWxlcnQucXVlcnlTZWxlY3RvcihcImEuY2xvc2VcIik7XG4gICAgY2xvc2VCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBoaWRlQWxlcnQoKTtcbiAgICB9KTtcblxuICAgIGlmKHRpbWVvdXQgPiAwKSB7XG4gICAgICAgIHNldFRpbWVvdXQoaGlkZUFsZXJ0LCB0aW1lb3V0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoaWRlQWxlcnQoKSB7XG4gICAgICAgIGFsZXJ0LnJlbW92ZSgpO1xuICAgIH1cbn07XG5cbiIsImZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHtcbiAgdHJ5IHtcbiAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZWplY3QoZXJyb3IpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpbmZvLmRvbmUpIHtcbiAgICByZXNvbHZlKHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcblxuICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICBfbmV4dCh1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hc3luY1RvR2VuZXJhdG9yO1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NsYXNzQ2FsbENoZWNrO1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY3JlYXRlQ2xhc3M7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7IiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2RlZmluZVByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyIsImZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7XG4gIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7XG4gICAgXCJkZWZhdWx0XCI6IG9ialxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQ7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEFic3RyYWN0RXZlbnQgPSByZXF1aXJlKCcuLi8uLi9zaGFyZWQvQWJzdHJhY3RFdmVudC9BYnN0cmFjdEV2ZW50LmNqcycpO1xuXG5jbGFzcyBEcmFnRXZlbnQgZXh0ZW5kcyBBYnN0cmFjdEV2ZW50LkFic3RyYWN0RXZlbnQge1xuXG4gIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICB9XG5cbiAgZ2V0IHNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLnNvdXJjZTtcbiAgfVxuXG4gIGdldCBvcmlnaW5hbFNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLm9yaWdpbmFsU291cmNlO1xuICB9XG5cbiAgZ2V0IG1pcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLm1pcnJvcjtcbiAgfVxuXG4gIGdldCBzb3VyY2VDb250YWluZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5zb3VyY2VDb250YWluZXI7XG4gIH1cblxuICBnZXQgc2Vuc29yRXZlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5zZW5zb3JFdmVudDtcbiAgfVxuXG4gIGdldCBvcmlnaW5hbEV2ZW50KCkge1xuICAgIGlmICh0aGlzLnNlbnNvckV2ZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZW5zb3JFdmVudC5vcmlnaW5hbEV2ZW50O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5EcmFnRXZlbnQudHlwZSA9ICdkcmFnJztcbmNsYXNzIERyYWdTdGFydEV2ZW50IGV4dGVuZHMgRHJhZ0V2ZW50IHt9XG5cbkRyYWdTdGFydEV2ZW50LnR5cGUgPSAnZHJhZzpzdGFydCc7XG5EcmFnU3RhcnRFdmVudC5jYW5jZWxhYmxlID0gdHJ1ZTtcbmNsYXNzIERyYWdNb3ZlRXZlbnQgZXh0ZW5kcyBEcmFnRXZlbnQge31cblxuRHJhZ01vdmVFdmVudC50eXBlID0gJ2RyYWc6bW92ZSc7XG5cbmNsYXNzIERyYWdPdmVyRXZlbnQgZXh0ZW5kcyBEcmFnRXZlbnQge1xuXG4gIGdldCBvdmVyQ29udGFpbmVyKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEub3ZlckNvbnRhaW5lcjtcbiAgfVxuXG4gIGdldCBvdmVyKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEub3ZlcjtcbiAgfVxufVxuRHJhZ092ZXJFdmVudC50eXBlID0gJ2RyYWc6b3Zlcic7XG5EcmFnT3ZlckV2ZW50LmNhbmNlbGFibGUgPSB0cnVlO1xuZnVuY3Rpb24gaXNEcmFnT3ZlckV2ZW50KGV2ZW50KSB7XG4gIHJldHVybiBldmVudC50eXBlID09PSBEcmFnT3ZlckV2ZW50LnR5cGU7XG59XG5cbmNsYXNzIERyYWdPdXRFdmVudCBleHRlbmRzIERyYWdFdmVudCB7XG5cbiAgZ2V0IG92ZXJDb250YWluZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5vdmVyQ29udGFpbmVyO1xuICB9XG5cbiAgZ2V0IG92ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5vdmVyO1xuICB9XG59XG5cbkRyYWdPdXRFdmVudC50eXBlID0gJ2RyYWc6b3V0JztcblxuY2xhc3MgRHJhZ092ZXJDb250YWluZXJFdmVudCBleHRlbmRzIERyYWdFdmVudCB7XG5cbiAgZ2V0IG92ZXJDb250YWluZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5vdmVyQ29udGFpbmVyO1xuICB9XG59XG5cbkRyYWdPdmVyQ29udGFpbmVyRXZlbnQudHlwZSA9ICdkcmFnOm92ZXI6Y29udGFpbmVyJztcblxuY2xhc3MgRHJhZ091dENvbnRhaW5lckV2ZW50IGV4dGVuZHMgRHJhZ0V2ZW50IHtcblxuICBnZXQgb3ZlckNvbnRhaW5lcigpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLm92ZXJDb250YWluZXI7XG4gIH1cbn1cblxuRHJhZ091dENvbnRhaW5lckV2ZW50LnR5cGUgPSAnZHJhZzpvdXQ6Y29udGFpbmVyJztcblxuY2xhc3MgRHJhZ1ByZXNzdXJlRXZlbnQgZXh0ZW5kcyBEcmFnRXZlbnQge1xuXG4gIGdldCBwcmVzc3VyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLnByZXNzdXJlO1xuICB9XG59XG5cbkRyYWdQcmVzc3VyZUV2ZW50LnR5cGUgPSAnZHJhZzpwcmVzc3VyZSc7XG5jbGFzcyBEcmFnU3RvcEV2ZW50IGV4dGVuZHMgRHJhZ0V2ZW50IHt9XG5cbkRyYWdTdG9wRXZlbnQudHlwZSA9ICdkcmFnOnN0b3AnO1xuRHJhZ1N0b3BFdmVudC5jYW5jZWxhYmxlID0gdHJ1ZTtcbmNsYXNzIERyYWdTdG9wcGVkRXZlbnQgZXh0ZW5kcyBEcmFnRXZlbnQge31cbkRyYWdTdG9wcGVkRXZlbnQudHlwZSA9ICdkcmFnOnN0b3BwZWQnO1xuXG5leHBvcnRzLkRyYWdFdmVudCA9IERyYWdFdmVudDtcbmV4cG9ydHMuRHJhZ01vdmVFdmVudCA9IERyYWdNb3ZlRXZlbnQ7XG5leHBvcnRzLkRyYWdPdXRDb250YWluZXJFdmVudCA9IERyYWdPdXRDb250YWluZXJFdmVudDtcbmV4cG9ydHMuRHJhZ091dEV2ZW50ID0gRHJhZ091dEV2ZW50O1xuZXhwb3J0cy5EcmFnT3ZlckNvbnRhaW5lckV2ZW50ID0gRHJhZ092ZXJDb250YWluZXJFdmVudDtcbmV4cG9ydHMuRHJhZ092ZXJFdmVudCA9IERyYWdPdmVyRXZlbnQ7XG5leHBvcnRzLkRyYWdQcmVzc3VyZUV2ZW50ID0gRHJhZ1ByZXNzdXJlRXZlbnQ7XG5leHBvcnRzLkRyYWdTdGFydEV2ZW50ID0gRHJhZ1N0YXJ0RXZlbnQ7XG5leHBvcnRzLkRyYWdTdG9wRXZlbnQgPSBEcmFnU3RvcEV2ZW50O1xuZXhwb3J0cy5EcmFnU3RvcHBlZEV2ZW50ID0gRHJhZ1N0b3BwZWRFdmVudDtcbmV4cG9ydHMuaXNEcmFnT3ZlckV2ZW50ID0gaXNEcmFnT3ZlckV2ZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgY2xvc2VzdCA9IHJlcXVpcmUoJy4uL3NoYXJlZC91dGlscy9jbG9zZXN0L2Nsb3Nlc3QuY2pzJyk7XG52YXIgQW5ub3VuY2VtZW50ID0gcmVxdWlyZSgnLi9QbHVnaW5zL0Fubm91bmNlbWVudC9Bbm5vdW5jZW1lbnQuY2pzJyk7XG52YXIgRm9jdXNhYmxlID0gcmVxdWlyZSgnLi9QbHVnaW5zL0ZvY3VzYWJsZS9Gb2N1c2FibGUuY2pzJyk7XG52YXIgTWlycm9yID0gcmVxdWlyZSgnLi9QbHVnaW5zL01pcnJvci9NaXJyb3IuY2pzJyk7XG52YXIgU2Nyb2xsYWJsZSA9IHJlcXVpcmUoJy4vUGx1Z2lucy9TY3JvbGxhYmxlL1Njcm9sbGFibGUuY2pzJyk7XG52YXIgRW1pdHRlciA9IHJlcXVpcmUoJy4vRW1pdHRlci9FbWl0dGVyLmNqcycpO1xudmFyIE1vdXNlU2Vuc29yID0gcmVxdWlyZSgnLi9TZW5zb3JzL01vdXNlU2Vuc29yL01vdXNlU2Vuc29yLmNqcycpO1xudmFyIFRvdWNoU2Vuc29yID0gcmVxdWlyZSgnLi9TZW5zb3JzL1RvdWNoU2Vuc29yL1RvdWNoU2Vuc29yLmNqcycpO1xucmVxdWlyZSgnLi9TZW5zb3JzL1NlbnNvckV2ZW50L1NlbnNvckV2ZW50LmNqcycpO1xudmFyIERyYWdnYWJsZUV2ZW50ID0gcmVxdWlyZSgnLi9EcmFnZ2FibGVFdmVudC9EcmFnZ2FibGVFdmVudC5janMnKTtcbnZhciBEcmFnRXZlbnQgPSByZXF1aXJlKCcuL0RyYWdFdmVudC9EcmFnRXZlbnQuY2pzJyk7XG5cbmNvbnN0IG9uRHJhZ1N0YXJ0ID0gU3ltYm9sKCdvbkRyYWdTdGFydCcpO1xuY29uc3Qgb25EcmFnTW92ZSA9IFN5bWJvbCgnb25EcmFnTW92ZScpO1xuY29uc3Qgb25EcmFnU3RvcCA9IFN5bWJvbCgnb25EcmFnU3RvcCcpO1xuY29uc3Qgb25EcmFnUHJlc3N1cmUgPSBTeW1ib2woJ29uRHJhZ1ByZXNzdXJlJyk7XG5jb25zdCBkcmFnU3RvcCA9IFN5bWJvbCgnZHJhZ1N0b3AnKTtcblxuY29uc3QgZGVmYXVsdEFubm91bmNlbWVudHMgPSB7XG4gICdkcmFnOnN0YXJ0JzogZXZlbnQgPT4gYFBpY2tlZCB1cCAke2V2ZW50LnNvdXJjZS50ZXh0Q29udGVudC50cmltKCkgfHwgZXZlbnQuc291cmNlLmlkIHx8ICdkcmFnZ2FibGUgZWxlbWVudCd9YCxcbiAgJ2RyYWc6c3RvcCc6IGV2ZW50ID0+IGBSZWxlYXNlZCAke2V2ZW50LnNvdXJjZS50ZXh0Q29udGVudC50cmltKCkgfHwgZXZlbnQuc291cmNlLmlkIHx8ICdkcmFnZ2FibGUgZWxlbWVudCd9YFxufTtcbmNvbnN0IGRlZmF1bHRDbGFzc2VzID0ge1xuICAnY29udGFpbmVyOmRyYWdnaW5nJzogJ2RyYWdnYWJsZS1jb250YWluZXItLWlzLWRyYWdnaW5nJyxcbiAgJ3NvdXJjZTpkcmFnZ2luZyc6ICdkcmFnZ2FibGUtc291cmNlLS1pcy1kcmFnZ2luZycsXG4gICdzb3VyY2U6cGxhY2VkJzogJ2RyYWdnYWJsZS1zb3VyY2UtLXBsYWNlZCcsXG4gICdjb250YWluZXI6cGxhY2VkJzogJ2RyYWdnYWJsZS1jb250YWluZXItLXBsYWNlZCcsXG4gICdib2R5OmRyYWdnaW5nJzogJ2RyYWdnYWJsZS0taXMtZHJhZ2dpbmcnLFxuICAnZHJhZ2dhYmxlOm92ZXInOiAnZHJhZ2dhYmxlLS1vdmVyJyxcbiAgJ2NvbnRhaW5lcjpvdmVyJzogJ2RyYWdnYWJsZS1jb250YWluZXItLW92ZXInLFxuICAnc291cmNlOm9yaWdpbmFsJzogJ2RyYWdnYWJsZS0tb3JpZ2luYWwnLFxuICBtaXJyb3I6ICdkcmFnZ2FibGUtbWlycm9yJ1xufTtcbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICBkcmFnZ2FibGU6ICcuZHJhZ2dhYmxlLXNvdXJjZScsXG4gIGhhbmRsZTogbnVsbCxcbiAgZGVsYXk6IHt9LFxuICBkaXN0YW5jZTogMCxcbiAgcGxhY2VkVGltZW91dDogODAwLFxuICBwbHVnaW5zOiBbXSxcbiAgc2Vuc29yczogW10sXG4gIGV4Y2x1ZGU6IHtcbiAgICBwbHVnaW5zOiBbXSxcbiAgICBzZW5zb3JzOiBbXVxuICB9XG59O1xuXG5jbGFzcyBEcmFnZ2FibGUge1xuXG4gIGNvbnN0cnVjdG9yKGNvbnRhaW5lcnMgPSBbZG9jdW1lbnQuYm9keV0sIG9wdGlvbnMgPSB7fSkge1xuXG4gICAgaWYgKGNvbnRhaW5lcnMgaW5zdGFuY2VvZiBOb2RlTGlzdCB8fCBjb250YWluZXJzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHRoaXMuY29udGFpbmVycyA9IFsuLi5jb250YWluZXJzXTtcbiAgICB9IGVsc2UgaWYgKGNvbnRhaW5lcnMgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgdGhpcy5jb250YWluZXJzID0gW2NvbnRhaW5lcnNdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RyYWdnYWJsZSBjb250YWluZXJzIGFyZSBleHBlY3RlZCB0byBiZSBvZiB0eXBlIGBOb2RlTGlzdGAsIGBIVE1MRWxlbWVudFtdYCBvciBgSFRNTEVsZW1lbnRgJyk7XG4gICAgfVxuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGNsYXNzZXM6IHtcbiAgICAgICAgLi4uZGVmYXVsdENsYXNzZXMsXG4gICAgICAgIC4uLihvcHRpb25zLmNsYXNzZXMgfHwge30pXG4gICAgICB9LFxuICAgICAgYW5ub3VuY2VtZW50czoge1xuICAgICAgICAuLi5kZWZhdWx0QW5ub3VuY2VtZW50cyxcbiAgICAgICAgLi4uKG9wdGlvbnMuYW5ub3VuY2VtZW50cyB8fCB7fSlcbiAgICAgIH0sXG4gICAgICBleGNsdWRlOiB7XG4gICAgICAgIHBsdWdpbnM6IG9wdGlvbnMuZXhjbHVkZSAmJiBvcHRpb25zLmV4Y2x1ZGUucGx1Z2lucyB8fCBbXSxcbiAgICAgICAgc2Vuc29yczogb3B0aW9ucy5leGNsdWRlICYmIG9wdGlvbnMuZXhjbHVkZS5zZW5zb3JzIHx8IFtdXG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuZW1pdHRlciA9IG5ldyBFbWl0dGVyLmRlZmF1bHQoKTtcblxuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgIHRoaXMucGx1Z2lucyA9IFtdO1xuXG4gICAgdGhpcy5zZW5zb3JzID0gW107XG4gICAgdGhpc1tvbkRyYWdTdGFydF0gPSB0aGlzW29uRHJhZ1N0YXJ0XS5iaW5kKHRoaXMpO1xuICAgIHRoaXNbb25EcmFnTW92ZV0gPSB0aGlzW29uRHJhZ01vdmVdLmJpbmQodGhpcyk7XG4gICAgdGhpc1tvbkRyYWdTdG9wXSA9IHRoaXNbb25EcmFnU3RvcF0uYmluZCh0aGlzKTtcbiAgICB0aGlzW29uRHJhZ1ByZXNzdXJlXSA9IHRoaXNbb25EcmFnUHJlc3N1cmVdLmJpbmQodGhpcyk7XG4gICAgdGhpc1tkcmFnU3RvcF0gPSB0aGlzW2RyYWdTdG9wXS5iaW5kKHRoaXMpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWc6c3RhcnQnLCB0aGlzW29uRHJhZ1N0YXJ0XSwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZzptb3ZlJywgdGhpc1tvbkRyYWdNb3ZlXSwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZzpzdG9wJywgdGhpc1tvbkRyYWdTdG9wXSwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZzpwcmVzc3VyZScsIHRoaXNbb25EcmFnUHJlc3N1cmVdLCB0cnVlKTtcbiAgICBjb25zdCBkZWZhdWx0UGx1Z2lucyA9IE9iamVjdC52YWx1ZXMoRHJhZ2dhYmxlLlBsdWdpbnMpLmZpbHRlcihQbHVnaW4gPT4gIXRoaXMub3B0aW9ucy5leGNsdWRlLnBsdWdpbnMuaW5jbHVkZXMoUGx1Z2luKSk7XG4gICAgY29uc3QgZGVmYXVsdFNlbnNvcnMgPSBPYmplY3QudmFsdWVzKERyYWdnYWJsZS5TZW5zb3JzKS5maWx0ZXIoc2Vuc29yID0+ICF0aGlzLm9wdGlvbnMuZXhjbHVkZS5zZW5zb3JzLmluY2x1ZGVzKHNlbnNvcikpO1xuICAgIHRoaXMuYWRkUGx1Z2luKC4uLlsuLi5kZWZhdWx0UGx1Z2lucywgLi4udGhpcy5vcHRpb25zLnBsdWdpbnNdKTtcbiAgICB0aGlzLmFkZFNlbnNvciguLi5bLi4uZGVmYXVsdFNlbnNvcnMsIC4uLnRoaXMub3B0aW9ucy5zZW5zb3JzXSk7XG4gICAgY29uc3QgZHJhZ2dhYmxlSW5pdGlhbGl6ZWRFdmVudCA9IG5ldyBEcmFnZ2FibGVFdmVudC5EcmFnZ2FibGVJbml0aWFsaXplZEV2ZW50KHtcbiAgICAgIGRyYWdnYWJsZTogdGhpc1xuICAgIH0pO1xuICAgIHRoaXMub24oJ21pcnJvcjpjcmVhdGVkJywgKHtcbiAgICAgIG1pcnJvclxuICAgIH0pID0+IHRoaXMubWlycm9yID0gbWlycm9yKTtcbiAgICB0aGlzLm9uKCdtaXJyb3I6ZGVzdHJveScsICgpID0+IHRoaXMubWlycm9yID0gbnVsbCk7XG4gICAgdGhpcy50cmlnZ2VyKGRyYWdnYWJsZUluaXRpYWxpemVkRXZlbnQpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnOnN0YXJ0JywgdGhpc1tvbkRyYWdTdGFydF0sIHRydWUpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWc6bW92ZScsIHRoaXNbb25EcmFnTW92ZV0sIHRydWUpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWc6c3RvcCcsIHRoaXNbb25EcmFnU3RvcF0sIHRydWUpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWc6cHJlc3N1cmUnLCB0aGlzW29uRHJhZ1ByZXNzdXJlXSwgdHJ1ZSk7XG4gICAgY29uc3QgZHJhZ2dhYmxlRGVzdHJveUV2ZW50ID0gbmV3IERyYWdnYWJsZUV2ZW50LkRyYWdnYWJsZURlc3Ryb3lFdmVudCh7XG4gICAgICBkcmFnZ2FibGU6IHRoaXNcbiAgICB9KTtcbiAgICB0aGlzLnRyaWdnZXIoZHJhZ2dhYmxlRGVzdHJveUV2ZW50KTtcbiAgICB0aGlzLnJlbW92ZVBsdWdpbiguLi50aGlzLnBsdWdpbnMubWFwKHBsdWdpbiA9PiBwbHVnaW4uY29uc3RydWN0b3IpKTtcbiAgICB0aGlzLnJlbW92ZVNlbnNvciguLi50aGlzLnNlbnNvcnMubWFwKHNlbnNvciA9PiBzZW5zb3IuY29uc3RydWN0b3IpKTtcbiAgfVxuXG4gIGFkZFBsdWdpbiguLi5wbHVnaW5zKSB7XG4gICAgY29uc3QgYWN0aXZlUGx1Z2lucyA9IHBsdWdpbnMubWFwKFBsdWdpbiA9PiBuZXcgUGx1Z2luKHRoaXMpKTtcbiAgICBhY3RpdmVQbHVnaW5zLmZvckVhY2gocGx1Z2luID0+IHBsdWdpbi5hdHRhY2goKSk7XG4gICAgdGhpcy5wbHVnaW5zID0gWy4uLnRoaXMucGx1Z2lucywgLi4uYWN0aXZlUGx1Z2luc107XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICByZW1vdmVQbHVnaW4oLi4ucGx1Z2lucykge1xuICAgIGNvbnN0IHJlbW92ZWRQbHVnaW5zID0gdGhpcy5wbHVnaW5zLmZpbHRlcihwbHVnaW4gPT4gcGx1Z2lucy5pbmNsdWRlcyhwbHVnaW4uY29uc3RydWN0b3IpKTtcbiAgICByZW1vdmVkUGx1Z2lucy5mb3JFYWNoKHBsdWdpbiA9PiBwbHVnaW4uZGV0YWNoKCkpO1xuICAgIHRoaXMucGx1Z2lucyA9IHRoaXMucGx1Z2lucy5maWx0ZXIocGx1Z2luID0+ICFwbHVnaW5zLmluY2x1ZGVzKHBsdWdpbi5jb25zdHJ1Y3RvcikpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkU2Vuc29yKC4uLnNlbnNvcnMpIHtcbiAgICBjb25zdCBhY3RpdmVTZW5zb3JzID0gc2Vuc29ycy5tYXAoU2Vuc29yID0+IG5ldyBTZW5zb3IodGhpcy5jb250YWluZXJzLCB0aGlzLm9wdGlvbnMpKTtcbiAgICBhY3RpdmVTZW5zb3JzLmZvckVhY2goc2Vuc29yID0+IHNlbnNvci5hdHRhY2goKSk7XG4gICAgdGhpcy5zZW5zb3JzID0gWy4uLnRoaXMuc2Vuc29ycywgLi4uYWN0aXZlU2Vuc29yc107XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICByZW1vdmVTZW5zb3IoLi4uc2Vuc29ycykge1xuICAgIGNvbnN0IHJlbW92ZWRTZW5zb3JzID0gdGhpcy5zZW5zb3JzLmZpbHRlcihzZW5zb3IgPT4gc2Vuc29ycy5pbmNsdWRlcyhzZW5zb3IuY29uc3RydWN0b3IpKTtcbiAgICByZW1vdmVkU2Vuc29ycy5mb3JFYWNoKHNlbnNvciA9PiBzZW5zb3IuZGV0YWNoKCkpO1xuICAgIHRoaXMuc2Vuc29ycyA9IHRoaXMuc2Vuc29ycy5maWx0ZXIoc2Vuc29yID0+ICFzZW5zb3JzLmluY2x1ZGVzKHNlbnNvci5jb25zdHJ1Y3RvcikpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkQ29udGFpbmVyKC4uLmNvbnRhaW5lcnMpIHtcbiAgICB0aGlzLmNvbnRhaW5lcnMgPSBbLi4udGhpcy5jb250YWluZXJzLCAuLi5jb250YWluZXJzXTtcbiAgICB0aGlzLnNlbnNvcnMuZm9yRWFjaChzZW5zb3IgPT4gc2Vuc29yLmFkZENvbnRhaW5lciguLi5jb250YWluZXJzKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICByZW1vdmVDb250YWluZXIoLi4uY29udGFpbmVycykge1xuICAgIHRoaXMuY29udGFpbmVycyA9IHRoaXMuY29udGFpbmVycy5maWx0ZXIoY29udGFpbmVyID0+ICFjb250YWluZXJzLmluY2x1ZGVzKGNvbnRhaW5lcikpO1xuICAgIHRoaXMuc2Vuc29ycy5mb3JFYWNoKHNlbnNvciA9PiBzZW5zb3IucmVtb3ZlQ29udGFpbmVyKC4uLmNvbnRhaW5lcnMpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9uKHR5cGUsIC4uLmNhbGxiYWNrcykge1xuICAgIHRoaXMuZW1pdHRlci5vbih0eXBlLCAuLi5jYWxsYmFja3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb2ZmKHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5lbWl0dGVyLm9mZih0eXBlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0cmlnZ2VyKGV2ZW50KSB7XG4gICAgdGhpcy5lbWl0dGVyLnRyaWdnZXIoZXZlbnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lRm9yKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDbGFzc05hbWVzRm9yKG5hbWUpWzBdO1xuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lc0ZvcihuYW1lKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IHRoaXMub3B0aW9ucy5jbGFzc2VzW25hbWVdO1xuICAgIGlmIChjbGFzc05hbWVzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHJldHVybiBjbGFzc05hbWVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNsYXNzTmFtZXMgPT09ICdzdHJpbmcnIHx8IGNsYXNzTmFtZXMgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgIHJldHVybiBbY2xhc3NOYW1lc107XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBpc0RyYWdnaW5nKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuZHJhZ2dpbmcpO1xuICB9XG5cbiAgZ2V0RHJhZ2dhYmxlRWxlbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVycy5yZWR1Y2UoKGN1cnJlbnQsIGNvbnRhaW5lcikgPT4ge1xuICAgICAgcmV0dXJuIFsuLi5jdXJyZW50LCAuLi50aGlzLmdldERyYWdnYWJsZUVsZW1lbnRzRm9yQ29udGFpbmVyKGNvbnRhaW5lcildO1xuICAgIH0sIFtdKTtcbiAgfVxuXG4gIGdldERyYWdnYWJsZUVsZW1lbnRzRm9yQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICAgIGNvbnN0IGFsbERyYWdnYWJsZUVsZW1lbnRzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5vcHRpb25zLmRyYWdnYWJsZSk7XG4gICAgcmV0dXJuIFsuLi5hbGxEcmFnZ2FibGVFbGVtZW50c10uZmlsdGVyKGNoaWxkRWxlbWVudCA9PiB7XG4gICAgICByZXR1cm4gY2hpbGRFbGVtZW50ICE9PSB0aGlzLm9yaWdpbmFsU291cmNlICYmIGNoaWxkRWxlbWVudCAhPT0gdGhpcy5taXJyb3I7XG4gICAgfSk7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpc1tkcmFnU3RvcF0oKTtcbiAgfVxuXG4gIFtvbkRyYWdTdGFydF0oZXZlbnQpIHtcbiAgICBjb25zdCBzZW5zb3JFdmVudCA9IGdldFNlbnNvckV2ZW50KGV2ZW50KTtcbiAgICBjb25zdCB7XG4gICAgICB0YXJnZXQsXG4gICAgICBjb250YWluZXIsXG4gICAgICBvcmlnaW5hbFNvdXJjZVxuICAgIH0gPSBzZW5zb3JFdmVudDtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVycy5pbmNsdWRlcyhjb250YWluZXIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuaGFuZGxlICYmIHRhcmdldCAmJiAhY2xvc2VzdC5kZWZhdWx0KHRhcmdldCwgdGhpcy5vcHRpb25zLmhhbmRsZSkpIHtcbiAgICAgIHNlbnNvckV2ZW50LmNhbmNlbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9yaWdpbmFsU291cmNlID0gb3JpZ2luYWxTb3VyY2U7XG4gICAgdGhpcy5zb3VyY2VDb250YWluZXIgPSBjb250YWluZXI7XG4gICAgaWYgKHRoaXMubGFzdFBsYWNlZFNvdXJjZSAmJiB0aGlzLmxhc3RQbGFjZWRDb250YWluZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnBsYWNlZFRpbWVvdXRJRCk7XG4gICAgICB0aGlzLmxhc3RQbGFjZWRTb3VyY2UuY2xhc3NMaXN0LnJlbW92ZSguLi50aGlzLmdldENsYXNzTmFtZXNGb3IoJ3NvdXJjZTpwbGFjZWQnKSk7XG4gICAgICB0aGlzLmxhc3RQbGFjZWRDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSguLi50aGlzLmdldENsYXNzTmFtZXNGb3IoJ2NvbnRhaW5lcjpwbGFjZWQnKSk7XG4gICAgfVxuICAgIHRoaXMuc291cmNlID0gdGhpcy5vcmlnaW5hbFNvdXJjZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgdGhpcy5vcmlnaW5hbFNvdXJjZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnNvdXJjZSwgdGhpcy5vcmlnaW5hbFNvdXJjZSk7XG4gICAgdGhpcy5vcmlnaW5hbFNvdXJjZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGNvbnN0IGRyYWdTdGFydEV2ZW50ID0gbmV3IERyYWdFdmVudC5EcmFnU3RhcnRFdmVudCh7XG4gICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgb3JpZ2luYWxTb3VyY2U6IHRoaXMub3JpZ2luYWxTb3VyY2UsXG4gICAgICBzb3VyY2VDb250YWluZXI6IGNvbnRhaW5lcixcbiAgICAgIHNlbnNvckV2ZW50XG4gICAgfSk7XG4gICAgdGhpcy50cmlnZ2VyKGRyYWdTdGFydEV2ZW50KTtcbiAgICB0aGlzLmRyYWdnaW5nID0gIWRyYWdTdGFydEV2ZW50LmNhbmNlbGVkKCk7XG4gICAgaWYgKGRyYWdTdGFydEV2ZW50LmNhbmNlbGVkKCkpIHtcbiAgICAgIHRoaXMuc291cmNlLnJlbW92ZSgpO1xuICAgICAgdGhpcy5vcmlnaW5hbFNvdXJjZS5zdHlsZS5kaXNwbGF5ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vcmlnaW5hbFNvdXJjZS5jbGFzc0xpc3QuYWRkKC4uLnRoaXMuZ2V0Q2xhc3NOYW1lc0Zvcignc291cmNlOm9yaWdpbmFsJykpO1xuICAgIHRoaXMuc291cmNlLmNsYXNzTGlzdC5hZGQoLi4udGhpcy5nZXRDbGFzc05hbWVzRm9yKCdzb3VyY2U6ZHJhZ2dpbmcnKSk7XG4gICAgdGhpcy5zb3VyY2VDb250YWluZXIuY2xhc3NMaXN0LmFkZCguLi50aGlzLmdldENsYXNzTmFtZXNGb3IoJ2NvbnRhaW5lcjpkcmFnZ2luZycpKTtcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoLi4udGhpcy5nZXRDbGFzc05hbWVzRm9yKCdib2R5OmRyYWdnaW5nJykpO1xuICAgIGFwcGx5VXNlclNlbGVjdChkb2N1bWVudC5ib2R5LCAnbm9uZScpO1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBjb25zdCBvbGRTZW5zb3JFdmVudCA9IGdldFNlbnNvckV2ZW50KGV2ZW50KTtcbiAgICAgIGNvbnN0IG5ld1NlbnNvckV2ZW50ID0gb2xkU2Vuc29yRXZlbnQuY2xvbmUoe1xuICAgICAgICB0YXJnZXQ6IHRoaXMuc291cmNlXG4gICAgICB9KTtcbiAgICAgIHRoaXNbb25EcmFnTW92ZV0oe1xuICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgZGV0YWlsOiBuZXdTZW5zb3JFdmVudFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBbb25EcmFnTW92ZV0oZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2Vuc29yRXZlbnQgPSBnZXRTZW5zb3JFdmVudChldmVudCk7XG4gICAgY29uc3Qge1xuICAgICAgY29udGFpbmVyXG4gICAgfSA9IHNlbnNvckV2ZW50O1xuICAgIGxldCB0YXJnZXQgPSBzZW5zb3JFdmVudC50YXJnZXQ7XG4gICAgY29uc3QgZHJhZ01vdmVFdmVudCA9IG5ldyBEcmFnRXZlbnQuRHJhZ01vdmVFdmVudCh7XG4gICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgb3JpZ2luYWxTb3VyY2U6IHRoaXMub3JpZ2luYWxTb3VyY2UsXG4gICAgICBzb3VyY2VDb250YWluZXI6IGNvbnRhaW5lcixcbiAgICAgIHNlbnNvckV2ZW50XG4gICAgfSk7XG4gICAgdGhpcy50cmlnZ2VyKGRyYWdNb3ZlRXZlbnQpO1xuICAgIGlmIChkcmFnTW92ZUV2ZW50LmNhbmNlbGVkKCkpIHtcbiAgICAgIHNlbnNvckV2ZW50LmNhbmNlbCgpO1xuICAgIH1cbiAgICB0YXJnZXQgPSBjbG9zZXN0LmRlZmF1bHQodGFyZ2V0LCB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlKTtcbiAgICBjb25zdCB3aXRoaW5Db3JyZWN0Q29udGFpbmVyID0gY2xvc2VzdC5kZWZhdWx0KHNlbnNvckV2ZW50LnRhcmdldCwgdGhpcy5jb250YWluZXJzKTtcbiAgICBjb25zdCBvdmVyQ29udGFpbmVyID0gc2Vuc29yRXZlbnQub3ZlckNvbnRhaW5lciB8fCB3aXRoaW5Db3JyZWN0Q29udGFpbmVyO1xuICAgIGNvbnN0IGlzTGVhdmluZ0NvbnRhaW5lciA9IHRoaXMuY3VycmVudE92ZXJDb250YWluZXIgJiYgb3ZlckNvbnRhaW5lciAhPT0gdGhpcy5jdXJyZW50T3ZlckNvbnRhaW5lcjtcbiAgICBjb25zdCBpc0xlYXZpbmdEcmFnZ2FibGUgPSB0aGlzLmN1cnJlbnRPdmVyICYmIHRhcmdldCAhPT0gdGhpcy5jdXJyZW50T3ZlcjtcbiAgICBjb25zdCBpc092ZXJDb250YWluZXIgPSBvdmVyQ29udGFpbmVyICYmIHRoaXMuY3VycmVudE92ZXJDb250YWluZXIgIT09IG92ZXJDb250YWluZXI7XG4gICAgY29uc3QgaXNPdmVyRHJhZ2dhYmxlID0gd2l0aGluQ29ycmVjdENvbnRhaW5lciAmJiB0YXJnZXQgJiYgdGhpcy5jdXJyZW50T3ZlciAhPT0gdGFyZ2V0O1xuICAgIGlmIChpc0xlYXZpbmdEcmFnZ2FibGUpIHtcbiAgICAgIGNvbnN0IGRyYWdPdXRFdmVudCA9IG5ldyBEcmFnRXZlbnQuRHJhZ091dEV2ZW50KHtcbiAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgb3JpZ2luYWxTb3VyY2U6IHRoaXMub3JpZ2luYWxTb3VyY2UsXG4gICAgICAgIHNvdXJjZUNvbnRhaW5lcjogY29udGFpbmVyLFxuICAgICAgICBzZW5zb3JFdmVudCxcbiAgICAgICAgb3ZlcjogdGhpcy5jdXJyZW50T3ZlcixcbiAgICAgICAgb3ZlckNvbnRhaW5lcjogdGhpcy5jdXJyZW50T3ZlckNvbnRhaW5lclxuICAgICAgfSk7XG4gICAgICB0aGlzLmN1cnJlbnRPdmVyLmNsYXNzTGlzdC5yZW1vdmUoLi4udGhpcy5nZXRDbGFzc05hbWVzRm9yKCdkcmFnZ2FibGU6b3ZlcicpKTtcbiAgICAgIHRoaXMuY3VycmVudE92ZXIgPSBudWxsO1xuICAgICAgdGhpcy50cmlnZ2VyKGRyYWdPdXRFdmVudCk7XG4gICAgfVxuICAgIGlmIChpc0xlYXZpbmdDb250YWluZXIpIHtcbiAgICAgIGNvbnN0IGRyYWdPdXRDb250YWluZXJFdmVudCA9IG5ldyBEcmFnRXZlbnQuRHJhZ091dENvbnRhaW5lckV2ZW50KHtcbiAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgb3JpZ2luYWxTb3VyY2U6IHRoaXMub3JpZ2luYWxTb3VyY2UsXG4gICAgICAgIHNvdXJjZUNvbnRhaW5lcjogY29udGFpbmVyLFxuICAgICAgICBzZW5zb3JFdmVudCxcbiAgICAgICAgb3ZlckNvbnRhaW5lcjogdGhpcy5jdXJyZW50T3ZlckNvbnRhaW5lclxuICAgICAgfSk7XG4gICAgICB0aGlzLmN1cnJlbnRPdmVyQ29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoLi4udGhpcy5nZXRDbGFzc05hbWVzRm9yKCdjb250YWluZXI6b3ZlcicpKTtcbiAgICAgIHRoaXMuY3VycmVudE92ZXJDb250YWluZXIgPSBudWxsO1xuICAgICAgdGhpcy50cmlnZ2VyKGRyYWdPdXRDb250YWluZXJFdmVudCk7XG4gICAgfVxuICAgIGlmIChpc092ZXJDb250YWluZXIpIHtcbiAgICAgIG92ZXJDb250YWluZXIuY2xhc3NMaXN0LmFkZCguLi50aGlzLmdldENsYXNzTmFtZXNGb3IoJ2NvbnRhaW5lcjpvdmVyJykpO1xuICAgICAgY29uc3QgZHJhZ092ZXJDb250YWluZXJFdmVudCA9IG5ldyBEcmFnRXZlbnQuRHJhZ092ZXJDb250YWluZXJFdmVudCh7XG4gICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgIG9yaWdpbmFsU291cmNlOiB0aGlzLm9yaWdpbmFsU291cmNlLFxuICAgICAgICBzb3VyY2VDb250YWluZXI6IGNvbnRhaW5lcixcbiAgICAgICAgc2Vuc29yRXZlbnQsXG4gICAgICAgIG92ZXJDb250YWluZXJcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jdXJyZW50T3ZlckNvbnRhaW5lciA9IG92ZXJDb250YWluZXI7XG4gICAgICB0aGlzLnRyaWdnZXIoZHJhZ092ZXJDb250YWluZXJFdmVudCk7XG4gICAgfVxuICAgIGlmIChpc092ZXJEcmFnZ2FibGUpIHtcbiAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKC4uLnRoaXMuZ2V0Q2xhc3NOYW1lc0ZvcignZHJhZ2dhYmxlOm92ZXInKSk7XG4gICAgICBjb25zdCBkcmFnT3ZlckV2ZW50ID0gbmV3IERyYWdFdmVudC5EcmFnT3ZlckV2ZW50KHtcbiAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgb3JpZ2luYWxTb3VyY2U6IHRoaXMub3JpZ2luYWxTb3VyY2UsXG4gICAgICAgIHNvdXJjZUNvbnRhaW5lcjogY29udGFpbmVyLFxuICAgICAgICBzZW5zb3JFdmVudCxcbiAgICAgICAgb3ZlckNvbnRhaW5lcixcbiAgICAgICAgb3ZlcjogdGFyZ2V0XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY3VycmVudE92ZXIgPSB0YXJnZXQ7XG4gICAgICB0aGlzLnRyaWdnZXIoZHJhZ092ZXJFdmVudCk7XG4gICAgfVxuICB9XG5cbiAgW2RyYWdTdG9wXShldmVudCkge1xuICAgIGlmICghdGhpcy5kcmFnZ2luZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgY29uc3QgZHJhZ1N0b3BFdmVudCA9IG5ldyBEcmFnRXZlbnQuRHJhZ1N0b3BFdmVudCh7XG4gICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgb3JpZ2luYWxTb3VyY2U6IHRoaXMub3JpZ2luYWxTb3VyY2UsXG4gICAgICBzZW5zb3JFdmVudDogZXZlbnQgPyBldmVudC5zZW5zb3JFdmVudCA6IG51bGwsXG4gICAgICBzb3VyY2VDb250YWluZXI6IHRoaXMuc291cmNlQ29udGFpbmVyXG4gICAgfSk7XG4gICAgdGhpcy50cmlnZ2VyKGRyYWdTdG9wRXZlbnQpO1xuICAgIGlmICghZHJhZ1N0b3BFdmVudC5jYW5jZWxlZCgpKSB0aGlzLnNvdXJjZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLm9yaWdpbmFsU291cmNlLCB0aGlzLnNvdXJjZSk7XG4gICAgdGhpcy5zb3VyY2UucmVtb3ZlKCk7XG4gICAgdGhpcy5vcmlnaW5hbFNvdXJjZS5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgdGhpcy5zb3VyY2UuY2xhc3NMaXN0LnJlbW92ZSguLi50aGlzLmdldENsYXNzTmFtZXNGb3IoJ3NvdXJjZTpkcmFnZ2luZycpKTtcbiAgICB0aGlzLm9yaWdpbmFsU291cmNlLmNsYXNzTGlzdC5yZW1vdmUoLi4udGhpcy5nZXRDbGFzc05hbWVzRm9yKCdzb3VyY2U6b3JpZ2luYWwnKSk7XG4gICAgdGhpcy5vcmlnaW5hbFNvdXJjZS5jbGFzc0xpc3QuYWRkKC4uLnRoaXMuZ2V0Q2xhc3NOYW1lc0Zvcignc291cmNlOnBsYWNlZCcpKTtcbiAgICB0aGlzLnNvdXJjZUNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKC4uLnRoaXMuZ2V0Q2xhc3NOYW1lc0ZvcignY29udGFpbmVyOnBsYWNlZCcpKTtcbiAgICB0aGlzLnNvdXJjZUNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKC4uLnRoaXMuZ2V0Q2xhc3NOYW1lc0ZvcignY29udGFpbmVyOmRyYWdnaW5nJykpO1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSguLi50aGlzLmdldENsYXNzTmFtZXNGb3IoJ2JvZHk6ZHJhZ2dpbmcnKSk7XG4gICAgYXBwbHlVc2VyU2VsZWN0KGRvY3VtZW50LmJvZHksICcnKTtcbiAgICBpZiAodGhpcy5jdXJyZW50T3Zlcikge1xuICAgICAgdGhpcy5jdXJyZW50T3Zlci5jbGFzc0xpc3QucmVtb3ZlKC4uLnRoaXMuZ2V0Q2xhc3NOYW1lc0ZvcignZHJhZ2dhYmxlOm92ZXInKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmN1cnJlbnRPdmVyQ29udGFpbmVyKSB7XG4gICAgICB0aGlzLmN1cnJlbnRPdmVyQ29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoLi4udGhpcy5nZXRDbGFzc05hbWVzRm9yKCdjb250YWluZXI6b3ZlcicpKTtcbiAgICB9XG4gICAgdGhpcy5sYXN0UGxhY2VkU291cmNlID0gdGhpcy5vcmlnaW5hbFNvdXJjZTtcbiAgICB0aGlzLmxhc3RQbGFjZWRDb250YWluZXIgPSB0aGlzLnNvdXJjZUNvbnRhaW5lcjtcbiAgICB0aGlzLnBsYWNlZFRpbWVvdXRJRCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubGFzdFBsYWNlZFNvdXJjZSkge1xuICAgICAgICB0aGlzLmxhc3RQbGFjZWRTb3VyY2UuY2xhc3NMaXN0LnJlbW92ZSguLi50aGlzLmdldENsYXNzTmFtZXNGb3IoJ3NvdXJjZTpwbGFjZWQnKSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5sYXN0UGxhY2VkQ29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMubGFzdFBsYWNlZENvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKC4uLnRoaXMuZ2V0Q2xhc3NOYW1lc0ZvcignY29udGFpbmVyOnBsYWNlZCcpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdFBsYWNlZFNvdXJjZSA9IG51bGw7XG4gICAgICB0aGlzLmxhc3RQbGFjZWRDb250YWluZXIgPSBudWxsO1xuICAgIH0sIHRoaXMub3B0aW9ucy5wbGFjZWRUaW1lb3V0KTtcbiAgICBjb25zdCBkcmFnU3RvcHBlZEV2ZW50ID0gbmV3IERyYWdFdmVudC5EcmFnU3RvcHBlZEV2ZW50KHtcbiAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICBvcmlnaW5hbFNvdXJjZTogdGhpcy5vcmlnaW5hbFNvdXJjZSxcbiAgICAgIHNlbnNvckV2ZW50OiBldmVudCA/IGV2ZW50LnNlbnNvckV2ZW50IDogbnVsbCxcbiAgICAgIHNvdXJjZUNvbnRhaW5lcjogdGhpcy5zb3VyY2VDb250YWluZXJcbiAgICB9KTtcbiAgICB0aGlzLnRyaWdnZXIoZHJhZ1N0b3BwZWRFdmVudCk7XG4gICAgdGhpcy5zb3VyY2UgPSBudWxsO1xuICAgIHRoaXMub3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuY3VycmVudE92ZXJDb250YWluZXIgPSBudWxsO1xuICAgIHRoaXMuY3VycmVudE92ZXIgPSBudWxsO1xuICAgIHRoaXMuc291cmNlQ29udGFpbmVyID0gbnVsbDtcbiAgfVxuXG4gIFtvbkRyYWdTdG9wXShldmVudCkge1xuICAgIHRoaXNbZHJhZ1N0b3BdKGV2ZW50KTtcbiAgfVxuXG4gIFtvbkRyYWdQcmVzc3VyZV0oZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2Vuc29yRXZlbnQgPSBnZXRTZW5zb3JFdmVudChldmVudCk7XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5zb3VyY2UgfHwgY2xvc2VzdC5kZWZhdWx0KHNlbnNvckV2ZW50Lm9yaWdpbmFsRXZlbnQudGFyZ2V0LCB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlKTtcbiAgICBjb25zdCBkcmFnUHJlc3N1cmVFdmVudCA9IG5ldyBEcmFnRXZlbnQuRHJhZ1ByZXNzdXJlRXZlbnQoe1xuICAgICAgc2Vuc29yRXZlbnQsXG4gICAgICBzb3VyY2UsXG4gICAgICBwcmVzc3VyZTogc2Vuc29yRXZlbnQucHJlc3N1cmVcbiAgICB9KTtcbiAgICB0aGlzLnRyaWdnZXIoZHJhZ1ByZXNzdXJlRXZlbnQpO1xuICB9XG59XG5cbkRyYWdnYWJsZS5QbHVnaW5zID0ge1xuICBBbm5vdW5jZW1lbnQ6IEFubm91bmNlbWVudC5kZWZhdWx0LFxuICBGb2N1c2FibGU6IEZvY3VzYWJsZS5kZWZhdWx0LFxuICBNaXJyb3I6IE1pcnJvci5kZWZhdWx0LFxuICBTY3JvbGxhYmxlOiBTY3JvbGxhYmxlLmRlZmF1bHRcbn07XG5cbkRyYWdnYWJsZS5TZW5zb3JzID0ge1xuICBNb3VzZVNlbnNvcjogTW91c2VTZW5zb3IuZGVmYXVsdCxcbiAgVG91Y2hTZW5zb3I6IFRvdWNoU2Vuc29yLmRlZmF1bHRcbn07XG5mdW5jdGlvbiBnZXRTZW5zb3JFdmVudChldmVudCkge1xuICByZXR1cm4gZXZlbnQuZGV0YWlsO1xufVxuZnVuY3Rpb24gYXBwbHlVc2VyU2VsZWN0KGVsZW1lbnQsIHZhbHVlKSB7XG4gIGVsZW1lbnQuc3R5bGUud2Via2l0VXNlclNlbGVjdCA9IHZhbHVlO1xuICBlbGVtZW50LnN0eWxlLm1velVzZXJTZWxlY3QgPSB2YWx1ZTtcbiAgZWxlbWVudC5zdHlsZS5tc1VzZXJTZWxlY3QgPSB2YWx1ZTtcbiAgZWxlbWVudC5zdHlsZS5vVXNlclNlbGVjdCA9IHZhbHVlO1xuICBlbGVtZW50LnN0eWxlLnVzZXJTZWxlY3QgPSB2YWx1ZTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gRHJhZ2dhYmxlO1xuZXhwb3J0cy5kZWZhdWx0T3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQWJzdHJhY3RFdmVudCA9IHJlcXVpcmUoJy4uLy4uL3NoYXJlZC9BYnN0cmFjdEV2ZW50L0Fic3RyYWN0RXZlbnQuY2pzJyk7XG5cbmNsYXNzIERyYWdnYWJsZUV2ZW50IGV4dGVuZHMgQWJzdHJhY3RFdmVudC5BYnN0cmFjdEV2ZW50IHtcblxuICBnZXQgZHJhZ2dhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuZHJhZ2dhYmxlO1xuICB9XG59XG5cbkRyYWdnYWJsZUV2ZW50LnR5cGUgPSAnZHJhZ2dhYmxlJztcbmNsYXNzIERyYWdnYWJsZUluaXRpYWxpemVkRXZlbnQgZXh0ZW5kcyBEcmFnZ2FibGVFdmVudCB7fVxuXG5EcmFnZ2FibGVJbml0aWFsaXplZEV2ZW50LnR5cGUgPSAnZHJhZ2dhYmxlOmluaXRpYWxpemUnO1xuY2xhc3MgRHJhZ2dhYmxlRGVzdHJveUV2ZW50IGV4dGVuZHMgRHJhZ2dhYmxlRXZlbnQge31cbkRyYWdnYWJsZURlc3Ryb3lFdmVudC50eXBlID0gJ2RyYWdnYWJsZTpkZXN0cm95JztcblxuZXhwb3J0cy5EcmFnZ2FibGVEZXN0cm95RXZlbnQgPSBEcmFnZ2FibGVEZXN0cm95RXZlbnQ7XG5leHBvcnRzLkRyYWdnYWJsZUV2ZW50ID0gRHJhZ2dhYmxlRXZlbnQ7XG5leHBvcnRzLkRyYWdnYWJsZUluaXRpYWxpemVkRXZlbnQgPSBEcmFnZ2FibGVJbml0aWFsaXplZEV2ZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG5jbGFzcyBFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jYWxsYmFja3MgPSB7fTtcbiAgfVxuXG4gIG9uKHR5cGUsIC4uLmNhbGxiYWNrcykge1xuICAgIGlmICghdGhpcy5jYWxsYmFja3NbdHlwZV0pIHtcbiAgICAgIHRoaXMuY2FsbGJhY2tzW3R5cGVdID0gW107XG4gICAgfVxuICAgIHRoaXMuY2FsbGJhY2tzW3R5cGVdLnB1c2goLi4uY2FsbGJhY2tzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9mZih0eXBlLCBjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5jYWxsYmFja3NbdHlwZV0pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBjb3B5ID0gdGhpcy5jYWxsYmFja3NbdHlwZV0uc2xpY2UoMCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3B5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoY2FsbGJhY2sgPT09IGNvcHlbaV0pIHtcbiAgICAgICAgdGhpcy5jYWxsYmFja3NbdHlwZV0uc3BsaWNlKGksIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRyaWdnZXIoZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuY2FsbGJhY2tzW2V2ZW50LnR5cGVdKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2tzID0gWy4uLnRoaXMuY2FsbGJhY2tzW2V2ZW50LnR5cGVdXTtcbiAgICBjb25zdCBjYXVnaHRFcnJvcnMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gY2FsbGJhY2tzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IGNhbGxiYWNrc1tpXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhdWdodEVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNhdWdodEVycm9ycy5sZW5ndGgpIHtcblxuICAgICAgY29uc29sZS5lcnJvcihgRHJhZ2dhYmxlIGNhdWdodCBlcnJvcnMgd2hpbGUgdHJpZ2dlcmluZyAnJHtldmVudC50eXBlfSdgLCBjYXVnaHRFcnJvcnMpO1xuXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gRW1pdHRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxudmFyIEFic3RyYWN0UGx1Z2luID0gcmVxdWlyZSgnLi4vLi4vLi4vc2hhcmVkL0Fic3RyYWN0UGx1Z2luL0Fic3RyYWN0UGx1Z2luLmNqcycpO1xuXG5jb25zdCBvbkluaXRpYWxpemUgPSBTeW1ib2woJ29uSW5pdGlhbGl6ZScpO1xuY29uc3Qgb25EZXN0cm95ID0gU3ltYm9sKCdvbkRlc3Ryb3knKTtcbmNvbnN0IGFubm91bmNlRXZlbnQgPSBTeW1ib2woJ2Fubm91bmNlRXZlbnQnKTtcbmNvbnN0IGFubm91bmNlTWVzc2FnZSA9IFN5bWJvbCgnYW5ub3VuY2VNZXNzYWdlJyk7XG5jb25zdCBBUklBX1JFTEVWQU5UID0gJ2FyaWEtcmVsZXZhbnQnO1xuY29uc3QgQVJJQV9BVE9NSUMgPSAnYXJpYS1hdG9taWMnO1xuY29uc3QgQVJJQV9MSVZFID0gJ2FyaWEtbGl2ZSc7XG5jb25zdCBST0xFID0gJ3JvbGUnO1xuXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgZXhwaXJlOiA3MDAwXG59O1xuXG5jbGFzcyBBbm5vdW5jZW1lbnQgZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbi5BYnN0cmFjdFBsdWdpbiB7XG5cbiAgY29uc3RydWN0b3IoZHJhZ2dhYmxlKSB7XG4gICAgc3VwZXIoZHJhZ2dhYmxlKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgLi4udGhpcy5nZXRPcHRpb25zKClcbiAgICB9O1xuXG4gICAgdGhpcy5vcmlnaW5hbFRyaWdnZXJNZXRob2QgPSB0aGlzLmRyYWdnYWJsZS50cmlnZ2VyO1xuICAgIHRoaXNbb25Jbml0aWFsaXplXSA9IHRoaXNbb25Jbml0aWFsaXplXS5iaW5kKHRoaXMpO1xuICAgIHRoaXNbb25EZXN0cm95XSA9IHRoaXNbb25EZXN0cm95XS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgYXR0YWNoKCkge1xuICAgIHRoaXMuZHJhZ2dhYmxlLm9uKCdkcmFnZ2FibGU6aW5pdGlhbGl6ZScsIHRoaXNbb25Jbml0aWFsaXplXSk7XG4gIH1cblxuICBkZXRhY2goKSB7XG4gICAgdGhpcy5kcmFnZ2FibGUub2ZmKCdkcmFnZ2FibGU6ZGVzdHJveScsIHRoaXNbb25EZXN0cm95XSk7XG4gIH1cblxuICBnZXRPcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmRyYWdnYWJsZS5vcHRpb25zLmFubm91bmNlbWVudHMgfHwge307XG4gIH1cblxuICBbYW5ub3VuY2VFdmVudF0oZXZlbnQpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5vcHRpb25zW2V2ZW50LnR5cGVdO1xuICAgIGlmIChtZXNzYWdlICYmIHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpc1thbm5vdW5jZU1lc3NhZ2VdKG1lc3NhZ2UpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZSAmJiB0eXBlb2YgbWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1thbm5vdW5jZU1lc3NhZ2VdKG1lc3NhZ2UoZXZlbnQpKTtcbiAgICB9XG4gIH1cblxuICBbYW5ub3VuY2VNZXNzYWdlXShtZXNzYWdlKSB7XG4gICAgYW5ub3VuY2UobWVzc2FnZSwge1xuICAgICAgZXhwaXJlOiB0aGlzLm9wdGlvbnMuZXhwaXJlXG4gICAgfSk7XG4gIH1cblxuICBbb25Jbml0aWFsaXplXSgpIHtcblxuICAgIHRoaXMuZHJhZ2dhYmxlLnRyaWdnZXIgPSBldmVudCA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzW2Fubm91bmNlRXZlbnRdKGV2ZW50KTtcbiAgICAgIH0gZmluYWxseSB7XG5cbiAgICAgICAgdGhpcy5vcmlnaW5hbFRyaWdnZXJNZXRob2QuY2FsbCh0aGlzLmRyYWdnYWJsZSwgZXZlbnQpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBbb25EZXN0cm95XSgpIHtcbiAgICB0aGlzLmRyYWdnYWJsZS50cmlnZ2VyID0gdGhpcy5vcmlnaW5hbFRyaWdnZXJNZXRob2Q7XG4gIH1cbn1cblxuY29uc3QgbGl2ZVJlZ2lvbiA9IGNyZWF0ZVJlZ2lvbigpO1xuXG5mdW5jdGlvbiBhbm5vdW5jZShtZXNzYWdlLCB7XG4gIGV4cGlyZVxufSkge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGVsZW1lbnQudGV4dENvbnRlbnQgPSBtZXNzYWdlO1xuICBsaXZlUmVnaW9uLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICByZXR1cm4gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgbGl2ZVJlZ2lvbi5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgfSwgZXhwaXJlKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUmVnaW9uKCkge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdpZCcsICdkcmFnZ2FibGUtbGl2ZS1yZWdpb24nKTtcbiAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoQVJJQV9SRUxFVkFOVCwgJ2FkZGl0aW9ucycpO1xuICBlbGVtZW50LnNldEF0dHJpYnV0ZShBUklBX0FUT01JQywgJ3RydWUnKTtcbiAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoQVJJQV9MSVZFLCAnYXNzZXJ0aXZlJyk7XG4gIGVsZW1lbnQuc2V0QXR0cmlidXRlKFJPTEUsICdsb2cnKTtcbiAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMXB4JztcbiAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMXB4JztcbiAgZWxlbWVudC5zdHlsZS50b3AgPSAnLTFweCc7XG4gIGVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGl2ZVJlZ2lvbik7XG59KTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gQW5ub3VuY2VtZW50O1xuZXhwb3J0cy5kZWZhdWx0T3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgQWJzdHJhY3RQbHVnaW4gPSByZXF1aXJlKCcuLi8uLi8uLi9zaGFyZWQvQWJzdHJhY3RQbHVnaW4vQWJzdHJhY3RQbHVnaW4uY2pzJyk7XG5cbmNvbnN0IG9uSW5pdGlhbGl6ZSA9IFN5bWJvbCgnb25Jbml0aWFsaXplJyk7XG5jb25zdCBvbkRlc3Ryb3kgPSBTeW1ib2woJ29uRGVzdHJveScpO1xuXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHt9O1xuXG5jbGFzcyBGb2N1c2FibGUgZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbi5BYnN0cmFjdFBsdWdpbiB7XG5cbiAgY29uc3RydWN0b3IoZHJhZ2dhYmxlKSB7XG4gICAgc3VwZXIoZHJhZ2dhYmxlKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgLi4udGhpcy5nZXRPcHRpb25zKClcbiAgICB9O1xuICAgIHRoaXNbb25Jbml0aWFsaXplXSA9IHRoaXNbb25Jbml0aWFsaXplXS5iaW5kKHRoaXMpO1xuICAgIHRoaXNbb25EZXN0cm95XSA9IHRoaXNbb25EZXN0cm95XS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgYXR0YWNoKCkge1xuICAgIHRoaXMuZHJhZ2dhYmxlLm9uKCdkcmFnZ2FibGU6aW5pdGlhbGl6ZScsIHRoaXNbb25Jbml0aWFsaXplXSkub24oJ2RyYWdnYWJsZTpkZXN0cm95JywgdGhpc1tvbkRlc3Ryb3ldKTtcbiAgfVxuXG4gIGRldGFjaCgpIHtcbiAgICB0aGlzLmRyYWdnYWJsZS5vZmYoJ2RyYWdnYWJsZTppbml0aWFsaXplJywgdGhpc1tvbkluaXRpYWxpemVdKS5vZmYoJ2RyYWdnYWJsZTpkZXN0cm95JywgdGhpc1tvbkRlc3Ryb3ldKTtcblxuICAgIHRoaXNbb25EZXN0cm95XSgpO1xuICB9XG5cbiAgZ2V0T3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5kcmFnZ2FibGUub3B0aW9ucy5mb2N1c2FibGUgfHwge307XG4gIH1cblxuICBnZXRFbGVtZW50cygpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuZHJhZ2dhYmxlLmNvbnRhaW5lcnMsIC4uLnRoaXMuZHJhZ2dhYmxlLmdldERyYWdnYWJsZUVsZW1lbnRzKCldO1xuICB9XG5cbiAgW29uSW5pdGlhbGl6ZV0oKSB7XG5cbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGhpcy5nZXRFbGVtZW50cygpLmZvckVhY2goZWxlbWVudCA9PiBkZWNvcmF0ZUVsZW1lbnQoZWxlbWVudCkpO1xuICAgIH0pO1xuICB9XG5cbiAgW29uRGVzdHJveV0oKSB7XG5cbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGhpcy5nZXRFbGVtZW50cygpLmZvckVhY2goZWxlbWVudCA9PiBzdHJpcEVsZW1lbnQoZWxlbWVudCkpO1xuICAgIH0pO1xuICB9XG59XG5cbmNvbnN0IGVsZW1lbnRzV2l0aE1pc3NpbmdUYWJJbmRleCA9IFtdO1xuXG5mdW5jdGlvbiBkZWNvcmF0ZUVsZW1lbnQoZWxlbWVudCkge1xuICBjb25zdCBoYXNNaXNzaW5nVGFiSW5kZXggPSBCb29sZWFuKCFlbGVtZW50LmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSAmJiBlbGVtZW50LnRhYkluZGV4ID09PSAtMSk7XG4gIGlmIChoYXNNaXNzaW5nVGFiSW5kZXgpIHtcbiAgICBlbGVtZW50c1dpdGhNaXNzaW5nVGFiSW5kZXgucHVzaChlbGVtZW50KTtcbiAgICBlbGVtZW50LnRhYkluZGV4ID0gMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdHJpcEVsZW1lbnQoZWxlbWVudCkge1xuICBjb25zdCB0YWJJbmRleEVsZW1lbnRQb3NpdGlvbiA9IGVsZW1lbnRzV2l0aE1pc3NpbmdUYWJJbmRleC5pbmRleE9mKGVsZW1lbnQpO1xuICBpZiAodGFiSW5kZXhFbGVtZW50UG9zaXRpb24gIT09IC0xKSB7XG4gICAgZWxlbWVudC50YWJJbmRleCA9IC0xO1xuICAgIGVsZW1lbnRzV2l0aE1pc3NpbmdUYWJJbmRleC5zcGxpY2UodGFiSW5kZXhFbGVtZW50UG9zaXRpb24sIDEpO1xuICB9XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IEZvY3VzYWJsZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxudmFyIEFic3RyYWN0UGx1Z2luID0gcmVxdWlyZSgnLi4vLi4vLi4vc2hhcmVkL0Fic3RyYWN0UGx1Z2luL0Fic3RyYWN0UGx1Z2luLmNqcycpO1xudmFyIE1pcnJvckV2ZW50ID0gcmVxdWlyZSgnLi9NaXJyb3JFdmVudC9NaXJyb3JFdmVudC5janMnKTtcblxuY29uc3Qgb25EcmFnU3RhcnQgPSBTeW1ib2woJ29uRHJhZ1N0YXJ0Jyk7XG5jb25zdCBvbkRyYWdNb3ZlID0gU3ltYm9sKCdvbkRyYWdNb3ZlJyk7XG5jb25zdCBvbkRyYWdTdG9wID0gU3ltYm9sKCdvbkRyYWdTdG9wJyk7XG5jb25zdCBvbk1pcnJvckNyZWF0ZWQgPSBTeW1ib2woJ29uTWlycm9yQ3JlYXRlZCcpO1xuY29uc3Qgb25NaXJyb3JNb3ZlID0gU3ltYm9sKCdvbk1pcnJvck1vdmUnKTtcbmNvbnN0IG9uU2Nyb2xsID0gU3ltYm9sKCdvblNjcm9sbCcpO1xuY29uc3QgZ2V0QXBwZW5kYWJsZUNvbnRhaW5lciA9IFN5bWJvbCgnZ2V0QXBwZW5kYWJsZUNvbnRhaW5lcicpO1xuXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgY29uc3RyYWluRGltZW5zaW9uczogZmFsc2UsXG4gIHhBeGlzOiB0cnVlLFxuICB5QXhpczogdHJ1ZSxcbiAgY3Vyc29yT2Zmc2V0WDogbnVsbCxcbiAgY3Vyc29yT2Zmc2V0WTogbnVsbCxcbiAgdGhyZXNob2xkWDogbnVsbCxcbiAgdGhyZXNob2xkWTogbnVsbFxufTtcblxuY2xhc3MgTWlycm9yIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4uQWJzdHJhY3RQbHVnaW4ge1xuXG4gIGNvbnN0cnVjdG9yKGRyYWdnYWJsZSkge1xuICAgIHN1cGVyKGRyYWdnYWJsZSk7XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAuLi5kZWZhdWx0T3B0aW9ucyxcbiAgICAgIC4uLnRoaXMuZ2V0T3B0aW9ucygpXG4gICAgfTtcblxuICAgIHRoaXMuc2Nyb2xsT2Zmc2V0ID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuXG4gICAgdGhpcy5pbml0aWFsU2Nyb2xsT2Zmc2V0ID0ge1xuICAgICAgeDogd2luZG93LnNjcm9sbFgsXG4gICAgICB5OiB3aW5kb3cuc2Nyb2xsWVxuICAgIH07XG4gICAgdGhpc1tvbkRyYWdTdGFydF0gPSB0aGlzW29uRHJhZ1N0YXJ0XS5iaW5kKHRoaXMpO1xuICAgIHRoaXNbb25EcmFnTW92ZV0gPSB0aGlzW29uRHJhZ01vdmVdLmJpbmQodGhpcyk7XG4gICAgdGhpc1tvbkRyYWdTdG9wXSA9IHRoaXNbb25EcmFnU3RvcF0uYmluZCh0aGlzKTtcbiAgICB0aGlzW29uTWlycm9yQ3JlYXRlZF0gPSB0aGlzW29uTWlycm9yQ3JlYXRlZF0uYmluZCh0aGlzKTtcbiAgICB0aGlzW29uTWlycm9yTW92ZV0gPSB0aGlzW29uTWlycm9yTW92ZV0uYmluZCh0aGlzKTtcbiAgICB0aGlzW29uU2Nyb2xsXSA9IHRoaXNbb25TY3JvbGxdLmJpbmQodGhpcyk7XG4gIH1cblxuICBhdHRhY2goKSB7XG4gICAgdGhpcy5kcmFnZ2FibGUub24oJ2RyYWc6c3RhcnQnLCB0aGlzW29uRHJhZ1N0YXJ0XSkub24oJ2RyYWc6bW92ZScsIHRoaXNbb25EcmFnTW92ZV0pLm9uKCdkcmFnOnN0b3AnLCB0aGlzW29uRHJhZ1N0b3BdKS5vbignbWlycm9yOmNyZWF0ZWQnLCB0aGlzW29uTWlycm9yQ3JlYXRlZF0pLm9uKCdtaXJyb3I6bW92ZScsIHRoaXNbb25NaXJyb3JNb3ZlXSk7XG4gIH1cblxuICBkZXRhY2goKSB7XG4gICAgdGhpcy5kcmFnZ2FibGUub2ZmKCdkcmFnOnN0YXJ0JywgdGhpc1tvbkRyYWdTdGFydF0pLm9mZignZHJhZzptb3ZlJywgdGhpc1tvbkRyYWdNb3ZlXSkub2ZmKCdkcmFnOnN0b3AnLCB0aGlzW29uRHJhZ1N0b3BdKS5vZmYoJ21pcnJvcjpjcmVhdGVkJywgdGhpc1tvbk1pcnJvckNyZWF0ZWRdKS5vZmYoJ21pcnJvcjptb3ZlJywgdGhpc1tvbk1pcnJvck1vdmVdKTtcbiAgfVxuXG4gIGdldE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHJhZ2dhYmxlLm9wdGlvbnMubWlycm9yIHx8IHt9O1xuICB9XG4gIFtvbkRyYWdTdGFydF0oZHJhZ0V2ZW50KSB7XG4gICAgaWYgKGRyYWdFdmVudC5jYW5jZWxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiB3aW5kb3cpIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXNbb25TY3JvbGxdLCB0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5pbml0aWFsU2Nyb2xsT2Zmc2V0ID0ge1xuICAgICAgeDogd2luZG93LnNjcm9sbFgsXG4gICAgICB5OiB3aW5kb3cuc2Nyb2xsWVxuICAgIH07XG4gICAgY29uc3Qge1xuICAgICAgc291cmNlLFxuICAgICAgb3JpZ2luYWxTb3VyY2UsXG4gICAgICBzb3VyY2VDb250YWluZXIsXG4gICAgICBzZW5zb3JFdmVudFxuICAgIH0gPSBkcmFnRXZlbnQ7XG5cbiAgICB0aGlzLmxhc3RNaXJyb3JNb3ZlZENsaWVudCA9IHtcbiAgICAgIHg6IHNlbnNvckV2ZW50LmNsaWVudFgsXG4gICAgICB5OiBzZW5zb3JFdmVudC5jbGllbnRZXG4gICAgfTtcbiAgICBjb25zdCBtaXJyb3JDcmVhdGVFdmVudCA9IG5ldyBNaXJyb3JFdmVudC5NaXJyb3JDcmVhdGVFdmVudCh7XG4gICAgICBzb3VyY2UsXG4gICAgICBvcmlnaW5hbFNvdXJjZSxcbiAgICAgIHNvdXJjZUNvbnRhaW5lcixcbiAgICAgIHNlbnNvckV2ZW50LFxuICAgICAgZHJhZ0V2ZW50XG4gICAgfSk7XG4gICAgdGhpcy5kcmFnZ2FibGUudHJpZ2dlcihtaXJyb3JDcmVhdGVFdmVudCk7XG4gICAgaWYgKGlzTmF0aXZlRHJhZ0V2ZW50KHNlbnNvckV2ZW50KSB8fCBtaXJyb3JDcmVhdGVFdmVudC5jYW5jZWxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFwcGVuZGFibGVDb250YWluZXIgPSB0aGlzW2dldEFwcGVuZGFibGVDb250YWluZXJdKHNvdXJjZSkgfHwgc291cmNlQ29udGFpbmVyO1xuICAgIHRoaXMubWlycm9yID0gc291cmNlLmNsb25lTm9kZSh0cnVlKTtcbiAgICBjb25zdCBtaXJyb3JDcmVhdGVkRXZlbnQgPSBuZXcgTWlycm9yRXZlbnQuTWlycm9yQ3JlYXRlZEV2ZW50KHtcbiAgICAgIHNvdXJjZSxcbiAgICAgIG9yaWdpbmFsU291cmNlLFxuICAgICAgc291cmNlQ29udGFpbmVyLFxuICAgICAgc2Vuc29yRXZlbnQsXG4gICAgICBkcmFnRXZlbnQsXG4gICAgICBtaXJyb3I6IHRoaXMubWlycm9yXG4gICAgfSk7XG4gICAgY29uc3QgbWlycm9yQXR0YWNoZWRFdmVudCA9IG5ldyBNaXJyb3JFdmVudC5NaXJyb3JBdHRhY2hlZEV2ZW50KHtcbiAgICAgIHNvdXJjZSxcbiAgICAgIG9yaWdpbmFsU291cmNlLFxuICAgICAgc291cmNlQ29udGFpbmVyLFxuICAgICAgc2Vuc29yRXZlbnQsXG4gICAgICBkcmFnRXZlbnQsXG4gICAgICBtaXJyb3I6IHRoaXMubWlycm9yXG4gICAgfSk7XG4gICAgdGhpcy5kcmFnZ2FibGUudHJpZ2dlcihtaXJyb3JDcmVhdGVkRXZlbnQpO1xuICAgIGFwcGVuZGFibGVDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5taXJyb3IpO1xuICAgIHRoaXMuZHJhZ2dhYmxlLnRyaWdnZXIobWlycm9yQXR0YWNoZWRFdmVudCk7XG4gIH1cbiAgW29uRHJhZ01vdmVdKGRyYWdFdmVudCkge1xuICAgIGlmICghdGhpcy5taXJyb3IgfHwgZHJhZ0V2ZW50LmNhbmNlbGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgc291cmNlLFxuICAgICAgb3JpZ2luYWxTb3VyY2UsXG4gICAgICBzb3VyY2VDb250YWluZXIsXG4gICAgICBzZW5zb3JFdmVudFxuICAgIH0gPSBkcmFnRXZlbnQ7XG4gICAgbGV0IHBhc3NlZFRocmVzaFggPSB0cnVlO1xuICAgIGxldCBwYXNzZWRUaHJlc2hZID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5vcHRpb25zLnRocmVzaG9sZFggfHwgdGhpcy5vcHRpb25zLnRocmVzaG9sZFkpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeDogbGFzdFgsXG4gICAgICAgIHk6IGxhc3RZXG4gICAgICB9ID0gdGhpcy5sYXN0TWlycm9yTW92ZWRDbGllbnQ7XG4gICAgICBpZiAoTWF0aC5hYnMobGFzdFggLSBzZW5zb3JFdmVudC5jbGllbnRYKSA8IHRoaXMub3B0aW9ucy50aHJlc2hvbGRYKSB7XG4gICAgICAgIHBhc3NlZFRocmVzaFggPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubGFzdE1pcnJvck1vdmVkQ2xpZW50LnggPSBzZW5zb3JFdmVudC5jbGllbnRYO1xuICAgICAgfVxuICAgICAgaWYgKE1hdGguYWJzKGxhc3RZIC0gc2Vuc29yRXZlbnQuY2xpZW50WSkgPCB0aGlzLm9wdGlvbnMudGhyZXNob2xkWSkge1xuICAgICAgICBwYXNzZWRUaHJlc2hZID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxhc3RNaXJyb3JNb3ZlZENsaWVudC55ID0gc2Vuc29yRXZlbnQuY2xpZW50WTtcbiAgICAgIH1cbiAgICAgIGlmICghcGFzc2VkVGhyZXNoWCAmJiAhcGFzc2VkVGhyZXNoWSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG1pcnJvck1vdmVFdmVudCA9IG5ldyBNaXJyb3JFdmVudC5NaXJyb3JNb3ZlRXZlbnQoe1xuICAgICAgc291cmNlLFxuICAgICAgb3JpZ2luYWxTb3VyY2UsXG4gICAgICBzb3VyY2VDb250YWluZXIsXG4gICAgICBzZW5zb3JFdmVudCxcbiAgICAgIGRyYWdFdmVudCxcbiAgICAgIG1pcnJvcjogdGhpcy5taXJyb3IsXG4gICAgICBwYXNzZWRUaHJlc2hYLFxuICAgICAgcGFzc2VkVGhyZXNoWVxuICAgIH0pO1xuICAgIHRoaXMuZHJhZ2dhYmxlLnRyaWdnZXIobWlycm9yTW92ZUV2ZW50KTtcbiAgfVxuICBbb25EcmFnU3RvcF0oZHJhZ0V2ZW50KSB7XG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdykge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpc1tvblNjcm9sbF0sIHRydWUpO1xuICAgIH1cbiAgICB0aGlzLmluaXRpYWxTY3JvbGxPZmZzZXQgPSB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH07XG4gICAgdGhpcy5zY3JvbGxPZmZzZXQgPSB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH07XG4gICAgaWYgKCF0aGlzLm1pcnJvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBzb3VyY2UsXG4gICAgICBzb3VyY2VDb250YWluZXIsXG4gICAgICBzZW5zb3JFdmVudFxuICAgIH0gPSBkcmFnRXZlbnQ7XG4gICAgY29uc3QgbWlycm9yRGVzdHJveUV2ZW50ID0gbmV3IE1pcnJvckV2ZW50Lk1pcnJvckRlc3Ryb3lFdmVudCh7XG4gICAgICBzb3VyY2UsXG4gICAgICBtaXJyb3I6IHRoaXMubWlycm9yLFxuICAgICAgc291cmNlQ29udGFpbmVyLFxuICAgICAgc2Vuc29yRXZlbnQsXG4gICAgICBkcmFnRXZlbnRcbiAgICB9KTtcbiAgICB0aGlzLmRyYWdnYWJsZS50cmlnZ2VyKG1pcnJvckRlc3Ryb3lFdmVudCk7XG4gICAgaWYgKCFtaXJyb3JEZXN0cm95RXZlbnQuY2FuY2VsZWQoKSkge1xuICAgICAgdGhpcy5taXJyb3IucmVtb3ZlKCk7XG4gICAgfVxuICB9XG4gIFtvblNjcm9sbF0oKSB7XG4gICAgdGhpcy5zY3JvbGxPZmZzZXQgPSB7XG4gICAgICB4OiB3aW5kb3cuc2Nyb2xsWCAtIHRoaXMuaW5pdGlhbFNjcm9sbE9mZnNldC54LFxuICAgICAgeTogd2luZG93LnNjcm9sbFkgLSB0aGlzLmluaXRpYWxTY3JvbGxPZmZzZXQueVxuICAgIH07XG4gIH1cblxuICBbb25NaXJyb3JDcmVhdGVkXSh7XG4gICAgbWlycm9yLFxuICAgIHNvdXJjZSxcbiAgICBzZW5zb3JFdmVudFxuICB9KSB7XG4gICAgY29uc3QgbWlycm9yQ2xhc3NlcyA9IHRoaXMuZHJhZ2dhYmxlLmdldENsYXNzTmFtZXNGb3IoJ21pcnJvcicpO1xuICAgIGNvbnN0IHNldFN0YXRlID0gKHtcbiAgICAgIG1pcnJvck9mZnNldCxcbiAgICAgIGluaXRpYWxYLFxuICAgICAgaW5pdGlhbFksXG4gICAgICAuLi5hcmdzXG4gICAgfSkgPT4ge1xuICAgICAgdGhpcy5taXJyb3JPZmZzZXQgPSBtaXJyb3JPZmZzZXQ7XG4gICAgICB0aGlzLmluaXRpYWxYID0gaW5pdGlhbFg7XG4gICAgICB0aGlzLmluaXRpYWxZID0gaW5pdGlhbFk7XG4gICAgICB0aGlzLmxhc3RNb3ZlZFggPSBpbml0aWFsWDtcbiAgICAgIHRoaXMubGFzdE1vdmVkWSA9IGluaXRpYWxZO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWlycm9yT2Zmc2V0LFxuICAgICAgICBpbml0aWFsWCxcbiAgICAgICAgaW5pdGlhbFksXG4gICAgICAgIC4uLmFyZ3NcbiAgICAgIH07XG4gICAgfTtcbiAgICBtaXJyb3Iuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBjb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gICAgICBtaXJyb3IsXG4gICAgICBzb3VyY2UsXG4gICAgICBzZW5zb3JFdmVudCxcbiAgICAgIG1pcnJvckNsYXNzZXMsXG4gICAgICBzY3JvbGxPZmZzZXQ6IHRoaXMuc2Nyb2xsT2Zmc2V0LFxuICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgcGFzc2VkVGhyZXNoWDogdHJ1ZSxcbiAgICAgIHBhc3NlZFRocmVzaFk6IHRydWVcbiAgICB9O1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoaW5pdGlhbFN0YXRlKVxuXG4gICAgLnRoZW4oY29tcHV0ZU1pcnJvckRpbWVuc2lvbnMpLnRoZW4oY2FsY3VsYXRlTWlycm9yT2Zmc2V0KS50aGVuKHJlc2V0TWlycm9yKS50aGVuKGFkZE1pcnJvckNsYXNzZXMpLnRoZW4ocG9zaXRpb25NaXJyb3Ioe1xuICAgICAgaW5pdGlhbDogdHJ1ZVxuICAgIH0pKS50aGVuKHJlbW92ZU1pcnJvcklEKS50aGVuKHNldFN0YXRlKTtcbiAgfVxuXG4gIFtvbk1pcnJvck1vdmVdKG1pcnJvckV2ZW50KSB7XG4gICAgaWYgKG1pcnJvckV2ZW50LmNhbmNlbGVkKCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBzZXRTdGF0ZSA9ICh7XG4gICAgICBsYXN0TW92ZWRYLFxuICAgICAgbGFzdE1vdmVkWSxcbiAgICAgIC4uLmFyZ3NcbiAgICB9KSA9PiB7XG4gICAgICB0aGlzLmxhc3RNb3ZlZFggPSBsYXN0TW92ZWRYO1xuICAgICAgdGhpcy5sYXN0TW92ZWRZID0gbGFzdE1vdmVkWTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhc3RNb3ZlZFgsXG4gICAgICAgIGxhc3RNb3ZlZFksXG4gICAgICAgIC4uLmFyZ3NcbiAgICAgIH07XG4gICAgfTtcbiAgICBjb25zdCB0cmlnZ2VyTW92ZWQgPSBhcmdzID0+IHtcbiAgICAgIGNvbnN0IG1pcnJvck1vdmVkRXZlbnQgPSBuZXcgTWlycm9yRXZlbnQuTWlycm9yTW92ZWRFdmVudCh7XG4gICAgICAgIHNvdXJjZTogbWlycm9yRXZlbnQuc291cmNlLFxuICAgICAgICBvcmlnaW5hbFNvdXJjZTogbWlycm9yRXZlbnQub3JpZ2luYWxTb3VyY2UsXG4gICAgICAgIHNvdXJjZUNvbnRhaW5lcjogbWlycm9yRXZlbnQuc291cmNlQ29udGFpbmVyLFxuICAgICAgICBzZW5zb3JFdmVudDogbWlycm9yRXZlbnQuc2Vuc29yRXZlbnQsXG4gICAgICAgIGRyYWdFdmVudDogbWlycm9yRXZlbnQuZHJhZ0V2ZW50LFxuICAgICAgICBtaXJyb3I6IHRoaXMubWlycm9yLFxuICAgICAgICBwYXNzZWRUaHJlc2hYOiBtaXJyb3JFdmVudC5wYXNzZWRUaHJlc2hYLFxuICAgICAgICBwYXNzZWRUaHJlc2hZOiBtaXJyb3JFdmVudC5wYXNzZWRUaHJlc2hZXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZHJhZ2dhYmxlLnRyaWdnZXIobWlycm9yTW92ZWRFdmVudCk7XG4gICAgICByZXR1cm4gYXJncztcbiAgICB9O1xuICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHtcbiAgICAgIG1pcnJvcjogbWlycm9yRXZlbnQubWlycm9yLFxuICAgICAgc2Vuc29yRXZlbnQ6IG1pcnJvckV2ZW50LnNlbnNvckV2ZW50LFxuICAgICAgbWlycm9yT2Zmc2V0OiB0aGlzLm1pcnJvck9mZnNldCxcbiAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgIGluaXRpYWxYOiB0aGlzLmluaXRpYWxYLFxuICAgICAgaW5pdGlhbFk6IHRoaXMuaW5pdGlhbFksXG4gICAgICBzY3JvbGxPZmZzZXQ6IHRoaXMuc2Nyb2xsT2Zmc2V0LFxuICAgICAgcGFzc2VkVGhyZXNoWDogbWlycm9yRXZlbnQucGFzc2VkVGhyZXNoWCxcbiAgICAgIHBhc3NlZFRocmVzaFk6IG1pcnJvckV2ZW50LnBhc3NlZFRocmVzaFksXG4gICAgICBsYXN0TW92ZWRYOiB0aGlzLmxhc3RNb3ZlZFgsXG4gICAgICBsYXN0TW92ZWRZOiB0aGlzLmxhc3RNb3ZlZFlcbiAgICB9O1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoaW5pdGlhbFN0YXRlKS50aGVuKHBvc2l0aW9uTWlycm9yKHtcbiAgICAgIHJhZjogdHJ1ZVxuICAgIH0pKS50aGVuKHNldFN0YXRlKS50aGVuKHRyaWdnZXJNb3ZlZCk7XG4gIH1cblxuICBbZ2V0QXBwZW5kYWJsZUNvbnRhaW5lcl0oc291cmNlKSB7XG4gICAgY29uc3QgYXBwZW5kVG8gPSB0aGlzLm9wdGlvbnMuYXBwZW5kVG87XG4gICAgaWYgKHR5cGVvZiBhcHBlbmRUbyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGFwcGVuZFRvKTtcbiAgICB9IGVsc2UgaWYgKGFwcGVuZFRvIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBhcHBlbmRUbztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcHBlbmRUbyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGFwcGVuZFRvKHNvdXJjZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzb3VyY2UucGFyZW50Tm9kZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcHV0ZU1pcnJvckRpbWVuc2lvbnMoe1xuICBzb3VyY2UsXG4gIC4uLmFyZ3Ncbn0pIHtcbiAgcmV0dXJuIHdpdGhQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIGNvbnN0IHNvdXJjZVJlY3QgPSBzb3VyY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmVzb2x2ZSh7XG4gICAgICBzb3VyY2UsXG4gICAgICBzb3VyY2VSZWN0LFxuICAgICAgLi4uYXJnc1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlTWlycm9yT2Zmc2V0KHtcbiAgc2Vuc29yRXZlbnQsXG4gIHNvdXJjZVJlY3QsXG4gIG9wdGlvbnMsXG4gIC4uLmFyZ3Ncbn0pIHtcbiAgcmV0dXJuIHdpdGhQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIGNvbnN0IHRvcCA9IG9wdGlvbnMuY3Vyc29yT2Zmc2V0WSA9PT0gbnVsbCA/IHNlbnNvckV2ZW50LmNsaWVudFkgLSBzb3VyY2VSZWN0LnRvcCA6IG9wdGlvbnMuY3Vyc29yT2Zmc2V0WTtcbiAgICBjb25zdCBsZWZ0ID0gb3B0aW9ucy5jdXJzb3JPZmZzZXRYID09PSBudWxsID8gc2Vuc29yRXZlbnQuY2xpZW50WCAtIHNvdXJjZVJlY3QubGVmdCA6IG9wdGlvbnMuY3Vyc29yT2Zmc2V0WDtcbiAgICBjb25zdCBtaXJyb3JPZmZzZXQgPSB7XG4gICAgICB0b3AsXG4gICAgICBsZWZ0XG4gICAgfTtcbiAgICByZXNvbHZlKHtcbiAgICAgIHNlbnNvckV2ZW50LFxuICAgICAgc291cmNlUmVjdCxcbiAgICAgIG1pcnJvck9mZnNldCxcbiAgICAgIG9wdGlvbnMsXG4gICAgICAuLi5hcmdzXG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXNldE1pcnJvcih7XG4gIG1pcnJvcixcbiAgc291cmNlLFxuICBvcHRpb25zLFxuICAuLi5hcmdzXG59KSB7XG4gIHJldHVybiB3aXRoUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICBsZXQgb2Zmc2V0SGVpZ2h0O1xuICAgIGxldCBvZmZzZXRXaWR0aDtcbiAgICBpZiAob3B0aW9ucy5jb25zdHJhaW5EaW1lbnNpb25zKSB7XG4gICAgICBjb25zdCBjb21wdXRlZFNvdXJjZVN0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUoc291cmNlKTtcbiAgICAgIG9mZnNldEhlaWdodCA9IGNvbXB1dGVkU291cmNlU3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ2hlaWdodCcpO1xuICAgICAgb2Zmc2V0V2lkdGggPSBjb21wdXRlZFNvdXJjZVN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCd3aWR0aCcpO1xuICAgIH1cbiAgICBtaXJyb3Iuc3R5bGUuZGlzcGxheSA9IG51bGw7XG4gICAgbWlycm9yLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICBtaXJyb3Iuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICBtaXJyb3Iuc3R5bGUudG9wID0gMDtcbiAgICBtaXJyb3Iuc3R5bGUubGVmdCA9IDA7XG4gICAgbWlycm9yLnN0eWxlLm1hcmdpbiA9IDA7XG4gICAgaWYgKG9wdGlvbnMuY29uc3RyYWluRGltZW5zaW9ucykge1xuICAgICAgbWlycm9yLnN0eWxlLmhlaWdodCA9IG9mZnNldEhlaWdodDtcbiAgICAgIG1pcnJvci5zdHlsZS53aWR0aCA9IG9mZnNldFdpZHRoO1xuICAgIH1cbiAgICByZXNvbHZlKHtcbiAgICAgIG1pcnJvcixcbiAgICAgIHNvdXJjZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICAuLi5hcmdzXG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRNaXJyb3JDbGFzc2VzKHtcbiAgbWlycm9yLFxuICBtaXJyb3JDbGFzc2VzLFxuICAuLi5hcmdzXG59KSB7XG4gIHJldHVybiB3aXRoUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICBtaXJyb3IuY2xhc3NMaXN0LmFkZCguLi5taXJyb3JDbGFzc2VzKTtcbiAgICByZXNvbHZlKHtcbiAgICAgIG1pcnJvcixcbiAgICAgIG1pcnJvckNsYXNzZXMsXG4gICAgICAuLi5hcmdzXG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVNaXJyb3JJRCh7XG4gIG1pcnJvcixcbiAgLi4uYXJnc1xufSkge1xuICByZXR1cm4gd2l0aFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgbWlycm9yLnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTtcbiAgICBkZWxldGUgbWlycm9yLmlkO1xuICAgIHJlc29sdmUoe1xuICAgICAgbWlycm9yLFxuICAgICAgLi4uYXJnc1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcG9zaXRpb25NaXJyb3Ioe1xuICB3aXRoRnJhbWUgPSBmYWxzZSxcbiAgaW5pdGlhbCA9IGZhbHNlXG59ID0ge30pIHtcbiAgcmV0dXJuICh7XG4gICAgbWlycm9yLFxuICAgIHNlbnNvckV2ZW50LFxuICAgIG1pcnJvck9mZnNldCxcbiAgICBpbml0aWFsWSxcbiAgICBpbml0aWFsWCxcbiAgICBzY3JvbGxPZmZzZXQsXG4gICAgb3B0aW9ucyxcbiAgICBwYXNzZWRUaHJlc2hYLFxuICAgIHBhc3NlZFRocmVzaFksXG4gICAgbGFzdE1vdmVkWCxcbiAgICBsYXN0TW92ZWRZLFxuICAgIC4uLmFyZ3NcbiAgfSkgPT4ge1xuICAgIHJldHVybiB3aXRoUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgbWlycm9yLFxuICAgICAgICBzZW5zb3JFdmVudCxcbiAgICAgICAgbWlycm9yT2Zmc2V0LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICAuLi5hcmdzXG4gICAgICB9O1xuICAgICAgaWYgKG1pcnJvck9mZnNldCkge1xuICAgICAgICBjb25zdCB4ID0gcGFzc2VkVGhyZXNoWCA/IE1hdGgucm91bmQoKHNlbnNvckV2ZW50LmNsaWVudFggLSBtaXJyb3JPZmZzZXQubGVmdCAtIHNjcm9sbE9mZnNldC54KSAvIChvcHRpb25zLnRocmVzaG9sZFggfHwgMSkpICogKG9wdGlvbnMudGhyZXNob2xkWCB8fCAxKSA6IE1hdGgucm91bmQobGFzdE1vdmVkWCk7XG4gICAgICAgIGNvbnN0IHkgPSBwYXNzZWRUaHJlc2hZID8gTWF0aC5yb3VuZCgoc2Vuc29yRXZlbnQuY2xpZW50WSAtIG1pcnJvck9mZnNldC50b3AgLSBzY3JvbGxPZmZzZXQueSkgLyAob3B0aW9ucy50aHJlc2hvbGRZIHx8IDEpKSAqIChvcHRpb25zLnRocmVzaG9sZFkgfHwgMSkgOiBNYXRoLnJvdW5kKGxhc3RNb3ZlZFkpO1xuICAgICAgICBpZiAob3B0aW9ucy54QXhpcyAmJiBvcHRpb25zLnlBeGlzIHx8IGluaXRpYWwpIHtcbiAgICAgICAgICBtaXJyb3Iuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZTNkKCR7eH1weCwgJHt5fXB4LCAwKWA7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy54QXhpcyAmJiAhb3B0aW9ucy55QXhpcykge1xuICAgICAgICAgIG1pcnJvci5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlM2QoJHt4fXB4LCAke2luaXRpYWxZfXB4LCAwKWA7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy55QXhpcyAmJiAhb3B0aW9ucy54QXhpcykge1xuICAgICAgICAgIG1pcnJvci5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlM2QoJHtpbml0aWFsWH1weCwgJHt5fXB4LCAwKWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluaXRpYWwpIHtcbiAgICAgICAgICByZXN1bHQuaW5pdGlhbFggPSB4O1xuICAgICAgICAgIHJlc3VsdC5pbml0aWFsWSA9IHk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0Lmxhc3RNb3ZlZFggPSB4O1xuICAgICAgICByZXN1bHQubGFzdE1vdmVkWSA9IHk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgfSwge1xuICAgICAgZnJhbWU6IHdpdGhGcmFtZVxuICAgIH0pO1xuICB9O1xufVxuXG5mdW5jdGlvbiB3aXRoUHJvbWlzZShjYWxsYmFjaywge1xuICByYWYgPSBmYWxzZVxufSA9IHt9KSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgaWYgKHJhZikge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgY2FsbGJhY2socmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayhyZXNvbHZlLCByZWplY3QpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzTmF0aXZlRHJhZ0V2ZW50KHNlbnNvckV2ZW50KSB7XG4gIHJldHVybiAvXmRyYWcvLnRlc3Qoc2Vuc29yRXZlbnQub3JpZ2luYWxFdmVudC50eXBlKTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gTWlycm9yO1xuZXhwb3J0cy5kZWZhdWx0T3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuZXhwb3J0cy5nZXRBcHBlbmRhYmxlQ29udGFpbmVyID0gZ2V0QXBwZW5kYWJsZUNvbnRhaW5lcjtcbmV4cG9ydHMub25EcmFnTW92ZSA9IG9uRHJhZ01vdmU7XG5leHBvcnRzLm9uRHJhZ1N0YXJ0ID0gb25EcmFnU3RhcnQ7XG5leHBvcnRzLm9uRHJhZ1N0b3AgPSBvbkRyYWdTdG9wO1xuZXhwb3J0cy5vbk1pcnJvckNyZWF0ZWQgPSBvbk1pcnJvckNyZWF0ZWQ7XG5leHBvcnRzLm9uTWlycm9yTW92ZSA9IG9uTWlycm9yTW92ZTtcbmV4cG9ydHMub25TY3JvbGwgPSBvblNjcm9sbDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEFic3RyYWN0RXZlbnQgPSByZXF1aXJlKCcuLi8uLi8uLi8uLi9zaGFyZWQvQWJzdHJhY3RFdmVudC9BYnN0cmFjdEV2ZW50LmNqcycpO1xuXG5jbGFzcyBNaXJyb3JFdmVudCBleHRlbmRzIEFic3RyYWN0RXZlbnQuQWJzdHJhY3RFdmVudCB7XG5cbiAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgIHN1cGVyKGRhdGEpO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gIH1cblxuICBnZXQgc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuc291cmNlO1xuICB9XG5cbiAgZ2V0IG9yaWdpbmFsU291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEub3JpZ2luYWxTb3VyY2U7XG4gIH1cblxuICBnZXQgc291cmNlQ29udGFpbmVyKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuc291cmNlQ29udGFpbmVyO1xuICB9XG5cbiAgZ2V0IHNlbnNvckV2ZW50KCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuc2Vuc29yRXZlbnQ7XG4gIH1cblxuICBnZXQgZHJhZ0V2ZW50KCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuZHJhZ0V2ZW50O1xuICB9XG5cbiAgZ2V0IG9yaWdpbmFsRXZlbnQoKSB7XG4gICAgaWYgKHRoaXMuc2Vuc29yRXZlbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbnNvckV2ZW50Lm9yaWdpbmFsRXZlbnQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmNsYXNzIE1pcnJvckNyZWF0ZUV2ZW50IGV4dGVuZHMgTWlycm9yRXZlbnQge31cbk1pcnJvckNyZWF0ZUV2ZW50LnR5cGUgPSAnbWlycm9yOmNyZWF0ZSc7XG5cbmNsYXNzIE1pcnJvckNyZWF0ZWRFdmVudCBleHRlbmRzIE1pcnJvckV2ZW50IHtcblxuICBnZXQgbWlycm9yKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEubWlycm9yO1xuICB9XG59XG5NaXJyb3JDcmVhdGVkRXZlbnQudHlwZSA9ICdtaXJyb3I6Y3JlYXRlZCc7XG5cbmNsYXNzIE1pcnJvckF0dGFjaGVkRXZlbnQgZXh0ZW5kcyBNaXJyb3JFdmVudCB7XG5cbiAgZ2V0IG1pcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLm1pcnJvcjtcbiAgfVxufVxuTWlycm9yQXR0YWNoZWRFdmVudC50eXBlID0gJ21pcnJvcjphdHRhY2hlZCc7XG5cbmNsYXNzIE1pcnJvck1vdmVFdmVudCBleHRlbmRzIE1pcnJvckV2ZW50IHtcblxuICBnZXQgbWlycm9yKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEubWlycm9yO1xuICB9XG5cbiAgZ2V0IHBhc3NlZFRocmVzaFgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5wYXNzZWRUaHJlc2hYO1xuICB9XG5cbiAgZ2V0IHBhc3NlZFRocmVzaFkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5wYXNzZWRUaHJlc2hZO1xuICB9XG59XG5NaXJyb3JNb3ZlRXZlbnQudHlwZSA9ICdtaXJyb3I6bW92ZSc7XG5NaXJyb3JNb3ZlRXZlbnQuY2FuY2VsYWJsZSA9IHRydWU7XG5cbmNsYXNzIE1pcnJvck1vdmVkRXZlbnQgZXh0ZW5kcyBNaXJyb3JFdmVudCB7XG5cbiAgZ2V0IG1pcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLm1pcnJvcjtcbiAgfVxuXG4gIGdldCBwYXNzZWRUaHJlc2hYKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEucGFzc2VkVGhyZXNoWDtcbiAgfVxuXG4gIGdldCBwYXNzZWRUaHJlc2hZKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEucGFzc2VkVGhyZXNoWTtcbiAgfVxufVxuTWlycm9yTW92ZWRFdmVudC50eXBlID0gJ21pcnJvcjptb3ZlZCc7XG5cbmNsYXNzIE1pcnJvckRlc3Ryb3lFdmVudCBleHRlbmRzIE1pcnJvckV2ZW50IHtcblxuICBnZXQgbWlycm9yKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEubWlycm9yO1xuICB9XG59XG5NaXJyb3JEZXN0cm95RXZlbnQudHlwZSA9ICdtaXJyb3I6ZGVzdHJveSc7XG5NaXJyb3JEZXN0cm95RXZlbnQuY2FuY2VsYWJsZSA9IHRydWU7XG5cbmV4cG9ydHMuTWlycm9yQXR0YWNoZWRFdmVudCA9IE1pcnJvckF0dGFjaGVkRXZlbnQ7XG5leHBvcnRzLk1pcnJvckNyZWF0ZUV2ZW50ID0gTWlycm9yQ3JlYXRlRXZlbnQ7XG5leHBvcnRzLk1pcnJvckNyZWF0ZWRFdmVudCA9IE1pcnJvckNyZWF0ZWRFdmVudDtcbmV4cG9ydHMuTWlycm9yRGVzdHJveUV2ZW50ID0gTWlycm9yRGVzdHJveUV2ZW50O1xuZXhwb3J0cy5NaXJyb3JFdmVudCA9IE1pcnJvckV2ZW50O1xuZXhwb3J0cy5NaXJyb3JNb3ZlRXZlbnQgPSBNaXJyb3JNb3ZlRXZlbnQ7XG5leHBvcnRzLk1pcnJvck1vdmVkRXZlbnQgPSBNaXJyb3JNb3ZlZEV2ZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgQWJzdHJhY3RQbHVnaW4gPSByZXF1aXJlKCcuLi8uLi8uLi9zaGFyZWQvQWJzdHJhY3RQbHVnaW4vQWJzdHJhY3RQbHVnaW4uY2pzJyk7XG52YXIgY2xvc2VzdCA9IHJlcXVpcmUoJy4uLy4uLy4uL3NoYXJlZC91dGlscy9jbG9zZXN0L2Nsb3Nlc3QuY2pzJyk7XG5cbmNvbnN0IG9uRHJhZ1N0YXJ0ID0gU3ltYm9sKCdvbkRyYWdTdGFydCcpO1xuY29uc3Qgb25EcmFnTW92ZSA9IFN5bWJvbCgnb25EcmFnTW92ZScpO1xuY29uc3Qgb25EcmFnU3RvcCA9IFN5bWJvbCgnb25EcmFnU3RvcCcpO1xuY29uc3Qgc2Nyb2xsID0gU3ltYm9sKCdzY3JvbGwnKTtcblxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gIHNwZWVkOiA2LFxuICBzZW5zaXRpdml0eTogNTAsXG4gIHNjcm9sbGFibGVFbGVtZW50czogW11cbn07XG5cbmNsYXNzIFNjcm9sbGFibGUgZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbi5BYnN0cmFjdFBsdWdpbiB7XG5cbiAgY29uc3RydWN0b3IoZHJhZ2dhYmxlKSB7XG4gICAgc3VwZXIoZHJhZ2dhYmxlKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgLi4udGhpcy5nZXRPcHRpb25zKClcbiAgICB9O1xuXG4gICAgdGhpcy5jdXJyZW50TW91c2VQb3NpdGlvbiA9IG51bGw7XG5cbiAgICB0aGlzLnNjcm9sbEFuaW1hdGlvbkZyYW1lID0gbnVsbDtcblxuICAgIHRoaXMuc2Nyb2xsYWJsZUVsZW1lbnQgPSBudWxsO1xuXG4gICAgdGhpcy5maW5kU2Nyb2xsYWJsZUVsZW1lbnRGcmFtZSA9IG51bGw7XG4gICAgdGhpc1tvbkRyYWdTdGFydF0gPSB0aGlzW29uRHJhZ1N0YXJ0XS5iaW5kKHRoaXMpO1xuICAgIHRoaXNbb25EcmFnTW92ZV0gPSB0aGlzW29uRHJhZ01vdmVdLmJpbmQodGhpcyk7XG4gICAgdGhpc1tvbkRyYWdTdG9wXSA9IHRoaXNbb25EcmFnU3RvcF0uYmluZCh0aGlzKTtcbiAgICB0aGlzW3Njcm9sbF0gPSB0aGlzW3Njcm9sbF0uYmluZCh0aGlzKTtcbiAgfVxuXG4gIGF0dGFjaCgpIHtcbiAgICB0aGlzLmRyYWdnYWJsZS5vbignZHJhZzpzdGFydCcsIHRoaXNbb25EcmFnU3RhcnRdKS5vbignZHJhZzptb3ZlJywgdGhpc1tvbkRyYWdNb3ZlXSkub24oJ2RyYWc6c3RvcCcsIHRoaXNbb25EcmFnU3RvcF0pO1xuICB9XG5cbiAgZGV0YWNoKCkge1xuICAgIHRoaXMuZHJhZ2dhYmxlLm9mZignZHJhZzpzdGFydCcsIHRoaXNbb25EcmFnU3RhcnRdKS5vZmYoJ2RyYWc6bW92ZScsIHRoaXNbb25EcmFnTW92ZV0pLm9mZignZHJhZzpzdG9wJywgdGhpc1tvbkRyYWdTdG9wXSk7XG4gIH1cblxuICBnZXRPcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmRyYWdnYWJsZS5vcHRpb25zLnNjcm9sbGFibGUgfHwge307XG4gIH1cblxuICBnZXRTY3JvbGxhYmxlRWxlbWVudCh0YXJnZXQpIHtcbiAgICBpZiAodGhpcy5oYXNEZWZpbmVkU2Nyb2xsYWJsZUVsZW1lbnRzKCkpIHtcbiAgICAgIHJldHVybiBjbG9zZXN0LmRlZmF1bHQodGFyZ2V0LCB0aGlzLm9wdGlvbnMuc2Nyb2xsYWJsZUVsZW1lbnRzKSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjbG9zZXN0U2Nyb2xsYWJsZUVsZW1lbnQodGFyZ2V0KTtcbiAgICB9XG4gIH1cblxuICBoYXNEZWZpbmVkU2Nyb2xsYWJsZUVsZW1lbnRzKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMub3B0aW9ucy5zY3JvbGxhYmxlRWxlbWVudHMubGVuZ3RoICE9PSAwKTtcbiAgfVxuXG4gIFtvbkRyYWdTdGFydF0oZHJhZ0V2ZW50KSB7XG4gICAgdGhpcy5maW5kU2Nyb2xsYWJsZUVsZW1lbnRGcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB0aGlzLnNjcm9sbGFibGVFbGVtZW50ID0gdGhpcy5nZXRTY3JvbGxhYmxlRWxlbWVudChkcmFnRXZlbnQuc291cmNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIFtvbkRyYWdNb3ZlXShkcmFnRXZlbnQpIHtcbiAgICB0aGlzLmZpbmRTY3JvbGxhYmxlRWxlbWVudEZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRoaXMuc2Nyb2xsYWJsZUVsZW1lbnQgPSB0aGlzLmdldFNjcm9sbGFibGVFbGVtZW50KGRyYWdFdmVudC5zZW5zb3JFdmVudC50YXJnZXQpO1xuICAgIH0pO1xuICAgIGlmICghdGhpcy5zY3JvbGxhYmxlRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZW5zb3JFdmVudCA9IGRyYWdFdmVudC5zZW5zb3JFdmVudDtcbiAgICBjb25zdCBzY3JvbGxPZmZzZXQgPSB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH07XG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdykge1xuICAgICAgc2Nyb2xsT2Zmc2V0LnkgPSB3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCB8fCAwO1xuICAgICAgc2Nyb2xsT2Zmc2V0LnggPSB3aW5kb3cucGFnZVhPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0IHx8IDA7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudE1vdXNlUG9zaXRpb24gPSB7XG4gICAgICBjbGllbnRYOiBzZW5zb3JFdmVudC5jbGllbnRYIC0gc2Nyb2xsT2Zmc2V0LngsXG4gICAgICBjbGllbnRZOiBzZW5zb3JFdmVudC5jbGllbnRZIC0gc2Nyb2xsT2Zmc2V0LnlcbiAgICB9O1xuICAgIHRoaXMuc2Nyb2xsQW5pbWF0aW9uRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpc1tzY3JvbGxdKTtcbiAgfVxuXG4gIFtvbkRyYWdTdG9wXSgpIHtcbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnNjcm9sbEFuaW1hdGlvbkZyYW1lKTtcbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmZpbmRTY3JvbGxhYmxlRWxlbWVudEZyYW1lKTtcbiAgICB0aGlzLnNjcm9sbGFibGVFbGVtZW50ID0gbnVsbDtcbiAgICB0aGlzLnNjcm9sbEFuaW1hdGlvbkZyYW1lID0gbnVsbDtcbiAgICB0aGlzLmZpbmRTY3JvbGxhYmxlRWxlbWVudEZyYW1lID0gbnVsbDtcbiAgICB0aGlzLmN1cnJlbnRNb3VzZVBvc2l0aW9uID0gbnVsbDtcbiAgfVxuXG4gIFtzY3JvbGxdKCkge1xuICAgIGlmICghdGhpcy5zY3JvbGxhYmxlRWxlbWVudCB8fCAhdGhpcy5jdXJyZW50TW91c2VQb3NpdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnNjcm9sbEFuaW1hdGlvbkZyYW1lKTtcbiAgICBjb25zdCB7XG4gICAgICBzcGVlZCxcbiAgICAgIHNlbnNpdGl2aXR5XG4gICAgfSA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCByZWN0ID0gdGhpcy5zY3JvbGxhYmxlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBib3R0b21DdXRPZmYgPSByZWN0LmJvdHRvbSA+IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICBjb25zdCB0b3BDdXRPZmYgPSByZWN0LnRvcCA8IDA7XG4gICAgY29uc3QgY3V0T2ZmID0gdG9wQ3V0T2ZmIHx8IGJvdHRvbUN1dE9mZjtcbiAgICBjb25zdCBkb2N1bWVudFNjcm9sbGluZ0VsZW1lbnQgPSBnZXREb2N1bWVudFNjcm9sbGluZ0VsZW1lbnQoKTtcbiAgICBjb25zdCBzY3JvbGxhYmxlRWxlbWVudCA9IHRoaXMuc2Nyb2xsYWJsZUVsZW1lbnQ7XG4gICAgY29uc3QgY2xpZW50WCA9IHRoaXMuY3VycmVudE1vdXNlUG9zaXRpb24uY2xpZW50WDtcbiAgICBjb25zdCBjbGllbnRZID0gdGhpcy5jdXJyZW50TW91c2VQb3NpdGlvbi5jbGllbnRZO1xuICAgIGlmIChzY3JvbGxhYmxlRWxlbWVudCAhPT0gZG9jdW1lbnQuYm9keSAmJiBzY3JvbGxhYmxlRWxlbWVudCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmICFjdXRPZmYpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgb2Zmc2V0SGVpZ2h0LFxuICAgICAgICBvZmZzZXRXaWR0aFxuICAgICAgfSA9IHNjcm9sbGFibGVFbGVtZW50O1xuICAgICAgaWYgKHJlY3QudG9wICsgb2Zmc2V0SGVpZ2h0IC0gY2xpZW50WSA8IHNlbnNpdGl2aXR5KSB7XG4gICAgICAgIHNjcm9sbGFibGVFbGVtZW50LnNjcm9sbFRvcCArPSBzcGVlZDtcbiAgICAgIH0gZWxzZSBpZiAoY2xpZW50WSAtIHJlY3QudG9wIDwgc2Vuc2l0aXZpdHkpIHtcbiAgICAgICAgc2Nyb2xsYWJsZUVsZW1lbnQuc2Nyb2xsVG9wIC09IHNwZWVkO1xuICAgICAgfVxuICAgICAgaWYgKHJlY3QubGVmdCArIG9mZnNldFdpZHRoIC0gY2xpZW50WCA8IHNlbnNpdGl2aXR5KSB7XG4gICAgICAgIHNjcm9sbGFibGVFbGVtZW50LnNjcm9sbExlZnQgKz0gc3BlZWQ7XG4gICAgICB9IGVsc2UgaWYgKGNsaWVudFggLSByZWN0LmxlZnQgPCBzZW5zaXRpdml0eSkge1xuICAgICAgICBzY3JvbGxhYmxlRWxlbWVudC5zY3JvbGxMZWZ0IC09IHNwZWVkO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGlubmVySGVpZ2h0LFxuICAgICAgICBpbm5lcldpZHRoXG4gICAgICB9ID0gd2luZG93O1xuICAgICAgaWYgKGNsaWVudFkgPCBzZW5zaXRpdml0eSkge1xuICAgICAgICBkb2N1bWVudFNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsVG9wIC09IHNwZWVkO1xuICAgICAgfSBlbHNlIGlmIChpbm5lckhlaWdodCAtIGNsaWVudFkgPCBzZW5zaXRpdml0eSkge1xuICAgICAgICBkb2N1bWVudFNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsVG9wICs9IHNwZWVkO1xuICAgICAgfVxuICAgICAgaWYgKGNsaWVudFggPCBzZW5zaXRpdml0eSkge1xuICAgICAgICBkb2N1bWVudFNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsTGVmdCAtPSBzcGVlZDtcbiAgICAgIH0gZWxzZSBpZiAoaW5uZXJXaWR0aCAtIGNsaWVudFggPCBzZW5zaXRpdml0eSkge1xuICAgICAgICBkb2N1bWVudFNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsTGVmdCArPSBzcGVlZDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zY3JvbGxBbmltYXRpb25GcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzW3Njcm9sbF0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc092ZXJmbG93KGVsZW1lbnQpIHtcbiAgY29uc3Qgb3ZlcmZsb3dSZWdleCA9IC8oYXV0b3xzY3JvbGwpLztcbiAgY29uc3QgY29tcHV0ZWRTdHlsZXMgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIG51bGwpO1xuICBjb25zdCBvdmVyZmxvdyA9IGNvbXB1dGVkU3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ292ZXJmbG93JykgKyBjb21wdXRlZFN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCdvdmVyZmxvdy15JykgKyBjb21wdXRlZFN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCdvdmVyZmxvdy14Jyk7XG4gIHJldHVybiBvdmVyZmxvd1JlZ2V4LnRlc3Qob3ZlcmZsb3cpO1xufVxuXG5mdW5jdGlvbiBpc1N0YXRpY2FsbHlQb3NpdGlvbmVkKGVsZW1lbnQpIHtcbiAgY29uc3QgcG9zaXRpb24gPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ3Bvc2l0aW9uJyk7XG4gIHJldHVybiBwb3NpdGlvbiA9PT0gJ3N0YXRpYyc7XG59XG5cbmZ1bmN0aW9uIGNsb3Nlc3RTY3JvbGxhYmxlRWxlbWVudChlbGVtZW50KSB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBnZXREb2N1bWVudFNjcm9sbGluZ0VsZW1lbnQoKTtcbiAgfVxuICBjb25zdCBwb3NpdGlvbiA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZSgncG9zaXRpb24nKTtcbiAgY29uc3QgZXhjbHVkZVN0YXRpY1BhcmVudHMgPSBwb3NpdGlvbiA9PT0gJ2Fic29sdXRlJztcbiAgY29uc3Qgc2Nyb2xsYWJsZUVsZW1lbnQgPSBjbG9zZXN0LmRlZmF1bHQoZWxlbWVudCwgcGFyZW50ID0+IHtcbiAgICBpZiAoZXhjbHVkZVN0YXRpY1BhcmVudHMgJiYgaXNTdGF0aWNhbGx5UG9zaXRpb25lZChwYXJlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBoYXNPdmVyZmxvdyhwYXJlbnQpO1xuICB9KTtcbiAgaWYgKHBvc2l0aW9uID09PSAnZml4ZWQnIHx8ICFzY3JvbGxhYmxlRWxlbWVudCkge1xuICAgIHJldHVybiBnZXREb2N1bWVudFNjcm9sbGluZ0VsZW1lbnQoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc2Nyb2xsYWJsZUVsZW1lbnQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RG9jdW1lbnRTY3JvbGxpbmdFbGVtZW50KCkge1xuICByZXR1cm4gZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFNjcm9sbGFibGU7XG5leHBvcnRzLmRlZmF1bHRPcHRpb25zID0gZGVmYXVsdE9wdGlvbnM7XG5leHBvcnRzLm9uRHJhZ01vdmUgPSBvbkRyYWdNb3ZlO1xuZXhwb3J0cy5vbkRyYWdTdGFydCA9IG9uRHJhZ1N0YXJ0O1xuZXhwb3J0cy5vbkRyYWdTdG9wID0gb25EcmFnU3RvcDtcbmV4cG9ydHMuc2Nyb2xsID0gc2Nyb2xsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgY2xvc2VzdCA9IHJlcXVpcmUoJy4uLy4uLy4uL3NoYXJlZC91dGlscy9jbG9zZXN0L2Nsb3Nlc3QuY2pzJyk7XG52YXIgU2Vuc29yID0gcmVxdWlyZSgnLi4vU2Vuc29yL1NlbnNvci5janMnKTtcbnZhciBTZW5zb3JFdmVudCA9IHJlcXVpcmUoJy4uL1NlbnNvckV2ZW50L1NlbnNvckV2ZW50LmNqcycpO1xuXG5jb25zdCBvbk1vdXNlRG93biA9IFN5bWJvbCgnb25Nb3VzZURvd24nKTtcbmNvbnN0IG9uTW91c2VVcCA9IFN5bWJvbCgnb25Nb3VzZVVwJyk7XG5jb25zdCBvbkRyYWdTdGFydCA9IFN5bWJvbCgnb25EcmFnU3RhcnQnKTtcbmNvbnN0IG9uRHJhZ092ZXIgPSBTeW1ib2woJ29uRHJhZ092ZXInKTtcbmNvbnN0IG9uRHJhZ0VuZCA9IFN5bWJvbCgnb25EcmFnRW5kJyk7XG5jb25zdCBvbkRyb3AgPSBTeW1ib2woJ29uRHJvcCcpO1xuY29uc3QgcmVzZXQgPSBTeW1ib2woJ3Jlc2V0Jyk7XG5cbmNsYXNzIERyYWdTZW5zb3IgZXh0ZW5kcyBTZW5zb3IuZGVmYXVsdCB7XG5cbiAgY29uc3RydWN0b3IoY29udGFpbmVycyA9IFtdLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihjb250YWluZXJzLCBvcHRpb25zKTtcblxuICAgIHRoaXMubW91c2VEb3duVGltZW91dCA9IG51bGw7XG5cbiAgICB0aGlzLmRyYWdnYWJsZUVsZW1lbnQgPSBudWxsO1xuXG4gICAgdGhpcy5uYXRpdmVEcmFnZ2FibGVFbGVtZW50ID0gbnVsbDtcbiAgICB0aGlzW29uTW91c2VEb3duXSA9IHRoaXNbb25Nb3VzZURvd25dLmJpbmQodGhpcyk7XG4gICAgdGhpc1tvbk1vdXNlVXBdID0gdGhpc1tvbk1vdXNlVXBdLmJpbmQodGhpcyk7XG4gICAgdGhpc1tvbkRyYWdTdGFydF0gPSB0aGlzW29uRHJhZ1N0YXJ0XS5iaW5kKHRoaXMpO1xuICAgIHRoaXNbb25EcmFnT3Zlcl0gPSB0aGlzW29uRHJhZ092ZXJdLmJpbmQodGhpcyk7XG4gICAgdGhpc1tvbkRyYWdFbmRdID0gdGhpc1tvbkRyYWdFbmRdLmJpbmQodGhpcyk7XG4gICAgdGhpc1tvbkRyb3BdID0gdGhpc1tvbkRyb3BdLmJpbmQodGhpcyk7XG4gIH1cblxuICBhdHRhY2goKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpc1tvbk1vdXNlRG93bl0sIHRydWUpO1xuICB9XG5cbiAgZGV0YWNoKCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXNbb25Nb3VzZURvd25dLCB0cnVlKTtcbiAgfVxuXG4gIFtvbkRyYWdTdGFydF0oZXZlbnQpIHtcblxuICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKCd0ZXh0JywgJycpO1xuICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gdGhpcy5vcHRpb25zLnR5cGU7XG4gICAgY29uc3QgdGFyZ2V0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICBjb25zdCBvcmlnaW5hbFNvdXJjZSA9IHRoaXMuZHJhZ2dhYmxlRWxlbWVudDtcbiAgICBpZiAoIW9yaWdpbmFsU291cmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRyYWdTdGFydEV2ZW50ID0gbmV3IFNlbnNvckV2ZW50LkRyYWdTdGFydFNlbnNvckV2ZW50KHtcbiAgICAgIGNsaWVudFg6IGV2ZW50LmNsaWVudFgsXG4gICAgICBjbGllbnRZOiBldmVudC5jbGllbnRZLFxuICAgICAgdGFyZ2V0LFxuICAgICAgb3JpZ2luYWxTb3VyY2UsXG4gICAgICBjb250YWluZXI6IHRoaXMuY3VycmVudENvbnRhaW5lcixcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50XG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudHJpZ2dlcih0aGlzLmN1cnJlbnRDb250YWluZXIsIGRyYWdTdGFydEV2ZW50KTtcbiAgICAgIGlmIChkcmFnU3RhcnRFdmVudC5jYW5jZWxlZCgpKSB7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgfVxuICAgIH0sIDApO1xuICB9XG5cbiAgW29uRHJhZ092ZXJdKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jdXJyZW50Q29udGFpbmVyO1xuICAgIGNvbnN0IGRyYWdNb3ZlRXZlbnQgPSBuZXcgU2Vuc29yRXZlbnQuRHJhZ01vdmVTZW5zb3JFdmVudCh7XG4gICAgICBjbGllbnRYOiBldmVudC5jbGllbnRYLFxuICAgICAgY2xpZW50WTogZXZlbnQuY2xpZW50WSxcbiAgICAgIHRhcmdldCxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50XG4gICAgfSk7XG4gICAgdGhpcy50cmlnZ2VyKGNvbnRhaW5lciwgZHJhZ01vdmVFdmVudCk7XG4gICAgaWYgKCFkcmFnTW92ZUV2ZW50LmNhbmNlbGVkKCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9IHRoaXMub3B0aW9ucy50eXBlO1xuICAgIH1cbiAgfVxuXG4gIFtvbkRyYWdFbmRdKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzW29uTW91c2VVcF0sIHRydWUpO1xuICAgIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jdXJyZW50Q29udGFpbmVyO1xuICAgIGNvbnN0IGRyYWdTdG9wRXZlbnQgPSBuZXcgU2Vuc29yRXZlbnQuRHJhZ1N0b3BTZW5zb3JFdmVudCh7XG4gICAgICBjbGllbnRYOiBldmVudC5jbGllbnRYLFxuICAgICAgY2xpZW50WTogZXZlbnQuY2xpZW50WSxcbiAgICAgIHRhcmdldCxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50XG4gICAgfSk7XG4gICAgdGhpcy50cmlnZ2VyKGNvbnRhaW5lciwgZHJhZ1N0b3BFdmVudCk7XG4gICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgIHRoaXMuc3RhcnRFdmVudCA9IG51bGw7XG4gICAgdGhpc1tyZXNldF0oKTtcbiAgfVxuXG4gIFtvbkRyb3BdKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIFtvbk1vdXNlRG93bl0oZXZlbnQpIHtcblxuICAgIGlmIChldmVudC50YXJnZXQgJiYgKGV2ZW50LnRhcmdldC5mb3JtIHx8IGV2ZW50LnRhcmdldC5jb250ZW50ZWRpdGFibGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICB0aGlzLmN1cnJlbnRDb250YWluZXIgPSBjbG9zZXN0LmRlZmF1bHQodGFyZ2V0LCB0aGlzLmNvbnRhaW5lcnMpO1xuICAgIGlmICghdGhpcy5jdXJyZW50Q29udGFpbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuaGFuZGxlICYmIHRhcmdldCAmJiAhY2xvc2VzdC5kZWZhdWx0KHRhcmdldCwgdGhpcy5vcHRpb25zLmhhbmRsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2luYWxTb3VyY2UgPSBjbG9zZXN0LmRlZmF1bHQodGFyZ2V0LCB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlKTtcbiAgICBpZiAoIW9yaWdpbmFsU291cmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hdGl2ZURyYWdnYWJsZUVsZW1lbnQgPSBjbG9zZXN0LmRlZmF1bHQoZXZlbnQudGFyZ2V0LCBlbGVtZW50ID0+IGVsZW1lbnQuZHJhZ2dhYmxlKTtcbiAgICBpZiAobmF0aXZlRHJhZ2dhYmxlRWxlbWVudCkge1xuICAgICAgbmF0aXZlRHJhZ2dhYmxlRWxlbWVudC5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgICAgIHRoaXMubmF0aXZlRHJhZ2dhYmxlRWxlbWVudCA9IG5hdGl2ZURyYWdnYWJsZUVsZW1lbnQ7XG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzW29uTW91c2VVcF0sIHRydWUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIHRoaXNbb25EcmFnU3RhcnRdLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzW29uRHJhZ092ZXJdLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsIHRoaXNbb25EcmFnRW5kXSwgZmFsc2UpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzW29uRHJvcF0sIGZhbHNlKTtcbiAgICB0aGlzLnN0YXJ0RXZlbnQgPSBldmVudDtcbiAgICB0aGlzLm1vdXNlRG93blRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIG9yaWdpbmFsU291cmNlLmRyYWdnYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLmRyYWdnYWJsZUVsZW1lbnQgPSBvcmlnaW5hbFNvdXJjZTtcbiAgICB9LCB0aGlzLmRlbGF5LmRyYWcpO1xuICB9XG5cbiAgW29uTW91c2VVcF0oKSB7XG4gICAgdGhpc1tyZXNldF0oKTtcbiAgfVxuXG4gIFtyZXNldF0oKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMubW91c2VEb3duVGltZW91dCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXNbb25Nb3VzZVVwXSwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgdGhpc1tvbkRyYWdTdGFydF0sIGZhbHNlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXNbb25EcmFnT3Zlcl0sIGZhbHNlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnZW5kJywgdGhpc1tvbkRyYWdFbmRdLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXNbb25Ecm9wXSwgZmFsc2UpO1xuICAgIGlmICh0aGlzLm5hdGl2ZURyYWdnYWJsZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMubmF0aXZlRHJhZ2dhYmxlRWxlbWVudC5kcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgdGhpcy5uYXRpdmVEcmFnZ2FibGVFbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHJhZ2dhYmxlRWxlbWVudCkge1xuICAgICAgdGhpcy5kcmFnZ2FibGVFbGVtZW50LmRyYWdnYWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kcmFnZ2FibGVFbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gRHJhZ1NlbnNvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxudmFyIGNsb3Nlc3QgPSByZXF1aXJlKCcuLi8uLi8uLi9zaGFyZWQvdXRpbHMvY2xvc2VzdC9jbG9zZXN0LmNqcycpO1xudmFyIFNlbnNvciA9IHJlcXVpcmUoJy4uL1NlbnNvci9TZW5zb3IuY2pzJyk7XG52YXIgU2Vuc29yRXZlbnQgPSByZXF1aXJlKCcuLi9TZW5zb3JFdmVudC9TZW5zb3JFdmVudC5janMnKTtcblxuY29uc3Qgb25Nb3VzZUZvcmNlV2lsbEJlZ2luID0gU3ltYm9sKCdvbk1vdXNlRm9yY2VXaWxsQmVnaW4nKTtcbmNvbnN0IG9uTW91c2VGb3JjZURvd24gPSBTeW1ib2woJ29uTW91c2VGb3JjZURvd24nKTtcbmNvbnN0IG9uTW91c2VEb3duID0gU3ltYm9sKCdvbk1vdXNlRG93bicpO1xuY29uc3Qgb25Nb3VzZUZvcmNlQ2hhbmdlID0gU3ltYm9sKCdvbk1vdXNlRm9yY2VDaGFuZ2UnKTtcbmNvbnN0IG9uTW91c2VNb3ZlID0gU3ltYm9sKCdvbk1vdXNlTW92ZScpO1xuY29uc3Qgb25Nb3VzZVVwID0gU3ltYm9sKCdvbk1vdXNlVXAnKTtcbmNvbnN0IG9uTW91c2VGb3JjZUdsb2JhbENoYW5nZSA9IFN5bWJvbCgnb25Nb3VzZUZvcmNlR2xvYmFsQ2hhbmdlJyk7XG5cbmNsYXNzIEZvcmNlVG91Y2hTZW5zb3IgZXh0ZW5kcyBTZW5zb3IuZGVmYXVsdCB7XG5cbiAgY29uc3RydWN0b3IoY29udGFpbmVycyA9IFtdLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihjb250YWluZXJzLCBvcHRpb25zKTtcblxuICAgIHRoaXMubWlnaHREcmFnID0gZmFsc2U7XG4gICAgdGhpc1tvbk1vdXNlRm9yY2VXaWxsQmVnaW5dID0gdGhpc1tvbk1vdXNlRm9yY2VXaWxsQmVnaW5dLmJpbmQodGhpcyk7XG4gICAgdGhpc1tvbk1vdXNlRm9yY2VEb3duXSA9IHRoaXNbb25Nb3VzZUZvcmNlRG93bl0uYmluZCh0aGlzKTtcbiAgICB0aGlzW29uTW91c2VEb3duXSA9IHRoaXNbb25Nb3VzZURvd25dLmJpbmQodGhpcyk7XG4gICAgdGhpc1tvbk1vdXNlRm9yY2VDaGFuZ2VdID0gdGhpc1tvbk1vdXNlRm9yY2VDaGFuZ2VdLmJpbmQodGhpcyk7XG4gICAgdGhpc1tvbk1vdXNlTW92ZV0gPSB0aGlzW29uTW91c2VNb3ZlXS5iaW5kKHRoaXMpO1xuICAgIHRoaXNbb25Nb3VzZVVwXSA9IHRoaXNbb25Nb3VzZVVwXS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgYXR0YWNoKCkge1xuICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIHRoaXMuY29udGFpbmVycykge1xuICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdG1vdXNlZm9yY2V3aWxsYmVnaW4nLCB0aGlzW29uTW91c2VGb3JjZVdpbGxCZWdpbl0sIGZhbHNlKTtcbiAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXRtb3VzZWZvcmNlZG93bicsIHRoaXNbb25Nb3VzZUZvcmNlRG93bl0sIGZhbHNlKTtcbiAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzW29uTW91c2VEb3duXSwgdHJ1ZSk7XG4gICAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignd2Via2l0bW91c2Vmb3JjZWNoYW5nZWQnLCB0aGlzW29uTW91c2VGb3JjZUNoYW5nZV0sIGZhbHNlKTtcbiAgICB9XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpc1tvbk1vdXNlTW92ZV0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzW29uTW91c2VVcF0pO1xuICB9XG5cbiAgZGV0YWNoKCkge1xuICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIHRoaXMuY29udGFpbmVycykge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3dlYmtpdG1vdXNlZm9yY2V3aWxsYmVnaW4nLCB0aGlzW29uTW91c2VGb3JjZVdpbGxCZWdpbl0sIGZhbHNlKTtcbiAgICAgIGNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCd3ZWJraXRtb3VzZWZvcmNlZG93bicsIHRoaXNbb25Nb3VzZUZvcmNlRG93bl0sIGZhbHNlKTtcbiAgICAgIGNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzW29uTW91c2VEb3duXSwgdHJ1ZSk7XG4gICAgICBjb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2Via2l0bW91c2Vmb3JjZWNoYW5nZWQnLCB0aGlzW29uTW91c2VGb3JjZUNoYW5nZV0sIGZhbHNlKTtcbiAgICB9XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpc1tvbk1vdXNlTW92ZV0pO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzW29uTW91c2VVcF0pO1xuICB9XG5cbiAgW29uTW91c2VGb3JjZVdpbGxCZWdpbl0oZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMubWlnaHREcmFnID0gdHJ1ZTtcbiAgfVxuXG4gIFtvbk1vdXNlRm9yY2VEb3duXShldmVudCkge1xuICAgIGlmICh0aGlzLmRyYWdnaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgY29uc3QgY29udGFpbmVyID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgICBpZiAodGhpcy5vcHRpb25zLmhhbmRsZSAmJiB0YXJnZXQgJiYgIWNsb3Nlc3QuZGVmYXVsdCh0YXJnZXQsIHRoaXMub3B0aW9ucy5oYW5kbGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9yaWdpbmFsU291cmNlID0gY2xvc2VzdC5kZWZhdWx0KHRhcmdldCwgdGhpcy5vcHRpb25zLmRyYWdnYWJsZSk7XG4gICAgaWYgKCFvcmlnaW5hbFNvdXJjZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkcmFnU3RhcnRFdmVudCA9IG5ldyBTZW5zb3JFdmVudC5EcmFnU3RhcnRTZW5zb3JFdmVudCh7XG4gICAgICBjbGllbnRYOiBldmVudC5jbGllbnRYLFxuICAgICAgY2xpZW50WTogZXZlbnQuY2xpZW50WSxcbiAgICAgIHRhcmdldCxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIG9yaWdpbmFsU291cmNlLFxuICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnRcbiAgICB9KTtcbiAgICB0aGlzLnRyaWdnZXIoY29udGFpbmVyLCBkcmFnU3RhcnRFdmVudCk7XG4gICAgdGhpcy5jdXJyZW50Q29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSAhZHJhZ1N0YXJ0RXZlbnQuY2FuY2VsZWQoKTtcbiAgICB0aGlzLm1pZ2h0RHJhZyA9IGZhbHNlO1xuICB9XG5cbiAgW29uTW91c2VVcF0oZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZHJhZ1N0b3BFdmVudCA9IG5ldyBTZW5zb3JFdmVudC5EcmFnU3RvcFNlbnNvckV2ZW50KHtcbiAgICAgIGNsaWVudFg6IGV2ZW50LmNsaWVudFgsXG4gICAgICBjbGllbnRZOiBldmVudC5jbGllbnRZLFxuICAgICAgdGFyZ2V0OiBudWxsLFxuICAgICAgY29udGFpbmVyOiB0aGlzLmN1cnJlbnRDb250YWluZXIsXG4gICAgICBvcmlnaW5hbEV2ZW50OiBldmVudFxuICAgIH0pO1xuICAgIHRoaXMudHJpZ2dlcih0aGlzLmN1cnJlbnRDb250YWluZXIsIGRyYWdTdG9wRXZlbnQpO1xuICAgIHRoaXMuY3VycmVudENvbnRhaW5lciA9IG51bGw7XG4gICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgIHRoaXMubWlnaHREcmFnID0gZmFsc2U7XG4gIH1cblxuICBbb25Nb3VzZURvd25dKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLm1pZ2h0RHJhZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBbb25Nb3VzZU1vdmVdKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgY29uc3QgZHJhZ01vdmVFdmVudCA9IG5ldyBTZW5zb3JFdmVudC5EcmFnTW92ZVNlbnNvckV2ZW50KHtcbiAgICAgIGNsaWVudFg6IGV2ZW50LmNsaWVudFgsXG4gICAgICBjbGllbnRZOiBldmVudC5jbGllbnRZLFxuICAgICAgdGFyZ2V0LFxuICAgICAgY29udGFpbmVyOiB0aGlzLmN1cnJlbnRDb250YWluZXIsXG4gICAgICBvcmlnaW5hbEV2ZW50OiBldmVudFxuICAgIH0pO1xuICAgIHRoaXMudHJpZ2dlcih0aGlzLmN1cnJlbnRDb250YWluZXIsIGRyYWdNb3ZlRXZlbnQpO1xuICB9XG5cbiAgW29uTW91c2VGb3JjZUNoYW5nZV0oZXZlbnQpIHtcbiAgICBpZiAodGhpcy5kcmFnZ2luZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgY29uc3QgY29udGFpbmVyID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgICBjb25zdCBkcmFnUHJlc3N1cmVFdmVudCA9IG5ldyBTZW5zb3JFdmVudC5EcmFnUHJlc3N1cmVTZW5zb3JFdmVudCh7XG4gICAgICBwcmVzc3VyZTogZXZlbnQud2Via2l0Rm9yY2UsXG4gICAgICBjbGllbnRYOiBldmVudC5jbGllbnRYLFxuICAgICAgY2xpZW50WTogZXZlbnQuY2xpZW50WSxcbiAgICAgIHRhcmdldCxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50XG4gICAgfSk7XG4gICAgdGhpcy50cmlnZ2VyKGNvbnRhaW5lciwgZHJhZ1ByZXNzdXJlRXZlbnQpO1xuICB9XG5cbiAgW29uTW91c2VGb3JjZUdsb2JhbENoYW5nZV0oZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIGNvbnN0IGRyYWdQcmVzc3VyZUV2ZW50ID0gbmV3IFNlbnNvckV2ZW50LkRyYWdQcmVzc3VyZVNlbnNvckV2ZW50KHtcbiAgICAgIHByZXNzdXJlOiBldmVudC53ZWJraXRGb3JjZSxcbiAgICAgIGNsaWVudFg6IGV2ZW50LmNsaWVudFgsXG4gICAgICBjbGllbnRZOiBldmVudC5jbGllbnRZLFxuICAgICAgdGFyZ2V0LFxuICAgICAgY29udGFpbmVyOiB0aGlzLmN1cnJlbnRDb250YWluZXIsXG4gICAgICBvcmlnaW5hbEV2ZW50OiBldmVudFxuICAgIH0pO1xuICAgIHRoaXMudHJpZ2dlcih0aGlzLmN1cnJlbnRDb250YWluZXIsIGRyYWdQcmVzc3VyZUV2ZW50KTtcbiAgfVxufVxuXG5leHBvcnRzLmRlZmF1bHQgPSBGb3JjZVRvdWNoU2Vuc29yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgY2xvc2VzdCA9IHJlcXVpcmUoJy4uLy4uLy4uL3NoYXJlZC91dGlscy9jbG9zZXN0L2Nsb3Nlc3QuY2pzJyk7XG52YXIgZGlzdGFuY2UgPSByZXF1aXJlKCcuLi8uLi8uLi9zaGFyZWQvdXRpbHMvZGlzdGFuY2UvZGlzdGFuY2UuY2pzJyk7XG52YXIgU2Vuc29yID0gcmVxdWlyZSgnLi4vU2Vuc29yL1NlbnNvci5janMnKTtcbnZhciBTZW5zb3JFdmVudCA9IHJlcXVpcmUoJy4uL1NlbnNvckV2ZW50L1NlbnNvckV2ZW50LmNqcycpO1xuXG5jb25zdCBvbkNvbnRleHRNZW51V2hpbGVEcmFnZ2luZyA9IFN5bWJvbCgnb25Db250ZXh0TWVudVdoaWxlRHJhZ2dpbmcnKTtcbmNvbnN0IG9uTW91c2VEb3duID0gU3ltYm9sKCdvbk1vdXNlRG93bicpO1xuY29uc3Qgb25Nb3VzZU1vdmUgPSBTeW1ib2woJ29uTW91c2VNb3ZlJyk7XG5jb25zdCBvbk1vdXNlVXAgPSBTeW1ib2woJ29uTW91c2VVcCcpO1xuY29uc3Qgc3RhcnREcmFnID0gU3ltYm9sKCdzdGFydERyYWcnKTtcbmNvbnN0IG9uRGlzdGFuY2VDaGFuZ2UgPSBTeW1ib2woJ29uRGlzdGFuY2VDaGFuZ2UnKTtcblxuY2xhc3MgTW91c2VTZW5zb3IgZXh0ZW5kcyBTZW5zb3IuZGVmYXVsdCB7XG5cbiAgY29uc3RydWN0b3IoY29udGFpbmVycyA9IFtdLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihjb250YWluZXJzLCBvcHRpb25zKTtcblxuICAgIHRoaXMubW91c2VEb3duVGltZW91dCA9IG51bGw7XG5cbiAgICB0aGlzLnBhZ2VYID0gbnVsbDtcblxuICAgIHRoaXMucGFnZVkgPSBudWxsO1xuICAgIHRoaXNbb25Db250ZXh0TWVudVdoaWxlRHJhZ2dpbmddID0gdGhpc1tvbkNvbnRleHRNZW51V2hpbGVEcmFnZ2luZ10uYmluZCh0aGlzKTtcbiAgICB0aGlzW29uTW91c2VEb3duXSA9IHRoaXNbb25Nb3VzZURvd25dLmJpbmQodGhpcyk7XG4gICAgdGhpc1tvbk1vdXNlTW92ZV0gPSB0aGlzW29uTW91c2VNb3ZlXS5iaW5kKHRoaXMpO1xuICAgIHRoaXNbb25Nb3VzZVVwXSA9IHRoaXNbb25Nb3VzZVVwXS5iaW5kKHRoaXMpO1xuICAgIHRoaXNbc3RhcnREcmFnXSA9IHRoaXNbc3RhcnREcmFnXS5iaW5kKHRoaXMpO1xuICAgIHRoaXNbb25EaXN0YW5jZUNoYW5nZV0gPSB0aGlzW29uRGlzdGFuY2VDaGFuZ2VdLmJpbmQodGhpcyk7XG4gIH1cblxuICBhdHRhY2goKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpc1tvbk1vdXNlRG93bl0sIHRydWUpO1xuICB9XG5cbiAgZGV0YWNoKCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXNbb25Nb3VzZURvd25dLCB0cnVlKTtcbiAgfVxuXG4gIFtvbk1vdXNlRG93bl0oZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuYnV0dG9uICE9PSAwIHx8IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb250YWluZXIgPSBjbG9zZXN0LmRlZmF1bHQoZXZlbnQudGFyZ2V0LCB0aGlzLmNvbnRhaW5lcnMpO1xuICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuaGFuZGxlICYmIGV2ZW50LnRhcmdldCAmJiAhY2xvc2VzdC5kZWZhdWx0KGV2ZW50LnRhcmdldCwgdGhpcy5vcHRpb25zLmhhbmRsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2luYWxTb3VyY2UgPSBjbG9zZXN0LmRlZmF1bHQoZXZlbnQudGFyZ2V0LCB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlKTtcbiAgICBpZiAoIW9yaWdpbmFsU291cmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGRlbGF5XG4gICAgfSA9IHRoaXM7XG4gICAgY29uc3Qge1xuICAgICAgcGFnZVgsXG4gICAgICBwYWdlWVxuICAgIH0gPSBldmVudDtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMsIHtcbiAgICAgIHBhZ2VYLFxuICAgICAgcGFnZVlcbiAgICB9KTtcbiAgICB0aGlzLm9uTW91c2VEb3duQXQgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMuc3RhcnRFdmVudCA9IGV2ZW50O1xuICAgIHRoaXMuY3VycmVudENvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB0aGlzLm9yaWdpbmFsU291cmNlID0gb3JpZ2luYWxTb3VyY2U7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXNbb25Nb3VzZVVwXSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgcHJldmVudE5hdGl2ZURyYWdTdGFydCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpc1tvbkRpc3RhbmNlQ2hhbmdlXSk7XG4gICAgdGhpcy5tb3VzZURvd25UaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpc1tvbkRpc3RhbmNlQ2hhbmdlXSh7XG4gICAgICAgIHBhZ2VYOiB0aGlzLnBhZ2VYLFxuICAgICAgICBwYWdlWTogdGhpcy5wYWdlWVxuICAgICAgfSk7XG4gICAgfSwgZGVsYXkubW91c2UpO1xuICB9XG5cbiAgW3N0YXJ0RHJhZ10oKSB7XG4gICAgY29uc3Qgc3RhcnRFdmVudCA9IHRoaXMuc3RhcnRFdmVudDtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmN1cnJlbnRDb250YWluZXI7XG4gICAgY29uc3Qgb3JpZ2luYWxTb3VyY2UgPSB0aGlzLm9yaWdpbmFsU291cmNlO1xuICAgIGNvbnN0IGRyYWdTdGFydEV2ZW50ID0gbmV3IFNlbnNvckV2ZW50LkRyYWdTdGFydFNlbnNvckV2ZW50KHtcbiAgICAgIGNsaWVudFg6IHN0YXJ0RXZlbnQuY2xpZW50WCxcbiAgICAgIGNsaWVudFk6IHN0YXJ0RXZlbnQuY2xpZW50WSxcbiAgICAgIHRhcmdldDogc3RhcnRFdmVudC50YXJnZXQsXG4gICAgICBjb250YWluZXIsXG4gICAgICBvcmlnaW5hbFNvdXJjZSxcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IHN0YXJ0RXZlbnRcbiAgICB9KTtcbiAgICB0aGlzLnRyaWdnZXIodGhpcy5jdXJyZW50Q29udGFpbmVyLCBkcmFnU3RhcnRFdmVudCk7XG4gICAgdGhpcy5kcmFnZ2luZyA9ICFkcmFnU3RhcnRFdmVudC5jYW5jZWxlZCgpO1xuICAgIGlmICh0aGlzLmRyYWdnaW5nKSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIHRoaXNbb25Db250ZXh0TWVudVdoaWxlRHJhZ2dpbmddLCB0cnVlKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXNbb25Nb3VzZU1vdmVdKTtcbiAgICB9XG4gIH1cblxuICBbb25EaXN0YW5jZUNoYW5nZV0oZXZlbnQpIHtcbiAgICBjb25zdCB7XG4gICAgICBwYWdlWCxcbiAgICAgIHBhZ2VZXG4gICAgfSA9IGV2ZW50O1xuICAgIGNvbnN0IHtcbiAgICAgIGRpc3RhbmNlOiBkaXN0YW5jZSQxXG4gICAgfSA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCB7XG4gICAgICBzdGFydEV2ZW50LFxuICAgICAgZGVsYXlcbiAgICB9ID0gdGhpcztcbiAgICBPYmplY3QuYXNzaWduKHRoaXMsIHtcbiAgICAgIHBhZ2VYLFxuICAgICAgcGFnZVlcbiAgICB9KTtcbiAgICBpZiAoIXRoaXMuY3VycmVudENvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0aW1lRWxhcHNlZCA9IERhdGUubm93KCkgLSB0aGlzLm9uTW91c2VEb3duQXQ7XG4gICAgY29uc3QgZGlzdGFuY2VUcmF2ZWxsZWQgPSBkaXN0YW5jZS5kZWZhdWx0KHN0YXJ0RXZlbnQucGFnZVgsIHN0YXJ0RXZlbnQucGFnZVksIHBhZ2VYLCBwYWdlWSkgfHwgMDtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5tb3VzZURvd25UaW1lb3V0KTtcbiAgICBpZiAodGltZUVsYXBzZWQgPCBkZWxheS5tb3VzZSkge1xuXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzW29uRGlzdGFuY2VDaGFuZ2VdKTtcbiAgICB9IGVsc2UgaWYgKGRpc3RhbmNlVHJhdmVsbGVkID49IGRpc3RhbmNlJDEpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXNbb25EaXN0YW5jZUNoYW5nZV0pO1xuICAgICAgdGhpc1tzdGFydERyYWddKCk7XG4gICAgfVxuICB9XG5cbiAgW29uTW91c2VNb3ZlXShldmVudCkge1xuICAgIGlmICghdGhpcy5kcmFnZ2luZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgIGNvbnN0IGRyYWdNb3ZlRXZlbnQgPSBuZXcgU2Vuc29yRXZlbnQuRHJhZ01vdmVTZW5zb3JFdmVudCh7XG4gICAgICBjbGllbnRYOiBldmVudC5jbGllbnRYLFxuICAgICAgY2xpZW50WTogZXZlbnQuY2xpZW50WSxcbiAgICAgIHRhcmdldCxcbiAgICAgIGNvbnRhaW5lcjogdGhpcy5jdXJyZW50Q29udGFpbmVyLFxuICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnRcbiAgICB9KTtcbiAgICB0aGlzLnRyaWdnZXIodGhpcy5jdXJyZW50Q29udGFpbmVyLCBkcmFnTW92ZUV2ZW50KTtcbiAgfVxuXG4gIFtvbk1vdXNlVXBdKGV2ZW50KSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMubW91c2VEb3duVGltZW91dCk7XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpc1tvbk1vdXNlVXBdKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCBwcmV2ZW50TmF0aXZlRHJhZ1N0YXJ0KTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzW29uRGlzdGFuY2VDaGFuZ2VdKTtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICBjb25zdCBkcmFnU3RvcEV2ZW50ID0gbmV3IFNlbnNvckV2ZW50LkRyYWdTdG9wU2Vuc29yRXZlbnQoe1xuICAgICAgY2xpZW50WDogZXZlbnQuY2xpZW50WCxcbiAgICAgIGNsaWVudFk6IGV2ZW50LmNsaWVudFksXG4gICAgICB0YXJnZXQsXG4gICAgICBjb250YWluZXI6IHRoaXMuY3VycmVudENvbnRhaW5lcixcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50XG4gICAgfSk7XG4gICAgdGhpcy50cmlnZ2VyKHRoaXMuY3VycmVudENvbnRhaW5lciwgZHJhZ1N0b3BFdmVudCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCB0aGlzW29uQ29udGV4dE1lbnVXaGlsZURyYWdnaW5nXSwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpc1tvbk1vdXNlTW92ZV0pO1xuICAgIHRoaXMuY3VycmVudENvbnRhaW5lciA9IG51bGw7XG4gICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgIHRoaXMuc3RhcnRFdmVudCA9IG51bGw7XG4gIH1cblxuICBbb25Db250ZXh0TWVudVdoaWxlRHJhZ2dpbmddKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxufVxuZnVuY3Rpb24gcHJldmVudE5hdGl2ZURyYWdTdGFydChldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xufVxuXG5leHBvcnRzLmRlZmF1bHQgPSBNb3VzZVNlbnNvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuY29uc3QgZGVmYXVsdERlbGF5ID0ge1xuICBtb3VzZTogMCxcbiAgZHJhZzogMCxcbiAgdG91Y2g6IDEwMFxufTtcblxuY2xhc3MgU2Vuc29yIHtcblxuICBjb25zdHJ1Y3Rvcihjb250YWluZXJzID0gW10sIG9wdGlvbnMgPSB7fSkge1xuXG4gICAgdGhpcy5jb250YWluZXJzID0gWy4uLmNvbnRhaW5lcnNdO1xuXG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9uc1xuICAgIH07XG5cbiAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG5cbiAgICB0aGlzLmN1cnJlbnRDb250YWluZXIgPSBudWxsO1xuXG4gICAgdGhpcy5vcmlnaW5hbFNvdXJjZSA9IG51bGw7XG5cbiAgICB0aGlzLnN0YXJ0RXZlbnQgPSBudWxsO1xuXG4gICAgdGhpcy5kZWxheSA9IGNhbGNEZWxheShvcHRpb25zLmRlbGF5KTtcbiAgfVxuXG4gIGF0dGFjaCgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGRldGFjaCgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZENvbnRhaW5lciguLi5jb250YWluZXJzKSB7XG4gICAgdGhpcy5jb250YWluZXJzID0gWy4uLnRoaXMuY29udGFpbmVycywgLi4uY29udGFpbmVyc107XG4gIH1cblxuICByZW1vdmVDb250YWluZXIoLi4uY29udGFpbmVycykge1xuICAgIHRoaXMuY29udGFpbmVycyA9IHRoaXMuY29udGFpbmVycy5maWx0ZXIoY29udGFpbmVyID0+ICFjb250YWluZXJzLmluY2x1ZGVzKGNvbnRhaW5lcikpO1xuICB9XG5cbiAgdHJpZ2dlcihlbGVtZW50LCBzZW5zb3JFdmVudCkge1xuICAgIGNvbnN0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZlbnQuZGV0YWlsID0gc2Vuc29yRXZlbnQ7XG4gICAgZXZlbnQuaW5pdEV2ZW50KHNlbnNvckV2ZW50LnR5cGUsIHRydWUsIHRydWUpO1xuICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgdGhpcy5sYXN0RXZlbnQgPSBzZW5zb3JFdmVudDtcbiAgICByZXR1cm4gc2Vuc29yRXZlbnQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsY0RlbGF5KG9wdGlvbnNEZWxheSkge1xuICBjb25zdCBkZWxheSA9IHt9O1xuICBpZiAob3B0aW9uc0RlbGF5ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmYXVsdERlbGF5XG4gICAgfTtcbiAgfVxuICBpZiAodHlwZW9mIG9wdGlvbnNEZWxheSA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkZWZhdWx0RGVsYXkpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVmYXVsdERlbGF5LCBrZXkpKSB7XG4gICAgICAgIGRlbGF5W2tleV0gPSBvcHRpb25zRGVsYXk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWxheTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBkZWZhdWx0RGVsYXkpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRlZmF1bHREZWxheSwga2V5KSkge1xuICAgICAgaWYgKG9wdGlvbnNEZWxheVtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVsYXlba2V5XSA9IGRlZmF1bHREZWxheVtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsYXlba2V5XSA9IG9wdGlvbnNEZWxheVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGVsYXk7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFNlbnNvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEFic3RyYWN0RXZlbnQgPSByZXF1aXJlKCcuLi8uLi8uLi9zaGFyZWQvQWJzdHJhY3RFdmVudC9BYnN0cmFjdEV2ZW50LmNqcycpO1xuXG5jbGFzcyBTZW5zb3JFdmVudCBleHRlbmRzIEFic3RyYWN0RXZlbnQuQWJzdHJhY3RFdmVudCB7XG5cbiAgZ2V0IG9yaWdpbmFsRXZlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5vcmlnaW5hbEV2ZW50O1xuICB9XG5cbiAgZ2V0IGNsaWVudFgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5jbGllbnRYO1xuICB9XG5cbiAgZ2V0IGNsaWVudFkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5jbGllbnRZO1xuICB9XG5cbiAgZ2V0IHRhcmdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLnRhcmdldDtcbiAgfVxuXG4gIGdldCBjb250YWluZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5jb250YWluZXI7XG4gIH1cblxuICBnZXQgb3JpZ2luYWxTb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5vcmlnaW5hbFNvdXJjZTtcbiAgfVxuXG4gIGdldCBwcmVzc3VyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLnByZXNzdXJlO1xuICB9XG59XG5cbmNsYXNzIERyYWdTdGFydFNlbnNvckV2ZW50IGV4dGVuZHMgU2Vuc29yRXZlbnQge31cblxuRHJhZ1N0YXJ0U2Vuc29yRXZlbnQudHlwZSA9ICdkcmFnOnN0YXJ0JztcbmNsYXNzIERyYWdNb3ZlU2Vuc29yRXZlbnQgZXh0ZW5kcyBTZW5zb3JFdmVudCB7fVxuXG5EcmFnTW92ZVNlbnNvckV2ZW50LnR5cGUgPSAnZHJhZzptb3ZlJztcbmNsYXNzIERyYWdTdG9wU2Vuc29yRXZlbnQgZXh0ZW5kcyBTZW5zb3JFdmVudCB7fVxuXG5EcmFnU3RvcFNlbnNvckV2ZW50LnR5cGUgPSAnZHJhZzpzdG9wJztcbmNsYXNzIERyYWdQcmVzc3VyZVNlbnNvckV2ZW50IGV4dGVuZHMgU2Vuc29yRXZlbnQge31cbkRyYWdQcmVzc3VyZVNlbnNvckV2ZW50LnR5cGUgPSAnZHJhZzpwcmVzc3VyZSc7XG5cbmV4cG9ydHMuRHJhZ01vdmVTZW5zb3JFdmVudCA9IERyYWdNb3ZlU2Vuc29yRXZlbnQ7XG5leHBvcnRzLkRyYWdQcmVzc3VyZVNlbnNvckV2ZW50ID0gRHJhZ1ByZXNzdXJlU2Vuc29yRXZlbnQ7XG5leHBvcnRzLkRyYWdTdGFydFNlbnNvckV2ZW50ID0gRHJhZ1N0YXJ0U2Vuc29yRXZlbnQ7XG5leHBvcnRzLkRyYWdTdG9wU2Vuc29yRXZlbnQgPSBEcmFnU3RvcFNlbnNvckV2ZW50O1xuZXhwb3J0cy5TZW5zb3JFdmVudCA9IFNlbnNvckV2ZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgY2xvc2VzdCA9IHJlcXVpcmUoJy4uLy4uLy4uL3NoYXJlZC91dGlscy9jbG9zZXN0L2Nsb3Nlc3QuY2pzJyk7XG52YXIgZGlzdGFuY2UgPSByZXF1aXJlKCcuLi8uLi8uLi9zaGFyZWQvdXRpbHMvZGlzdGFuY2UvZGlzdGFuY2UuY2pzJyk7XG52YXIgdG91Y2hDb29yZHMgPSByZXF1aXJlKCcuLi8uLi8uLi9zaGFyZWQvdXRpbHMvdG91Y2hDb29yZHMvdG91Y2hDb29yZHMuY2pzJyk7XG52YXIgU2Vuc29yID0gcmVxdWlyZSgnLi4vU2Vuc29yL1NlbnNvci5janMnKTtcbnZhciBTZW5zb3JFdmVudCA9IHJlcXVpcmUoJy4uL1NlbnNvckV2ZW50L1NlbnNvckV2ZW50LmNqcycpO1xuXG5jb25zdCBvblRvdWNoU3RhcnQgPSBTeW1ib2woJ29uVG91Y2hTdGFydCcpO1xuY29uc3Qgb25Ub3VjaEVuZCA9IFN5bWJvbCgnb25Ub3VjaEVuZCcpO1xuY29uc3Qgb25Ub3VjaE1vdmUgPSBTeW1ib2woJ29uVG91Y2hNb3ZlJyk7XG5jb25zdCBzdGFydERyYWcgPSBTeW1ib2woJ3N0YXJ0RHJhZycpO1xuY29uc3Qgb25EaXN0YW5jZUNoYW5nZSA9IFN5bWJvbCgnb25EaXN0YW5jZUNoYW5nZScpO1xuXG5sZXQgcHJldmVudFNjcm9sbGluZyA9IGZhbHNlO1xuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgZXZlbnQgPT4ge1xuICBpZiAoIXByZXZlbnRTY3JvbGxpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xufSwge1xuICBwYXNzaXZlOiBmYWxzZVxufSk7XG5cbmNsYXNzIFRvdWNoU2Vuc29yIGV4dGVuZHMgU2Vuc29yLmRlZmF1bHQge1xuXG4gIGNvbnN0cnVjdG9yKGNvbnRhaW5lcnMgPSBbXSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoY29udGFpbmVycywgb3B0aW9ucyk7XG5cbiAgICB0aGlzLmN1cnJlbnRTY3JvbGxhYmxlUGFyZW50ID0gbnVsbDtcblxuICAgIHRoaXMudGFwVGltZW91dCA9IG51bGw7XG5cbiAgICB0aGlzLnRvdWNoTW92ZWQgPSBmYWxzZTtcblxuICAgIHRoaXMucGFnZVggPSBudWxsO1xuXG4gICAgdGhpcy5wYWdlWSA9IG51bGw7XG4gICAgdGhpc1tvblRvdWNoU3RhcnRdID0gdGhpc1tvblRvdWNoU3RhcnRdLmJpbmQodGhpcyk7XG4gICAgdGhpc1tvblRvdWNoRW5kXSA9IHRoaXNbb25Ub3VjaEVuZF0uYmluZCh0aGlzKTtcbiAgICB0aGlzW29uVG91Y2hNb3ZlXSA9IHRoaXNbb25Ub3VjaE1vdmVdLmJpbmQodGhpcyk7XG4gICAgdGhpc1tzdGFydERyYWddID0gdGhpc1tzdGFydERyYWddLmJpbmQodGhpcyk7XG4gICAgdGhpc1tvbkRpc3RhbmNlQ2hhbmdlXSA9IHRoaXNbb25EaXN0YW5jZUNoYW5nZV0uYmluZCh0aGlzKTtcbiAgfVxuXG4gIGF0dGFjaCgpIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpc1tvblRvdWNoU3RhcnRdKTtcbiAgfVxuXG4gIGRldGFjaCgpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpc1tvblRvdWNoU3RhcnRdKTtcbiAgfVxuXG4gIFtvblRvdWNoU3RhcnRdKGV2ZW50KSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gY2xvc2VzdC5kZWZhdWx0KGV2ZW50LnRhcmdldCwgdGhpcy5jb250YWluZXJzKTtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLmhhbmRsZSAmJiBldmVudC50YXJnZXQgJiYgIWNsb3Nlc3QuZGVmYXVsdChldmVudC50YXJnZXQsIHRoaXMub3B0aW9ucy5oYW5kbGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9yaWdpbmFsU291cmNlID0gY2xvc2VzdC5kZWZhdWx0KGV2ZW50LnRhcmdldCwgdGhpcy5vcHRpb25zLmRyYWdnYWJsZSk7XG4gICAgaWYgKCFvcmlnaW5hbFNvdXJjZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBkaXN0YW5jZSA9IDBcbiAgICB9ID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHtcbiAgICAgIGRlbGF5XG4gICAgfSA9IHRoaXM7XG4gICAgY29uc3Qge1xuICAgICAgcGFnZVgsXG4gICAgICBwYWdlWVxuICAgIH0gPSB0b3VjaENvb3Jkcy5kZWZhdWx0KGV2ZW50KTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMsIHtcbiAgICAgIHBhZ2VYLFxuICAgICAgcGFnZVlcbiAgICB9KTtcbiAgICB0aGlzLm9uVG91Y2hTdGFydEF0ID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLnN0YXJ0RXZlbnQgPSBldmVudDtcbiAgICB0aGlzLmN1cnJlbnRDb250YWluZXIgPSBjb250YWluZXI7XG4gICAgdGhpcy5vcmlnaW5hbFNvdXJjZSA9IG9yaWdpbmFsU291cmNlO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpc1tvblRvdWNoRW5kXSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzW29uVG91Y2hFbmRdKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzW29uRGlzdGFuY2VDaGFuZ2VdKTtcbiAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBvbkNvbnRleHRNZW51KTtcbiAgICBpZiAoZGlzdGFuY2UpIHtcbiAgICAgIHByZXZlbnRTY3JvbGxpbmcgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLnRhcFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzW29uRGlzdGFuY2VDaGFuZ2VdKHtcbiAgICAgICAgdG91Y2hlczogW3tcbiAgICAgICAgICBwYWdlWDogdGhpcy5wYWdlWCxcbiAgICAgICAgICBwYWdlWTogdGhpcy5wYWdlWVxuICAgICAgICB9XVxuICAgICAgfSk7XG4gICAgfSwgZGVsYXkudG91Y2gpO1xuICB9XG5cbiAgW3N0YXJ0RHJhZ10oKSB7XG4gICAgY29uc3Qgc3RhcnRFdmVudCA9IHRoaXMuc3RhcnRFdmVudDtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmN1cnJlbnRDb250YWluZXI7XG4gICAgY29uc3QgdG91Y2ggPSB0b3VjaENvb3Jkcy5kZWZhdWx0KHN0YXJ0RXZlbnQpO1xuICAgIGNvbnN0IG9yaWdpbmFsU291cmNlID0gdGhpcy5vcmlnaW5hbFNvdXJjZTtcbiAgICBjb25zdCBkcmFnU3RhcnRFdmVudCA9IG5ldyBTZW5zb3JFdmVudC5EcmFnU3RhcnRTZW5zb3JFdmVudCh7XG4gICAgICBjbGllbnRYOiB0b3VjaC5wYWdlWCxcbiAgICAgIGNsaWVudFk6IHRvdWNoLnBhZ2VZLFxuICAgICAgdGFyZ2V0OiBzdGFydEV2ZW50LnRhcmdldCxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIG9yaWdpbmFsU291cmNlLFxuICAgICAgb3JpZ2luYWxFdmVudDogc3RhcnRFdmVudFxuICAgIH0pO1xuICAgIHRoaXMudHJpZ2dlcih0aGlzLmN1cnJlbnRDb250YWluZXIsIGRyYWdTdGFydEV2ZW50KTtcbiAgICB0aGlzLmRyYWdnaW5nID0gIWRyYWdTdGFydEV2ZW50LmNhbmNlbGVkKCk7XG4gICAgaWYgKHRoaXMuZHJhZ2dpbmcpIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXNbb25Ub3VjaE1vdmVdKTtcbiAgICB9XG4gICAgcHJldmVudFNjcm9sbGluZyA9IHRoaXMuZHJhZ2dpbmc7XG4gIH1cblxuICBbb25EaXN0YW5jZUNoYW5nZV0oZXZlbnQpIHtcbiAgICBjb25zdCB7XG4gICAgICBkaXN0YW5jZTogZGlzdGFuY2UkMVxuICAgIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3Qge1xuICAgICAgc3RhcnRFdmVudCxcbiAgICAgIGRlbGF5XG4gICAgfSA9IHRoaXM7XG4gICAgY29uc3Qgc3RhcnQgPSB0b3VjaENvb3Jkcy5kZWZhdWx0KHN0YXJ0RXZlbnQpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0b3VjaENvb3Jkcy5kZWZhdWx0KGV2ZW50KTtcbiAgICBjb25zdCB0aW1lRWxhcHNlZCA9IERhdGUubm93KCkgLSB0aGlzLm9uVG91Y2hTdGFydEF0O1xuICAgIGNvbnN0IGRpc3RhbmNlVHJhdmVsbGVkID0gZGlzdGFuY2UuZGVmYXVsdChzdGFydC5wYWdlWCwgc3RhcnQucGFnZVksIGN1cnJlbnQucGFnZVgsIGN1cnJlbnQucGFnZVkpO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcywgY3VycmVudCk7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGFwVGltZW91dCk7XG4gICAgaWYgKHRpbWVFbGFwc2VkIDwgZGVsYXkudG91Y2gpIHtcblxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpc1tvbkRpc3RhbmNlQ2hhbmdlXSk7XG4gICAgfSBlbHNlIGlmIChkaXN0YW5jZVRyYXZlbGxlZCA+PSBkaXN0YW5jZSQxKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzW29uRGlzdGFuY2VDaGFuZ2VdKTtcbiAgICAgIHRoaXNbc3RhcnREcmFnXSgpO1xuICAgIH1cbiAgfVxuXG4gIFtvblRvdWNoTW92ZV0oZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgcGFnZVgsXG4gICAgICBwYWdlWVxuICAgIH0gPSB0b3VjaENvb3Jkcy5kZWZhdWx0KGV2ZW50KTtcbiAgICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHBhZ2VYIC0gd2luZG93LnNjcm9sbFgsIHBhZ2VZIC0gd2luZG93LnNjcm9sbFkpO1xuICAgIGNvbnN0IGRyYWdNb3ZlRXZlbnQgPSBuZXcgU2Vuc29yRXZlbnQuRHJhZ01vdmVTZW5zb3JFdmVudCh7XG4gICAgICBjbGllbnRYOiBwYWdlWCxcbiAgICAgIGNsaWVudFk6IHBhZ2VZLFxuICAgICAgdGFyZ2V0LFxuICAgICAgY29udGFpbmVyOiB0aGlzLmN1cnJlbnRDb250YWluZXIsXG4gICAgICBvcmlnaW5hbEV2ZW50OiBldmVudFxuICAgIH0pO1xuICAgIHRoaXMudHJpZ2dlcih0aGlzLmN1cnJlbnRDb250YWluZXIsIGRyYWdNb3ZlRXZlbnQpO1xuICB9XG5cbiAgW29uVG91Y2hFbmRdKGV2ZW50KSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGFwVGltZW91dCk7XG4gICAgcHJldmVudFNjcm9sbGluZyA9IGZhbHNlO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpc1tvblRvdWNoRW5kXSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzW29uVG91Y2hFbmRdKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzW29uRGlzdGFuY2VDaGFuZ2VdKTtcbiAgICBpZiAodGhpcy5jdXJyZW50Q29udGFpbmVyKSB7XG4gICAgICB0aGlzLmN1cnJlbnRDb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBvbkNvbnRleHRNZW51KTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXNbb25Ub3VjaE1vdmVdKTtcbiAgICBjb25zdCB7XG4gICAgICBwYWdlWCxcbiAgICAgIHBhZ2VZXG4gICAgfSA9IHRvdWNoQ29vcmRzLmRlZmF1bHQoZXZlbnQpO1xuICAgIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQocGFnZVggLSB3aW5kb3cuc2Nyb2xsWCwgcGFnZVkgLSB3aW5kb3cuc2Nyb2xsWSk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBkcmFnU3RvcEV2ZW50ID0gbmV3IFNlbnNvckV2ZW50LkRyYWdTdG9wU2Vuc29yRXZlbnQoe1xuICAgICAgY2xpZW50WDogcGFnZVgsXG4gICAgICBjbGllbnRZOiBwYWdlWSxcbiAgICAgIHRhcmdldCxcbiAgICAgIGNvbnRhaW5lcjogdGhpcy5jdXJyZW50Q29udGFpbmVyLFxuICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnRcbiAgICB9KTtcbiAgICB0aGlzLnRyaWdnZXIodGhpcy5jdXJyZW50Q29udGFpbmVyLCBkcmFnU3RvcEV2ZW50KTtcbiAgICB0aGlzLmN1cnJlbnRDb250YWluZXIgPSBudWxsO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnN0YXJ0RXZlbnQgPSBudWxsO1xuICB9XG59XG5mdW5jdGlvbiBvbkNvbnRleHRNZW51KGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xufVxuXG5leHBvcnRzLmRlZmF1bHQgPSBUb3VjaFNlbnNvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFNlbnNvciA9IHJlcXVpcmUoJy4vU2Vuc29yL1NlbnNvci5janMnKTtcbnZhciBNb3VzZVNlbnNvciA9IHJlcXVpcmUoJy4vTW91c2VTZW5zb3IvTW91c2VTZW5zb3IuY2pzJyk7XG52YXIgVG91Y2hTZW5zb3IgPSByZXF1aXJlKCcuL1RvdWNoU2Vuc29yL1RvdWNoU2Vuc29yLmNqcycpO1xudmFyIERyYWdTZW5zb3IgPSByZXF1aXJlKCcuL0RyYWdTZW5zb3IvRHJhZ1NlbnNvci5janMnKTtcbnZhciBGb3JjZVRvdWNoU2Vuc29yID0gcmVxdWlyZSgnLi9Gb3JjZVRvdWNoU2Vuc29yL0ZvcmNlVG91Y2hTZW5zb3IuY2pzJyk7XG52YXIgU2Vuc29yRXZlbnQgPSByZXF1aXJlKCcuL1NlbnNvckV2ZW50L1NlbnNvckV2ZW50LmNqcycpO1xuXG5cblxuZXhwb3J0cy5TZW5zb3IgPSBTZW5zb3IuZGVmYXVsdDtcbmV4cG9ydHMuTW91c2VTZW5zb3IgPSBNb3VzZVNlbnNvci5kZWZhdWx0O1xuZXhwb3J0cy5Ub3VjaFNlbnNvciA9IFRvdWNoU2Vuc29yLmRlZmF1bHQ7XG5leHBvcnRzLkRyYWdTZW5zb3IgPSBEcmFnU2Vuc29yLmRlZmF1bHQ7XG5leHBvcnRzLkZvcmNlVG91Y2hTZW5zb3IgPSBGb3JjZVRvdWNoU2Vuc29yLmRlZmF1bHQ7XG5leHBvcnRzLkRyYWdNb3ZlU2Vuc29yRXZlbnQgPSBTZW5zb3JFdmVudC5EcmFnTW92ZVNlbnNvckV2ZW50O1xuZXhwb3J0cy5EcmFnUHJlc3N1cmVTZW5zb3JFdmVudCA9IFNlbnNvckV2ZW50LkRyYWdQcmVzc3VyZVNlbnNvckV2ZW50O1xuZXhwb3J0cy5EcmFnU3RhcnRTZW5zb3JFdmVudCA9IFNlbnNvckV2ZW50LkRyYWdTdGFydFNlbnNvckV2ZW50O1xuZXhwb3J0cy5EcmFnU3RvcFNlbnNvckV2ZW50ID0gU2Vuc29yRXZlbnQuRHJhZ1N0b3BTZW5zb3JFdmVudDtcbmV4cG9ydHMuU2Vuc29yRXZlbnQgPSBTZW5zb3JFdmVudC5TZW5zb3JFdmVudDtcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxudmFyIGNsb3Nlc3QgPSByZXF1aXJlKCcuLi9zaGFyZWQvdXRpbHMvY2xvc2VzdC9jbG9zZXN0LmNqcycpO1xudmFyIERyYWdnYWJsZSA9IHJlcXVpcmUoJy4uL0RyYWdnYWJsZS9EcmFnZ2FibGUuY2pzJyk7XG5yZXF1aXJlKCcuLi9EcmFnZ2FibGUvRHJhZ0V2ZW50L0RyYWdFdmVudC5janMnKTtcbnJlcXVpcmUoJy4uL0RyYWdnYWJsZS9EcmFnZ2FibGVFdmVudC9EcmFnZ2FibGVFdmVudC5janMnKTtcbnJlcXVpcmUoJy4uL0RyYWdnYWJsZS9QbHVnaW5zL0Fubm91bmNlbWVudC9Bbm5vdW5jZW1lbnQuY2pzJyk7XG5yZXF1aXJlKCcuLi9EcmFnZ2FibGUvUGx1Z2lucy9NaXJyb3IvTWlycm9yRXZlbnQvTWlycm9yRXZlbnQuY2pzJyk7XG5yZXF1aXJlKCcuLi9EcmFnZ2FibGUvU2Vuc29ycy9TZW5zb3JFdmVudC9TZW5zb3JFdmVudC5janMnKTtcbnJlcXVpcmUoJy4uL0RyYWdnYWJsZS9TZW5zb3JzL1RvdWNoU2Vuc29yL1RvdWNoU2Vuc29yLmNqcycpO1xudmFyIERyb3BwYWJsZUV2ZW50ID0gcmVxdWlyZSgnLi9Ecm9wcGFibGVFdmVudC9Ecm9wcGFibGVFdmVudC5janMnKTtcblxuY29uc3Qgb25EcmFnU3RhcnQgPSBTeW1ib2woJ29uRHJhZ1N0YXJ0Jyk7XG5jb25zdCBvbkRyYWdNb3ZlID0gU3ltYm9sKCdvbkRyYWdNb3ZlJyk7XG5jb25zdCBvbkRyYWdTdG9wID0gU3ltYm9sKCdvbkRyYWdTdG9wJyk7XG5jb25zdCBkcm9wSW5Ecm9wem9uZSA9IFN5bWJvbCgnZHJvcEluRHJvcFpvbmUnKTtcbmNvbnN0IHJldHVyblRvT3JpZ2luYWxEcm9wem9uZSA9IFN5bWJvbCgncmV0dXJuVG9PcmlnaW5hbERyb3B6b25lJyk7XG5jb25zdCBjbG9zZXN0RHJvcHpvbmUgPSBTeW1ib2woJ2Nsb3Nlc3REcm9wem9uZScpO1xuY29uc3QgZ2V0RHJvcHpvbmVzID0gU3ltYm9sKCdnZXREcm9wem9uZXMnKTtcblxuZnVuY3Rpb24gb25Ecm9wcGFibGVEcm9wcGVkRGVmYXVsdEFubm91bmNlbWVudCh7XG4gIGRyYWdFdmVudCxcbiAgZHJvcHpvbmVcbn0pIHtcbiAgY29uc3Qgc291cmNlVGV4dCA9IGRyYWdFdmVudC5zb3VyY2UudGV4dENvbnRlbnQudHJpbSgpIHx8IGRyYWdFdmVudC5zb3VyY2UuaWQgfHwgJ2RyYWdnYWJsZSBlbGVtZW50JztcbiAgY29uc3QgZHJvcHpvbmVUZXh0ID0gZHJvcHpvbmUudGV4dENvbnRlbnQudHJpbSgpIHx8IGRyb3B6b25lLmlkIHx8ICdkcm9wcGFibGUgZWxlbWVudCc7XG4gIHJldHVybiBgRHJvcHBlZCAke3NvdXJjZVRleHR9IGludG8gJHtkcm9wem9uZVRleHR9YDtcbn1cblxuZnVuY3Rpb24gb25Ecm9wcGFibGVSZXR1cm5lZERlZmF1bHRBbm5vdW5jZW1lbnQoe1xuICBkcmFnRXZlbnQsXG4gIGRyb3B6b25lXG59KSB7XG4gIGNvbnN0IHNvdXJjZVRleHQgPSBkcmFnRXZlbnQuc291cmNlLnRleHRDb250ZW50LnRyaW0oKSB8fCBkcmFnRXZlbnQuc291cmNlLmlkIHx8ICdkcmFnZ2FibGUgZWxlbWVudCc7XG4gIGNvbnN0IGRyb3B6b25lVGV4dCA9IGRyb3B6b25lLnRleHRDb250ZW50LnRyaW0oKSB8fCBkcm9wem9uZS5pZCB8fCAnZHJvcHBhYmxlIGVsZW1lbnQnO1xuICByZXR1cm4gYFJldHVybmVkICR7c291cmNlVGV4dH0gZnJvbSAke2Ryb3B6b25lVGV4dH1gO1xufVxuXG5jb25zdCBkZWZhdWx0QW5ub3VuY2VtZW50cyA9IHtcbiAgJ2Ryb3BwYWJsZTpkcm9wcGVkJzogb25Ecm9wcGFibGVEcm9wcGVkRGVmYXVsdEFubm91bmNlbWVudCxcbiAgJ2Ryb3BwYWJsZTpyZXR1cm5lZCc6IG9uRHJvcHBhYmxlUmV0dXJuZWREZWZhdWx0QW5ub3VuY2VtZW50XG59O1xuY29uc3QgZGVmYXVsdENsYXNzZXMgPSB7XG4gICdkcm9wcGFibGU6YWN0aXZlJzogJ2RyYWdnYWJsZS1kcm9wem9uZS0tYWN0aXZlJyxcbiAgJ2Ryb3BwYWJsZTpvY2N1cGllZCc6ICdkcmFnZ2FibGUtZHJvcHpvbmUtLW9jY3VwaWVkJ1xufTtcbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICBkcm9wem9uZTogJy5kcmFnZ2FibGUtZHJvcHBhYmxlJ1xufTtcblxuY2xhc3MgRHJvcHBhYmxlIGV4dGVuZHMgRHJhZ2dhYmxlLmRlZmF1bHQge1xuXG4gIGNvbnN0cnVjdG9yKGNvbnRhaW5lcnMgPSBbXSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoY29udGFpbmVycywge1xuICAgICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgY2xhc3Nlczoge1xuICAgICAgICAuLi5kZWZhdWx0Q2xhc3NlcyxcbiAgICAgICAgLi4uKG9wdGlvbnMuY2xhc3NlcyB8fCB7fSlcbiAgICAgIH0sXG4gICAgICBhbm5vdW5jZW1lbnRzOiB7XG4gICAgICAgIC4uLmRlZmF1bHRBbm5vdW5jZW1lbnRzLFxuICAgICAgICAuLi4ob3B0aW9ucy5hbm5vdW5jZW1lbnRzIHx8IHt9KVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5kcm9wem9uZXMgPSBudWxsO1xuXG4gICAgdGhpcy5sYXN0RHJvcHpvbmUgPSBudWxsO1xuXG4gICAgdGhpcy5pbml0aWFsRHJvcHpvbmUgPSBudWxsO1xuICAgIHRoaXNbb25EcmFnU3RhcnRdID0gdGhpc1tvbkRyYWdTdGFydF0uYmluZCh0aGlzKTtcbiAgICB0aGlzW29uRHJhZ01vdmVdID0gdGhpc1tvbkRyYWdNb3ZlXS5iaW5kKHRoaXMpO1xuICAgIHRoaXNbb25EcmFnU3RvcF0gPSB0aGlzW29uRHJhZ1N0b3BdLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbignZHJhZzpzdGFydCcsIHRoaXNbb25EcmFnU3RhcnRdKS5vbignZHJhZzptb3ZlJywgdGhpc1tvbkRyYWdNb3ZlXSkub24oJ2RyYWc6c3RvcCcsIHRoaXNbb25EcmFnU3RvcF0pO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5vZmYoJ2RyYWc6c3RhcnQnLCB0aGlzW29uRHJhZ1N0YXJ0XSkub2ZmKCdkcmFnOm1vdmUnLCB0aGlzW29uRHJhZ01vdmVdKS5vZmYoJ2RyYWc6c3RvcCcsIHRoaXNbb25EcmFnU3RvcF0pO1xuICB9XG5cbiAgW29uRHJhZ1N0YXJ0XShldmVudCkge1xuICAgIGlmIChldmVudC5jYW5jZWxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZHJvcHpvbmVzID0gWy4uLnRoaXNbZ2V0RHJvcHpvbmVzXSgpXTtcbiAgICBjb25zdCBkcm9wem9uZSA9IGNsb3Nlc3QuZGVmYXVsdChldmVudC5zZW5zb3JFdmVudC50YXJnZXQsIHRoaXMub3B0aW9ucy5kcm9wem9uZSk7XG4gICAgaWYgKCFkcm9wem9uZSkge1xuICAgICAgZXZlbnQuY2FuY2VsKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRyb3BwYWJsZVN0YXJ0RXZlbnQgPSBuZXcgRHJvcHBhYmxlRXZlbnQuRHJvcHBhYmxlU3RhcnRFdmVudCh7XG4gICAgICBkcmFnRXZlbnQ6IGV2ZW50LFxuICAgICAgZHJvcHpvbmVcbiAgICB9KTtcbiAgICB0aGlzLnRyaWdnZXIoZHJvcHBhYmxlU3RhcnRFdmVudCk7XG4gICAgaWYgKGRyb3BwYWJsZVN0YXJ0RXZlbnQuY2FuY2VsZWQoKSkge1xuICAgICAgZXZlbnQuY2FuY2VsKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbERyb3B6b25lID0gZHJvcHpvbmU7XG4gICAgZm9yIChjb25zdCBkcm9wem9uZUVsZW1lbnQgb2YgdGhpcy5kcm9wem9uZXMpIHtcbiAgICAgIGlmIChkcm9wem9uZUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKHRoaXMuZ2V0Q2xhc3NOYW1lRm9yKCdkcm9wcGFibGU6b2NjdXBpZWQnKSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBkcm9wem9uZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCguLi50aGlzLmdldENsYXNzTmFtZXNGb3IoJ2Ryb3BwYWJsZTphY3RpdmUnKSk7XG4gICAgfVxuICB9XG5cbiAgW29uRHJhZ01vdmVdKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmNhbmNlbGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZHJvcHpvbmUgPSB0aGlzW2Nsb3Nlc3REcm9wem9uZV0oZXZlbnQuc2Vuc29yRXZlbnQudGFyZ2V0KTtcbiAgICBjb25zdCBvdmVyRW1wdHlEcm9wem9uZSA9IGRyb3B6b25lICYmICFkcm9wem9uZS5jbGFzc0xpc3QuY29udGFpbnModGhpcy5nZXRDbGFzc05hbWVGb3IoJ2Ryb3BwYWJsZTpvY2N1cGllZCcpKTtcbiAgICBpZiAob3ZlckVtcHR5RHJvcHpvbmUgJiYgdGhpc1tkcm9wSW5Ecm9wem9uZV0oZXZlbnQsIGRyb3B6b25lKSkge1xuICAgICAgdGhpcy5sYXN0RHJvcHpvbmUgPSBkcm9wem9uZTtcbiAgICB9IGVsc2UgaWYgKCghZHJvcHpvbmUgfHwgZHJvcHpvbmUgPT09IHRoaXMuaW5pdGlhbERyb3B6b25lKSAmJiB0aGlzLmxhc3REcm9wem9uZSkge1xuICAgICAgdGhpc1tyZXR1cm5Ub09yaWdpbmFsRHJvcHpvbmVdKGV2ZW50KTtcbiAgICAgIHRoaXMubGFzdERyb3B6b25lID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBbb25EcmFnU3RvcF0oZXZlbnQpIHtcbiAgICBjb25zdCBkcm9wcGFibGVTdG9wRXZlbnQgPSBuZXcgRHJvcHBhYmxlRXZlbnQuRHJvcHBhYmxlU3RvcEV2ZW50KHtcbiAgICAgIGRyYWdFdmVudDogZXZlbnQsXG4gICAgICBkcm9wem9uZTogdGhpcy5sYXN0RHJvcHpvbmUgfHwgdGhpcy5pbml0aWFsRHJvcHpvbmVcbiAgICB9KTtcbiAgICB0aGlzLnRyaWdnZXIoZHJvcHBhYmxlU3RvcEV2ZW50KTtcbiAgICBjb25zdCBvY2N1cGllZENsYXNzZXMgPSB0aGlzLmdldENsYXNzTmFtZXNGb3IoJ2Ryb3BwYWJsZTpvY2N1cGllZCcpO1xuICAgIGZvciAoY29uc3QgZHJvcHpvbmUgb2YgdGhpcy5kcm9wem9uZXMpIHtcbiAgICAgIGRyb3B6b25lLmNsYXNzTGlzdC5yZW1vdmUoLi4udGhpcy5nZXRDbGFzc05hbWVzRm9yKCdkcm9wcGFibGU6YWN0aXZlJykpO1xuICAgIH1cbiAgICBpZiAodGhpcy5sYXN0RHJvcHpvbmUgJiYgdGhpcy5sYXN0RHJvcHpvbmUgIT09IHRoaXMuaW5pdGlhbERyb3B6b25lKSB7XG4gICAgICB0aGlzLmluaXRpYWxEcm9wem9uZS5jbGFzc0xpc3QucmVtb3ZlKC4uLm9jY3VwaWVkQ2xhc3Nlcyk7XG4gICAgfVxuICAgIHRoaXMuZHJvcHpvbmVzID0gbnVsbDtcbiAgICB0aGlzLmxhc3REcm9wem9uZSA9IG51bGw7XG4gICAgdGhpcy5pbml0aWFsRHJvcHpvbmUgPSBudWxsO1xuICB9XG5cbiAgW2Ryb3BJbkRyb3B6b25lXShldmVudCwgZHJvcHpvbmUpIHtcbiAgICBjb25zdCBkcm9wcGFibGVEcm9wcGVkRXZlbnQgPSBuZXcgRHJvcHBhYmxlRXZlbnQuRHJvcHBhYmxlRHJvcHBlZEV2ZW50KHtcbiAgICAgIGRyYWdFdmVudDogZXZlbnQsXG4gICAgICBkcm9wem9uZVxuICAgIH0pO1xuICAgIHRoaXMudHJpZ2dlcihkcm9wcGFibGVEcm9wcGVkRXZlbnQpO1xuICAgIGlmIChkcm9wcGFibGVEcm9wcGVkRXZlbnQuY2FuY2VsZWQoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBvY2N1cGllZENsYXNzZXMgPSB0aGlzLmdldENsYXNzTmFtZXNGb3IoJ2Ryb3BwYWJsZTpvY2N1cGllZCcpO1xuICAgIGlmICh0aGlzLmxhc3REcm9wem9uZSkge1xuICAgICAgdGhpcy5sYXN0RHJvcHpvbmUuY2xhc3NMaXN0LnJlbW92ZSguLi5vY2N1cGllZENsYXNzZXMpO1xuICAgIH1cbiAgICBkcm9wem9uZS5hcHBlbmRDaGlsZChldmVudC5zb3VyY2UpO1xuICAgIGRyb3B6b25lLmNsYXNzTGlzdC5hZGQoLi4ub2NjdXBpZWRDbGFzc2VzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIFtyZXR1cm5Ub09yaWdpbmFsRHJvcHpvbmVdKGV2ZW50KSB7XG4gICAgY29uc3QgZHJvcHBhYmxlUmV0dXJuZWRFdmVudCA9IG5ldyBEcm9wcGFibGVFdmVudC5Ecm9wcGFibGVSZXR1cm5lZEV2ZW50KHtcbiAgICAgIGRyYWdFdmVudDogZXZlbnQsXG4gICAgICBkcm9wem9uZTogdGhpcy5sYXN0RHJvcHpvbmVcbiAgICB9KTtcbiAgICB0aGlzLnRyaWdnZXIoZHJvcHBhYmxlUmV0dXJuZWRFdmVudCk7XG4gICAgaWYgKGRyb3BwYWJsZVJldHVybmVkRXZlbnQuY2FuY2VsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmluaXRpYWxEcm9wem9uZS5hcHBlbmRDaGlsZChldmVudC5zb3VyY2UpO1xuICAgIHRoaXMubGFzdERyb3B6b25lLmNsYXNzTGlzdC5yZW1vdmUoLi4udGhpcy5nZXRDbGFzc05hbWVzRm9yKCdkcm9wcGFibGU6b2NjdXBpZWQnKSk7XG4gIH1cblxuICBbY2xvc2VzdERyb3B6b25lXSh0YXJnZXQpIHtcbiAgICBpZiAoIXRoaXMuZHJvcHpvbmVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNsb3Nlc3QuZGVmYXVsdCh0YXJnZXQsIHRoaXMuZHJvcHpvbmVzKTtcbiAgfVxuXG4gIFtnZXREcm9wem9uZXNdKCkge1xuICAgIGNvbnN0IGRyb3B6b25lID0gdGhpcy5vcHRpb25zLmRyb3B6b25lO1xuICAgIGlmICh0eXBlb2YgZHJvcHpvbmUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChkcm9wem9uZSk7XG4gICAgfSBlbHNlIGlmIChkcm9wem9uZSBpbnN0YW5jZW9mIE5vZGVMaXN0IHx8IGRyb3B6b25lIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHJldHVybiBkcm9wem9uZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkcm9wem9uZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGRyb3B6b25lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gRHJvcHBhYmxlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQWJzdHJhY3RFdmVudCA9IHJlcXVpcmUoJy4uLy4uL3NoYXJlZC9BYnN0cmFjdEV2ZW50L0Fic3RyYWN0RXZlbnQuY2pzJyk7XG5cbmNsYXNzIERyb3BwYWJsZUV2ZW50IGV4dGVuZHMgQWJzdHJhY3RFdmVudC5BYnN0cmFjdEV2ZW50IHtcblxuICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgfVxuXG4gIGdldCBkcmFnRXZlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5kcmFnRXZlbnQ7XG4gIH1cbn1cbkRyb3BwYWJsZUV2ZW50LnR5cGUgPSAnZHJvcHBhYmxlJztcblxuY2xhc3MgRHJvcHBhYmxlU3RhcnRFdmVudCBleHRlbmRzIERyb3BwYWJsZUV2ZW50IHtcblxuICBnZXQgZHJvcHpvbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5kcm9wem9uZTtcbiAgfVxufVxuRHJvcHBhYmxlU3RhcnRFdmVudC50eXBlID0gJ2Ryb3BwYWJsZTpzdGFydCc7XG5Ecm9wcGFibGVTdGFydEV2ZW50LmNhbmNlbGFibGUgPSB0cnVlO1xuXG5jbGFzcyBEcm9wcGFibGVEcm9wcGVkRXZlbnQgZXh0ZW5kcyBEcm9wcGFibGVFdmVudCB7XG5cbiAgZ2V0IGRyb3B6b25lKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuZHJvcHpvbmU7XG4gIH1cbn1cbkRyb3BwYWJsZURyb3BwZWRFdmVudC50eXBlID0gJ2Ryb3BwYWJsZTpkcm9wcGVkJztcbkRyb3BwYWJsZURyb3BwZWRFdmVudC5jYW5jZWxhYmxlID0gdHJ1ZTtcblxuY2xhc3MgRHJvcHBhYmxlUmV0dXJuZWRFdmVudCBleHRlbmRzIERyb3BwYWJsZUV2ZW50IHtcblxuICBnZXQgZHJvcHpvbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5kcm9wem9uZTtcbiAgfVxufVxuRHJvcHBhYmxlUmV0dXJuZWRFdmVudC50eXBlID0gJ2Ryb3BwYWJsZTpyZXR1cm5lZCc7XG5Ecm9wcGFibGVSZXR1cm5lZEV2ZW50LmNhbmNlbGFibGUgPSB0cnVlO1xuXG5jbGFzcyBEcm9wcGFibGVTdG9wRXZlbnQgZXh0ZW5kcyBEcm9wcGFibGVFdmVudCB7XG5cbiAgZ2V0IGRyb3B6b25lKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuZHJvcHpvbmU7XG4gIH1cbn1cbkRyb3BwYWJsZVN0b3BFdmVudC50eXBlID0gJ2Ryb3BwYWJsZTpzdG9wJztcbkRyb3BwYWJsZVN0b3BFdmVudC5jYW5jZWxhYmxlID0gdHJ1ZTtcblxuZXhwb3J0cy5Ecm9wcGFibGVEcm9wcGVkRXZlbnQgPSBEcm9wcGFibGVEcm9wcGVkRXZlbnQ7XG5leHBvcnRzLkRyb3BwYWJsZUV2ZW50ID0gRHJvcHBhYmxlRXZlbnQ7XG5leHBvcnRzLkRyb3BwYWJsZVJldHVybmVkRXZlbnQgPSBEcm9wcGFibGVSZXR1cm5lZEV2ZW50O1xuZXhwb3J0cy5Ecm9wcGFibGVTdGFydEV2ZW50ID0gRHJvcHBhYmxlU3RhcnRFdmVudDtcbmV4cG9ydHMuRHJvcHBhYmxlU3RvcEV2ZW50ID0gRHJvcHBhYmxlU3RvcEV2ZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgQWJzdHJhY3RQbHVnaW4gPSByZXF1aXJlKCcuLi8uLi9zaGFyZWQvQWJzdHJhY3RQbHVnaW4vQWJzdHJhY3RQbHVnaW4uY2pzJyk7XG52YXIgY2xvc2VzdCA9IHJlcXVpcmUoJy4uLy4uL3NoYXJlZC91dGlscy9jbG9zZXN0L2Nsb3Nlc3QuY2pzJyk7XG52YXIgQ29sbGlkYWJsZUV2ZW50ID0gcmVxdWlyZSgnLi9Db2xsaWRhYmxlRXZlbnQvQ29sbGlkYWJsZUV2ZW50LmNqcycpO1xuXG5jb25zdCBvbkRyYWdNb3ZlID0gU3ltYm9sKCdvbkRyYWdNb3ZlJyk7XG5jb25zdCBvbkRyYWdTdG9wID0gU3ltYm9sKCdvbkRyYWdTdG9wJyk7XG5jb25zdCBvblJlcXVlc3RBbmltYXRpb25GcmFtZSA9IFN5bWJvbCgnb25SZXF1ZXN0QW5pbWF0aW9uRnJhbWUnKTtcblxuY2xhc3MgQ29sbGlkYWJsZSBleHRlbmRzIEFic3RyYWN0UGx1Z2luLkFic3RyYWN0UGx1Z2luIHtcblxuICBjb25zdHJ1Y3RvcihkcmFnZ2FibGUpIHtcbiAgICBzdXBlcihkcmFnZ2FibGUpO1xuXG4gICAgdGhpcy5jdXJyZW50bHlDb2xsaWRpbmdFbGVtZW50ID0gbnVsbDtcblxuICAgIHRoaXMubGFzdENvbGxpZGluZ0VsZW1lbnQgPSBudWxsO1xuXG4gICAgdGhpcy5jdXJyZW50QW5pbWF0aW9uRnJhbWUgPSBudWxsO1xuICAgIHRoaXNbb25EcmFnTW92ZV0gPSB0aGlzW29uRHJhZ01vdmVdLmJpbmQodGhpcyk7XG4gICAgdGhpc1tvbkRyYWdTdG9wXSA9IHRoaXNbb25EcmFnU3RvcF0uYmluZCh0aGlzKTtcbiAgICB0aGlzW29uUmVxdWVzdEFuaW1hdGlvbkZyYW1lXSA9IHRoaXNbb25SZXF1ZXN0QW5pbWF0aW9uRnJhbWVdLmJpbmQodGhpcyk7XG4gIH1cblxuICBhdHRhY2goKSB7XG4gICAgdGhpcy5kcmFnZ2FibGUub24oJ2RyYWc6bW92ZScsIHRoaXNbb25EcmFnTW92ZV0pLm9uKCdkcmFnOnN0b3AnLCB0aGlzW29uRHJhZ1N0b3BdKTtcbiAgfVxuXG4gIGRldGFjaCgpIHtcbiAgICB0aGlzLmRyYWdnYWJsZS5vZmYoJ2RyYWc6bW92ZScsIHRoaXNbb25EcmFnTW92ZV0pLm9mZignZHJhZzpzdG9wJywgdGhpc1tvbkRyYWdTdG9wXSk7XG4gIH1cblxuICBnZXRDb2xsaWRhYmxlcygpIHtcbiAgICBjb25zdCBjb2xsaWRhYmxlcyA9IHRoaXMuZHJhZ2dhYmxlLm9wdGlvbnMuY29sbGlkYWJsZXM7XG4gICAgaWYgKHR5cGVvZiBjb2xsaWRhYmxlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGNvbGxpZGFibGVzKSk7XG4gICAgfSBlbHNlIGlmIChjb2xsaWRhYmxlcyBpbnN0YW5jZW9mIE5vZGVMaXN0IHx8IGNvbGxpZGFibGVzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjb2xsaWRhYmxlcyk7XG4gICAgfSBlbHNlIGlmIChjb2xsaWRhYmxlcyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICByZXR1cm4gW2NvbGxpZGFibGVzXTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb2xsaWRhYmxlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGNvbGxpZGFibGVzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBbb25EcmFnTW92ZV0oZXZlbnQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC5zZW5zb3JFdmVudC50YXJnZXQ7XG4gICAgdGhpcy5jdXJyZW50QW5pbWF0aW9uRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpc1tvblJlcXVlc3RBbmltYXRpb25GcmFtZV0odGFyZ2V0KSk7XG4gICAgaWYgKHRoaXMuY3VycmVudGx5Q29sbGlkaW5nRWxlbWVudCkge1xuICAgICAgZXZlbnQuY2FuY2VsKCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbGxpZGFibGVJbkV2ZW50ID0gbmV3IENvbGxpZGFibGVFdmVudC5Db2xsaWRhYmxlSW5FdmVudCh7XG4gICAgICBkcmFnRXZlbnQ6IGV2ZW50LFxuICAgICAgY29sbGlkaW5nRWxlbWVudDogdGhpcy5jdXJyZW50bHlDb2xsaWRpbmdFbGVtZW50XG4gICAgfSk7XG4gICAgY29uc3QgY29sbGlkYWJsZU91dEV2ZW50ID0gbmV3IENvbGxpZGFibGVFdmVudC5Db2xsaWRhYmxlT3V0RXZlbnQoe1xuICAgICAgZHJhZ0V2ZW50OiBldmVudCxcbiAgICAgIGNvbGxpZGluZ0VsZW1lbnQ6IHRoaXMubGFzdENvbGxpZGluZ0VsZW1lbnRcbiAgICB9KTtcbiAgICBjb25zdCBlbnRlcmluZ0NvbGxpZGFibGUgPSBCb29sZWFuKHRoaXMuY3VycmVudGx5Q29sbGlkaW5nRWxlbWVudCAmJiB0aGlzLmxhc3RDb2xsaWRpbmdFbGVtZW50ICE9PSB0aGlzLmN1cnJlbnRseUNvbGxpZGluZ0VsZW1lbnQpO1xuICAgIGNvbnN0IGxlYXZpbmdDb2xsaWRhYmxlID0gQm9vbGVhbighdGhpcy5jdXJyZW50bHlDb2xsaWRpbmdFbGVtZW50ICYmIHRoaXMubGFzdENvbGxpZGluZ0VsZW1lbnQpO1xuICAgIGlmIChlbnRlcmluZ0NvbGxpZGFibGUpIHtcbiAgICAgIGlmICh0aGlzLmxhc3RDb2xsaWRpbmdFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlLnRyaWdnZXIoY29sbGlkYWJsZU91dEV2ZW50KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZHJhZ2dhYmxlLnRyaWdnZXIoY29sbGlkYWJsZUluRXZlbnQpO1xuICAgIH0gZWxzZSBpZiAobGVhdmluZ0NvbGxpZGFibGUpIHtcbiAgICAgIHRoaXMuZHJhZ2dhYmxlLnRyaWdnZXIoY29sbGlkYWJsZU91dEV2ZW50KTtcbiAgICB9XG4gICAgdGhpcy5sYXN0Q29sbGlkaW5nRWxlbWVudCA9IHRoaXMuY3VycmVudGx5Q29sbGlkaW5nRWxlbWVudDtcbiAgfVxuXG4gIFtvbkRyYWdTdG9wXShldmVudCkge1xuICAgIGNvbnN0IGxhc3RDb2xsaWRpbmdFbGVtZW50ID0gdGhpcy5jdXJyZW50bHlDb2xsaWRpbmdFbGVtZW50IHx8IHRoaXMubGFzdENvbGxpZGluZ0VsZW1lbnQ7XG4gICAgY29uc3QgY29sbGlkYWJsZU91dEV2ZW50ID0gbmV3IENvbGxpZGFibGVFdmVudC5Db2xsaWRhYmxlT3V0RXZlbnQoe1xuICAgICAgZHJhZ0V2ZW50OiBldmVudCxcbiAgICAgIGNvbGxpZGluZ0VsZW1lbnQ6IGxhc3RDb2xsaWRpbmdFbGVtZW50XG4gICAgfSk7XG4gICAgaWYgKGxhc3RDb2xsaWRpbmdFbGVtZW50KSB7XG4gICAgICB0aGlzLmRyYWdnYWJsZS50cmlnZ2VyKGNvbGxpZGFibGVPdXRFdmVudCk7XG4gICAgfVxuICAgIHRoaXMubGFzdENvbGxpZGluZ0VsZW1lbnQgPSBudWxsO1xuICAgIHRoaXMuY3VycmVudGx5Q29sbGlkaW5nRWxlbWVudCA9IG51bGw7XG4gIH1cblxuICBbb25SZXF1ZXN0QW5pbWF0aW9uRnJhbWVdKHRhcmdldCkge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBjb2xsaWRhYmxlcyA9IHRoaXMuZ2V0Q29sbGlkYWJsZXMoKTtcbiAgICAgIHRoaXMuY3VycmVudGx5Q29sbGlkaW5nRWxlbWVudCA9IGNsb3Nlc3QuZGVmYXVsdCh0YXJnZXQsIGVsZW1lbnQgPT4gY29sbGlkYWJsZXMuaW5jbHVkZXMoZWxlbWVudCkpO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gQ29sbGlkYWJsZTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEFic3RyYWN0RXZlbnQgPSByZXF1aXJlKCcuLi8uLi8uLi9zaGFyZWQvQWJzdHJhY3RFdmVudC9BYnN0cmFjdEV2ZW50LmNqcycpO1xuXG5jbGFzcyBDb2xsaWRhYmxlRXZlbnQgZXh0ZW5kcyBBYnN0cmFjdEV2ZW50LkFic3RyYWN0RXZlbnQge1xuXG4gIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICB9XG5cbiAgZ2V0IGRyYWdFdmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmRyYWdFdmVudDtcbiAgfVxufVxuQ29sbGlkYWJsZUV2ZW50LnR5cGUgPSAnY29sbGlkYWJsZSc7XG5cbmNsYXNzIENvbGxpZGFibGVJbkV2ZW50IGV4dGVuZHMgQ29sbGlkYWJsZUV2ZW50IHtcblxuICBnZXQgY29sbGlkaW5nRWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmNvbGxpZGluZ0VsZW1lbnQ7XG4gIH1cbn1cbkNvbGxpZGFibGVJbkV2ZW50LnR5cGUgPSAnY29sbGlkYWJsZTppbic7XG5cbmNsYXNzIENvbGxpZGFibGVPdXRFdmVudCBleHRlbmRzIENvbGxpZGFibGVFdmVudCB7XG5cbiAgZ2V0IGNvbGxpZGluZ0VsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5jb2xsaWRpbmdFbGVtZW50O1xuICB9XG59XG5Db2xsaWRhYmxlT3V0RXZlbnQudHlwZSA9ICdjb2xsaWRhYmxlOm91dCc7XG5cbmV4cG9ydHMuQ29sbGlkYWJsZUV2ZW50ID0gQ29sbGlkYWJsZUV2ZW50O1xuZXhwb3J0cy5Db2xsaWRhYmxlSW5FdmVudCA9IENvbGxpZGFibGVJbkV2ZW50O1xuZXhwb3J0cy5Db2xsaWRhYmxlT3V0RXZlbnQgPSBDb2xsaWRhYmxlT3V0RXZlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciBfcm9sbHVwUGx1Z2luQmFiZWxIZWxwZXJzID0gcmVxdWlyZSgnLi4vLi4vX3ZpcnR1YWwvX3JvbGx1cFBsdWdpbkJhYmVsSGVscGVycy5janMnKTtcbnZhciBBYnN0cmFjdFBsdWdpbiA9IHJlcXVpcmUoJy4uLy4uL3NoYXJlZC9BYnN0cmFjdFBsdWdpbi9BYnN0cmFjdFBsdWdpbi5janMnKTtcbnZhciBBdXRvQmluZCA9IHJlcXVpcmUoJy4uLy4uL3NoYXJlZC91dGlscy9kZWNvcmF0b3JzL0F1dG9CaW5kLmNqcycpO1xudmFyIHJlcXVlc3ROZXh0QW5pbWF0aW9uRnJhbWUgPSByZXF1aXJlKCcuLi8uLi9zaGFyZWQvdXRpbHMvcmVxdWVzdE5leHRBbmltYXRpb25GcmFtZS9yZXF1ZXN0TmV4dEFuaW1hdGlvbkZyYW1lLmNqcycpO1xudmFyIERyYWdFdmVudCA9IHJlcXVpcmUoJy4uLy4uL0RyYWdnYWJsZS9EcmFnRXZlbnQvRHJhZ0V2ZW50LmNqcycpO1xuXG52YXIgX2luaXRQcm90bywgX2NsYXNzO1xuXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHt9O1xuXG5jbGFzcyBSZXNpemVNaXJyb3IgZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbi5BYnN0cmFjdFBsdWdpbiB7XG5cbiAgY29uc3RydWN0b3IoZHJhZ2dhYmxlKSB7XG4gICAgX2luaXRQcm90byhzdXBlcihkcmFnZ2FibGUpKTtcblxuICAgIHRoaXMubGFzdFdpZHRoID0gMDtcblxuICAgIHRoaXMubGFzdEhlaWdodCA9IDA7XG5cbiAgICB0aGlzLm1pcnJvciA9IG51bGw7XG4gIH1cblxuICBhdHRhY2goKSB7XG4gICAgdGhpcy5kcmFnZ2FibGUub24oJ21pcnJvcjpjcmVhdGVkJywgdGhpcy5vbk1pcnJvckNyZWF0ZWQpLm9uKCdkcmFnOm92ZXInLCB0aGlzLm9uRHJhZ092ZXIpLm9uKCdkcmFnOm92ZXI6Y29udGFpbmVyJywgdGhpcy5vbkRyYWdPdmVyKTtcbiAgfVxuXG4gIGRldGFjaCgpIHtcbiAgICB0aGlzLmRyYWdnYWJsZS5vZmYoJ21pcnJvcjpjcmVhdGVkJywgdGhpcy5vbk1pcnJvckNyZWF0ZWQpLm9mZignbWlycm9yOmRlc3Ryb3knLCB0aGlzLm9uTWlycm9yRGVzdHJveSkub2ZmKCdkcmFnOm92ZXInLCB0aGlzLm9uRHJhZ092ZXIpLm9mZignZHJhZzpvdmVyOmNvbnRhaW5lcicsIHRoaXMub25EcmFnT3Zlcik7XG4gIH1cblxuICBnZXRPcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmRyYWdnYWJsZS5vcHRpb25zLnJlc2l6ZU1pcnJvciB8fCB7fTtcbiAgfVxuXG4gIG9uTWlycm9yQ3JlYXRlZCh7XG4gICAgbWlycm9yXG4gIH0pIHtcbiAgICB0aGlzLm1pcnJvciA9IG1pcnJvcjtcbiAgfVxuXG4gIG9uTWlycm9yRGVzdHJveSgpIHtcbiAgICB0aGlzLm1pcnJvciA9IG51bGw7XG4gIH1cblxuICBvbkRyYWdPdmVyKGRyYWdFdmVudCkge1xuICAgIHRoaXMucmVzaXplKGRyYWdFdmVudCk7XG4gIH1cblxuICByZXNpemUoZHJhZ0V2ZW50KSB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIGxldCBvdmVyID0gbnVsbDtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgb3ZlckNvbnRhaW5lclxuICAgICAgfSA9IGRyYWdFdmVudDtcbiAgICAgIGlmICh0aGlzLm1pcnJvciA9PSBudWxsIHx8IHRoaXMubWlycm9yLnBhcmVudE5vZGUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5taXJyb3IucGFyZW50Tm9kZSAhPT0gb3ZlckNvbnRhaW5lcikge1xuICAgICAgICBvdmVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMubWlycm9yKTtcbiAgICAgIH1cbiAgICAgIGlmIChEcmFnRXZlbnQuaXNEcmFnT3ZlckV2ZW50KGRyYWdFdmVudCkpIHtcbiAgICAgICAgb3ZlciA9IGRyYWdFdmVudC5vdmVyO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3ZlckVsZW1lbnQgPSBvdmVyIHx8IHRoaXMuZHJhZ2dhYmxlLmdldERyYWdnYWJsZUVsZW1lbnRzRm9yQ29udGFpbmVyKG92ZXJDb250YWluZXIpWzBdO1xuICAgICAgaWYgKCFvdmVyRWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXF1ZXN0TmV4dEFuaW1hdGlvbkZyYW1lLmRlZmF1bHQoKCkgPT4ge1xuICAgICAgICBjb25zdCBvdmVyUmVjdCA9IG92ZXJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBpZiAodGhpcy5taXJyb3IgPT0gbnVsbCB8fCB0aGlzLmxhc3RIZWlnaHQgPT09IG92ZXJSZWN0LmhlaWdodCAmJiB0aGlzLmxhc3RXaWR0aCA9PT0gb3ZlclJlY3Qud2lkdGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5taXJyb3Iuc3R5bGUud2lkdGggPSBgJHtvdmVyUmVjdC53aWR0aH1weGA7XG4gICAgICAgIHRoaXMubWlycm9yLnN0eWxlLmhlaWdodCA9IGAke292ZXJSZWN0LmhlaWdodH1weGA7XG4gICAgICAgIHRoaXMubGFzdFdpZHRoID0gb3ZlclJlY3Qud2lkdGg7XG4gICAgICAgIHRoaXMubGFzdEhlaWdodCA9IG92ZXJSZWN0LmhlaWdodDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5fY2xhc3MgPSBSZXNpemVNaXJyb3I7XG5bX2luaXRQcm90b10gPSBfcm9sbHVwUGx1Z2luQmFiZWxIZWxwZXJzLmFwcGx5RGVjczIzMDUoX2NsYXNzLCBbW0F1dG9CaW5kLkF1dG9CaW5kLCAyLCBcIm9uTWlycm9yQ3JlYXRlZFwiXSwgW0F1dG9CaW5kLkF1dG9CaW5kLCAyLCBcIm9uTWlycm9yRGVzdHJveVwiXSwgW0F1dG9CaW5kLkF1dG9CaW5kLCAyLCBcIm9uRHJhZ092ZXJcIl1dLCBbXSwgMCwgdm9pZCAwLCBBYnN0cmFjdFBsdWdpbi5BYnN0cmFjdFBsdWdpbikuZTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gUmVzaXplTWlycm9yO1xuZXhwb3J0cy5kZWZhdWx0T3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgQWJzdHJhY3RQbHVnaW4gPSByZXF1aXJlKCcuLi8uLi9zaGFyZWQvQWJzdHJhY3RQbHVnaW4vQWJzdHJhY3RQbHVnaW4uY2pzJyk7XG52YXIgU25hcHBhYmxlRXZlbnQgPSByZXF1aXJlKCcuL1NuYXBwYWJsZUV2ZW50L1NuYXBwYWJsZUV2ZW50LmNqcycpO1xuXG5jb25zdCBvbkRyYWdTdGFydCA9IFN5bWJvbCgnb25EcmFnU3RhcnQnKTtcbmNvbnN0IG9uRHJhZ1N0b3AgPSBTeW1ib2woJ29uRHJhZ1N0b3AnKTtcbmNvbnN0IG9uRHJhZ092ZXIgPSBTeW1ib2woJ29uRHJhZ092ZXInKTtcbmNvbnN0IG9uRHJhZ091dCA9IFN5bWJvbCgnb25EcmFnT3V0Jyk7XG5jb25zdCBvbk1pcnJvckNyZWF0ZWQgPSBTeW1ib2woJ29uTWlycm9yQ3JlYXRlZCcpO1xuY29uc3Qgb25NaXJyb3JEZXN0cm95ID0gU3ltYm9sKCdvbk1pcnJvckRlc3Ryb3knKTtcblxuY2xhc3MgU25hcHBhYmxlIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4uQWJzdHJhY3RQbHVnaW4ge1xuXG4gIGNvbnN0cnVjdG9yKGRyYWdnYWJsZSkge1xuICAgIHN1cGVyKGRyYWdnYWJsZSk7XG5cbiAgICB0aGlzLmZpcnN0U291cmNlID0gbnVsbDtcblxuICAgIHRoaXMubWlycm9yID0gbnVsbDtcbiAgICB0aGlzW29uRHJhZ1N0YXJ0XSA9IHRoaXNbb25EcmFnU3RhcnRdLmJpbmQodGhpcyk7XG4gICAgdGhpc1tvbkRyYWdTdG9wXSA9IHRoaXNbb25EcmFnU3RvcF0uYmluZCh0aGlzKTtcbiAgICB0aGlzW29uRHJhZ092ZXJdID0gdGhpc1tvbkRyYWdPdmVyXS5iaW5kKHRoaXMpO1xuICAgIHRoaXNbb25EcmFnT3V0XSA9IHRoaXNbb25EcmFnT3V0XS5iaW5kKHRoaXMpO1xuICAgIHRoaXNbb25NaXJyb3JDcmVhdGVkXSA9IHRoaXNbb25NaXJyb3JDcmVhdGVkXS5iaW5kKHRoaXMpO1xuICAgIHRoaXNbb25NaXJyb3JEZXN0cm95XSA9IHRoaXNbb25NaXJyb3JEZXN0cm95XS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgYXR0YWNoKCkge1xuICAgIHRoaXMuZHJhZ2dhYmxlLm9uKCdkcmFnOnN0YXJ0JywgdGhpc1tvbkRyYWdTdGFydF0pLm9uKCdkcmFnOnN0b3AnLCB0aGlzW29uRHJhZ1N0b3BdKS5vbignZHJhZzpvdmVyJywgdGhpc1tvbkRyYWdPdmVyXSkub24oJ2RyYWc6b3V0JywgdGhpc1tvbkRyYWdPdXRdKS5vbignZHJvcHBhYmxlOm92ZXInLCB0aGlzW29uRHJhZ092ZXJdKS5vbignZHJvcHBhYmxlOm91dCcsIHRoaXNbb25EcmFnT3V0XSkub24oJ21pcnJvcjpjcmVhdGVkJywgdGhpc1tvbk1pcnJvckNyZWF0ZWRdKS5vbignbWlycm9yOmRlc3Ryb3knLCB0aGlzW29uTWlycm9yRGVzdHJveV0pO1xuICB9XG5cbiAgZGV0YWNoKCkge1xuICAgIHRoaXMuZHJhZ2dhYmxlLm9mZignZHJhZzpzdGFydCcsIHRoaXNbb25EcmFnU3RhcnRdKS5vZmYoJ2RyYWc6c3RvcCcsIHRoaXNbb25EcmFnU3RvcF0pLm9mZignZHJhZzpvdmVyJywgdGhpc1tvbkRyYWdPdmVyXSkub2ZmKCdkcmFnOm91dCcsIHRoaXNbb25EcmFnT3V0XSkub2ZmKCdkcm9wcGFibGU6b3ZlcicsIHRoaXNbb25EcmFnT3Zlcl0pLm9mZignZHJvcHBhYmxlOm91dCcsIHRoaXNbb25EcmFnT3V0XSkub2ZmKCdtaXJyb3I6Y3JlYXRlZCcsIHRoaXNbb25NaXJyb3JDcmVhdGVkXSkub2ZmKCdtaXJyb3I6ZGVzdHJveScsIHRoaXNbb25NaXJyb3JEZXN0cm95XSk7XG4gIH1cblxuICBbb25EcmFnU3RhcnRdKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmNhbmNlbGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5maXJzdFNvdXJjZSA9IGV2ZW50LnNvdXJjZTtcbiAgfVxuXG4gIFtvbkRyYWdTdG9wXSgpIHtcbiAgICB0aGlzLmZpcnN0U291cmNlID0gbnVsbDtcbiAgfVxuXG4gIFtvbkRyYWdPdmVyXShldmVudCkge1xuICAgIGlmIChldmVudC5jYW5jZWxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50LnNvdXJjZSB8fCBldmVudC5kcmFnRXZlbnQuc291cmNlO1xuICAgIGlmIChzb3VyY2UgPT09IHRoaXMuZmlyc3RTb3VyY2UpIHtcbiAgICAgIHRoaXMuZmlyc3RTb3VyY2UgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzbmFwSW5FdmVudCA9IG5ldyBTbmFwcGFibGVFdmVudC5TbmFwSW5FdmVudCh7XG4gICAgICBkcmFnRXZlbnQ6IGV2ZW50LFxuICAgICAgc25hcHBhYmxlOiBldmVudC5vdmVyIHx8IGV2ZW50LmRyb3BwYWJsZVxuICAgIH0pO1xuICAgIHRoaXMuZHJhZ2dhYmxlLnRyaWdnZXIoc25hcEluRXZlbnQpO1xuICAgIGlmIChzbmFwSW5FdmVudC5jYW5jZWxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm1pcnJvcikge1xuICAgICAgdGhpcy5taXJyb3Iuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gICAgc291cmNlLmNsYXNzTGlzdC5yZW1vdmUoLi4udGhpcy5kcmFnZ2FibGUuZ2V0Q2xhc3NOYW1lc0Zvcignc291cmNlOmRyYWdnaW5nJykpO1xuICAgIHNvdXJjZS5jbGFzc0xpc3QuYWRkKC4uLnRoaXMuZHJhZ2dhYmxlLmdldENsYXNzTmFtZXNGb3IoJ3NvdXJjZTpwbGFjZWQnKSk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHNvdXJjZS5jbGFzc0xpc3QucmVtb3ZlKC4uLnRoaXMuZHJhZ2dhYmxlLmdldENsYXNzTmFtZXNGb3IoJ3NvdXJjZTpwbGFjZWQnKSk7XG4gICAgfSwgdGhpcy5kcmFnZ2FibGUub3B0aW9ucy5wbGFjZWRUaW1lb3V0KTtcbiAgfVxuXG4gIFtvbkRyYWdPdXRdKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmNhbmNlbGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc291cmNlID0gZXZlbnQuc291cmNlIHx8IGV2ZW50LmRyYWdFdmVudC5zb3VyY2U7XG4gICAgY29uc3Qgc25hcE91dEV2ZW50ID0gbmV3IFNuYXBwYWJsZUV2ZW50LlNuYXBPdXRFdmVudCh7XG4gICAgICBkcmFnRXZlbnQ6IGV2ZW50LFxuICAgICAgc25hcHBhYmxlOiBldmVudC5vdmVyIHx8IGV2ZW50LmRyb3BwYWJsZVxuICAgIH0pO1xuICAgIHRoaXMuZHJhZ2dhYmxlLnRyaWdnZXIoc25hcE91dEV2ZW50KTtcbiAgICBpZiAoc25hcE91dEV2ZW50LmNhbmNlbGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubWlycm9yKSB7XG4gICAgICB0aGlzLm1pcnJvci5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgfVxuICAgIHNvdXJjZS5jbGFzc0xpc3QuYWRkKC4uLnRoaXMuZHJhZ2dhYmxlLmdldENsYXNzTmFtZXNGb3IoJ3NvdXJjZTpkcmFnZ2luZycpKTtcbiAgfVxuXG4gIFtvbk1pcnJvckNyZWF0ZWRdKHtcbiAgICBtaXJyb3JcbiAgfSkge1xuICAgIHRoaXMubWlycm9yID0gbWlycm9yO1xuICB9XG5cbiAgW29uTWlycm9yRGVzdHJveV0oKSB7XG4gICAgdGhpcy5taXJyb3IgPSBudWxsO1xuICB9XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFNuYXBwYWJsZTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEFic3RyYWN0RXZlbnQgPSByZXF1aXJlKCcuLi8uLi8uLi9zaGFyZWQvQWJzdHJhY3RFdmVudC9BYnN0cmFjdEV2ZW50LmNqcycpO1xuXG5jbGFzcyBTbmFwRXZlbnQgZXh0ZW5kcyBBYnN0cmFjdEV2ZW50LkFic3RyYWN0RXZlbnQge1xuXG4gIGdldCBkcmFnRXZlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5kcmFnRXZlbnQ7XG4gIH1cblxuICBnZXQgc25hcHBhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuc25hcHBhYmxlO1xuICB9XG59XG5cblNuYXBFdmVudC50eXBlID0gJ3NuYXAnO1xuY2xhc3MgU25hcEluRXZlbnQgZXh0ZW5kcyBTbmFwRXZlbnQge31cblxuU25hcEluRXZlbnQudHlwZSA9ICdzbmFwOmluJztcblNuYXBJbkV2ZW50LmNhbmNlbGFibGUgPSB0cnVlO1xuY2xhc3MgU25hcE91dEV2ZW50IGV4dGVuZHMgU25hcEV2ZW50IHt9XG5TbmFwT3V0RXZlbnQudHlwZSA9ICdzbmFwOm91dCc7XG5TbmFwT3V0RXZlbnQuY2FuY2VsYWJsZSA9IHRydWU7XG5cbmV4cG9ydHMuU25hcEV2ZW50ID0gU25hcEV2ZW50O1xuZXhwb3J0cy5TbmFwSW5FdmVudCA9IFNuYXBJbkV2ZW50O1xuZXhwb3J0cy5TbmFwT3V0RXZlbnQgPSBTbmFwT3V0RXZlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciBBYnN0cmFjdFBsdWdpbiA9IHJlcXVpcmUoJy4uLy4uL3NoYXJlZC9BYnN0cmFjdFBsdWdpbi9BYnN0cmFjdFBsdWdpbi5janMnKTtcblxuY29uc3Qgb25Tb3J0YWJsZVNvcnRlZCA9IFN5bWJvbCgnb25Tb3J0YWJsZVNvcnRlZCcpO1xuY29uc3Qgb25Tb3J0YWJsZVNvcnQgPSBTeW1ib2woJ29uU29ydGFibGVTb3J0Jyk7XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICBkdXJhdGlvbjogMTUwLFxuICBlYXNpbmdGdW5jdGlvbjogJ2Vhc2UtaW4tb3V0J1xufTtcblxuY2xhc3MgU29ydEFuaW1hdGlvbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luLkFic3RyYWN0UGx1Z2luIHtcblxuICBjb25zdHJ1Y3RvcihkcmFnZ2FibGUpIHtcbiAgICBzdXBlcihkcmFnZ2FibGUpO1xuXG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAuLi50aGlzLmdldE9wdGlvbnMoKVxuICAgIH07XG5cbiAgICB0aGlzLmxhc3RBbmltYXRpb25GcmFtZSA9IG51bGw7XG4gICAgdGhpcy5sYXN0RWxlbWVudHMgPSBbXTtcbiAgICB0aGlzW29uU29ydGFibGVTb3J0ZWRdID0gdGhpc1tvblNvcnRhYmxlU29ydGVkXS5iaW5kKHRoaXMpO1xuICAgIHRoaXNbb25Tb3J0YWJsZVNvcnRdID0gdGhpc1tvblNvcnRhYmxlU29ydF0uYmluZCh0aGlzKTtcbiAgfVxuXG4gIGF0dGFjaCgpIHtcbiAgICB0aGlzLmRyYWdnYWJsZS5vbignc29ydGFibGU6c29ydCcsIHRoaXNbb25Tb3J0YWJsZVNvcnRdKTtcbiAgICB0aGlzLmRyYWdnYWJsZS5vbignc29ydGFibGU6c29ydGVkJywgdGhpc1tvblNvcnRhYmxlU29ydGVkXSk7XG4gIH1cblxuICBkZXRhY2goKSB7XG4gICAgdGhpcy5kcmFnZ2FibGUub2ZmKCdzb3J0YWJsZTpzb3J0JywgdGhpc1tvblNvcnRhYmxlU29ydF0pO1xuICAgIHRoaXMuZHJhZ2dhYmxlLm9mZignc29ydGFibGU6c29ydGVkJywgdGhpc1tvblNvcnRhYmxlU29ydGVkXSk7XG4gIH1cblxuICBnZXRPcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmRyYWdnYWJsZS5vcHRpb25zLnNvcnRBbmltYXRpb24gfHwge307XG4gIH1cblxuICBbb25Tb3J0YWJsZVNvcnRdKHtcbiAgICBkcmFnRXZlbnRcbiAgfSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHNvdXJjZUNvbnRhaW5lclxuICAgIH0gPSBkcmFnRXZlbnQ7XG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLmRyYWdnYWJsZS5nZXREcmFnZ2FibGVFbGVtZW50c0ZvckNvbnRhaW5lcihzb3VyY2VDb250YWluZXIpO1xuICAgIHRoaXMubGFzdEVsZW1lbnRzID0gQXJyYXkuZnJvbShlbGVtZW50cykubWFwKGVsID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRvbUVsOiBlbCxcbiAgICAgICAgb2Zmc2V0VG9wOiBlbC5vZmZzZXRUb3AsXG4gICAgICAgIG9mZnNldExlZnQ6IGVsLm9mZnNldExlZnRcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBbb25Tb3J0YWJsZVNvcnRlZF0oe1xuICAgIG9sZEluZGV4LFxuICAgIG5ld0luZGV4XG4gIH0pIHtcbiAgICBpZiAob2xkSW5kZXggPT09IG5ld0luZGV4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVmZmVjdGVkRWxlbWVudHMgPSBbXTtcbiAgICBsZXQgc3RhcnQ7XG4gICAgbGV0IGVuZDtcbiAgICBsZXQgbnVtO1xuICAgIGlmIChvbGRJbmRleCA+IG5ld0luZGV4KSB7XG4gICAgICBzdGFydCA9IG5ld0luZGV4O1xuICAgICAgZW5kID0gb2xkSW5kZXggLSAxO1xuICAgICAgbnVtID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhcnQgPSBvbGRJbmRleCArIDE7XG4gICAgICBlbmQgPSBuZXdJbmRleDtcbiAgICAgIG51bSA9IC0xO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgIGNvbnN0IGZyb20gPSB0aGlzLmxhc3RFbGVtZW50c1tpXTtcbiAgICAgIGNvbnN0IHRvID0gdGhpcy5sYXN0RWxlbWVudHNbaSArIG51bV07XG4gICAgICBlZmZlY3RlZEVsZW1lbnRzLnB1c2goe1xuICAgICAgICBmcm9tLFxuICAgICAgICB0b1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMubGFzdEFuaW1hdGlvbkZyYW1lKTtcblxuICAgIHRoaXMubGFzdEFuaW1hdGlvbkZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIGVmZmVjdGVkRWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IGFuaW1hdGUoZWxlbWVudCwgdGhpcy5vcHRpb25zKSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYW5pbWF0ZSh7XG4gIGZyb20sXG4gIHRvXG59LCB7XG4gIGR1cmF0aW9uLFxuICBlYXNpbmdGdW5jdGlvblxufSkge1xuICBjb25zdCBkb21FbCA9IGZyb20uZG9tRWw7XG4gIGNvbnN0IHggPSBmcm9tLm9mZnNldExlZnQgLSB0by5vZmZzZXRMZWZ0O1xuICBjb25zdCB5ID0gZnJvbS5vZmZzZXRUb3AgLSB0by5vZmZzZXRUb3A7XG4gIGRvbUVsLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gIGRvbUVsLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgke3h9cHgsICR7eX1weCwgMClgO1xuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgIGRvbUVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCByZXNldEVsZW1lbnRPblRyYW5zaXRpb25FbmQpO1xuICAgIGRvbUVsLnN0eWxlLnRyYW5zaXRpb24gPSBgdHJhbnNmb3JtICR7ZHVyYXRpb259bXMgJHtlYXNpbmdGdW5jdGlvbn1gO1xuICAgIGRvbUVsLnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVzZXRFbGVtZW50T25UcmFuc2l0aW9uRW5kKGV2ZW50KSB7XG4gIGV2ZW50LnRhcmdldC5zdHlsZS50cmFuc2l0aW9uID0gJyc7XG4gIGV2ZW50LnRhcmdldC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJyc7XG4gIGV2ZW50LnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgcmVzZXRFbGVtZW50T25UcmFuc2l0aW9uRW5kKTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gU29ydEFuaW1hdGlvbjtcbmV4cG9ydHMuZGVmYXVsdE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucztcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxudmFyIF9yb2xsdXBQbHVnaW5CYWJlbEhlbHBlcnMgPSByZXF1aXJlKCcuLi8uLi9fdmlydHVhbC9fcm9sbHVwUGx1Z2luQmFiZWxIZWxwZXJzLmNqcycpO1xudmFyIEFic3RyYWN0UGx1Z2luID0gcmVxdWlyZSgnLi4vLi4vc2hhcmVkL0Fic3RyYWN0UGx1Z2luL0Fic3RyYWN0UGx1Z2luLmNqcycpO1xudmFyIEF1dG9CaW5kID0gcmVxdWlyZSgnLi4vLi4vc2hhcmVkL3V0aWxzL2RlY29yYXRvcnMvQXV0b0JpbmQuY2pzJyk7XG5cbnZhciBfaW5pdFByb3RvLCBfY2xhc3M7XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICBkdXJhdGlvbjogMTUwLFxuICBlYXNpbmdGdW5jdGlvbjogJ2Vhc2UtaW4tb3V0JyxcbiAgaG9yaXpvbnRhbDogZmFsc2Vcbn07XG5cbmNsYXNzIFN3YXBBbmltYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbi5BYnN0cmFjdFBsdWdpbiB7XG5cbiAgY29uc3RydWN0b3IoZHJhZ2dhYmxlKSB7XG4gICAgX2luaXRQcm90byhzdXBlcihkcmFnZ2FibGUpKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgLi4udGhpcy5nZXRPcHRpb25zKClcbiAgICB9O1xuXG4gICAgdGhpcy5sYXN0QW5pbWF0aW9uRnJhbWUgPSBudWxsO1xuICB9XG5cbiAgYXR0YWNoKCkge1xuICAgIHRoaXMuZHJhZ2dhYmxlLm9uKCdzb3J0YWJsZTpzb3J0ZWQnLCB0aGlzLm9uU29ydGFibGVTb3J0ZWQpO1xuICB9XG5cbiAgZGV0YWNoKCkge1xuICAgIHRoaXMuZHJhZ2dhYmxlLm9mZignc29ydGFibGU6c29ydGVkJywgdGhpcy5vblNvcnRhYmxlU29ydGVkKTtcbiAgfVxuXG4gIGdldE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHJhZ2dhYmxlLm9wdGlvbnMuc3dhcEFuaW1hdGlvbiB8fCB7fTtcbiAgfVxuXG4gIG9uU29ydGFibGVTb3J0ZWQoe1xuICAgIG9sZEluZGV4LFxuICAgIG5ld0luZGV4LFxuICAgIGRyYWdFdmVudFxuICB9KSB7XG4gICAgY29uc3Qge1xuICAgICAgc291cmNlLFxuICAgICAgb3ZlclxuICAgIH0gPSBkcmFnRXZlbnQ7XG4gICAgaWYgKHRoaXMubGFzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmxhc3RBbmltYXRpb25GcmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5sYXN0QW5pbWF0aW9uRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgaWYgKG9sZEluZGV4ID49IG5ld0luZGV4KSB7XG4gICAgICAgIGFuaW1hdGUoc291cmNlLCBvdmVyLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYW5pbWF0ZShvdmVyLCBzb3VyY2UsIHRoaXMub3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuX2NsYXNzID0gU3dhcEFuaW1hdGlvbjtcbltfaW5pdFByb3RvXSA9IF9yb2xsdXBQbHVnaW5CYWJlbEhlbHBlcnMuYXBwbHlEZWNzMjMwNShfY2xhc3MsIFtbQXV0b0JpbmQuQXV0b0JpbmQsIDIsIFwib25Tb3J0YWJsZVNvcnRlZFwiXV0sIFtdLCAwLCB2b2lkIDAsIEFic3RyYWN0UGx1Z2luLkFic3RyYWN0UGx1Z2luKS5lO1xuZnVuY3Rpb24gYW5pbWF0ZShmcm9tLCB0bywge1xuICBkdXJhdGlvbixcbiAgZWFzaW5nRnVuY3Rpb24sXG4gIGhvcml6b250YWxcbn0pIHtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtmcm9tLCB0b10pIHtcbiAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gIH1cbiAgaWYgKGhvcml6b250YWwpIHtcbiAgICBjb25zdCB3aWR0aCA9IGZyb20ub2Zmc2V0V2lkdGg7XG4gICAgZnJvbS5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlM2QoJHt3aWR0aH1weCwgMCwgMClgO1xuICAgIHRvLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgtJHt3aWR0aH1weCwgMCwgMClgO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGhlaWdodCA9IGZyb20ub2Zmc2V0SGVpZ2h0O1xuICAgIGZyb20uc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZTNkKDAsICR7aGVpZ2h0fXB4LCAwKWA7XG4gICAgdG8uc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZTNkKDAsIC0ke2hlaWdodH1weCwgMClgO1xuICB9XG4gIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtmcm9tLCB0b10pIHtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHJlc2V0RWxlbWVudE9uVHJhbnNpdGlvbkVuZCk7XG4gICAgICBlbGVtZW50LnN0eWxlLnRyYW5zaXRpb24gPSBgdHJhbnNmb3JtICR7ZHVyYXRpb259bXMgJHtlYXNpbmdGdW5jdGlvbn1gO1xuICAgICAgZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSAnJztcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXNldEVsZW1lbnRPblRyYW5zaXRpb25FbmQoZXZlbnQpIHtcbiAgaWYgKGV2ZW50LnRhcmdldCA9PSBudWxsIHx8ICFpc0hUTUxFbGVtZW50KGV2ZW50LnRhcmdldCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZXZlbnQudGFyZ2V0LnN0eWxlLnRyYW5zaXRpb24gPSAnJztcbiAgZXZlbnQudGFyZ2V0LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnJztcbiAgZXZlbnQudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCByZXNldEVsZW1lbnRPblRyYW5zaXRpb25FbmQpO1xufVxuZnVuY3Rpb24gaXNIVE1MRWxlbWVudChldmVudFRhcmdldCkge1xuICByZXR1cm4gQm9vbGVhbignc3R5bGUnIGluIGV2ZW50VGFyZ2V0KTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gU3dhcEFuaW1hdGlvbjtcbmV4cG9ydHMuZGVmYXVsdE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucztcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbGxpZGFibGUgPSByZXF1aXJlKCcuL0NvbGxpZGFibGUvQ29sbGlkYWJsZS5janMnKTtcbnJlcXVpcmUoJy4vQ29sbGlkYWJsZS9Db2xsaWRhYmxlRXZlbnQvQ29sbGlkYWJsZUV2ZW50LmNqcycpO1xudmFyIFJlc2l6ZU1pcnJvciA9IHJlcXVpcmUoJy4vUmVzaXplTWlycm9yL1Jlc2l6ZU1pcnJvci5janMnKTtcbnZhciBTbmFwcGFibGUgPSByZXF1aXJlKCcuL1NuYXBwYWJsZS9TbmFwcGFibGUuY2pzJyk7XG5yZXF1aXJlKCcuL1NuYXBwYWJsZS9TbmFwcGFibGVFdmVudC9TbmFwcGFibGVFdmVudC5janMnKTtcbnZhciBTd2FwQW5pbWF0aW9uID0gcmVxdWlyZSgnLi9Td2FwQW5pbWF0aW9uL1N3YXBBbmltYXRpb24uY2pzJyk7XG52YXIgU29ydEFuaW1hdGlvbiA9IHJlcXVpcmUoJy4vU29ydEFuaW1hdGlvbi9Tb3J0QW5pbWF0aW9uLmNqcycpO1xuXG5cblxuZXhwb3J0cy5Db2xsaWRhYmxlID0gQ29sbGlkYWJsZS5kZWZhdWx0O1xuZXhwb3J0cy5SZXNpemVNaXJyb3IgPSBSZXNpemVNaXJyb3IuZGVmYXVsdDtcbmV4cG9ydHMuZGVmYXVsdFJlc2l6ZU1pcnJvck9wdGlvbnMgPSBSZXNpemVNaXJyb3IuZGVmYXVsdE9wdGlvbnM7XG5leHBvcnRzLlNuYXBwYWJsZSA9IFNuYXBwYWJsZS5kZWZhdWx0O1xuZXhwb3J0cy5Td2FwQW5pbWF0aW9uID0gU3dhcEFuaW1hdGlvbi5kZWZhdWx0O1xuZXhwb3J0cy5kZWZhdWx0U3dhcEFuaW1hdGlvbk9wdGlvbnMgPSBTd2FwQW5pbWF0aW9uLmRlZmF1bHRPcHRpb25zO1xuZXhwb3J0cy5Tb3J0QW5pbWF0aW9uID0gU29ydEFuaW1hdGlvbi5kZWZhdWx0O1xuZXhwb3J0cy5kZWZhdWx0U29ydEFuaW1hdGlvbk9wdGlvbnMgPSBTb3J0QW5pbWF0aW9uLmRlZmF1bHRPcHRpb25zO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgRHJhZ2dhYmxlID0gcmVxdWlyZSgnLi4vRHJhZ2dhYmxlL0RyYWdnYWJsZS5janMnKTtcbnJlcXVpcmUoJy4uL0RyYWdnYWJsZS9EcmFnRXZlbnQvRHJhZ0V2ZW50LmNqcycpO1xucmVxdWlyZSgnLi4vRHJhZ2dhYmxlL0RyYWdnYWJsZUV2ZW50L0RyYWdnYWJsZUV2ZW50LmNqcycpO1xucmVxdWlyZSgnLi4vRHJhZ2dhYmxlL1BsdWdpbnMvQW5ub3VuY2VtZW50L0Fubm91bmNlbWVudC5janMnKTtcbnJlcXVpcmUoJy4uL0RyYWdnYWJsZS9QbHVnaW5zL01pcnJvci9NaXJyb3JFdmVudC9NaXJyb3JFdmVudC5janMnKTtcbnJlcXVpcmUoJy4uL0RyYWdnYWJsZS9TZW5zb3JzL1NlbnNvckV2ZW50L1NlbnNvckV2ZW50LmNqcycpO1xucmVxdWlyZSgnLi4vRHJhZ2dhYmxlL1NlbnNvcnMvVG91Y2hTZW5zb3IvVG91Y2hTZW5zb3IuY2pzJyk7XG52YXIgU29ydGFibGVFdmVudCA9IHJlcXVpcmUoJy4vU29ydGFibGVFdmVudC9Tb3J0YWJsZUV2ZW50LmNqcycpO1xuXG5jb25zdCBvbkRyYWdTdGFydCA9IFN5bWJvbCgnb25EcmFnU3RhcnQnKTtcbmNvbnN0IG9uRHJhZ092ZXJDb250YWluZXIgPSBTeW1ib2woJ29uRHJhZ092ZXJDb250YWluZXInKTtcbmNvbnN0IG9uRHJhZ092ZXIgPSBTeW1ib2woJ29uRHJhZ092ZXInKTtcbmNvbnN0IG9uRHJhZ1N0b3AgPSBTeW1ib2woJ29uRHJhZ1N0b3AnKTtcblxuZnVuY3Rpb24gb25Tb3J0YWJsZVNvcnRlZERlZmF1bHRBbm5vdW5jZW1lbnQoe1xuICBkcmFnRXZlbnRcbn0pIHtcbiAgY29uc3Qgc291cmNlVGV4dCA9IGRyYWdFdmVudC5zb3VyY2UudGV4dENvbnRlbnQudHJpbSgpIHx8IGRyYWdFdmVudC5zb3VyY2UuaWQgfHwgJ3NvcnRhYmxlIGVsZW1lbnQnO1xuICBpZiAoZHJhZ0V2ZW50Lm92ZXIpIHtcbiAgICBjb25zdCBvdmVyVGV4dCA9IGRyYWdFdmVudC5vdmVyLnRleHRDb250ZW50LnRyaW0oKSB8fCBkcmFnRXZlbnQub3Zlci5pZCB8fCAnc29ydGFibGUgZWxlbWVudCc7XG4gICAgY29uc3QgaXNGb2xsb3dpbmcgPSBkcmFnRXZlbnQuc291cmNlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGRyYWdFdmVudC5vdmVyKSAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HO1xuICAgIGlmIChpc0ZvbGxvd2luZykge1xuICAgICAgcmV0dXJuIGBQbGFjZWQgJHtzb3VyY2VUZXh0fSBhZnRlciAke292ZXJUZXh0fWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgUGxhY2VkICR7c291cmNlVGV4dH0gYmVmb3JlICR7b3ZlclRleHR9YDtcbiAgICB9XG4gIH0gZWxzZSB7XG5cbiAgICByZXR1cm4gYFBsYWNlZCAke3NvdXJjZVRleHR9IGludG8gYSBkaWZmZXJlbnQgY29udGFpbmVyYDtcbiAgfVxufVxuXG5jb25zdCBkZWZhdWx0QW5ub3VuY2VtZW50cyA9IHtcbiAgJ3NvcnRhYmxlOnNvcnRlZCc6IG9uU29ydGFibGVTb3J0ZWREZWZhdWx0QW5ub3VuY2VtZW50XG59O1xuXG5jbGFzcyBTb3J0YWJsZSBleHRlbmRzIERyYWdnYWJsZS5kZWZhdWx0IHtcblxuICBjb25zdHJ1Y3Rvcihjb250YWluZXJzID0gW10sIG9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGNvbnRhaW5lcnMsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBhbm5vdW5jZW1lbnRzOiB7XG4gICAgICAgIC4uLmRlZmF1bHRBbm5vdW5jZW1lbnRzLFxuICAgICAgICAuLi4ob3B0aW9ucy5hbm5vdW5jZW1lbnRzIHx8IHt9KVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5zdGFydEluZGV4ID0gbnVsbDtcblxuICAgIHRoaXMuc3RhcnRDb250YWluZXIgPSBudWxsO1xuICAgIHRoaXNbb25EcmFnU3RhcnRdID0gdGhpc1tvbkRyYWdTdGFydF0uYmluZCh0aGlzKTtcbiAgICB0aGlzW29uRHJhZ092ZXJDb250YWluZXJdID0gdGhpc1tvbkRyYWdPdmVyQ29udGFpbmVyXS5iaW5kKHRoaXMpO1xuICAgIHRoaXNbb25EcmFnT3Zlcl0gPSB0aGlzW29uRHJhZ092ZXJdLmJpbmQodGhpcyk7XG4gICAgdGhpc1tvbkRyYWdTdG9wXSA9IHRoaXNbb25EcmFnU3RvcF0uYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uKCdkcmFnOnN0YXJ0JywgdGhpc1tvbkRyYWdTdGFydF0pLm9uKCdkcmFnOm92ZXI6Y29udGFpbmVyJywgdGhpc1tvbkRyYWdPdmVyQ29udGFpbmVyXSkub24oJ2RyYWc6b3ZlcicsIHRoaXNbb25EcmFnT3Zlcl0pLm9uKCdkcmFnOnN0b3AnLCB0aGlzW29uRHJhZ1N0b3BdKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMub2ZmKCdkcmFnOnN0YXJ0JywgdGhpc1tvbkRyYWdTdGFydF0pLm9mZignZHJhZzpvdmVyOmNvbnRhaW5lcicsIHRoaXNbb25EcmFnT3ZlckNvbnRhaW5lcl0pLm9mZignZHJhZzpvdmVyJywgdGhpc1tvbkRyYWdPdmVyXSkub2ZmKCdkcmFnOnN0b3AnLCB0aGlzW29uRHJhZ1N0b3BdKTtcbiAgfVxuXG4gIGluZGV4KGVsZW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTb3J0YWJsZUVsZW1lbnRzRm9yQ29udGFpbmVyKGVsZW1lbnQucGFyZW50Tm9kZSkuaW5kZXhPZihlbGVtZW50KTtcbiAgfVxuXG4gIGdldFNvcnRhYmxlRWxlbWVudHNGb3JDb250YWluZXIoY29udGFpbmVyKSB7XG4gICAgY29uc3QgYWxsU29ydGFibGVFbGVtZW50cyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKHRoaXMub3B0aW9ucy5kcmFnZ2FibGUpO1xuICAgIHJldHVybiBbLi4uYWxsU29ydGFibGVFbGVtZW50c10uZmlsdGVyKGNoaWxkRWxlbWVudCA9PiB7XG4gICAgICByZXR1cm4gY2hpbGRFbGVtZW50ICE9PSB0aGlzLm9yaWdpbmFsU291cmNlICYmIGNoaWxkRWxlbWVudCAhPT0gdGhpcy5taXJyb3IgJiYgY2hpbGRFbGVtZW50LnBhcmVudE5vZGUgPT09IGNvbnRhaW5lcjtcbiAgICB9KTtcbiAgfVxuXG4gIFtvbkRyYWdTdGFydF0oZXZlbnQpIHtcbiAgICB0aGlzLnN0YXJ0Q29udGFpbmVyID0gZXZlbnQuc291cmNlLnBhcmVudE5vZGU7XG4gICAgdGhpcy5zdGFydEluZGV4ID0gdGhpcy5pbmRleChldmVudC5zb3VyY2UpO1xuICAgIGNvbnN0IHNvcnRhYmxlU3RhcnRFdmVudCA9IG5ldyBTb3J0YWJsZUV2ZW50LlNvcnRhYmxlU3RhcnRFdmVudCh7XG4gICAgICBkcmFnRXZlbnQ6IGV2ZW50LFxuICAgICAgc3RhcnRJbmRleDogdGhpcy5zdGFydEluZGV4LFxuICAgICAgc3RhcnRDb250YWluZXI6IHRoaXMuc3RhcnRDb250YWluZXJcbiAgICB9KTtcbiAgICB0aGlzLnRyaWdnZXIoc29ydGFibGVTdGFydEV2ZW50KTtcbiAgICBpZiAoc29ydGFibGVTdGFydEV2ZW50LmNhbmNlbGVkKCkpIHtcbiAgICAgIGV2ZW50LmNhbmNlbCgpO1xuICAgIH1cbiAgfVxuXG4gIFtvbkRyYWdPdmVyQ29udGFpbmVyXShldmVudCkge1xuICAgIGlmIChldmVudC5jYW5jZWxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHNvdXJjZSxcbiAgICAgIG92ZXIsXG4gICAgICBvdmVyQ29udGFpbmVyXG4gICAgfSA9IGV2ZW50O1xuICAgIGNvbnN0IG9sZEluZGV4ID0gdGhpcy5pbmRleChzb3VyY2UpO1xuICAgIGNvbnN0IHNvcnRhYmxlU29ydEV2ZW50ID0gbmV3IFNvcnRhYmxlRXZlbnQuU29ydGFibGVTb3J0RXZlbnQoe1xuICAgICAgZHJhZ0V2ZW50OiBldmVudCxcbiAgICAgIGN1cnJlbnRJbmRleDogb2xkSW5kZXgsXG4gICAgICBzb3VyY2UsXG4gICAgICBvdmVyXG4gICAgfSk7XG4gICAgdGhpcy50cmlnZ2VyKHNvcnRhYmxlU29ydEV2ZW50KTtcbiAgICBpZiAoc29ydGFibGVTb3J0RXZlbnQuY2FuY2VsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0U29ydGFibGVFbGVtZW50c0ZvckNvbnRhaW5lcihvdmVyQ29udGFpbmVyKTtcbiAgICBjb25zdCBtb3ZlcyA9IG1vdmUoe1xuICAgICAgc291cmNlLFxuICAgICAgb3ZlcixcbiAgICAgIG92ZXJDb250YWluZXIsXG4gICAgICBjaGlsZHJlblxuICAgIH0pO1xuICAgIGlmICghbW92ZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgb2xkQ29udGFpbmVyLFxuICAgICAgbmV3Q29udGFpbmVyXG4gICAgfSA9IG1vdmVzO1xuICAgIGNvbnN0IG5ld0luZGV4ID0gdGhpcy5pbmRleChldmVudC5zb3VyY2UpO1xuICAgIGNvbnN0IHNvcnRhYmxlU29ydGVkRXZlbnQgPSBuZXcgU29ydGFibGVFdmVudC5Tb3J0YWJsZVNvcnRlZEV2ZW50KHtcbiAgICAgIGRyYWdFdmVudDogZXZlbnQsXG4gICAgICBvbGRJbmRleCxcbiAgICAgIG5ld0luZGV4LFxuICAgICAgb2xkQ29udGFpbmVyLFxuICAgICAgbmV3Q29udGFpbmVyXG4gICAgfSk7XG4gICAgdGhpcy50cmlnZ2VyKHNvcnRhYmxlU29ydGVkRXZlbnQpO1xuICB9XG5cbiAgW29uRHJhZ092ZXJdKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50Lm92ZXIgPT09IGV2ZW50Lm9yaWdpbmFsU291cmNlIHx8IGV2ZW50Lm92ZXIgPT09IGV2ZW50LnNvdXJjZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBzb3VyY2UsXG4gICAgICBvdmVyLFxuICAgICAgb3ZlckNvbnRhaW5lclxuICAgIH0gPSBldmVudDtcbiAgICBjb25zdCBvbGRJbmRleCA9IHRoaXMuaW5kZXgoc291cmNlKTtcbiAgICBjb25zdCBzb3J0YWJsZVNvcnRFdmVudCA9IG5ldyBTb3J0YWJsZUV2ZW50LlNvcnRhYmxlU29ydEV2ZW50KHtcbiAgICAgIGRyYWdFdmVudDogZXZlbnQsXG4gICAgICBjdXJyZW50SW5kZXg6IG9sZEluZGV4LFxuICAgICAgc291cmNlLFxuICAgICAgb3ZlclxuICAgIH0pO1xuICAgIHRoaXMudHJpZ2dlcihzb3J0YWJsZVNvcnRFdmVudCk7XG4gICAgaWYgKHNvcnRhYmxlU29ydEV2ZW50LmNhbmNlbGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmdldERyYWdnYWJsZUVsZW1lbnRzRm9yQ29udGFpbmVyKG92ZXJDb250YWluZXIpO1xuICAgIGNvbnN0IG1vdmVzID0gbW92ZSh7XG4gICAgICBzb3VyY2UsXG4gICAgICBvdmVyLFxuICAgICAgb3ZlckNvbnRhaW5lcixcbiAgICAgIGNoaWxkcmVuXG4gICAgfSk7XG4gICAgaWYgKCFtb3Zlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBvbGRDb250YWluZXIsXG4gICAgICBuZXdDb250YWluZXJcbiAgICB9ID0gbW92ZXM7XG4gICAgY29uc3QgbmV3SW5kZXggPSB0aGlzLmluZGV4KHNvdXJjZSk7XG4gICAgY29uc3Qgc29ydGFibGVTb3J0ZWRFdmVudCA9IG5ldyBTb3J0YWJsZUV2ZW50LlNvcnRhYmxlU29ydGVkRXZlbnQoe1xuICAgICAgZHJhZ0V2ZW50OiBldmVudCxcbiAgICAgIG9sZEluZGV4LFxuICAgICAgbmV3SW5kZXgsXG4gICAgICBvbGRDb250YWluZXIsXG4gICAgICBuZXdDb250YWluZXJcbiAgICB9KTtcbiAgICB0aGlzLnRyaWdnZXIoc29ydGFibGVTb3J0ZWRFdmVudCk7XG4gIH1cblxuICBbb25EcmFnU3RvcF0oZXZlbnQpIHtcbiAgICBjb25zdCBzb3J0YWJsZVN0b3BFdmVudCA9IG5ldyBTb3J0YWJsZUV2ZW50LlNvcnRhYmxlU3RvcEV2ZW50KHtcbiAgICAgIGRyYWdFdmVudDogZXZlbnQsXG4gICAgICBvbGRJbmRleDogdGhpcy5zdGFydEluZGV4LFxuICAgICAgbmV3SW5kZXg6IHRoaXMuaW5kZXgoZXZlbnQuc291cmNlKSxcbiAgICAgIG9sZENvbnRhaW5lcjogdGhpcy5zdGFydENvbnRhaW5lcixcbiAgICAgIG5ld0NvbnRhaW5lcjogZXZlbnQuc291cmNlLnBhcmVudE5vZGVcbiAgICB9KTtcbiAgICB0aGlzLnRyaWdnZXIoc29ydGFibGVTdG9wRXZlbnQpO1xuICAgIHRoaXMuc3RhcnRJbmRleCA9IG51bGw7XG4gICAgdGhpcy5zdGFydENvbnRhaW5lciA9IG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIGluZGV4KGVsZW1lbnQpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZWxlbWVudC5wYXJlbnROb2RlLmNoaWxkcmVuLCBlbGVtZW50KTtcbn1cbmZ1bmN0aW9uIG1vdmUoe1xuICBzb3VyY2UsXG4gIG92ZXIsXG4gIG92ZXJDb250YWluZXIsXG4gIGNoaWxkcmVuXG59KSB7XG4gIGNvbnN0IGVtcHR5T3ZlckNvbnRhaW5lciA9ICFjaGlsZHJlbi5sZW5ndGg7XG4gIGNvbnN0IGRpZmZlcmVudENvbnRhaW5lciA9IHNvdXJjZS5wYXJlbnROb2RlICE9PSBvdmVyQ29udGFpbmVyO1xuICBjb25zdCBzYW1lQ29udGFpbmVyID0gb3ZlciAmJiBzb3VyY2UucGFyZW50Tm9kZSA9PT0gb3Zlci5wYXJlbnROb2RlO1xuICBpZiAoZW1wdHlPdmVyQ29udGFpbmVyKSB7XG4gICAgcmV0dXJuIG1vdmVJbnNpZGVFbXB0eUNvbnRhaW5lcihzb3VyY2UsIG92ZXJDb250YWluZXIpO1xuICB9IGVsc2UgaWYgKHNhbWVDb250YWluZXIpIHtcbiAgICByZXR1cm4gbW92ZVdpdGhpbkNvbnRhaW5lcihzb3VyY2UsIG92ZXIpO1xuICB9IGVsc2UgaWYgKGRpZmZlcmVudENvbnRhaW5lcikge1xuICAgIHJldHVybiBtb3ZlT3V0c2lkZUNvbnRhaW5lcihzb3VyY2UsIG92ZXIsIG92ZXJDb250YWluZXIpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5mdW5jdGlvbiBtb3ZlSW5zaWRlRW1wdHlDb250YWluZXIoc291cmNlLCBvdmVyQ29udGFpbmVyKSB7XG4gIGNvbnN0IG9sZENvbnRhaW5lciA9IHNvdXJjZS5wYXJlbnROb2RlO1xuICBvdmVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHNvdXJjZSk7XG4gIHJldHVybiB7XG4gICAgb2xkQ29udGFpbmVyLFxuICAgIG5ld0NvbnRhaW5lcjogb3ZlckNvbnRhaW5lclxuICB9O1xufVxuZnVuY3Rpb24gbW92ZVdpdGhpbkNvbnRhaW5lcihzb3VyY2UsIG92ZXIpIHtcbiAgY29uc3Qgb2xkSW5kZXggPSBpbmRleChzb3VyY2UpO1xuICBjb25zdCBuZXdJbmRleCA9IGluZGV4KG92ZXIpO1xuICBpZiAob2xkSW5kZXggPCBuZXdJbmRleCkge1xuICAgIHNvdXJjZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzb3VyY2UsIG92ZXIubmV4dEVsZW1lbnRTaWJsaW5nKTtcbiAgfSBlbHNlIHtcbiAgICBzb3VyY2UucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc291cmNlLCBvdmVyKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG9sZENvbnRhaW5lcjogc291cmNlLnBhcmVudE5vZGUsXG4gICAgbmV3Q29udGFpbmVyOiBzb3VyY2UucGFyZW50Tm9kZVxuICB9O1xufVxuZnVuY3Rpb24gbW92ZU91dHNpZGVDb250YWluZXIoc291cmNlLCBvdmVyLCBvdmVyQ29udGFpbmVyKSB7XG4gIGNvbnN0IG9sZENvbnRhaW5lciA9IHNvdXJjZS5wYXJlbnROb2RlO1xuICBpZiAob3Zlcikge1xuICAgIG92ZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc291cmNlLCBvdmVyKTtcbiAgfSBlbHNlIHtcblxuICAgIG92ZXJDb250YWluZXIuYXBwZW5kQ2hpbGQoc291cmNlKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG9sZENvbnRhaW5lcixcbiAgICBuZXdDb250YWluZXI6IHNvdXJjZS5wYXJlbnROb2RlXG4gIH07XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFNvcnRhYmxlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQWJzdHJhY3RFdmVudCA9IHJlcXVpcmUoJy4uLy4uL3NoYXJlZC9BYnN0cmFjdEV2ZW50L0Fic3RyYWN0RXZlbnQuY2pzJyk7XG5cbmNsYXNzIFNvcnRhYmxlRXZlbnQgZXh0ZW5kcyBBYnN0cmFjdEV2ZW50LkFic3RyYWN0RXZlbnQge1xuXG4gIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICB9XG5cbiAgZ2V0IGRyYWdFdmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmRyYWdFdmVudDtcbiAgfVxufVxuU29ydGFibGVFdmVudC50eXBlID0gJ3NvcnRhYmxlJztcblxuY2xhc3MgU29ydGFibGVTdGFydEV2ZW50IGV4dGVuZHMgU29ydGFibGVFdmVudCB7XG5cbiAgZ2V0IHN0YXJ0SW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5zdGFydEluZGV4O1xuICB9XG5cbiAgZ2V0IHN0YXJ0Q29udGFpbmVyKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuc3RhcnRDb250YWluZXI7XG4gIH1cbn1cblNvcnRhYmxlU3RhcnRFdmVudC50eXBlID0gJ3NvcnRhYmxlOnN0YXJ0JztcblNvcnRhYmxlU3RhcnRFdmVudC5jYW5jZWxhYmxlID0gdHJ1ZTtcblxuY2xhc3MgU29ydGFibGVTb3J0RXZlbnQgZXh0ZW5kcyBTb3J0YWJsZUV2ZW50IHtcblxuICBnZXQgY3VycmVudEluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuY3VycmVudEluZGV4O1xuICB9XG5cbiAgZ2V0IG92ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5vdmVyO1xuICB9XG5cbiAgZ2V0IG92ZXJDb250YWluZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5kcmFnRXZlbnQub3ZlckNvbnRhaW5lcjtcbiAgfVxufVxuU29ydGFibGVTb3J0RXZlbnQudHlwZSA9ICdzb3J0YWJsZTpzb3J0JztcblNvcnRhYmxlU29ydEV2ZW50LmNhbmNlbGFibGUgPSB0cnVlO1xuXG5jbGFzcyBTb3J0YWJsZVNvcnRlZEV2ZW50IGV4dGVuZHMgU29ydGFibGVFdmVudCB7XG5cbiAgZ2V0IG9sZEluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEub2xkSW5kZXg7XG4gIH1cblxuICBnZXQgbmV3SW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5uZXdJbmRleDtcbiAgfVxuXG4gIGdldCBvbGRDb250YWluZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5vbGRDb250YWluZXI7XG4gIH1cblxuICBnZXQgbmV3Q29udGFpbmVyKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEubmV3Q29udGFpbmVyO1xuICB9XG59XG5Tb3J0YWJsZVNvcnRlZEV2ZW50LnR5cGUgPSAnc29ydGFibGU6c29ydGVkJztcblxuY2xhc3MgU29ydGFibGVTdG9wRXZlbnQgZXh0ZW5kcyBTb3J0YWJsZUV2ZW50IHtcblxuICBnZXQgb2xkSW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5vbGRJbmRleDtcbiAgfVxuXG4gIGdldCBuZXdJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLm5ld0luZGV4O1xuICB9XG5cbiAgZ2V0IG9sZENvbnRhaW5lcigpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLm9sZENvbnRhaW5lcjtcbiAgfVxuXG4gIGdldCBuZXdDb250YWluZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5uZXdDb250YWluZXI7XG4gIH1cbn1cblNvcnRhYmxlU3RvcEV2ZW50LnR5cGUgPSAnc29ydGFibGU6c3RvcCc7XG5cbmV4cG9ydHMuU29ydGFibGVFdmVudCA9IFNvcnRhYmxlRXZlbnQ7XG5leHBvcnRzLlNvcnRhYmxlU29ydEV2ZW50ID0gU29ydGFibGVTb3J0RXZlbnQ7XG5leHBvcnRzLlNvcnRhYmxlU29ydGVkRXZlbnQgPSBTb3J0YWJsZVNvcnRlZEV2ZW50O1xuZXhwb3J0cy5Tb3J0YWJsZVN0YXJ0RXZlbnQgPSBTb3J0YWJsZVN0YXJ0RXZlbnQ7XG5leHBvcnRzLlNvcnRhYmxlU3RvcEV2ZW50ID0gU29ydGFibGVTdG9wRXZlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciBEcmFnZ2FibGUgPSByZXF1aXJlKCcuLi9EcmFnZ2FibGUvRHJhZ2dhYmxlLmNqcycpO1xucmVxdWlyZSgnLi4vRHJhZ2dhYmxlL0RyYWdFdmVudC9EcmFnRXZlbnQuY2pzJyk7XG5yZXF1aXJlKCcuLi9EcmFnZ2FibGUvRHJhZ2dhYmxlRXZlbnQvRHJhZ2dhYmxlRXZlbnQuY2pzJyk7XG5yZXF1aXJlKCcuLi9EcmFnZ2FibGUvUGx1Z2lucy9Bbm5vdW5jZW1lbnQvQW5ub3VuY2VtZW50LmNqcycpO1xucmVxdWlyZSgnLi4vRHJhZ2dhYmxlL1BsdWdpbnMvTWlycm9yL01pcnJvckV2ZW50L01pcnJvckV2ZW50LmNqcycpO1xucmVxdWlyZSgnLi4vRHJhZ2dhYmxlL1NlbnNvcnMvU2Vuc29yRXZlbnQvU2Vuc29yRXZlbnQuY2pzJyk7XG5yZXF1aXJlKCcuLi9EcmFnZ2FibGUvU2Vuc29ycy9Ub3VjaFNlbnNvci9Ub3VjaFNlbnNvci5janMnKTtcbnZhciBTd2FwcGFibGVFdmVudCA9IHJlcXVpcmUoJy4vU3dhcHBhYmxlRXZlbnQvU3dhcHBhYmxlRXZlbnQuY2pzJyk7XG5cbmNvbnN0IG9uRHJhZ1N0YXJ0ID0gU3ltYm9sKCdvbkRyYWdTdGFydCcpO1xuY29uc3Qgb25EcmFnT3ZlciA9IFN5bWJvbCgnb25EcmFnT3ZlcicpO1xuY29uc3Qgb25EcmFnU3RvcCA9IFN5bWJvbCgnb25EcmFnU3RvcCcpO1xuXG5mdW5jdGlvbiBvblN3YXBwYWJsZVN3YXBwZWREZWZhdWx0QW5ub3VuY2VtZW50KHtcbiAgZHJhZ0V2ZW50LFxuICBzd2FwcGVkRWxlbWVudFxufSkge1xuICBjb25zdCBzb3VyY2VUZXh0ID0gZHJhZ0V2ZW50LnNvdXJjZS50ZXh0Q29udGVudC50cmltKCkgfHwgZHJhZ0V2ZW50LnNvdXJjZS5pZCB8fCAnc3dhcHBhYmxlIGVsZW1lbnQnO1xuICBjb25zdCBvdmVyVGV4dCA9IHN3YXBwZWRFbGVtZW50LnRleHRDb250ZW50LnRyaW0oKSB8fCBzd2FwcGVkRWxlbWVudC5pZCB8fCAnc3dhcHBhYmxlIGVsZW1lbnQnO1xuICByZXR1cm4gYFN3YXBwZWQgJHtzb3VyY2VUZXh0fSB3aXRoICR7b3ZlclRleHR9YDtcbn1cblxuY29uc3QgZGVmYXVsdEFubm91bmNlbWVudHMgPSB7XG4gICdzd2FwcGFibGVkOnN3YXBwZWQnOiBvblN3YXBwYWJsZVN3YXBwZWREZWZhdWx0QW5ub3VuY2VtZW50XG59O1xuXG5jbGFzcyBTd2FwcGFibGUgZXh0ZW5kcyBEcmFnZ2FibGUuZGVmYXVsdCB7XG5cbiAgY29uc3RydWN0b3IoY29udGFpbmVycyA9IFtdLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihjb250YWluZXJzLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgYW5ub3VuY2VtZW50czoge1xuICAgICAgICAuLi5kZWZhdWx0QW5ub3VuY2VtZW50cyxcbiAgICAgICAgLi4uKG9wdGlvbnMuYW5ub3VuY2VtZW50cyB8fCB7fSlcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubGFzdE92ZXIgPSBudWxsO1xuICAgIHRoaXNbb25EcmFnU3RhcnRdID0gdGhpc1tvbkRyYWdTdGFydF0uYmluZCh0aGlzKTtcbiAgICB0aGlzW29uRHJhZ092ZXJdID0gdGhpc1tvbkRyYWdPdmVyXS5iaW5kKHRoaXMpO1xuICAgIHRoaXNbb25EcmFnU3RvcF0gPSB0aGlzW29uRHJhZ1N0b3BdLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbignZHJhZzpzdGFydCcsIHRoaXNbb25EcmFnU3RhcnRdKS5vbignZHJhZzpvdmVyJywgdGhpc1tvbkRyYWdPdmVyXSkub24oJ2RyYWc6c3RvcCcsIHRoaXNbb25EcmFnU3RvcF0pO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5vZmYoJ2RyYWc6c3RhcnQnLCB0aGlzLl9vbkRyYWdTdGFydCkub2ZmKCdkcmFnOm92ZXInLCB0aGlzLl9vbkRyYWdPdmVyKS5vZmYoJ2RyYWc6c3RvcCcsIHRoaXMuX29uRHJhZ1N0b3ApO1xuICB9XG5cbiAgW29uRHJhZ1N0YXJ0XShldmVudCkge1xuICAgIGNvbnN0IHN3YXBwYWJsZVN0YXJ0RXZlbnQgPSBuZXcgU3dhcHBhYmxlRXZlbnQuU3dhcHBhYmxlU3RhcnRFdmVudCh7XG4gICAgICBkcmFnRXZlbnQ6IGV2ZW50XG4gICAgfSk7XG4gICAgdGhpcy50cmlnZ2VyKHN3YXBwYWJsZVN0YXJ0RXZlbnQpO1xuICAgIGlmIChzd2FwcGFibGVTdGFydEV2ZW50LmNhbmNlbGVkKCkpIHtcbiAgICAgIGV2ZW50LmNhbmNlbCgpO1xuICAgIH1cbiAgfVxuXG4gIFtvbkRyYWdPdmVyXShldmVudCkge1xuICAgIGlmIChldmVudC5vdmVyID09PSBldmVudC5vcmlnaW5hbFNvdXJjZSB8fCBldmVudC5vdmVyID09PSBldmVudC5zb3VyY2UgfHwgZXZlbnQuY2FuY2VsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzd2FwcGFibGVTd2FwRXZlbnQgPSBuZXcgU3dhcHBhYmxlRXZlbnQuU3dhcHBhYmxlU3dhcEV2ZW50KHtcbiAgICAgIGRyYWdFdmVudDogZXZlbnQsXG4gICAgICBvdmVyOiBldmVudC5vdmVyLFxuICAgICAgb3ZlckNvbnRhaW5lcjogZXZlbnQub3ZlckNvbnRhaW5lclxuICAgIH0pO1xuICAgIHRoaXMudHJpZ2dlcihzd2FwcGFibGVTd2FwRXZlbnQpO1xuICAgIGlmIChzd2FwcGFibGVTd2FwRXZlbnQuY2FuY2VsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxhc3RPdmVyICYmIHRoaXMubGFzdE92ZXIgIT09IGV2ZW50Lm92ZXIpIHtcbiAgICAgIHN3YXAodGhpcy5sYXN0T3ZlciwgZXZlbnQuc291cmNlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGFzdE92ZXIgPT09IGV2ZW50Lm92ZXIpIHtcbiAgICAgIHRoaXMubGFzdE92ZXIgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxhc3RPdmVyID0gZXZlbnQub3ZlcjtcbiAgICB9XG4gICAgc3dhcChldmVudC5zb3VyY2UsIGV2ZW50Lm92ZXIpO1xuICAgIGNvbnN0IHN3YXBwYWJsZVN3YXBwZWRFdmVudCA9IG5ldyBTd2FwcGFibGVFdmVudC5Td2FwcGFibGVTd2FwcGVkRXZlbnQoe1xuICAgICAgZHJhZ0V2ZW50OiBldmVudCxcbiAgICAgIHN3YXBwZWRFbGVtZW50OiBldmVudC5vdmVyXG4gICAgfSk7XG4gICAgdGhpcy50cmlnZ2VyKHN3YXBwYWJsZVN3YXBwZWRFdmVudCk7XG4gIH1cblxuICBbb25EcmFnU3RvcF0oZXZlbnQpIHtcbiAgICBjb25zdCBzd2FwcGFibGVTdG9wRXZlbnQgPSBuZXcgU3dhcHBhYmxlRXZlbnQuU3dhcHBhYmxlU3RvcEV2ZW50KHtcbiAgICAgIGRyYWdFdmVudDogZXZlbnRcbiAgICB9KTtcbiAgICB0aGlzLnRyaWdnZXIoc3dhcHBhYmxlU3RvcEV2ZW50KTtcbiAgICB0aGlzLmxhc3RPdmVyID0gbnVsbDtcbiAgfVxufVxuZnVuY3Rpb24gd2l0aFRlbXBFbGVtZW50KGNhbGxiYWNrKSB7XG4gIGNvbnN0IHRtcEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgY2FsbGJhY2sodG1wRWxlbWVudCk7XG4gIHRtcEVsZW1lbnQucmVtb3ZlKCk7XG59XG5mdW5jdGlvbiBzd2FwKHNvdXJjZSwgb3Zlcikge1xuICBjb25zdCBvdmVyUGFyZW50ID0gb3Zlci5wYXJlbnROb2RlO1xuICBjb25zdCBzb3VyY2VQYXJlbnQgPSBzb3VyY2UucGFyZW50Tm9kZTtcbiAgd2l0aFRlbXBFbGVtZW50KHRtcEVsZW1lbnQgPT4ge1xuICAgIHNvdXJjZVBhcmVudC5pbnNlcnRCZWZvcmUodG1wRWxlbWVudCwgc291cmNlKTtcbiAgICBvdmVyUGFyZW50Lmluc2VydEJlZm9yZShzb3VyY2UsIG92ZXIpO1xuICAgIHNvdXJjZVBhcmVudC5pbnNlcnRCZWZvcmUob3ZlciwgdG1wRWxlbWVudCk7XG4gIH0pO1xufVxuXG5leHBvcnRzLmRlZmF1bHQgPSBTd2FwcGFibGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBBYnN0cmFjdEV2ZW50ID0gcmVxdWlyZSgnLi4vLi4vc2hhcmVkL0Fic3RyYWN0RXZlbnQvQWJzdHJhY3RFdmVudC5janMnKTtcblxuY2xhc3MgU3dhcHBhYmxlRXZlbnQgZXh0ZW5kcyBBYnN0cmFjdEV2ZW50LkFic3RyYWN0RXZlbnQge1xuXG4gIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICB9XG5cbiAgZ2V0IGRyYWdFdmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmRyYWdFdmVudDtcbiAgfVxufVxuXG5Td2FwcGFibGVFdmVudC50eXBlID0gJ3N3YXBwYWJsZSc7XG5jbGFzcyBTd2FwcGFibGVTdGFydEV2ZW50IGV4dGVuZHMgU3dhcHBhYmxlRXZlbnQge31cblN3YXBwYWJsZVN0YXJ0RXZlbnQudHlwZSA9ICdzd2FwcGFibGU6c3RhcnQnO1xuU3dhcHBhYmxlU3RhcnRFdmVudC5jYW5jZWxhYmxlID0gdHJ1ZTtcblxuY2xhc3MgU3dhcHBhYmxlU3dhcEV2ZW50IGV4dGVuZHMgU3dhcHBhYmxlRXZlbnQge1xuXG4gIGdldCBvdmVyKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEub3ZlcjtcbiAgfVxuXG4gIGdldCBvdmVyQ29udGFpbmVyKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEub3ZlckNvbnRhaW5lcjtcbiAgfVxufVxuU3dhcHBhYmxlU3dhcEV2ZW50LnR5cGUgPSAnc3dhcHBhYmxlOnN3YXAnO1xuU3dhcHBhYmxlU3dhcEV2ZW50LmNhbmNlbGFibGUgPSB0cnVlO1xuXG5jbGFzcyBTd2FwcGFibGVTd2FwcGVkRXZlbnQgZXh0ZW5kcyBTd2FwcGFibGVFdmVudCB7XG5cbiAgZ2V0IHN3YXBwZWRFbGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuc3dhcHBlZEVsZW1lbnQ7XG4gIH1cbn1cblxuU3dhcHBhYmxlU3dhcHBlZEV2ZW50LnR5cGUgPSAnc3dhcHBhYmxlOnN3YXBwZWQnO1xuY2xhc3MgU3dhcHBhYmxlU3RvcEV2ZW50IGV4dGVuZHMgU3dhcHBhYmxlRXZlbnQge31cblN3YXBwYWJsZVN0b3BFdmVudC50eXBlID0gJ3N3YXBwYWJsZTpzdG9wJztcblxuZXhwb3J0cy5Td2FwcGFibGVFdmVudCA9IFN3YXBwYWJsZUV2ZW50O1xuZXhwb3J0cy5Td2FwcGFibGVTdGFydEV2ZW50ID0gU3dhcHBhYmxlU3RhcnRFdmVudDtcbmV4cG9ydHMuU3dhcHBhYmxlU3RvcEV2ZW50ID0gU3dhcHBhYmxlU3RvcEV2ZW50O1xuZXhwb3J0cy5Td2FwcGFibGVTd2FwRXZlbnQgPSBTd2FwcGFibGVTd2FwRXZlbnQ7XG5leHBvcnRzLlN3YXBwYWJsZVN3YXBwZWRFdmVudCA9IFN3YXBwYWJsZVN3YXBwZWRFdmVudDtcbiIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gY3JlYXRlQWRkSW5pdGlhbGl6ZXJNZXRob2QoZSwgdCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHIpIHtcbiAgICBhc3NlcnROb3RGaW5pc2hlZCh0LCBcImFkZEluaXRpYWxpemVyXCIpLCBhc3NlcnRDYWxsYWJsZShyLCBcIkFuIGluaXRpYWxpemVyXCIpLCBlLnB1c2gocik7XG4gIH07XG59XG5mdW5jdGlvbiBhc3NlcnRJbnN0YW5jZUlmUHJpdmF0ZShlLCB0KSB7XG4gIGlmICghZSh0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkF0dGVtcHRlZCB0byBhY2Nlc3MgcHJpdmF0ZSBlbGVtZW50IG9uIG5vbi1pbnN0YW5jZVwiKTtcbn1cbmZ1bmN0aW9uIG1lbWJlckRlYyhlLCB0LCByLCBhLCBuLCBpLCBzLCBvLCBjLCBsLCB1KSB7XG4gIHZhciBmO1xuICBzd2l0Y2ggKGkpIHtcbiAgICBjYXNlIDE6XG4gICAgICBmID0gXCJhY2Nlc3NvclwiO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgZiA9IFwibWV0aG9kXCI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDM6XG4gICAgICBmID0gXCJnZXR0ZXJcIjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNDpcbiAgICAgIGYgPSBcInNldHRlclwiO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGYgPSBcImZpZWxkXCI7XG4gIH1cbiAgdmFyIGQsXG4gICAgcCxcbiAgICBoID0ge1xuICAgICAga2luZDogZixcbiAgICAgIG5hbWU6IG8gPyBcIiNcIiArIHIgOiByLFxuICAgICAgc3RhdGljOiBzLFxuICAgICAgcHJpdmF0ZTogbyxcbiAgICAgIG1ldGFkYXRhOiB1XG4gICAgfSxcbiAgICB2ID0ge1xuICAgICAgdjogITFcbiAgICB9O1xuICBpZiAoMCAhPT0gaSAmJiAoaC5hZGRJbml0aWFsaXplciA9IGNyZWF0ZUFkZEluaXRpYWxpemVyTWV0aG9kKG4sIHYpKSwgbyB8fCAwICE9PSBpICYmIDIgIT09IGkpIHtcbiAgICBpZiAoMiA9PT0gaSkgZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gYXNzZXJ0SW5zdGFuY2VJZlByaXZhdGUobCwgZSksIGEudmFsdWU7XG4gICAgfTtlbHNlIHtcbiAgICAgIHZhciB5ID0gMCA9PT0gaSB8fCAxID09PSBpO1xuICAgICAgKHkgfHwgMyA9PT0gaSkgJiYgKGQgPSBvID8gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGFzc2VydEluc3RhbmNlSWZQcml2YXRlKGwsIGUpLCBhLmdldC5jYWxsKGUpO1xuICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBhLmdldC5jYWxsKGUpO1xuICAgICAgfSksICh5IHx8IDQgPT09IGkpICYmIChwID0gbyA/IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIGFzc2VydEluc3RhbmNlSWZQcml2YXRlKGwsIGUpLCBhLnNldC5jYWxsKGUsIHQpO1xuICAgICAgfSA6IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIGEuc2V0LmNhbGwoZSwgdCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSBkID0gZnVuY3Rpb24gKGUpIHtcbiAgICByZXR1cm4gZVtyXTtcbiAgfSwgMCA9PT0gaSAmJiAocCA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgZVtyXSA9IHQ7XG4gIH0pO1xuICB2YXIgbSA9IG8gPyBsLmJpbmQoKSA6IGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuIHIgaW4gZTtcbiAgfTtcbiAgaC5hY2Nlc3MgPSBkICYmIHAgPyB7XG4gICAgZ2V0OiBkLFxuICAgIHNldDogcCxcbiAgICBoYXM6IG1cbiAgfSA6IGQgPyB7XG4gICAgZ2V0OiBkLFxuICAgIGhhczogbVxuICB9IDoge1xuICAgIHNldDogcCxcbiAgICBoYXM6IG1cbiAgfTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZS5jYWxsKHQsIGMsIGgpO1xuICB9IGZpbmFsbHkge1xuICAgIHYudiA9ICEwO1xuICB9XG59XG5mdW5jdGlvbiBhc3NlcnROb3RGaW5pc2hlZChlLCB0KSB7XG4gIGlmIChlLnYpIHRocm93IG5ldyBFcnJvcihcImF0dGVtcHRlZCB0byBjYWxsIFwiICsgdCArIFwiIGFmdGVyIGRlY29yYXRpb24gd2FzIGZpbmlzaGVkXCIpO1xufVxuZnVuY3Rpb24gYXNzZXJ0Q2FsbGFibGUoZSwgdCkge1xuICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSB0aHJvdyBuZXcgVHlwZUVycm9yKHQgKyBcIiBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG59XG5mdW5jdGlvbiBhc3NlcnRWYWxpZFJldHVyblZhbHVlKGUsIHQpIHtcbiAgdmFyIHIgPSB0eXBlb2YgdDtcbiAgaWYgKDEgPT09IGUpIHtcbiAgICBpZiAoXCJvYmplY3RcIiAhPT0gciB8fCBudWxsID09PSB0KSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYWNjZXNzb3IgZGVjb3JhdG9ycyBtdXN0IHJldHVybiBhbiBvYmplY3Qgd2l0aCBnZXQsIHNldCwgb3IgaW5pdCBwcm9wZXJ0aWVzIG9yIHZvaWQgMFwiKTtcbiAgICB2b2lkIDAgIT09IHQuZ2V0ICYmIGFzc2VydENhbGxhYmxlKHQuZ2V0LCBcImFjY2Vzc29yLmdldFwiKSwgdm9pZCAwICE9PSB0LnNldCAmJiBhc3NlcnRDYWxsYWJsZSh0LnNldCwgXCJhY2Nlc3Nvci5zZXRcIiksIHZvaWQgMCAhPT0gdC5pbml0ICYmIGFzc2VydENhbGxhYmxlKHQuaW5pdCwgXCJhY2Nlc3Nvci5pbml0XCIpO1xuICB9IGVsc2UgaWYgKFwiZnVuY3Rpb25cIiAhPT0gcikge1xuICAgIHZhciBhO1xuICAgIHRocm93IGEgPSAwID09PSBlID8gXCJmaWVsZFwiIDogNSA9PT0gZSA/IFwiY2xhc3NcIiA6IFwibWV0aG9kXCIsIG5ldyBUeXBlRXJyb3IoYSArIFwiIGRlY29yYXRvcnMgbXVzdCByZXR1cm4gYSBmdW5jdGlvbiBvciB2b2lkIDBcIik7XG4gIH1cbn1cbmZ1bmN0aW9uIGN1cnJ5VGhpczEoZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBlKHRoaXMpO1xuICB9O1xufVxuZnVuY3Rpb24gY3VycnlUaGlzMihlKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodCkge1xuICAgIGUodGhpcywgdCk7XG4gIH07XG59XG5mdW5jdGlvbiBhcHBseU1lbWJlckRlYyhlLCB0LCByLCBhLCBuLCBpLCBzLCBvLCBjLCBsLCB1KSB7XG4gIHZhciBmLFxuICAgIGQsXG4gICAgcCxcbiAgICBoLFxuICAgIHYsXG4gICAgeSxcbiAgICBtID0gclswXTtcbiAgYSB8fCBBcnJheS5pc0FycmF5KG0pIHx8IChtID0gW21dKSwgbyA/IGYgPSAwID09PSBpIHx8IDEgPT09IGkgPyB7XG4gICAgZ2V0OiBjdXJyeVRoaXMxKHJbM10pLFxuICAgIHNldDogY3VycnlUaGlzMihyWzRdKVxuICB9IDogMyA9PT0gaSA/IHtcbiAgICBnZXQ6IHJbM11cbiAgfSA6IDQgPT09IGkgPyB7XG4gICAgc2V0OiByWzNdXG4gIH0gOiB7XG4gICAgdmFsdWU6IHJbM11cbiAgfSA6IDAgIT09IGkgJiYgKGYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIG4pKSwgMSA9PT0gaSA/IHAgPSB7XG4gICAgZ2V0OiBmLmdldCxcbiAgICBzZXQ6IGYuc2V0XG4gIH0gOiAyID09PSBpID8gcCA9IGYudmFsdWUgOiAzID09PSBpID8gcCA9IGYuZ2V0IDogNCA9PT0gaSAmJiAocCA9IGYuc2V0KTtcbiAgZm9yICh2YXIgZyA9IGEgPyAyIDogMSwgYiA9IG0ubGVuZ3RoIC0gMTsgYiA+PSAwOyBiIC09IGcpIHtcbiAgICB2YXIgSTtcbiAgICBpZiAodm9pZCAwICE9PSAoaCA9IG1lbWJlckRlYyhtW2JdLCBhID8gbVtiIC0gMV0gOiB2b2lkIDAsIG4sIGYsIGMsIGksIHMsIG8sIHAsIGwsIHUpKSkgYXNzZXJ0VmFsaWRSZXR1cm5WYWx1ZShpLCBoKSwgMCA9PT0gaSA/IEkgPSBoIDogMSA9PT0gaSA/IChJID0gaC5pbml0LCB2ID0gaC5nZXQgfHwgcC5nZXQsIHkgPSBoLnNldCB8fCBwLnNldCwgcCA9IHtcbiAgICAgIGdldDogdixcbiAgICAgIHNldDogeVxuICAgIH0pIDogcCA9IGgsIHZvaWQgMCAhPT0gSSAmJiAodm9pZCAwID09PSBkID8gZCA9IEkgOiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGQgPyBkID0gW2QsIEldIDogZC5wdXNoKEkpKTtcbiAgfVxuICBpZiAoMCA9PT0gaSB8fCAxID09PSBpKSB7XG4gICAgaWYgKHZvaWQgMCA9PT0gZCkgZCA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICByZXR1cm4gdDtcbiAgICB9O2Vsc2UgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZCkge1xuICAgICAgdmFyIHcgPSBkO1xuICAgICAgZCA9IGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgICAgIGZvciAodmFyIHIgPSB0LCBhID0gdy5sZW5ndGggLSAxOyBhID49IDA7IGEtLSkgciA9IHdbYV0uY2FsbChlLCByKTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgTSA9IGQ7XG4gICAgICBkID0gZnVuY3Rpb24gKGUsIHQpIHtcbiAgICAgICAgcmV0dXJuIE0uY2FsbChlLCB0KTtcbiAgICAgIH07XG4gICAgfVxuICAgIGUucHVzaChkKTtcbiAgfVxuICAwICE9PSBpICYmICgxID09PSBpID8gKGYuZ2V0ID0gcC5nZXQsIGYuc2V0ID0gcC5zZXQpIDogMiA9PT0gaSA/IGYudmFsdWUgPSBwIDogMyA9PT0gaSA/IGYuZ2V0ID0gcCA6IDQgPT09IGkgJiYgKGYuc2V0ID0gcCksIG8gPyAxID09PSBpID8gKGUucHVzaChmdW5jdGlvbiAoZSwgdCkge1xuICAgIHJldHVybiBwLmdldC5jYWxsKGUsIHQpO1xuICB9KSwgZS5wdXNoKGZ1bmN0aW9uIChlLCB0KSB7XG4gICAgcmV0dXJuIHAuc2V0LmNhbGwoZSwgdCk7XG4gIH0pKSA6IDIgPT09IGkgPyBlLnB1c2gocCkgOiBlLnB1c2goZnVuY3Rpb24gKGUsIHQpIHtcbiAgICByZXR1cm4gcC5jYWxsKGUsIHQpO1xuICB9KSA6IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBuLCBmKSk7XG59XG5mdW5jdGlvbiBhcHBseU1lbWJlckRlY3MoZSwgdCwgciwgYSkge1xuICBmb3IgKHZhciBuLCBpLCBzLCBvID0gW10sIGMgPSBuZXcgTWFwKCksIGwgPSBuZXcgTWFwKCksIHUgPSAwOyB1IDwgdC5sZW5ndGg7IHUrKykge1xuICAgIHZhciBmID0gdFt1XTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmKSkge1xuICAgICAgdmFyIGQsXG4gICAgICAgIHAsXG4gICAgICAgIGggPSBmWzFdLFxuICAgICAgICB2ID0gZlsyXSxcbiAgICAgICAgeSA9IGYubGVuZ3RoID4gMyxcbiAgICAgICAgbSA9IDE2ICYgaCxcbiAgICAgICAgZyA9ICEhKDggJiBoKSxcbiAgICAgICAgYiA9IHI7XG4gICAgICBpZiAoaCAmPSA3LCBnID8gKGQgPSBlLCAwICE9PSBoICYmIChwID0gaSA9IGkgfHwgW10pLCB5ICYmICFzICYmIChzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIF9jaGVja0luUkhTKHQpID09PSBlO1xuICAgICAgfSksIGIgPSBzKSA6IChkID0gZS5wcm90b3R5cGUsIDAgIT09IGggJiYgKHAgPSBuID0gbiB8fCBbXSkpLCAwICE9PSBoICYmICF5KSB7XG4gICAgICAgIHZhciBJID0gZyA/IGwgOiBjLFxuICAgICAgICAgIHcgPSBJLmdldCh2KSB8fCAwO1xuICAgICAgICBpZiAoITAgPT09IHcgfHwgMyA9PT0gdyAmJiA0ICE9PSBoIHx8IDQgPT09IHcgJiYgMyAhPT0gaCkgdGhyb3cgbmV3IEVycm9yKFwiQXR0ZW1wdGVkIHRvIGRlY29yYXRlIGEgcHVibGljIG1ldGhvZC9hY2Nlc3NvciB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEgcHJldmlvdXNseSBkZWNvcmF0ZWQgcHVibGljIG1ldGhvZC9hY2Nlc3Nvci4gVGhpcyBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBieSB0aGUgZGVjb3JhdG9ycyBwbHVnaW4uIFByb3BlcnR5IG5hbWUgd2FzOiBcIiArIHYpO1xuICAgICAgICBJLnNldCh2LCAhKCF3ICYmIGggPiAyKSB8fCBoKTtcbiAgICAgIH1cbiAgICAgIGFwcGx5TWVtYmVyRGVjKG8sIGQsIGYsIG0sIHYsIGgsIGcsIHksIHAsIGIsIGEpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcHVzaEluaXRpYWxpemVycyhvLCBuKSwgcHVzaEluaXRpYWxpemVycyhvLCBpKSwgbztcbn1cbmZ1bmN0aW9uIHB1c2hJbml0aWFsaXplcnMoZSwgdCkge1xuICB0ICYmIGUucHVzaChmdW5jdGlvbiAoZSkge1xuICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5sZW5ndGg7IHIrKykgdFtyXS5jYWxsKGUpO1xuICAgIHJldHVybiBlO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGFwcGx5Q2xhc3NEZWNzKGUsIHQsIHIsIGEpIHtcbiAgaWYgKHQubGVuZ3RoKSB7XG4gICAgZm9yICh2YXIgbiA9IFtdLCBpID0gZSwgcyA9IGUubmFtZSwgbyA9IHIgPyAyIDogMSwgYyA9IHQubGVuZ3RoIC0gMTsgYyA+PSAwOyBjIC09IG8pIHtcbiAgICAgIHZhciBsID0ge1xuICAgICAgICB2OiAhMVxuICAgICAgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciB1ID0gdFtjXS5jYWxsKHIgPyB0W2MgLSAxXSA6IHZvaWQgMCwgaSwge1xuICAgICAgICAgIGtpbmQ6IFwiY2xhc3NcIixcbiAgICAgICAgICBuYW1lOiBzLFxuICAgICAgICAgIGFkZEluaXRpYWxpemVyOiBjcmVhdGVBZGRJbml0aWFsaXplck1ldGhvZChuLCBsKSxcbiAgICAgICAgICBtZXRhZGF0YTogYVxuICAgICAgICB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGwudiA9ICEwO1xuICAgICAgfVxuICAgICAgdm9pZCAwICE9PSB1ICYmIChhc3NlcnRWYWxpZFJldHVyblZhbHVlKDUsIHUpLCBpID0gdSk7XG4gICAgfVxuICAgIHJldHVybiBbZGVmaW5lTWV0YWRhdGEoaSwgYSksIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgbi5sZW5ndGg7IGUrKykgbltlXS5jYWxsKGkpO1xuICAgIH1dO1xuICB9XG59XG5mdW5jdGlvbiBkZWZpbmVNZXRhZGF0YShlLCB0KSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgU3ltYm9sLm1ldGFkYXRhIHx8IFN5bWJvbC5mb3IoXCJTeW1ib2wubWV0YWRhdGFcIiksIHtcbiAgICBjb25maWd1cmFibGU6ICEwLFxuICAgIGVudW1lcmFibGU6ICEwLFxuICAgIHZhbHVlOiB0XG4gIH0pO1xufVxuZnVuY3Rpb24gX2FwcGx5RGVjczIzMDUoZSwgdCwgciwgYSwgbiwgaSkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA2KSB2YXIgcyA9IGlbU3ltYm9sLm1ldGFkYXRhIHx8IFN5bWJvbC5mb3IoXCJTeW1ib2wubWV0YWRhdGFcIildO1xuICB2YXIgbyA9IE9iamVjdC5jcmVhdGUodm9pZCAwID09PSBzID8gbnVsbCA6IHMpLFxuICAgIGMgPSBhcHBseU1lbWJlckRlY3MoZSwgdCwgbiwgbyk7XG4gIHJldHVybiByLmxlbmd0aCB8fCBkZWZpbmVNZXRhZGF0YShlLCBvKSwge1xuICAgIGU6IGMsXG4gICAgZ2V0IGMoKSB7XG4gICAgICByZXR1cm4gYXBwbHlDbGFzc0RlY3MoZSwgciwgYSwgbyk7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gX2NoZWNrSW5SSFMoZSkge1xuICBpZiAoT2JqZWN0KGUpICE9PSBlKSB0aHJvdyBUeXBlRXJyb3IoXCJyaWdodC1oYW5kIHNpZGUgb2YgJ2luJyBzaG91bGQgYmUgYW4gb2JqZWN0LCBnb3QgXCIgKyAobnVsbCAhPT0gZSA/IHR5cGVvZiBlIDogXCJudWxsXCIpKTtcbiAgcmV0dXJuIGU7XG59XG5cbmV4cG9ydHMuYXBwbHlEZWNzMjMwNSA9IF9hcHBseURlY3MyMzA1O1xuZXhwb3J0cy5jaGVja0luUkhTID0gX2NoZWNrSW5SSFM7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBBYnN0cmFjdEV2ZW50ID0gcmVxdWlyZSgnLi9zaGFyZWQvQWJzdHJhY3RFdmVudC9BYnN0cmFjdEV2ZW50LmNqcycpO1xudmFyIEFic3RyYWN0UGx1Z2luID0gcmVxdWlyZSgnLi9zaGFyZWQvQWJzdHJhY3RQbHVnaW4vQWJzdHJhY3RQbHVnaW4uY2pzJyk7XG52YXIgaW5kZXggPSByZXF1aXJlKCcuL0RyYWdnYWJsZS9TZW5zb3JzL2luZGV4LmNqcycpO1xudmFyIGluZGV4JDEgPSByZXF1aXJlKCcuL1BsdWdpbnMvaW5kZXguY2pzJyk7XG52YXIgRHJhZ2dhYmxlID0gcmVxdWlyZSgnLi9EcmFnZ2FibGUvRHJhZ2dhYmxlLmNqcycpO1xucmVxdWlyZSgnLi9EcmFnZ2FibGUvRHJhZ0V2ZW50L0RyYWdFdmVudC5janMnKTtcbnJlcXVpcmUoJy4vRHJhZ2dhYmxlL0RyYWdnYWJsZUV2ZW50L0RyYWdnYWJsZUV2ZW50LmNqcycpO1xucmVxdWlyZSgnLi9EcmFnZ2FibGUvUGx1Z2lucy9Bbm5vdW5jZW1lbnQvQW5ub3VuY2VtZW50LmNqcycpO1xucmVxdWlyZSgnLi9EcmFnZ2FibGUvUGx1Z2lucy9NaXJyb3IvTWlycm9yRXZlbnQvTWlycm9yRXZlbnQuY2pzJyk7XG52YXIgRHJvcHBhYmxlID0gcmVxdWlyZSgnLi9Ecm9wcGFibGUvRHJvcHBhYmxlLmNqcycpO1xucmVxdWlyZSgnLi9Ecm9wcGFibGUvRHJvcHBhYmxlRXZlbnQvRHJvcHBhYmxlRXZlbnQuY2pzJyk7XG52YXIgU3dhcHBhYmxlID0gcmVxdWlyZSgnLi9Td2FwcGFibGUvU3dhcHBhYmxlLmNqcycpO1xucmVxdWlyZSgnLi9Td2FwcGFibGUvU3dhcHBhYmxlRXZlbnQvU3dhcHBhYmxlRXZlbnQuY2pzJyk7XG52YXIgU29ydGFibGUgPSByZXF1aXJlKCcuL1NvcnRhYmxlL1NvcnRhYmxlLmNqcycpO1xucmVxdWlyZSgnLi9Tb3J0YWJsZS9Tb3J0YWJsZUV2ZW50L1NvcnRhYmxlRXZlbnQuY2pzJyk7XG5cblxuXG5leHBvcnRzLkJhc2VFdmVudCA9IEFic3RyYWN0RXZlbnQuQWJzdHJhY3RFdmVudDtcbmV4cG9ydHMuQmFzZVBsdWdpbiA9IEFic3RyYWN0UGx1Z2luLkFic3RyYWN0UGx1Z2luO1xuZXhwb3J0cy5TZW5zb3JzID0gaW5kZXg7XG5leHBvcnRzLlBsdWdpbnMgPSBpbmRleCQxO1xuZXhwb3J0cy5EcmFnZ2FibGUgPSBEcmFnZ2FibGUuZGVmYXVsdDtcbmV4cG9ydHMuRHJvcHBhYmxlID0gRHJvcHBhYmxlLmRlZmF1bHQ7XG5leHBvcnRzLlN3YXBwYWJsZSA9IFN3YXBwYWJsZS5kZWZhdWx0O1xuZXhwb3J0cy5Tb3J0YWJsZSA9IFNvcnRhYmxlLmRlZmF1bHQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNsYXNzIEFic3RyYWN0RXZlbnQge1xuXG4gIGNvbnN0cnVjdG9yKGRhdGEpIHtcblxuICAgIHRoaXMuX2NhbmNlbGVkID0gZmFsc2U7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgfVxuXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnR5cGU7XG4gIH1cblxuICBnZXQgY2FuY2VsYWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5jYW5jZWxhYmxlO1xuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuX2NhbmNlbGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGNhbmNlbGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9jYW5jZWxlZDtcbiAgfVxuXG4gIGNsb25lKGRhdGEpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3Ioe1xuICAgICAgLi4udGhpcy5kYXRhLFxuICAgICAgLi4uZGF0YVxuICAgIH0pO1xuICB9XG59XG5cbkFic3RyYWN0RXZlbnQudHlwZSA9ICdldmVudCc7XG5cbkFic3RyYWN0RXZlbnQuY2FuY2VsYWJsZSA9IGZhbHNlO1xuXG5leHBvcnRzLkFic3RyYWN0RXZlbnQgPSBBYnN0cmFjdEV2ZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jbGFzcyBBYnN0cmFjdFBsdWdpbiB7XG5cbiAgY29uc3RydWN0b3IoZHJhZ2dhYmxlKSB7XG4gICAgdGhpcy5kcmFnZ2FibGUgPSBkcmFnZ2FibGU7XG4gIH1cblxuICBhdHRhY2goKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgSW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIGRldGFjaCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBJbXBsZW1lbnRlZCcpO1xuICB9XG59XG5cbmV4cG9ydHMuQWJzdHJhY3RQbHVnaW4gPSBBYnN0cmFjdFBsdWdpbjtcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuZnVuY3Rpb24gY2xvc2VzdChub2RlLCB2YWx1ZSkge1xuICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZnVuY3Rpb24gY29uZGl0aW9uRm4oY3VycmVudE5vZGUpIHtcbiAgICBpZiAoY3VycmVudE5vZGUgPT0gbnVsbCB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChpc1NlbGVjdG9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMuY2FsbChjdXJyZW50Tm9kZSwgdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoaXNOb2RlTGlzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBbLi4udmFsdWVdLmluY2x1ZGVzKGN1cnJlbnROb2RlKTtcbiAgICB9IGVsc2UgaWYgKGlzRWxlbWVudCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gY3VycmVudE5vZGU7XG4gICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlKGN1cnJlbnROb2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBsZXQgY3VycmVudCA9IG5vZGU7XG4gIGRvIHtcbiAgICBjdXJyZW50ID0gY3VycmVudC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCB8fCBjdXJyZW50LmNvcnJlc3BvbmRpbmdFbGVtZW50IHx8IGN1cnJlbnQ7XG4gICAgaWYgKGNvbmRpdGlvbkZuKGN1cnJlbnQpKSB7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnQ/LnBhcmVudE5vZGUgfHwgbnVsbDtcbiAgfSB3aGlsZSAoY3VycmVudCAhPSBudWxsICYmIGN1cnJlbnQgIT09IGRvY3VtZW50LmJvZHkgJiYgY3VycmVudCAhPT0gZG9jdW1lbnQpO1xuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzU2VsZWN0b3IodmFsdWUpIHtcbiAgcmV0dXJuIEJvb2xlYW4odHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyk7XG59XG5mdW5jdGlvbiBpc05vZGVMaXN0KHZhbHVlKSB7XG4gIHJldHVybiBCb29sZWFuKHZhbHVlIGluc3RhbmNlb2YgTm9kZUxpc3QgfHwgdmFsdWUgaW5zdGFuY2VvZiBBcnJheSk7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpIHtcbiAgcmV0dXJuIEJvb2xlYW4odmFsdWUgaW5zdGFuY2VvZiBOb2RlKTtcbn1cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIEJvb2xlYW4odHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gY2xvc2VzdDtcbiIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gQXV0b0JpbmQob3JpZ2luYWxNZXRob2QsIHtcbiAgbmFtZSxcbiAgYWRkSW5pdGlhbGl6ZXJcbn0pIHtcbiAgYWRkSW5pdGlhbGl6ZXIoZnVuY3Rpb24gKCkge1xuXG4gICAgdGhpc1tuYW1lXSA9IG9yaWdpbmFsTWV0aG9kLmJpbmQodGhpcyk7XG5cbiAgfSk7XG59XG5cbmV4cG9ydHMuQXV0b0JpbmQgPSBBdXRvQmluZDtcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuZnVuY3Rpb24gZGlzdGFuY2UoeDEsIHkxLCB4MiwgeTIpIHtcbiAgcmV0dXJuIE1hdGguc3FydCgoeDIgLSB4MSkgKiogMiArICh5MiAtIHkxKSAqKiAyKTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gZGlzdGFuY2U7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbmZ1bmN0aW9uIHJlcXVlc3ROZXh0QW5pbWF0aW9uRnJhbWUoY2FsbGJhY2spIHtcbiAgcmV0dXJuIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNhbGxiYWNrKTtcbiAgfSk7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHJlcXVlc3ROZXh0QW5pbWF0aW9uRnJhbWU7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbmZ1bmN0aW9uIHRvdWNoQ29vcmRzKGV2ZW50KSB7XG4gIGNvbnN0IHtcbiAgICB0b3VjaGVzLFxuICAgIGNoYW5nZWRUb3VjaGVzXG4gIH0gPSBldmVudDtcbiAgcmV0dXJuIHRvdWNoZXMgJiYgdG91Y2hlc1swXSB8fCBjaGFuZ2VkVG91Y2hlcyAmJiBjaGFuZ2VkVG91Y2hlc1swXTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gdG91Y2hDb29yZHM7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbnZhciBydW50aW1lID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBPcCA9IE9iamVjdC5wcm90b3R5cGU7XG4gIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHVuZGVmaW5lZDsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuXG4gIHZhciAkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiID8gU3ltYm9sIDoge307XG4gIHZhciBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCI7XG4gIHZhciBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCI7XG4gIHZhciB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgXCJAQHRvU3RyaW5nVGFnXCI7XG5cbiAgZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIG9ialtrZXldO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gSUUgOCBoYXMgYSBicm9rZW4gT2JqZWN0LmRlZmluZVByb3BlcnR5IHRoYXQgb25seSB3b3JrcyBvbiBET00gb2JqZWN0cy5cbiAgICBkZWZpbmUoe30sIFwiXCIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBkZWZpbmUgPSBmdW5jdGlvbihvYmosIGtleSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBvYmpba2V5XSA9IHZhbHVlO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7XG4gICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBleHBvcnRzLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0XG4gIC8vIGRvbid0IG5hdGl2ZWx5IHN1cHBvcnQgaXQuXG4gIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICBkZWZpbmUoSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pO1xuXG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpO1xuICBpZiAoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiZcbiAgICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJlxuICAgICAgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkge1xuICAgIC8vIFRoaXMgZW52aXJvbm1lbnQgaGFzIGEgbmF0aXZlICVJdGVyYXRvclByb3RvdHlwZSU7IHVzZSBpdCBpbnN0ZWFkXG4gICAgLy8gb2YgdGhlIHBvbHlmaWxsLlxuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPVxuICAgIEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIGRlZmluZShHcCwgXCJjb25zdHJ1Y3RvclwiLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gIGRlZmluZShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgXCJjb25zdHJ1Y3RvclwiLCBHZW5lcmF0b3JGdW5jdGlvbik7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKFxuICAgIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLFxuICAgIHRvU3RyaW5nVGFnU3ltYm9sLFxuICAgIFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICApO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBleHBvcnRzLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGRlZmluZShnZW5GdW4sIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpO1xuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgIC8vIElmIGEgcmVqZWN0ZWQgUHJvbWlzZSB3YXMgeWllbGRlZCwgdGhyb3cgdGhlIHJlamVjdGlvbiBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLlxuICAgICAgICAgIHJldHVybiBpbnZva2UoXCJ0aHJvd1wiLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2VJbXBsKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgZGVmaW5lKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlLCBhc3luY0l0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pO1xuICBleHBvcnRzLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBleHBvcnRzLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QsIFByb21pc2VJbXBsKSB7XG4gICAgaWYgKFByb21pc2VJbXBsID09PSB2b2lkIDApIFByb21pc2VJbXBsID0gUHJvbWlzZTtcblxuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoXG4gICAgICB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSxcbiAgICAgIFByb21pc2VJbXBsXG4gICAgKTtcblxuICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbilcbiAgICAgID8gaXRlciAvLyBJZiBvdXRlckZuIGlzIGEgZ2VuZXJhdG9yLCByZXR1cm4gdGhlIGZ1bGwgaXRlcmF0b3IuXG4gICAgICA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzpcbiAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZVxuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGNvbnRleHQuYXJnID0gYXJnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGNvbnRleHQuYXJnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlXG4gICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZykgY2FsbCBhYm92ZS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gQ2FsbCBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF0oY29udGV4dC5hcmcpIGFuZCBoYW5kbGUgdGhlXG4gIC8vIHJlc3VsdCwgZWl0aGVyIGJ5IHJldHVybmluZyBhIHsgdmFsdWUsIGRvbmUgfSByZXN1bHQgZnJvbSB0aGVcbiAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsXG4gIC8vIHNldHRpbmcgY29udGV4dC5kZWxlZ2F0ZSB0byBudWxsLCBhbmQgcmV0dXJuaW5nIHRoZSBDb250aW51ZVNlbnRpbmVsLlxuICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEEgLnRocm93IG9yIC5yZXR1cm4gd2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIC50aHJvd1xuICAgICAgLy8gbWV0aG9kIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC5cbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAvLyBOb3RlOiBbXCJyZXR1cm5cIl0gbXVzdCBiZSB1c2VkIGZvciBFUzMgcGFyc2luZyBjb21wYXRpYmlsaXR5LlxuICAgICAgICBpZiAoZGVsZWdhdGUuaXRlcmF0b3JbXCJyZXR1cm5cIl0pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBkZWZpbmUoR3AsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvclwiKTtcblxuICAvLyBBIEdlbmVyYXRvciBzaG91bGQgYWx3YXlzIHJldHVybiBpdHNlbGYgYXMgdGhlIGl0ZXJhdG9yIG9iamVjdCB3aGVuIHRoZVxuICAvLyBAQGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBpdC4gU29tZSBicm93c2VycycgaW1wbGVtZW50YXRpb25zIG9mIHRoZVxuICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvclxuICAvLyBvYmplY3QgdG8gbm90IGJlIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLiBUaGlzIGVuc3VyZXMgdGhhdCBkb2Vzbid0IGhhcHBlbi5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9pc3N1ZXMvMjc0IGZvciBtb3JlIGRldGFpbHMuXG4gIGRlZmluZShHcCwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KTtcblxuICBkZWZpbmUoR3AsIFwidG9TdHJpbmdcIiwgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTtcblxuICAgIGlmICgxIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoMiBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTtcbiAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiO1xuICAgIGRlbGV0ZSByZWNvcmQuYXJnO1xuICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7XG4gIH1cblxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gVGhlIHJvb3QgZW50cnkgb2JqZWN0IChlZmZlY3RpdmVseSBhIHRyeSBzdGF0ZW1lbnQgd2l0aG91dCBhIGNhdGNoXG4gICAgLy8gb3IgYSBmaW5hbGx5IGJsb2NrKSBnaXZlcyB1cyBhIHBsYWNlIHRvIHN0b3JlIHZhbHVlcyB0aHJvd24gZnJvbVxuICAgIC8vIGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBlbmNsb3NpbmcgdHJ5IHN0YXRlbWVudC5cbiAgICB0aGlzLnRyeUVudHJpZXMgPSBbeyB0cnlMb2M6IFwicm9vdFwiIH1dO1xuICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTtcbiAgICB0aGlzLnJlc2V0KHRydWUpO1xuICB9XG5cbiAgZXhwb3J0cy5rZXlzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5yZXZlcnNlKCk7XG5cbiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcFxuICAgIC8vIHRoaW5ncyBzaW1wbGUgYW5kIHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBpdHNlbGYuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTtcbiAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWVcbiAgICAgIC8vIGFuZCAuZG9uZSBwcm9wZXJ0aWVzIG9mZiB0aGUgbmV4dCBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLiBUaGlzXG4gICAgICAvLyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgbWluaWZpZXIgd2lsbCBub3QgYW5vbnltaXplIHRoZSBmdW5jdGlvbi5cbiAgICAgIG5leHQuZG9uZSA9IHRydWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdO1xuICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkge1xuICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igd2l0aCBubyB2YWx1ZXMuXG4gICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9O1xuICB9XG4gIGV4cG9ydHMudmFsdWVzID0gdmFsdWVzO1xuXG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IENvbnRleHQsXG5cbiAgICByZXNldDogZnVuY3Rpb24oc2tpcFRlbXBSZXNldCkge1xuICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgIHRoaXMubmV4dCA9IDA7XG4gICAgICAvLyBSZXNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpO1xuXG4gICAgICBpZiAoIXNraXBUZW1wUmVzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSB7XG4gICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIG9wdGltYWwgb3JkZXIgb2YgdGhlc2UgY29uZGl0aW9uczpcbiAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09IFwidFwiICYmXG4gICAgICAgICAgICAgIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmXG4gICAgICAgICAgICAgICFpc05hTigrbmFtZS5zbGljZSgxKSkpIHtcbiAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcblxuICAgICAgdmFyIHJvb3RFbnRyeSA9IHRoaXMudHJ5RW50cmllc1swXTtcbiAgICAgIHZhciByb290UmVjb3JkID0gcm9vdEVudHJ5LmNvbXBsZXRpb247XG4gICAgICBpZiAocm9vdFJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJ2YWw7XG4gICAgfSxcblxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHtcbiAgICAgICAgcmVjb3JkLnR5cGUgPSBcInRocm93XCI7XG4gICAgICAgIHJlY29yZC5hcmcgPSBleGNlcHRpb247XG4gICAgICAgIGNvbnRleHQubmV4dCA9IGxvYztcblxuICAgICAgICBpZiAoY2F1Z2h0KSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRpc3BhdGNoZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgYSBjYXRjaCBibG9jayxcbiAgICAgICAgICAvLyB0aGVuIGxldCB0aGF0IGNhdGNoIGJsb2NrIGhhbmRsZSB0aGUgZXhjZXB0aW9uIG5vcm1hbGx5LlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISEgY2F1Z2h0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gXCJyb290XCIpIHtcbiAgICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIG91dHNpZGUgb2YgYW55IHRyeSBibG9jayB0aGF0IGNvdWxkIGhhbmRsZVxuICAgICAgICAgIC8vIGl0LCBzbyBzZXQgdGhlIGNvbXBsZXRpb24gdmFsdWUgb2YgdGhlIGVudGlyZSBmdW5jdGlvbiB0b1xuICAgICAgICAgIC8vIHRocm93IHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmV0dXJuIGhhbmRsZShcImVuZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7XG4gICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksIFwiY2F0Y2hMb2NcIik7XG4gICAgICAgICAgdmFyIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpO1xuXG4gICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhYnJ1cHQ6IGZ1bmN0aW9uKHR5cGUsIGFyZykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmXG4gICAgICAgICAgICB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkgJiZcbiAgICAgICAgICAodHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgIHR5cGUgPT09IFwiY29udGludWVcIikgJiZcbiAgICAgICAgICBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJlxuICAgICAgICAgIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAvLyBJZ25vcmUgdGhlIGZpbmFsbHkgZW50cnkgaWYgY29udHJvbCBpcyBub3QganVtcGluZyB0byBhXG4gICAgICAgIC8vIGxvY2F0aW9uIG91dHNpZGUgdGhlIHRyeS9jYXRjaCBibG9jay5cbiAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307XG4gICAgICByZWNvcmQudHlwZSA9IHR5cGU7XG4gICAgICByZWNvcmQuYXJnID0gYXJnO1xuXG4gICAgICBpZiAoZmluYWxseUVudHJ5KSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jO1xuICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICB9LFxuXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlY29yZCwgYWZ0ZXJMb2MpIHtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgcmVjb3JkLnR5cGUgPT09IFwiY29udGludWVcIikge1xuICAgICAgICB0aGlzLm5leHQgPSByZWNvcmQuYXJnO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICB0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gXCJlbmRcIjtcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgYWZ0ZXJMb2MpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH0sXG5cbiAgICBmaW5pc2g6IGZ1bmN0aW9uKGZpbmFsbHlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykge1xuICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpO1xuICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24odHJ5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG4gICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aHJvd247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNvbnRleHQuY2F0Y2ggbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgd2l0aCBhIGxvY2F0aW9uXG4gICAgICAvLyBhcmd1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEga25vd24gY2F0Y2ggYmxvY2suXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHRcIik7XG4gICAgfSxcblxuICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7XG4gICAgICB0aGlzLmRlbGVnYXRlID0ge1xuICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSxcbiAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSxcbiAgICAgICAgbmV4dExvYzogbmV4dExvY1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndFxuICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuXG4gICAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH07XG5cbiAgLy8gUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZVxuICAvLyBvciBub3QsIHJldHVybiB0aGUgcnVudGltZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gZGVjbGFyZSB0aGUgdmFyaWFibGVcbiAgLy8gcmVnZW5lcmF0b3JSdW50aW1lIGluIHRoZSBvdXRlciBzY29wZSwgd2hpY2ggYWxsb3dzIHRoaXMgbW9kdWxlIHRvIGJlXG4gIC8vIGluamVjdGVkIGVhc2lseSBieSBgYmluL3JlZ2VuZXJhdG9yIC0taW5jbHVkZS1ydW50aW1lIHNjcmlwdC5qc2AuXG4gIHJldHVybiBleHBvcnRzO1xuXG59KFxuICAvLyBJZiB0aGlzIHNjcmlwdCBpcyBleGVjdXRpbmcgYXMgYSBDb21tb25KUyBtb2R1bGUsIHVzZSBtb2R1bGUuZXhwb3J0c1xuICAvLyBhcyB0aGUgcmVnZW5lcmF0b3JSdW50aW1lIG5hbWVzcGFjZS4gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBlbXB0eVxuICAvLyBvYmplY3QuIEVpdGhlciB3YXksIHRoZSByZXN1bHRpbmcgb2JqZWN0IHdpbGwgYmUgdXNlZCB0byBpbml0aWFsaXplXG4gIC8vIHRoZSByZWdlbmVyYXRvclJ1bnRpbWUgdmFyaWFibGUgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuXG4gIHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgPyBtb2R1bGUuZXhwb3J0cyA6IHt9XG4pKTtcblxudHJ5IHtcbiAgcmVnZW5lcmF0b3JSdW50aW1lID0gcnVudGltZTtcbn0gY2F0Y2ggKGFjY2lkZW50YWxTdHJpY3RNb2RlKSB7XG4gIC8vIFRoaXMgbW9kdWxlIHNob3VsZCBub3QgYmUgcnVubmluZyBpbiBzdHJpY3QgbW9kZSwgc28gdGhlIGFib3ZlXG4gIC8vIGFzc2lnbm1lbnQgc2hvdWxkIGFsd2F5cyB3b3JrIHVubGVzcyBzb21ldGhpbmcgaXMgbWlzY29uZmlndXJlZC4gSnVzdFxuICAvLyBpbiBjYXNlIHJ1bnRpbWUuanMgYWNjaWRlbnRhbGx5IHJ1bnMgaW4gc3RyaWN0IG1vZGUsIGluIG1vZGVybiBlbmdpbmVzXG4gIC8vIHdlIGNhbiBleHBsaWNpdGx5IGFjY2VzcyBnbG9iYWxUaGlzLiBJbiBvbGRlciBlbmdpbmVzIHdlIGNhbiBlc2NhcGVcbiAgLy8gc3RyaWN0IG1vZGUgdXNpbmcgYSBnbG9iYWwgRnVuY3Rpb24gY2FsbC4gVGhpcyBjb3VsZCBjb25jZWl2YWJseSBmYWlsXG4gIC8vIGlmIGEgQ29udGVudCBTZWN1cml0eSBQb2xpY3kgZm9yYmlkcyB1c2luZyBGdW5jdGlvbiwgYnV0IGluIHRoYXQgY2FzZVxuICAvLyB0aGUgcHJvcGVyIHNvbHV0aW9uIGlzIHRvIGZpeCB0aGUgYWNjaWRlbnRhbCBzdHJpY3QgbW9kZSBwcm9ibGVtLiBJZlxuICAvLyB5b3UndmUgbWlzY29uZmlndXJlZCB5b3VyIGJ1bmRsZXIgdG8gZm9yY2Ugc3RyaWN0IG1vZGUgYW5kIGFwcGxpZWQgYVxuICAvLyBDU1AgdG8gZm9yYmlkIEZ1bmN0aW9uLCBhbmQgeW91J3JlIG5vdCB3aWxsaW5nIHRvIGZpeCBlaXRoZXIgb2YgdGhvc2VcbiAgLy8gcHJvYmxlbXMsIHBsZWFzZSBkZXRhaWwgeW91ciB1bmlxdWUgcHJlZGljYW1lbnQgaW4gYSBHaXRIdWIgaXNzdWUuXG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gXCJvYmplY3RcIikge1xuICAgIGdsb2JhbFRoaXMucmVnZW5lcmF0b3JSdW50aW1lID0gcnVudGltZTtcbiAgfSBlbHNlIHtcbiAgICBGdW5jdGlvbihcInJcIiwgXCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByXCIpKHJ1bnRpbWUpO1xuICB9XG59XG4iXX0="}